Project: aws-toolkit-for-eclipse
/*
 * Copyright 2011 Amazon Technologies, Inc.  
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");  
 * you may not use this file except in compliance with the License.  
 * You may obtain a copy of the License at: 
 *  
 *    http://aws.amazon.com/apache2.0 
 * 
 * This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES  
 * OR CONDITIONS OF ANY KIND, either express or implied. See the  
 * License for the specific language governing permissions and  
 * limitations under the License.  
 */
package com.amazonaws.eclipse.core.regions; 
 
import java.io.InputStream; 
import java.util.ArrayList; 
import java.util.List; 
 
import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 
 
import org.w3c.dom.Document; 
import org.w3c.dom.Element; 
import org.w3c.dom.Node; 
import org.w3c.dom.NodeList; 
 
/**
 * Parses the Eclipse toolkit region metadata file to pull out information about 
 * the available regions, names, IDs, and what service endpoints are available 
 * in each region. 
 */
 
public class RegionMetadataParser { 
    private static final String REGION_TAG = "region"
    private static final String REGION_SYSTEM_ID_TAG = "systemname"
    private static final String REGION_DISPLAY_NAME_TAG = "displayname"
    private static final String SERVICE_TAG = "service"
    private static final String SERVICE_NAME_ATTRIBUTE = "name"
 
     
    /**
     * Parses the specified input stream and returns a list of the regions 
     * declared in it. 
     *  
     * @param input 
     *            The stream containing the region metadata to parse. 
     *  
     * @return The list of parsed regions. 
     */
 
    public List<Region> parseRegionMetadata(InputStream input) { 
        Document document; 
        try { 
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
            DocumentBuilder documentBuilder = factory.newDocumentBuilder(); 
            document = documentBuilder.parse(input); 
        } catch (Exception e) { 
            throw new RuntimeException("Unable to parse region metadata file: " + e.getMessage(), e); 
        } 
         
        NodeList regionNodes = document.getElementsByTagName(REGION_TAG); 
        List<Region> regions = new ArrayList<Region>(); 
        for (int i = 0; i < regionNodes.getLength(); i++) { 
            Node node = regionNodes.item(i); 
            if (node.getNodeType() == Node.ELEMENT_NODE) { 
                Element element = (Element)node; 
                regions.add(parseRegionElement(element)); 
            } 
        } 
         
        return regions; 
    } 
 
     
    /*
     * Private Interface  
     */
 
     
    private Region parseRegionElement(Element regionElement) { 
        String name = getTagValue(REGION_DISPLAY_NAME_TAG, regionElement); 
        String id   = getTagValue(REGION_SYSTEM_ID_TAG,  regionElement); 
        Region region = new Region(name, id); 
 
        NodeList serviceNodes = regionElement.getElementsByTagName(SERVICE_TAG); 
        for (int i = 0; i < serviceNodes.getLength(); i++) { 
            Node node = serviceNodes.item(i); 
            if (node.getNodeType() == Node.ELEMENT_NODE) { 
                Element element = (Element)node; 
                String serviceName = element.getAttribute(SERVICE_NAME_ATTRIBUTE); 
                String endpoint = element.getTextContent(); 
                 
                region.getServiceEndpoints().put(serviceName, endpoint); 
            } 
        } 
         
        return region; 
    } 
     
    private static String getTagValue(String tagName, Element element){ 
        NodeList nodes= element.getElementsByTagName(tagName).item(0).getChildNodes(); 
        Node node = (Node)nodes.item(0);  
      
        return node.getNodeValue();     
    } 
}