/*
** Luxor - XML User Interface Language (XUL) Toolkit
** Copyright (c) 2001, 2002 by Gerald Bauer
**
** This program is free software.
**
** You may redistribute it and/or modify it under the terms of the GNU
** General Public License as published by the Free Software Foundation.
** Version 2 of the license should be included with this distribution in
** the file LICENSE, as well as License.html. If the license is not
** included with this distribution, you may find a copy at the FSF web
** site at 'www.gnu.org' or 'www.fsf.org', or you may write to the
** Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139 USA.
**
** THIS SOFTWARE IS PROVIDED AS-IS WITHOUT WARRANTY OF ANY KIND,
** NOT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY. THE AUTHOR
** OF THIS SOFTWARE, ASSUMES _NO_ RESPONSIBILITY FOR ANY
** CONSEQUENCE RESULTING FROM THE USE, MODIFICATION, OR
** REDISTRIBUTION OF THIS SOFTWARE.
**
*/

package luxor.core.config;

import java.util.*;
import org.jdom.*;
import luxor.core.*;

public class XmlConfigArray extends XmlConfigContainer
{

   private ArrayList _entry = new ArrayList();

   private Object _prevValue;

   public XmlConfigArray( Element element )
   {
      super( element );
   }

   public Object getValue()
   {
      if( _entry.size() == 0 )
      {
         Xul.error( "xml config data array '" + getId() + "' is empty; empty arrays are not supported; unable to deduce array type" );
         return new Object[0];
      }

      // use first item to deduce type/class
      XmlConfigNode node = ( XmlConfigNode ) _entry.get( 0 );

      Class clazz = node.getValue().getClass();
      if( clazz == String.class )
      {
         String[] array = new String[_entry.size()];
         for( int i = 0; i < _entry.size(); i++ )
         {
            XmlConfigNode entry = ( XmlConfigNode ) _entry.get( i );
            array[i] = ( String ) entry.getValue();
         }
         return array;
      }
      else
      {
         Xul.warning( "unsupported type used in xml config data array '" + getId() + "': " + clazz.getName() );

         Object[] array = new Object[_entry.size()];
         for( int i = 0; i < _entry.size(); i++ )
         {
            XmlConfigNode entry = ( XmlConfigNode ) _entry.get( i );
            array[i] = entry.getValue();
         }
         return array;
      }
   }

   public void add( XmlConfigNode node )
   {
      Object value = node.getValue();

      // check for type mismatch; array supports only single type
      if( _prevValue != null )
      {
         if( _prevValue.getClass() != value.getClass() )
         {
            Xul.error( "type mismatch in xml config data array '" + getId() + "': "
                   + _prevValue.getClass().getName() + " != "
                   + value.getClass().getName() );
         }
      }

      _entry.add( node );

      _prevValue = value;
   }
}