package dom4wspart3;


import :java.io.OutputStreamWriter;
import java.io.PrintWriter;
import org.apache.xml.serialize.OutputFormat;
import org.apache.xml.serialize.XMLSerializer;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Attr;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import java.util.*;
import java.io.File;

//Range:
import org.w3c.dom.ranges.DocumentRange;
import org.w3c.dom.ranges.Range;

//Document fragment:
import org.w3c.dom.DocumentFragment;


public class DOMSampleRange {

    public static void main(String argv[]) {
        try {
            
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            DocumentBuilder db = dbf.newDocumentBuilder();

            if (!db.getDOMImplementation().hasFeature("Range", "2.0") ) {
                System.out.println("Range module not supported");
                return;
            }//if

            Document doc = db.newDocument();
            DocumentRange docRange = (DocumentRange)doc;
            Range range = docRange.createRange();

            Element wrapper = doc.createElementNS(
                        "http://domsamples.wrapper",
                        "wrapper");
            wrapper.appendChild(doc.createTextNode("Contents of the wrapper"));
            doc.appendChild(wrapper);

            Element e1 = doc.createElementNS(
                        "http://domsamples.wrapper",
                        "e1");
            e1.appendChild(doc.createTextNode("Contents of e1"));
            wrapper.appendChild(e1);

            Element e2 = doc.createElementNS(
                        "http://domsamples.wrapper",
                        "e2");
            e2.appendChild(doc.createTextNode("Contents of e2"));
            wrapper.appendChild(e2);

            Element e3 = doc.createElementNS(
                        "http://domsamples.wrapper",
                        "e3");
            e3.appendChild(doc.createTextNode("Contents of e3"));
            wrapper.appendChild(e3);

            Element e4 = doc.createElementNS(
                        "http://domsamples.wrapper",
                        "e4");
            e4.appendChild(doc.createTextNode("Contents of e4"));
            wrapper.appendChild(e4);

            Element e5 = doc.createElementNS(
                        "http://domsamples.wrapper",
                        "e5");
            e5.appendChild(doc.createTextNode("Contents of e5"));
            wrapper.appendChild(e5);

            range.setEndBefore(e5);
            range.setStartAfter(e1);
            DocumentFragment frag = range.cloneContents();

            Document newDoc = db.newDocument();
            Element newWrapper = newDoc.createElementNS(
                        "http://domsamples.wrapper",
                        "newWrapper");
            newDoc.appendChild(newWrapper);

            frag = (DocumentFragment)newDoc.importNode(frag, true);
            newWrapper.appendChild(frag);

            DOMSampleRange sample = new DOMSampleRange();
            sample.printDocument("The sample document:", newDoc);


        }//try
        catch (Exception e) {
            e.printStackTrace(System.err);
        }//catch

    }//main


    public void printDocument(String title, Document doc) {
        System.out.println("");
        System.out.println("");
        System.out.println("*********************");

        System.out.println(title+":");

        try {
            OutputFormat outputFormat = new OutputFormat(doc);
            outputFormat.setPreserveSpace(true);
            XMLSerializer serializer = new XMLSerializer(System.out, outputFormat);
            serializer.serialize(doc);
            System.out.println("");
        }//try

        catch (Exception e) {
            e.printStackTrace(System.err);
        }//catch

        System.out.println("*********************");
        System.out.println("");
        System.out.println("");

    }//printDocument    

}//DOMSampleRange