2007-07-22 Nagappan A <anagappan@novell.com>
[mono.git] / mcs / class / System.Data / System.Data.Common / DataTableMappingCollection.cs
index 96ad0c884bcb6c62484dcadda75f765f8f479bb8..6b80997fe14d061f825ccfec987e8d706f89c83e 100644 (file)
 //
 // Author:
 //   Rodrigo Moya (rodrigo@ximian.com)
+//   Tim Coleman (tim@timcoleman.com)
 //
 // (C) Ximian, Inc
+// Copyright (C) Tim Coleman, 2002-2003
 //
 
-namespace System.Data.Common
-{
-       /// <summary>
-       /// A collection of DataTableMapping objects. This class cannot be inherited.
-       /// </summary>
-       public sealed class DataTableMappingCollection :
-               MarshalByRefObject, ITableMappingCollection, IList,
-               ICollection, IEnumerable
+//
+// Copyright (C) 2004 Novell, Inc (http://www.novell.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+// 
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+// 
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+using System;
+using System.Collections;
+using System.ComponentModel;
+
+namespace System.Data.Common {
+       [ListBindable (false)]
+       [EditorAttribute ("Microsoft.VSDesigner.Data.Design.DataTableMappingCollectionEditor, "+ Consts.AssemblyMicrosoft_VSDesigner, "System.Drawing.Design.UITypeEditor, "+ Consts.AssemblySystem_Drawing )]
+       public sealed class DataTableMappingCollection : MarshalByRefObject, ITableMappingCollection, IList, ICollection, IEnumerable
        {
-               [MonoTODO]
-               public DataTableMappingCollection() {
-                       throw new NotImplementedException ();
+               #region Fields
+
+               ArrayList mappings;
+               Hashtable sourceTables;
+               Hashtable dataSetTables;
+
+               #endregion
+
+               #region Constructors 
+
+               public DataTableMappingCollection() 
+               {
+                       mappings = new ArrayList ();
+                       sourceTables = new Hashtable ();
+                       dataSetTables = new Hashtable ();
                }
 
-               [MonoTODO]
-               public int Add (object obj) {
-                       throw new NotImplementedException ();
+               #endregion // Constructors
+
+               #region Properties
+
+               [Browsable (false)]
+#if !NET_2_0
+               [DataSysDescription ("The number of items in the collection")]
+#endif
+               [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
+               public int Count {
+                       get { return mappings.Count; }
                }
 
-               [MonoTODO]
-               public DataTableMapping Add (string a, string b) {
-                       throw new NotImplementedException ();
+               [Browsable (false)]
+#if !NET_2_0
+               [DataSysDescription ("The specified DataTableMapping object")]
+#endif
+               [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
+               public DataTableMapping this [int index] {
+                       get { return (DataTableMapping)(mappings[index]); }
+                       set { 
+                               DataTableMapping mapping = (DataTableMapping) mappings[index];
+                               sourceTables [mapping.SourceTable] = value;
+                               dataSetTables [mapping.DataSetTable] = value;
+                               mappings [index] = value; 
+                       }
                }
 
-               [MonoTODO]
-               public void AddRange(DataTableMapping[] values) {
-                       throw new NotImplementedException ();
+               [Browsable (false)]
+#if !NET_2_0
+               [DataSysDescription ("The specified DataTableMapping object")]
+#endif
+               [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
+               public DataTableMapping this [string sourceTable] {
+                       get { return (DataTableMapping) sourceTables[sourceTable]; }
+                       set { this [mappings.IndexOf (sourceTables[sourceTable])] = value; }
+               }
+                       
+               object IList.this [int index] {
+                       get { return (object)(this[index]); }
+                       set { 
+                               if (!(value is DataTableMapping))
+                                       throw new ArgumentException (); 
+                               this[index] = (DataTableMapping)value;
+                        } 
                }
 
-               [MonoTODO]
-               public void Clear() {
-                       throw new NotImplementedException ();
+               bool ICollection.IsSynchronized {
+                       get { return mappings.IsSynchronized; }
                }
 
-               [MonoTODO]
-               public bool Contains(object) {
-                       throw new NotImplementedException ();
+               object ICollection.SyncRoot {
+                       get { return mappings.SyncRoot; }
                }
 
-               [MonoTODO]
-               public bool Contains(string) {
-                       throw new NotImplementedException ();
+               bool IList.IsFixedSize {
+                       get { return false; }
                }
 
-               [MonoTODO]
-               public void CopyTo(Array array, int index) {
-                       throw new NotImplementedException ();
+               bool IList.IsReadOnly {
+                       get { return false; }
                }
 
-               [MonoTODO]
-               public DataTableMapping GetByDataSetTable(string dataSetTable) {
-                       throw new NotImplementedException ();
+               object ITableMappingCollection.this [string sourceTable] {
+                       get { return this [sourceTable]; }
+                       set { 
+                               if (!(value is DataTableMapping))
+                                       throw new ArgumentException ();
+                               this [sourceTable] = (DataTableMapping) value;
+                       }
                }
 
-               [MonoTODO]
-               public static DataTableMapping GetTableMappingBySchemaAction(
-                       DataTableMappingCollection tableMappings,
-                       string sourceTable,
-                       string dataSetTable,
-                       MissingMappingAction mappingAction) {
-                       throw new NotImplementedException ();
+               #endregion // Properties
+
+               #region Methods
+
+               public int Add (object value) 
+               {
+                       if (!(value is System.Data.Common.DataTableMapping))
+                               throw new InvalidCastException ("The object passed in was not a DataTableMapping object.");
+
+                       sourceTables[((DataTableMapping)value).SourceTable] = value;    
+                       dataSetTables[((DataTableMapping)value).DataSetTable] = value;  
+                       return mappings.Add (value);
                }
 
-               [MonoTODO]
-               public int IndexOf(object) {
-                       throw new NotImplementedException ();
+               public DataTableMapping Add (string sourceTable, string dataSetTable) 
+               {
+                       DataTableMapping mapping = new DataTableMapping (sourceTable, dataSetTable);
+                       Add (mapping);
+                       return mapping;
                }
 
-               [MonoTODO]
-               public int IndexOf(string) {
-                       throw new NotImplementedException ();
+#if NET_2_0
+               public void AddRange (Array values)
+               {
+                       for (int i = 0; i < values.Length; ++i)
+                               Add (values.GetValue (i));
                }
+#endif
 
-               [MonoTODO]
-               public int IndexOfDataSetTable(string dataSetTable) {
-                       throw new NotImplementedException ();
+               public void AddRange (DataTableMapping[] values) 
+               {
+                       foreach (DataTableMapping dataTableMapping in values)
+                               this.Add (dataTableMapping);
                }
 
-               [MonoTODO]
-               public void Insert(int index, object value) {
-                       throw new NotImplementedException ();
+               public void Clear () 
+               {
+                       sourceTables.Clear ();
+                       dataSetTables.Clear ();
+                       mappings.Clear ();
                }
 
-               [MonoTODO]
-               public void Remove(object value) {
-                       throw new NotImplementedException ();
+               public bool Contains (object value) 
+               {
+                       return mappings.Contains (value);
                }
 
-               [MonoTODO]
-               public void RemoveAt(int index) {
-                       throw new NotImplementedException ();
+               public bool Contains (string value) 
+               {
+                       return sourceTables.Contains (value);
                }
 
-               [MonoTODO]
-               public void RemoveAt(string index) {
-                       throw new NotImplementedException ();
+               public void CopyTo (Array array, int index) 
+               {
+                       mappings.CopyTo (array, index);
                }
-               
-               [MonoTODO]
-               public int Count {
-                       get { throw new NotImplementedException (); }
+
+#if NET_2_0
+               public void CopyTo (DataTableMapping[] array, int index) 
+               {
+                       mappings.CopyTo (array, index);
+               }
+#endif
+
+               public DataTableMapping GetByDataSetTable (string dataSetTable) 
+               {
+                       
+                       // this should work case-insenstive.
+                        if (!(dataSetTables[dataSetTable] == null)) 
+                                return (DataTableMapping)(dataSetTables[dataSetTable]);
+                        else {
+                                string lowcasevalue = dataSetTable.ToLower();
+                                object [] keyarray = new object[dataSetTables.Count];
+                                dataSetTables.Keys.CopyTo(keyarray,0);
+                                for (int i=0; i<keyarray.Length; i++) {
+                                        string temp = (string) keyarray[i];
+                                        if (lowcasevalue.Equals(temp.ToLower()))                                                               return (DataTableMapping)(dataSetTables[keyarray[i]]);
+                                }
+                                return null;
+                                                                                
+                        }
+
+               }
+
+               [EditorBrowsable (EditorBrowsableState.Advanced)]
+               public static DataTableMapping GetTableMappingBySchemaAction (DataTableMappingCollection tableMappings, string sourceTable, string dataSetTable, MissingMappingAction mappingAction) 
+               {
+                       if (tableMappings.Contains (sourceTable))
+                               return tableMappings[sourceTable];
+                       if (mappingAction == MissingMappingAction.Error)
+                               throw new InvalidOperationException (String.Format ("Missing source table mapping: '{0}'",
+                                                                                   sourceTable));
+                       if (mappingAction == MissingMappingAction.Ignore)
+                               return null;
+                       return new DataTableMapping (sourceTable, dataSetTable);
                }
 
-               [MonoTODO]
-               public DataTableMapping this[int] {
-                       get { throw new NotImplementedException (); }
-                       set { throw new NotImplementedException (); }
+               public IEnumerator GetEnumerator ()
+               {
+                       return mappings.GetEnumerator ();
                }
 
-               [MonoTODO]
-               public DataTableMapping this[string] {
-                       get { throw new NotImplementedException (); }
-                       set { throw new NotImplementedException (); }
+               public int IndexOf (object value) 
+               {
+                       return mappings.IndexOf (value);
                }
+
+               public int IndexOf (string sourceTable) 
+               {
+                       return IndexOf (sourceTables[sourceTable]);
+               }
+
+               public int IndexOfDataSetTable (string dataSetTable) 
+               {
+                         // this should work case-insensitive
+                                                                                            
+                         if (!(dataSetTables[dataSetTable] == null)) 
+                               return IndexOf ((DataTableMapping)(dataSetTables[dataSetTable]));
+                         else {
+                                string lowcasevalue = dataSetTable.ToLower();
+                               object [] keyarray = new object[dataSetTables.Count];
+                                dataSetTables.Keys.CopyTo(keyarray,0);
+                                for (int i=0; i<keyarray.Length; i++) {
+                                        string temp = (string) keyarray[i];
+                                        if (lowcasevalue.Equals(temp.ToLower()))
+                                               return IndexOf ((DataTableMapping)(dataSetTables[keyarray[i]]));
+                                          
+                                }
+                               return -1;
+                                                                                                    
+                        }
+
+               }
+
+               public void Insert (int index, object value) 
+               {
+                       mappings.Insert (index, value);
+                       sourceTables[((DataTableMapping)value).SourceTable] = value;
+                        dataSetTables[((DataTableMapping)value).DataSetTable] = value;
+               }
+
+#if NET_2_0
+               public void Insert (int index, DataTableMapping value) 
+               {
+                       mappings.Insert (index, value);
+                       sourceTables[value.SourceTable] = value;
+                        dataSetTables[value.DataSetTable] = value;
+               }
+#endif
+
+               ITableMapping ITableMappingCollection.Add (string sourceTableName, string dataSetTableName)
+               {
+                       ITableMapping tableMapping = new DataTableMapping (sourceTableName, dataSetTableName);
+                       Add (tableMapping);
+                       return tableMapping;
+               }
+
+               ITableMapping ITableMappingCollection.GetByDataSetTable (string dataSetTableName)
+               {
+                       return this [mappings.IndexOf (dataSetTables [dataSetTableName])];
+               }
+
+               public void Remove (object value) 
+               {
+                       if (!(value is DataTableMapping))
+                                 throw new InvalidCastException ();
+                       int index = mappings.IndexOf (value);
+                       if (( index < 0 ) || (index >=mappings.Count))
+                                    throw new ArgumentException("There is no such element in collection.");
+                       mappings.Remove ((DataTableMapping) value);
+               }
+
+#if NET_2_0
+               public void Remove (DataTableMapping value) 
+               {
+                       int index = mappings.IndexOf (value);
+                       if (( index < 0 ) || (index >=mappings.Count))
+                                    throw new ArgumentException("There is no such element in collection."); 
+                       mappings.Remove ((DataTableMapping) value);
+               }
+#endif
+
+               public void RemoveAt (int index) 
+               {
+                        if (( index < 0 ) || (index >=mappings.Count))
+                                    throw new IndexOutOfRangeException("There is no element in collection.");
+
+                       mappings.RemoveAt (index);
+               }
+
+               public void RemoveAt (string sourceTable) 
+               {
+                       RemoveAt (mappings.IndexOf (sourceTables[sourceTable]));
+               }
+
+               #endregion // Methods
        }
 }