//##header J2SE15
/**
 *******************************************************************************
 * Copyright (C) 2001-2007, International Business Machines Corporation and    *
 * others. All Rights Reserved.                                                *
 *******************************************************************************
 */
package com.ibm.icu.dev.test;

import java.util.Iterator;

/**
 * Represents a collection of test data described in a file.
 * 
 */
public interface TestDataModule {
    /**
     * Return the name of this test data module.
     */
    public String getName();

    /**
     * Get additional data related to the module, e.g. DESCRIPTION,
     * global settings.  Might be null.
     */
    public DataMap getInfo();

    /**
     * Returns the TestData corresponding to name, or null if name not
     * found in this module.  Throw error if name is not found.  
     * @throws DataModuleFormatError
     */
    public TestData getTestData(String name) throws DataModuleFormatError;

    /**
     * @return Iterator<TestData>
     */
    public Iterator getTestDataIterator();

    public static class Factory{

        static final TestDataModule get(String baseName, String localeName) throws DataModuleFormatError {
            return new ResourceModule(baseName, localeName);
        }
    }

    public static class DataModuleFormatError extends Exception{
        /**
         * For serialization
         */
        private static final long serialVersionUID = 4312521272388482529L;
        public DataModuleFormatError(String msg){
            super(msg);
        }
//#if defined(FOUNDATION10) || defined(J2SE13)
//#else
        public DataModuleFormatError(String msg, Throwable cause){
            super(msg, cause);
        }
        public DataModuleFormatError(Throwable cause) {
            super(cause);
        }
//#endif
    }
    
    /**
     * Represents a single test in the module.
     */
    public static interface TestData {
        public String getName();
        /**
         * Get additional data related to the test data, e.g. DESCRIPTION,
         * global settings.  Might be null.
         */
        public DataMap getInfo();
        /**
         * @return Iterator<DataMap>
         */
        public Iterator getSettingsIterator();
        /**
         * @return Iterator<DataMap>
         */
        public Iterator getDataIterator();
    }

    /**
     * Map-like interface for accessing key-value pairs by key.
     * If the vaule is not found by given key, return null. 
     * The behavior is analogous the get() method of the Map interface.
     * 
     * @author Raymond Yang
     */
    public interface DataMap {
//    public abstract boolean    isDefined(String key);
//
    public abstract Object     getObject(String key);
    public abstract String     getString(String key);
//    public abstract char       getChar(String key);
//    public abstract int        getInt(String key);
//    public abstract byte       getByte(String key);
//    public abstract boolean    getBoolean(String key);
//
//    public abstract Object[]   getObjectArray(String key);
//    public abstract String[]   getStringArray(String key);
//    public abstract char[]     getCharArray(String key);
//    public abstract int[]      getIntArray(String key);
//    public abstract byte[]     getByteArray(String key);
//    public abstract boolean[]  getBooleanArray(String key);
    }
}
    
