/** @file
  ToolChainConfig class.
  
  ToolChainConfig class parse all config files and get tool chain information.
  
Copyright (c) 2006, Intel Corporation
All rights reserved. This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution.  The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php

THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.

**/
package org.tianocore.build.toolchain;

import java.io.File;
import java.util.Iterator;
import java.util.Set;

import org.apache.tools.ant.Project;
import org.tianocore.build.exception.GenBuildException;
import org.tianocore.build.toolchain.ToolChainKey;
import org.tianocore.build.toolchain.ToolChainMap;


/**
 
  ToolChainConfig class parse all config files and get tool chain information.
  
 **/
public class ToolChainConfig {
    //
    // tool chain definitions
    //
    private ToolChainMap config = null;
    //
    // tool chain information (how many targets, archs, etc.)
    // 
    private ToolChainInfo info = new ToolChainInfo();

    /**
      Public construct method.
      
      @param toolChainFile File object representing the tool chain configuration file
    **/
    public ToolChainConfig (Project prj, File toolChainFile) throws GenBuildException {
        config = getToolChainConfig(prj, toolChainFile);
        parseToolChainDefKey(config.keySet());
    }

    /**
       Read tool chain definitions from specified file and put them in 
       ToolChainMap class.

       @param ConfigFile    The file containing tool chain definitions
       
       @return ToolChainMap
     **/
    private ToolChainMap getToolChainConfig(Project prj, File ConfigFile) throws GenBuildException {
        ToolChainMap map = new ToolChainMap();
        String[][] toolChainDef = ConfigReader.parse(prj, ConfigFile);
    
        for (int i = 0; i < toolChainDef[0].length; ++i) {
            map.put(toolChainDef[0][i], toolChainDef[1][i]);
        }

        return map;
    }

    /**
     Collect target, tool chain tag, arch and command information from key part
     of configuration
      
     @param toolChainDefKey The set of keys in tool chain configuration
     **/
    private void parseToolChainDefKey (Set<ToolChainKey> toolChainDefKey) {
        Iterator it = toolChainDefKey.iterator();
        while (it.hasNext()) {
            ToolChainKey key = (ToolChainKey)it.next();
            String[] keySet = key.getKeySet();
            info.addTargets(keySet[ToolChainElement.TARGET.value]);
            info.addTagnames(keySet[ToolChainElement.TOOLCHAIN.value]);
            info.addArchs(keySet[ToolChainElement.ARCH.value]);
            info.addCommands(keySet[ToolChainElement.TOOLCODE.value]);
            info.normalize();
        }
    }

    /**
     Return the tool chain configuration information in a Map form 
      
     @return ToolChainMap Tool chain configurations in a ToolChainMap
     **/
    public ToolChainMap getConfig() {
        return config;
    }

    /**
     Return the tool chain's target, arch, tag and commands information
     
      @return ToolChainInfo Tool chain information summary
     **/
    public ToolChainInfo getConfigInfo() {
        return info;
    }

    /**
     override toString()
     
     @return String The converted configuration string in name=value form
     **/
    public String toString() {
        StringBuffer ts = new StringBuffer(10240);

        Iterator it = config.keySet().iterator();
        while (it.hasNext()) {
            ToolChainKey key = (ToolChainKey)it.next();
            ts.append(key.toString() + " = ");
            ts.append(config.get(key) + "\n");
        }

        return ts.toString();
    }
}

