KmlScanner.java :  » Map » mapinmypocket » org » mimp » dom » kml » scanner » Android Open Source

Android Open Source » Map » mapinmypocket 
mapinmypocket » org » mimp » dom » kml » scanner » KmlScanner.java
package org.mimp.dom.kml.scanner;

import java.math.BigDecimal;

import org.mimp.dom.ParsedObject;
import org.mimp.dom.kml.CoordinatesType;
import org.mimp.dom.kml.DocumentType;
import org.mimp.dom.kml.KmlType;
import org.mimp.dom.kml.PlacemarkType;
import org.mimp.dom.kml.StyleType;
import org.w3c.dom.Element;

import android.graphics.Color;

/**
 *
 * @author hellhand
 */
public class KmlScanner {
    /**
     * org.w3c.dom.Document document
     */
    org.w3c.dom.Document document;
    KmlType kmlType;

    /**
     * Create new KmlScanner with org.w3c.dom.Document.
     */
    public KmlScanner(org.w3c.dom.Document document) {
        this.document = document;
    }
    
    public ParsedObject getParsedObject() {
        return kmlType;
    }

    /**
     * Scan through org.w3c.dom.Document document.
     */
    public void visitDocument() {
        org.w3c.dom.Element element = document.getDocumentElement();
        if ((element != null) && element.getTagName().equals("kml")) {
            visitElement_kml(element);
        }
        if ((element != null) && element.getTagName().equals("Document")) {
            visitElement_Document(element);
        }
        if ((element != null) && element.getTagName().equals("name")) {
            visitElement_name(element);
        }
        if ((element != null) && element.getTagName().equals("description")) {
            visitElement_description(element);
        }
        if ((element != null) && element.getTagName().equals("Style")) {
            visitElement_Style(element);
        }
        if ((element != null) && element.getTagName().equals("IconStyle")) {
            visitElement_IconStyle(element);
        }
        if ((element != null) && element.getTagName().equals("Icon")) {
            visitElement_Icon(element);
        }
        if ((element != null) && element.getTagName().equals("href")) {
            visitElement_href(element);
        }
        if ((element != null) && element.getTagName().equals("LineStyle")) {
            visitElement_LineStyle(element);
        }
        if ((element != null) && element.getTagName().equals("color")) {
            visitElement_color(element);
        }
        if ((element != null) && element.getTagName().equals("width")) {
            visitElement_width(element);
        }
        if ((element != null) && element.getTagName().equals("Placemark")) {
            visitElement_Placemark(element);
        }
        if ((element != null) && element.getTagName().equals("styleUrl")) {
            visitElement_styleUrl(element);
        }
        if ((element != null) && element.getTagName().equals("Point")) {
            visitElement_Point(element);
        }
        if ((element != null) && element.getTagName().equals("coordinates")) {
            visitElement_coordinates(element);
        }
        if ((element != null) && element.getTagName().equals("ExtendedData")) {
            visitElement_ExtendedData(element);
        }
        if ((element != null) && element.getTagName().equals("Data")) {
            visitElement_Data(element);
        }
        if ((element != null) && element.getTagName().equals("value")) {
            visitElement_value(element);
        }
        if ((element != null) && element.getTagName().equals("LineString")) {
            visitElement_LineString(element);
        }
        if ((element != null) && element.getTagName().equals("tessellate")) {
            visitElement_tessellate(element);
        }
        if ((element != null) && element.getTagName().equals("Folder")) {
            visitElement_Folder(element);
        }
    }

    /**
     * Scan through org.w3c.dom.Element named kml.
     */
    void visitElement_kml(org.w3c.dom.Element element) {
        kmlType = new KmlType();
        org.w3c.dom.NamedNodeMap attrs = element.getAttributes();
        for (int i = 0; i < attrs.getLength(); i++) {
            org.w3c.dom.Attr attr = (org.w3c.dom.Attr) attrs.item(i);
            if (attr.getName().equals("xmlns")) {
                kmlType.setXmlns(attr.getValue());
            }
        }
        org.w3c.dom.NodeList nodes = element.getChildNodes();
        for (int i = 0; i < nodes.getLength(); i++) {
            org.w3c.dom.Node node = nodes.item(i);
            switch (node.getNodeType()) {
                case org.w3c.dom.Node.CDATA_SECTION_NODE:
                    break;
                case org.w3c.dom.Node.ELEMENT_NODE:
                    org.w3c.dom.Element nodeElement = (org.w3c.dom.Element) node;
                    if (nodeElement.getTagName().equals("Document")) {
                        visitElement_Document(nodeElement);
                    }
                    break;
                case org.w3c.dom.Node.PROCESSING_INSTRUCTION_NODE:
                    break;
            }
        }
    }

    /**
     * Scan through org.w3c.dom.Element named Document.
     */
    void visitElement_Document(org.w3c.dom.Element element) {
        kmlType.setDocument(new DocumentType());
        org.w3c.dom.NodeList nodes = element.getChildNodes();
        for (int i = 0; i < nodes.getLength(); i++) {
            org.w3c.dom.Node node = nodes.item(i);
            switch (node.getNodeType()) {
                case org.w3c.dom.Node.CDATA_SECTION_NODE:
                    break;
                case org.w3c.dom.Node.ELEMENT_NODE:
                    org.w3c.dom.Element nodeElement = (org.w3c.dom.Element) node;
                    if (nodeElement.getTagName().equals("name")) {
                        visitElement_name(nodeElement);
                    }
                    if (nodeElement.getTagName().equals("description")) {
                        visitElement_description(nodeElement);
                    }
                    if (nodeElement.getTagName().equals("Style")) {
                        visitElement_Style(nodeElement);
                    }
                    if (nodeElement.getTagName().equals("Placemark")) {
                        visitElement_Placemark(nodeElement);
                    }
                    if (nodeElement.getTagName().equals("Folder")) {
                        visitElement_Folder(nodeElement);
                    }                    
                    break;
                case org.w3c.dom.Node.PROCESSING_INSTRUCTION_NODE:
                    break;
            }
        }
    }
    
    /**
     * Scan through org.w3c.dom.Element named name.
     */
    void visitElement_name(org.w3c.dom.Element element) {
        String parentNode = element.getParentNode().getNodeName();
        if(element.getChildNodes().getLength() == 0)
            return;
        if ("Document".equals(parentNode)) {
            kmlType.getDocument().setName(element.getChildNodes().item(0).getNodeValue());
        }
        if ("Placemark".equals(parentNode)) {
            kmlType.getDocument().getLastPlacemark().setName(element.getChildNodes().item(0).getNodeValue());
        }
    }

    /**
     * Scan through org.w3c.dom.Element named description.
     */
    void visitElement_description(org.w3c.dom.Element element) {
        String parentNode = element.getParentNode().getNodeName();
        if(element.getChildNodes().getLength() == 0)
            return;
        if ("Document".equals(parentNode)) {
            kmlType.getDocument().setDescription(element.getChildNodes().item(0).getNodeValue());
        }
        if ("Placemark".equals(parentNode)) {
            kmlType.getDocument().getLastPlacemark().setDescription(element.getChildNodes().item(0).getNodeValue());
        }
    }

    /**
     * Scan through org.w3c.dom.Element named Style.
     */
    void visitElement_Style(org.w3c.dom.Element element) {
        kmlType.getDocument().getStyles().add(new StyleType());
        org.w3c.dom.NamedNodeMap attrs = element.getAttributes();
        for (int i = 0; i < attrs.getLength(); i++) {
            org.w3c.dom.Attr attr = (org.w3c.dom.Attr) attrs.item(i);
            if (attr.getName().equals("id")) {
                kmlType.getDocument().getLastStyle().setId(attr.getValue());
            }
        }
        org.w3c.dom.NodeList nodes = element.getChildNodes();
        for (int i = 0; i < nodes.getLength(); i++) {
            org.w3c.dom.Node node = nodes.item(i);
            switch (node.getNodeType()) {
                case org.w3c.dom.Node.CDATA_SECTION_NODE:
                    break;
                case org.w3c.dom.Node.ELEMENT_NODE:
                    org.w3c.dom.Element nodeElement = (org.w3c.dom.Element) node;
                    if (nodeElement.getTagName().equals("IconStyle")) {
                        visitElement_IconStyle(nodeElement);
                    }
                    if (nodeElement.getTagName().equals("LineStyle")) {
                        visitElement_LineStyle(nodeElement);
                    }
                    break;
                case org.w3c.dom.Node.PROCESSING_INSTRUCTION_NODE:
                    break;
            }
        }
    }

    /**
     * Scan through org.w3c.dom.Element named IconStyle.
     */
    void visitElement_IconStyle(org.w3c.dom.Element element) {
        org.w3c.dom.NodeList nodes = element.getChildNodes();
        for (int i = 0; i < nodes.getLength(); i++) {
            org.w3c.dom.Node node = nodes.item(i);
            switch (node.getNodeType()) {
                case org.w3c.dom.Node.CDATA_SECTION_NODE:
                    break;
                case org.w3c.dom.Node.ELEMENT_NODE:
                    org.w3c.dom.Element nodeElement = (org.w3c.dom.Element) node;
                    if (nodeElement.getTagName().equals("Icon")) {
                        visitElement_Icon(nodeElement);
                    }
                    break;
                case org.w3c.dom.Node.PROCESSING_INSTRUCTION_NODE:
                    break;
            }
        }
    }

    /**
     * Scan through org.w3c.dom.Element named Icon.
     */
    void visitElement_Icon(org.w3c.dom.Element element) {
        org.w3c.dom.NodeList nodes = element.getChildNodes();
        for (int i = 0; i < nodes.getLength(); i++) {
            org.w3c.dom.Node node = nodes.item(i);
            switch (node.getNodeType()) {
                case org.w3c.dom.Node.CDATA_SECTION_NODE:
                    break;
                case org.w3c.dom.Node.ELEMENT_NODE:
                    org.w3c.dom.Element nodeElement = (org.w3c.dom.Element) node;
                    if (nodeElement.getTagName().equals("href")) {
                        visitElement_href(nodeElement);
                    }
                    break;
                case org.w3c.dom.Node.PROCESSING_INSTRUCTION_NODE:
                    break;
            }
        }
    }

    /**
     * Scan through org.w3c.dom.Element named href.
     */
    void visitElement_href(org.w3c.dom.Element element) {
        String parentNode = element.getParentNode().getNodeName();
        if(element.getChildNodes().getLength() == 0)
            return;
        if ("Icon".equals(parentNode)) {
            kmlType.getDocument().getLastStyle().getIconstyle().getIcon().setHref(element.getChildNodes().item(0).getNodeValue());
        }
    }

    /**
     * Scan through org.w3c.dom.Element named LineStyle.
     */
    void visitElement_LineStyle(org.w3c.dom.Element element) {
        org.w3c.dom.NodeList nodes = element.getChildNodes();
        for (int i = 0; i < nodes.getLength(); i++) {
            org.w3c.dom.Node node = nodes.item(i);
            switch (node.getNodeType()) {
                case org.w3c.dom.Node.CDATA_SECTION_NODE:
                    break;
                case org.w3c.dom.Node.ELEMENT_NODE:
                    org.w3c.dom.Element nodeElement = (org.w3c.dom.Element) node;
                    if (nodeElement.getTagName().equals("color")) {
                        visitElement_color(nodeElement);
                    }
                    if (nodeElement.getTagName().equals("width")) {
                        visitElement_width(nodeElement);
                    }
                    break;
                case org.w3c.dom.Node.PROCESSING_INSTRUCTION_NODE:
                    break;
            }
        }
    }

    /**
     * Scan through org.w3c.dom.Element named color.
     */
    void visitElement_color(org.w3c.dom.Element element) {
        String parentNode = element.getParentNode().getNodeName();
        if ("LineStyle".equals(parentNode)) {
            int color;
            try {
                color = Color.parseColor(element.getChildNodes().item(0).getNodeValue());
            }
            catch (Exception e) {
                return;
            }
            kmlType.getDocument().getLastStyle().getLinestyle().setColor(color);
        }
    }

    /**
     * Scan through org.w3c.dom.Element named width.
     */
    void visitElement_width(org.w3c.dom.Element element) {
        String parentNode = element.getParentNode().getNodeName();
        if ("LineStyle".equals(parentNode)) {
            kmlType.getDocument().getLastStyle().getLinestyle().setWidth(Float.valueOf(element.getChildNodes().item(0).getNodeValue()));
        }
    }

    /**
     * Scan through org.w3c.dom.Element named Placemark.
     */
    void visitElement_Placemark(org.w3c.dom.Element element) {
        kmlType.getDocument().getPlacemarks().add(new PlacemarkType());
        org.w3c.dom.NodeList nodes = element.getChildNodes();
        for (int i = 0; i < nodes.getLength(); i++) {
            org.w3c.dom.Node node = nodes.item(i);
            switch (node.getNodeType()) {
                case org.w3c.dom.Node.CDATA_SECTION_NODE:
                    break;
                case org.w3c.dom.Node.ELEMENT_NODE:
                    org.w3c.dom.Element nodeElement = (org.w3c.dom.Element) node;
                    if (nodeElement.getTagName().equals("name")) {
                        visitElement_name(nodeElement);
                    }
                    if (nodeElement.getTagName().equals("description")) {
                        visitElement_description(nodeElement);
                    }
                    if (nodeElement.getTagName().equals("styleUrl")) {
                        visitElement_styleUrl(nodeElement);
                    }
                    if (nodeElement.getTagName().equals("Point")) {
                        visitElement_Point(nodeElement);
                    }
                    if (nodeElement.getTagName().equals("ExtendedData")) {
                        visitElement_ExtendedData(nodeElement);
                    }
                    if (nodeElement.getTagName().equals("LineString")) {
                        visitElement_LineString(nodeElement);
                    }
                    break;
                case org.w3c.dom.Node.PROCESSING_INSTRUCTION_NODE:
                    break;
            }
        }
    }

    /**
     * Scan through org.w3c.dom.Element named styleUrl.
     */
    void visitElement_styleUrl(org.w3c.dom.Element element) {
        String parentNode = element.getParentNode().getNodeName();
        if ("Placemark".equals(parentNode)) {
            kmlType.getDocument().getLastPlacemark().setStyleUrl(element.getChildNodes().item(0).getNodeValue());
        }
    }

    /**
     * Scan through org.w3c.dom.Element named Point.
     */
    void visitElement_Point(org.w3c.dom.Element element) {
        org.w3c.dom.NodeList nodes = element.getChildNodes();
        for (int i = 0; i < nodes.getLength(); i++) {
            org.w3c.dom.Node node = nodes.item(i);
            switch (node.getNodeType()) {
                case org.w3c.dom.Node.CDATA_SECTION_NODE:
                    break;
                case org.w3c.dom.Node.ELEMENT_NODE:
                    org.w3c.dom.Element nodeElement = (org.w3c.dom.Element) node;
                    if (nodeElement.getTagName().equals("coordinates")) {
                        visitElement_coordinates(nodeElement);
                    }
                    break;
                case org.w3c.dom.Node.PROCESSING_INSTRUCTION_NODE:
                    break;
            }
        }
    }

    /**
     * Scan through org.w3c.dom.Element named coordinates.
     */
    void visitElement_coordinates(org.w3c.dom.Element element) {
        String parentNode = element.getParentNode().getNodeName();
        String coordinates = element.getChildNodes().item(0).getNodeValue();
        if ("Point".equals(parentNode)) {            
            String[] coord = coordinates.split(",");
            CoordinatesType coords = new CoordinatesType(
                    new BigDecimal(coord[1].trim()),
                    new BigDecimal(coord[0].trim()),
                    new BigDecimal(coord[2].trim()));
            kmlType.getDocument().getLastPlacemark().getPoint().setCoordinates(coords);
        }
        if ("LineString".equals(parentNode)) {
            String[] pairs = coordinates.split(" |\\r?\\n");
            try {
                for (int i = 0; i < pairs.length-1; i++) {
                    String[] coord = pairs[i].split(",");
                    if (coord.length == 1)
                        continue;
                    CoordinatesType coords = new CoordinatesType(
                            new BigDecimal(coord[1].trim()),
                            new BigDecimal(coord[0].trim()),
                            new BigDecimal(coord[2].trim()));
                    kmlType.getDocument().getLastPlacemark().getLine().getCoordinates().add(coords);
                }
            }
            catch (Exception e) {
                e.printStackTrace();
            }   
        }
    }

    /**
     * Scan through org.w3c.dom.Element named ExtendedData.
     */
    void visitElement_ExtendedData(org.w3c.dom.Element element) {
        org.w3c.dom.NodeList nodes = element.getChildNodes();
        for (int i = 0; i < nodes.getLength(); i++) {
            org.w3c.dom.Node node = nodes.item(i);
            switch (node.getNodeType()) {
                case org.w3c.dom.Node.CDATA_SECTION_NODE:
                    break;
                case org.w3c.dom.Node.ELEMENT_NODE:
                    org.w3c.dom.Element nodeElement = (org.w3c.dom.Element) node;
                    if (nodeElement.getTagName().equals("Data")) {
                        visitElement_Data(nodeElement);
                    }
                    break;
                case org.w3c.dom.Node.PROCESSING_INSTRUCTION_NODE:
                    break;
            }
        }
    }

    /**
     * Scan through org.w3c.dom.Element named Data.
     */
    void visitElement_Data(org.w3c.dom.Element element) {
        org.w3c.dom.NamedNodeMap attrs = element.getAttributes();
        for (int i = 0; i < attrs.getLength(); i++) {
            org.w3c.dom.Attr attr = (org.w3c.dom.Attr) attrs.item(i);
            if (attr.getName().equals("name")) {
                
            }
        }
        org.w3c.dom.NodeList nodes = element.getChildNodes();
        for (int i = 0; i < nodes.getLength(); i++) {
            org.w3c.dom.Node node = nodes.item(i);
            switch (node.getNodeType()) {
                case org.w3c.dom.Node.CDATA_SECTION_NODE:
                    break;
                case org.w3c.dom.Node.ELEMENT_NODE:
                    org.w3c.dom.Element nodeElement = (org.w3c.dom.Element) node;
                    if (nodeElement.getTagName().equals("value")) {
                        visitElement_value(nodeElement);
                    }
                    break;
                case org.w3c.dom.Node.PROCESSING_INSTRUCTION_NODE:
                    break;
            }
        }
    }

    /**
     * Scan through org.w3c.dom.Element named value.
     */
    void visitElement_value(org.w3c.dom.Element element) {
        
    }

    /**
     * Scan through org.w3c.dom.Element named LineString.
     */
    void visitElement_LineString(org.w3c.dom.Element element) {
        org.w3c.dom.NodeList nodes = element.getChildNodes();
        for (int i = 0; i < nodes.getLength(); i++) {
            org.w3c.dom.Node node = nodes.item(i);
            switch (node.getNodeType()) {
                case org.w3c.dom.Node.CDATA_SECTION_NODE:
                    break;
                case org.w3c.dom.Node.ELEMENT_NODE:
                    org.w3c.dom.Element nodeElement = (org.w3c.dom.Element) node;
                    if (nodeElement.getTagName().equals("coordinates")) {
                        visitElement_coordinates(nodeElement);
                    }
                    if (nodeElement.getTagName().equals("tessellate")) {
                        visitElement_tessellate(nodeElement);
                    }
                    break;
                case org.w3c.dom.Node.PROCESSING_INSTRUCTION_NODE:
                    break;
            }
        }
    }

    /**
     * Scan through org.w3c.dom.Element named tessellate.
     */
    void visitElement_tessellate(org.w3c.dom.Element element) {
        String parentNode = element.getParentNode().getNodeName();
        if ("LineString".equals(parentNode)) {
            kmlType.getDocument().getLastPlacemark().getLine().setTesselate(Integer.parseInt(element.getChildNodes().item(0).getNodeValue()));
        }
    }
    
    private void visitElement_Folder(Element element) {
        org.w3c.dom.NodeList nodes = element.getChildNodes();
        for (int i = 0; i < nodes.getLength(); i++) {
            org.w3c.dom.Node node = nodes.item(i);
            switch (node.getNodeType()) {
                case org.w3c.dom.Node.CDATA_SECTION_NODE:
                    break;
                case org.w3c.dom.Node.ELEMENT_NODE:
                    org.w3c.dom.Element nodeElement = (org.w3c.dom.Element) node;
                    if (nodeElement.getTagName().equals("Placemark")) {
                        visitElement_Placemark(nodeElement);
                    }
                    if (nodeElement.getTagName().equals("Folder")) {
                        visitElement_Folder(nodeElement);
                    }    
                    break;
                case org.w3c.dom.Node.PROCESSING_INSTRUCTION_NODE:
                    break;
            }
        }
    }
}
java2s.com  | Contact Us | Privacy Policy
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.