Index: trunk/sources/HeuristicLab.DataAccess.ADOHelper/3.2/BinaryRelation.cs
===================================================================
--- trunk/sources/HeuristicLab.DataAccess.ADOHelper/3.2/BinaryRelation.cs	(revision 1579)
+++ 	(revision )
@@ -1,11 +1,0 @@
-﻿using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using HeuristicLab.DataAccess.Interfaces;
-
-namespace HeuristicLab.DataAccess.ADOHelper {
-  public class BinaryRelation: PersistableObject {
-    public Guid Id2 { get; set; }
-  }
-}
Index: trunk/sources/HeuristicLab.DataAccess.ADOHelper/3.2/BinaryRelationHelper.cs
===================================================================
--- trunk/sources/HeuristicLab.DataAccess.ADOHelper/3.2/BinaryRelationHelper.cs	(revision 1579)
+++ 	(revision )
@@ -1,93 +1,0 @@
-﻿using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-
-namespace HeuristicLab.DataAccess.ADOHelper {
-  public class BinaryRelationHelper<AdapterT, RowT>
-    where AdapterT : new()
-    where RowT : System.Data.DataRow
-    {
-    IDataAdapterWrapper<AdapterT, BinaryRelation, RowT> tableAdapterWrapper;
-    
-    public BinaryRelationHelper(
-      IDataAdapterWrapper<AdapterT, BinaryRelation, RowT> tableAdapterWrapper) {
-      this.tableAdapterWrapper = tableAdapterWrapper;
-    }
-
-    public Session Session {
-      set {
-        tableAdapterWrapper.Session = value;
-      }
-    }
-
-    public void UpdateRelationships(Guid objectA, IList<Guid> relationships) {
-      //firstly check for created references
-      IList<Guid> existing =
-        this.GetRelationships(objectA);
-
-      foreach (Guid relationship in relationships) {
-        if (!existing.Contains(relationship)) {
-          BinaryRelation rel = 
-            new BinaryRelation();
-          rel.Id = objectA;
-          rel.Id2 = relationship;
-          
-          RowT inserted = 
-            tableAdapterWrapper.InsertNewRow(rel);
-
-          tableAdapterWrapper.UpdateRow(inserted);
-        }
-      }
-
-      //secondly check for deleted references
-      ICollection<Guid> deleted =
-        new List<Guid>();
-
-      foreach (Guid relationship in existing) {
-        if(!relationships.Contains(relationship)) {
-          deleted.Add(relationship);
-        }
-      }
-
-      foreach (Guid relationship in deleted) {
-        RowT toDelete =
-          FindRow(objectA, relationship);
-        if (toDelete != null) {
-          toDelete.Delete();
-          tableAdapterWrapper.UpdateRow(toDelete);
-        }
-      }
-    }
-
-    public IList<Guid> GetRelationships(Guid objectA) {
-      IList<Guid> result =
-        new List<Guid>();
-
-      IEnumerable<RowT> rows = 
-        tableAdapterWrapper.FindById(objectA);
-
-      foreach(RowT row in rows) {
-        result.Add((Guid)row[1]);
-      }
-
-      return result;
-    }
-
-    private RowT FindRow(Guid objectA, Guid objectB) {
-      IEnumerable<RowT> rows =
-       tableAdapterWrapper.FindById(objectA);
-
-      RowT found = null;
-
-      foreach (RowT row in rows) {
-        if (row[1].Equals(objectB)) {
-          found = row;
-          break;
-        }
-      }
-
-      return found;
-    }
-  }
-}
Index: trunk/sources/HeuristicLab.DataAccess.ADOHelper/3.2/DataAdapterBase.cs
===================================================================
--- trunk/sources/HeuristicLab.DataAccess.ADOHelper/3.2/DataAdapterBase.cs	(revision 1579)
+++ trunk/sources/HeuristicLab.DataAccess.ADOHelper/3.2/DataAdapterBase.cs	(revision 1580)
@@ -36,8 +36,8 @@
     private ISession session;
 
-    private IDataAdapterWrapper<AdapterT, ObjT, RowT> dataAdapter;
+    private ITableAdapterWrapper<AdapterT, ObjT, RowT> dataAdapter;
 
     protected DataAdapterBase(
-      IDataAdapterWrapper<AdapterT, ObjT, RowT> dataAdapter) {
+      ITableAdapterWrapper<AdapterT, ObjT, RowT> dataAdapter) {
       this.dataAdapter = dataAdapter;
     }
@@ -49,5 +49,5 @@
     }
 
-    protected IDataAdapterWrapper<AdapterT, ObjT, RowT> DataAdapterWrapper {
+    protected ITableAdapterWrapper<AdapterT, ObjT, RowT> DataAdapterWrapper {
       get {
         return dataAdapter;
Index: trunk/sources/HeuristicLab.DataAccess.ADOHelper/3.2/DataAdapterWrapperBase.cs
===================================================================
--- trunk/sources/HeuristicLab.DataAccess.ADOHelper/3.2/DataAdapterWrapperBase.cs	(revision 1579)
+++ 	(revision )
@@ -1,80 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using HeuristicLab.DataAccess.Interfaces;
-using System.Data.Common;
-
-namespace HeuristicLab.DataAccess.ADOHelper {
-  public abstract class DataAdapterWrapperBase<AdapterT, ObjT, RowT>:
-    IDataAdapterWrapper<AdapterT, ObjT, RowT>
-    where AdapterT : new()
-    where ObjT : IPersistableObject, new()
-    where RowT : System.Data.DataRow {
-    protected AdapterT adapter =
-      new AdapterT();
-
-    private ISession session;
-    
-    #region IDataAdapterWrapper<AdapterT,ObjT,RowT> Members
-
-    public AdapterT TransactionalAdapter {
-      get {
-        if (session == null)
-          throw new Exception("No session set!");
-
-        ITransaction trans =
-          session.GetCurrentTransaction();
-        if (trans != null)
-          SetTransaction(trans.InnerTransaction as DbTransaction);
-        else
-          SetTransaction(null);
-
-        return this.adapter; 
-      }
-    }
-
-    public Session Session {
-      set { 
-        this.session = value;
-
-        SetConnection(value.Connection); 
-      }
-    }
-
-    public abstract void UpdateRow(RowT row);
-
-    public abstract RowT InsertNewRow(ObjT obj);
-
-    public abstract IEnumerable<RowT> FindById(Guid id);
-
-    public abstract IEnumerable<RowT> FindAll();
-
-    protected abstract void SetConnection(DbConnection connection);
-
-    protected abstract void SetTransaction(DbTransaction transaction);
-
-    #endregion
-  }
-}
Index: trunk/sources/HeuristicLab.DataAccess.ADOHelper/3.2/HeuristicLab.DataAccess.ADOHelper-3.2.csproj
===================================================================
--- trunk/sources/HeuristicLab.DataAccess.ADOHelper/3.2/HeuristicLab.DataAccess.ADOHelper-3.2.csproj	(revision 1579)
+++ trunk/sources/HeuristicLab.DataAccess.ADOHelper/3.2/HeuristicLab.DataAccess.ADOHelper-3.2.csproj	(revision 1580)
@@ -83,8 +83,8 @@
     <Compile Include="DataAccessADOHelperPlugin.cs" />
     <Compile Include="DataAdapterBase.cs" />
-    <Compile Include="DataAdapterWrapperBase.cs" />
-    <Compile Include="IDataAdapterWrapper.cs" />
-    <Compile Include="BinaryRelation.cs" />
-    <Compile Include="BinaryRelationHelper.cs" />
+    <Compile Include="TableAdapterWrapperBase.cs" />
+    <Compile Include="ITableAdapterWrapper.cs" />
+    <Compile Include="ManyToManyRelation.cs" />
+    <Compile Include="ManyToManyRelationHelper.cs" />
     <Compile Include="Session.cs" />
     <Compile Include="SessionFactory.cs" />
Index: trunk/sources/HeuristicLab.DataAccess.ADOHelper/3.2/IDataAdapterWrapper.cs
===================================================================
--- trunk/sources/HeuristicLab.DataAccess.ADOHelper/3.2/IDataAdapterWrapper.cs	(revision 1579)
+++ 	(revision )
@@ -1,46 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using HeuristicLab.DataAccess.Interfaces;
-using System.Data.Common;
-
-namespace HeuristicLab.DataAccess.ADOHelper {
-  public interface IDataAdapterWrapper<AdapterT, ObjT, RowT>
-   where AdapterT : new()
-   where ObjT : IPersistableObject, new()
-   where RowT : System.Data.DataRow {
-    void UpdateRow(RowT row);
-
-    RowT InsertNewRow(ObjT obj);
-
-    IEnumerable<RowT> FindById(Guid id);
-
-    IEnumerable<RowT> FindAll();
-
-    AdapterT TransactionalAdapter { get; }
-
-    Session Session { set; }
-  }
-}
Index: trunk/sources/HeuristicLab.DataAccess.ADOHelper/3.2/ITableAdapterWrapper.cs
===================================================================
--- trunk/sources/HeuristicLab.DataAccess.ADOHelper/3.2/ITableAdapterWrapper.cs	(revision 1580)
+++ trunk/sources/HeuristicLab.DataAccess.ADOHelper/3.2/ITableAdapterWrapper.cs	(revision 1580)
@@ -0,0 +1,46 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.DataAccess.Interfaces;
+using System.Data.Common;
+
+namespace HeuristicLab.DataAccess.ADOHelper {
+  public interface ITableAdapterWrapper<AdapterT, ObjT, RowT>
+   where AdapterT : new()
+   where ObjT : IPersistableObject, new()
+   where RowT : System.Data.DataRow {
+    void UpdateRow(RowT row);
+
+    RowT InsertNewRow(ObjT obj);
+
+    IEnumerable<RowT> FindById(Guid id);
+
+    IEnumerable<RowT> FindAll();
+
+    AdapterT TransactionalAdapter { get; }
+
+    Session Session { set; }
+  }
+}
Index: trunk/sources/HeuristicLab.DataAccess.ADOHelper/3.2/ManyToManyRelation.cs
===================================================================
--- trunk/sources/HeuristicLab.DataAccess.ADOHelper/3.2/ManyToManyRelation.cs	(revision 1580)
+++ trunk/sources/HeuristicLab.DataAccess.ADOHelper/3.2/ManyToManyRelation.cs	(revision 1580)
@@ -0,0 +1,11 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.DataAccess.Interfaces;
+
+namespace HeuristicLab.DataAccess.ADOHelper {
+  public class ManyToManyRelation: PersistableObject {
+    public Guid Id2 { get; set; }
+  }
+}
Index: trunk/sources/HeuristicLab.DataAccess.ADOHelper/3.2/ManyToManyRelationHelper.cs
===================================================================
--- trunk/sources/HeuristicLab.DataAccess.ADOHelper/3.2/ManyToManyRelationHelper.cs	(revision 1580)
+++ trunk/sources/HeuristicLab.DataAccess.ADOHelper/3.2/ManyToManyRelationHelper.cs	(revision 1580)
@@ -0,0 +1,93 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace HeuristicLab.DataAccess.ADOHelper {
+  public class ManyToManyRelationHelper<AdapterT, RowT>
+    where AdapterT : new()
+    where RowT : System.Data.DataRow
+    {
+    ITableAdapterWrapper<AdapterT, ManyToManyRelation, RowT> tableAdapterWrapper;
+    
+    public ManyToManyRelationHelper(
+      ITableAdapterWrapper<AdapterT, ManyToManyRelation, RowT> tableAdapterWrapper) {
+      this.tableAdapterWrapper = tableAdapterWrapper;
+    }
+
+    public Session Session {
+      set {
+        tableAdapterWrapper.Session = value;
+      }
+    }
+
+    public void UpdateRelationships(Guid objectA, IList<Guid> relationships) {
+      //firstly check for created references
+      IList<Guid> existing =
+        this.GetRelationships(objectA);
+
+      foreach (Guid relationship in relationships) {
+        if (!existing.Contains(relationship)) {
+          ManyToManyRelation rel = 
+            new ManyToManyRelation();
+          rel.Id = objectA;
+          rel.Id2 = relationship;
+          
+          RowT inserted = 
+            tableAdapterWrapper.InsertNewRow(rel);
+
+          tableAdapterWrapper.UpdateRow(inserted);
+        }
+      }
+
+      //secondly check for deleted references
+      ICollection<Guid> deleted =
+        new List<Guid>();
+
+      foreach (Guid relationship in existing) {
+        if(!relationships.Contains(relationship)) {
+          deleted.Add(relationship);
+        }
+      }
+
+      foreach (Guid relationship in deleted) {
+        RowT toDelete =
+          FindRow(objectA, relationship);
+        if (toDelete != null) {
+          toDelete.Delete();
+          tableAdapterWrapper.UpdateRow(toDelete);
+        }
+      }
+    }
+
+    public IList<Guid> GetRelationships(Guid objectA) {
+      IList<Guid> result =
+        new List<Guid>();
+
+      IEnumerable<RowT> rows = 
+        tableAdapterWrapper.FindById(objectA);
+
+      foreach(RowT row in rows) {
+        result.Add((Guid)row[1]);
+      }
+
+      return result;
+    }
+
+    private RowT FindRow(Guid objectA, Guid objectB) {
+      IEnumerable<RowT> rows =
+       tableAdapterWrapper.FindById(objectA);
+
+      RowT found = null;
+
+      foreach (RowT row in rows) {
+        if (row[1].Equals(objectB)) {
+          found = row;
+          break;
+        }
+      }
+
+      return found;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.DataAccess.ADOHelper/3.2/TableAdapterWrapperBase.cs
===================================================================
--- trunk/sources/HeuristicLab.DataAccess.ADOHelper/3.2/TableAdapterWrapperBase.cs	(revision 1580)
+++ trunk/sources/HeuristicLab.DataAccess.ADOHelper/3.2/TableAdapterWrapperBase.cs	(revision 1580)
@@ -0,0 +1,80 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.DataAccess.Interfaces;
+using System.Data.Common;
+
+namespace HeuristicLab.DataAccess.ADOHelper {
+  public abstract class TableAdapterWrapperBase<AdapterT, ObjT, RowT>:
+    ITableAdapterWrapper<AdapterT, ObjT, RowT>
+    where AdapterT : new()
+    where ObjT : IPersistableObject, new()
+    where RowT : System.Data.DataRow {
+    protected AdapterT adapter =
+      new AdapterT();
+
+    private ISession session;
+    
+    #region IDataAdapterWrapper<AdapterT,ObjT,RowT> Members
+
+    public AdapterT TransactionalAdapter {
+      get {
+        if (session == null)
+          throw new Exception("No session set!");
+
+        ITransaction trans =
+          session.GetCurrentTransaction();
+        if (trans != null)
+          SetTransaction(trans.InnerTransaction as DbTransaction);
+        else
+          SetTransaction(null);
+
+        return this.adapter; 
+      }
+    }
+
+    public Session Session {
+      set { 
+        this.session = value;
+
+        SetConnection(value.Connection); 
+      }
+    }
+
+    public abstract void UpdateRow(RowT row);
+
+    public abstract RowT InsertNewRow(ObjT obj);
+
+    public abstract IEnumerable<RowT> FindById(Guid id);
+
+    public abstract IEnumerable<RowT> FindAll();
+
+    protected abstract void SetConnection(DbConnection connection);
+
+    protected abstract void SetTransaction(DbTransaction transaction);
+
+    #endregion
+  }
+}
Index: trunk/sources/HeuristicLab.Hive.Contracts/3.2/BusinessObjects/HivePluginInfo.cs
===================================================================
--- trunk/sources/HeuristicLab.Hive.Contracts/3.2/BusinessObjects/HivePluginInfo.cs	(revision 1580)
+++ trunk/sources/HeuristicLab.Hive.Contracts/3.2/BusinessObjects/HivePluginInfo.cs	(revision 1580)
@@ -0,0 +1,43 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Runtime.Serialization;
+using HeuristicLab.DataAccess;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Hive.Contracts.BusinessObjects {
+
+  [DataContract]
+  public class HivePluginInfo : PersistableObject {
+    [DataMember]
+    public String Name { get; set; }
+
+    [DataMember]
+    public String Version { get; set; }
+
+    [DataMember]
+    public String BuildDate { get; set; }
+  }
+}
Index: trunk/sources/HeuristicLab.Hive.Contracts/3.2/BusinessObjects/Job.cs
===================================================================
--- trunk/sources/HeuristicLab.Hive.Contracts/3.2/BusinessObjects/Job.cs	(revision 1579)
+++ trunk/sources/HeuristicLab.Hive.Contracts/3.2/BusinessObjects/Job.cs	(revision 1580)
@@ -55,5 +55,5 @@
     public int MemoryNeeded { get; set; }
     [DataMember]
-    public List<PluginInfo> PluginsNeeded { get; set; }
+    public List<HivePluginInfo> PluginsNeeded { get; set; }
   }
 }
Index: trunk/sources/HeuristicLab.Hive.Contracts/3.2/HeuristicLab.Hive.Contracts-3.2.csproj
===================================================================
--- trunk/sources/HeuristicLab.Hive.Contracts/3.2/HeuristicLab.Hive.Contracts-3.2.csproj	(revision 1579)
+++ trunk/sources/HeuristicLab.Hive.Contracts/3.2/HeuristicLab.Hive.Contracts-3.2.csproj	(revision 1580)
@@ -88,4 +88,5 @@
     <Compile Include="ApplicationConstants.cs" />
     <Compile Include="BusinessObjects\ClientGroup.cs" />
+    <Compile Include="BusinessObjects\HivePluginInfo.cs" />
     <Compile Include="BusinessObjects\HeartBeatData.cs" />
     <Compile Include="BusinessObjects\Job.cs" />
Index: trunk/sources/HeuristicLab.Hive.Engine/3.2/HiveEngine.cs
===================================================================
--- trunk/sources/HeuristicLab.Hive.Engine/3.2/HiveEngine.cs	(revision 1579)
+++ trunk/sources/HeuristicLab.Hive.Engine/3.2/HiveEngine.cs	(revision 1580)
@@ -29,4 +29,5 @@
 using HeuristicLab.Hive.Contracts;
 using HeuristicLab.PluginInfrastructure;
+using HeuristicLab.Hive.Contracts.BusinessObjects;
 
 namespace HeuristicLab.Hive.Engine {
@@ -81,5 +82,19 @@
       jobObj.SerializedJob = PersistenceManager.SaveToGZip(job);
       jobObj.State = HeuristicLab.Hive.Contracts.BusinessObjects.State.offline;
-      jobObj.PluginsNeeded = dependentPlugins;
+
+      List<HivePluginInfo> pluginsNeeded =
+        new List<HivePluginInfo>();
+
+      foreach (PluginInfo info in dependentPlugins) {
+        HivePluginInfo pluginInfo = 
+          new HivePluginInfo();
+        pluginInfo.Name = info.Name;
+        pluginInfo.Version = info.Version.ToString();
+        pluginInfo.BuildDate = info.BuildDate.ToString();
+
+        pluginsNeeded.Add(pluginInfo);
+      }
+
+      jobObj.PluginsNeeded = pluginsNeeded;
       ResponseObject<Contracts.BusinessObjects.Job> res = executionEngineFacade.AddJob(jobObj);
       jobId = res.Obj.Id;
Index: trunk/sources/HeuristicLab.Hive.Server.ADODataAccess/3.2/ClientAdapter.cs
===================================================================
--- trunk/sources/HeuristicLab.Hive.Server.ADODataAccess/3.2/ClientAdapter.cs	(revision 1579)
+++ trunk/sources/HeuristicLab.Hive.Server.ADODataAccess/3.2/ClientAdapter.cs	(revision 1580)
@@ -32,46 +32,7 @@
 using System.Data.Common;
 using System.Data.SqlClient;
+using HeuristicLab.Hive.Server.ADODataAccess.TableAdapterWrapper;
 
 namespace HeuristicLab.Hive.Server.ADODataAccess {
-  class ClientAdapterWrapper :
-    DataAdapterWrapperBase<
-        dsHiveServerTableAdapters.ClientTableAdapter,
-    ClientInfo,
-    dsHiveServer.ClientRow> {
-    public override void UpdateRow(dsHiveServer.ClientRow row) {
-      TransactionalAdapter.Update(row);
-    }
-
-    public override dsHiveServer.ClientRow
-      InsertNewRow(ClientInfo client) {
-      dsHiveServer.ClientDataTable data =
-        new dsHiveServer.ClientDataTable();
-
-      dsHiveServer.ClientRow row = data.NewClientRow();
-      row.ResourceId = client.Id;
-      data.AddClientRow(row);
-
-      return row;
-    }
-
-    public override IEnumerable<dsHiveServer.ClientRow>
-      FindById(Guid id) {
-      return TransactionalAdapter.GetDataById(id);
-    }
-
-    public override IEnumerable<dsHiveServer.ClientRow>
-      FindAll() {
-      return TransactionalAdapter.GetData();
-    }
-
-    protected override void SetConnection(DbConnection connection) {
-      adapter.Connection = connection as SqlConnection;
-    }
-
-    protected override void SetTransaction(DbTransaction transaction) {
-      adapter.Transaction = transaction as SqlTransaction;
-    }
-  }
-
   class ClientAdapter: 
     DataAdapterBase<
Index: trunk/sources/HeuristicLab.Hive.Server.ADODataAccess/3.2/ClientGroupAdapter.cs
===================================================================
--- trunk/sources/HeuristicLab.Hive.Server.ADODataAccess/3.2/ClientGroupAdapter.cs	(revision 1579)
+++ trunk/sources/HeuristicLab.Hive.Server.ADODataAccess/3.2/ClientGroupAdapter.cs	(revision 1580)
@@ -32,95 +32,7 @@
 using System.Data.Common;
 using System.Data.SqlClient;
+using HeuristicLab.Hive.Server.ADODataAccess.TableAdapterWrapper;
 
 namespace HeuristicLab.Hive.Server.ADODataAccess {
-  class ClientGroupAdapterWrapper :
-    DataAdapterWrapperBase<dsHiveServerTableAdapters.ClientGroupTableAdapter,
-    ClientGroup,
-    dsHiveServer.ClientGroupRow> {
-    public override dsHiveServer.ClientGroupRow
-     InsertNewRow(ClientGroup group) {
-      dsHiveServer.ClientGroupDataTable data =
-         new dsHiveServer.ClientGroupDataTable();
-
-      dsHiveServer.ClientGroupRow row =
-        data.NewClientGroupRow();
-
-      row.ResourceId = group.Id;
-
-      data.AddClientGroupRow(row);
-      TransactionalAdapter.Update(row);
-
-      return row;
-    }
-
-    public override void
-      UpdateRow(dsHiveServer.ClientGroupRow row) {
-      TransactionalAdapter.Update(row);
-    }
-
-    public override IEnumerable<dsHiveServer.ClientGroupRow>
-      FindById(Guid id) {
-      return TransactionalAdapter.GetDataById(id);
-    }
-
-    public override IEnumerable<dsHiveServer.ClientGroupRow>
-      FindAll() {
-      return TransactionalAdapter.GetData();
-    }
-
-    protected override void SetConnection(DbConnection connection) {
-      adapter.Connection = connection as SqlConnection;
-    }
-
-    protected override void SetTransaction(DbTransaction transaction) {
-      adapter.Transaction = transaction as SqlTransaction;
-    }
-  }
-
-  class ClientGroup_ResourceAdapterWrapper :
-  DataAdapterWrapperBase<dsHiveServerTableAdapters.ClientGroup_ResourceTableAdapter,
-  BinaryRelation,
-  dsHiveServer.ClientGroup_ResourceRow> {
-    public override dsHiveServer.ClientGroup_ResourceRow
-     InsertNewRow(BinaryRelation relation) {
-      dsHiveServer.ClientGroup_ResourceDataTable data =
-         new dsHiveServer.ClientGroup_ResourceDataTable();
-
-      dsHiveServer.ClientGroup_ResourceRow row =
-        data.NewClientGroup_ResourceRow();
-
-      row.ClientGroupId = relation.Id;
-      row.ResourceId = relation.Id2;
-
-      data.AddClientGroup_ResourceRow(row);
-      TransactionalAdapter.Update(row);
-
-      return row;
-    }
-
-    public override void
-      UpdateRow(dsHiveServer.ClientGroup_ResourceRow row) {
-      TransactionalAdapter.Update(row);
-    }
-
-    public override IEnumerable<dsHiveServer.ClientGroup_ResourceRow>
-      FindById(Guid id) {
-      return TransactionalAdapter.GetDataByClientGroupId(id);
-    }
-
-    public override IEnumerable<dsHiveServer.ClientGroup_ResourceRow>
-      FindAll() {
-      return TransactionalAdapter.GetData();
-    }
-
-    protected override void SetConnection(DbConnection connection) {
-      adapter.Connection = connection as SqlConnection;
-    }
-
-    protected override void SetTransaction(DbTransaction transaction) {
-      adapter.Transaction = transaction as SqlTransaction;
-    }
-  }
-  
   class ClientGroupAdapter : 
     DataAdapterBase<dsHiveServerTableAdapters.ClientGroupTableAdapter, 
@@ -129,20 +41,20 @@
     IClientGroupAdapter {
     #region Fields
-    private BinaryRelationHelper<
+    private ManyToManyRelationHelper<
       dsHiveServerTableAdapters.ClientGroup_ResourceTableAdapter, 
-      dsHiveServer.ClientGroup_ResourceRow> binaryRelationHelper = null;
+      dsHiveServer.ClientGroup_ResourceRow> manyToManyRelationHelper = null;
 
-    private BinaryRelationHelper<dsHiveServerTableAdapters.ClientGroup_ResourceTableAdapter, 
-      dsHiveServer.ClientGroup_ResourceRow> BinaryRelationHelper {
+    private ManyToManyRelationHelper<dsHiveServerTableAdapters.ClientGroup_ResourceTableAdapter, 
+      dsHiveServer.ClientGroup_ResourceRow> ManyToManyRelationHelper {
       get {
-        if (binaryRelationHelper == null) {
-          binaryRelationHelper =
-            new BinaryRelationHelper<dsHiveServerTableAdapters.ClientGroup_ResourceTableAdapter,
+        if (manyToManyRelationHelper == null) {
+          manyToManyRelationHelper =
+            new ManyToManyRelationHelper<dsHiveServerTableAdapters.ClientGroup_ResourceTableAdapter,
               dsHiveServer.ClientGroup_ResourceRow>(new ClientGroup_ResourceAdapterWrapper());
         }
 
-        binaryRelationHelper.Session = Session as Session;
+        manyToManyRelationHelper.Session = Session as Session;
 
-        return binaryRelationHelper;
+        return manyToManyRelationHelper;
       }
     }
@@ -186,5 +98,5 @@
 
         ICollection<Guid> resources =
-          BinaryRelationHelper.GetRelationships(clientGroup.Id);
+          ManyToManyRelationHelper.GetRelationships(clientGroup.Id);
 
        clientGroup.Resources.Clear();
@@ -240,5 +152,5 @@
         }
 
-        BinaryRelationHelper.UpdateRelationships(group.Id,
+        ManyToManyRelationHelper.UpdateRelationships(group.Id,
           relationships);
       }
@@ -264,5 +176,5 @@
       if (group != null) {
         //delete all relationships
-        BinaryRelationHelper.UpdateRelationships(group.Id,
+        ManyToManyRelationHelper.UpdateRelationships(group.Id,
           new List<Guid>());
 
Index: trunk/sources/HeuristicLab.Hive.Server.ADODataAccess/3.2/HeuristicLab.Hive.Server.ADODataAccess-3.2.csproj
===================================================================
--- trunk/sources/HeuristicLab.Hive.Server.ADODataAccess/3.2/HeuristicLab.Hive.Server.ADODataAccess-3.2.csproj	(revision 1579)
+++ trunk/sources/HeuristicLab.Hive.Server.ADODataAccess/3.2/HeuristicLab.Hive.Server.ADODataAccess-3.2.csproj	(revision 1580)
@@ -94,4 +94,5 @@
     <Compile Include="JobAdapter.cs" />
     <Compile Include="JobResultsAdapter.cs" />
+    <Compile Include="PluginInfoAdapter.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
     <Compile Include="Properties\Settings.Designer.cs">
@@ -101,4 +102,12 @@
     </Compile>
     <Compile Include="ResourceAdapter.cs" />
+    <Compile Include="TableAdapterWrapper\ClientAdapterWrapper.cs" />
+    <Compile Include="TableAdapterWrapper\ClientGroupAdapterWrapper.cs" />
+    <Compile Include="TableAdapterWrapper\ClientGroup_ResourceAdapterWrapper.cs" />
+    <Compile Include="TableAdapterWrapper\RequiredPluginsAdapterWrapper.cs" />
+    <Compile Include="TableAdapterWrapper\PluginInfoAdapterWrapper.cs" />
+    <Compile Include="TableAdapterWrapper\ResourceAdapterWrapper.cs" />
+    <Compile Include="TableAdapterWrapper\JobResultsAdapterWrapper.cs" />
+    <Compile Include="TableAdapterWrapper\JobAdapterWrapper.cs" />
   </ItemGroup>
   <ItemGroup>
Index: trunk/sources/HeuristicLab.Hive.Server.ADODataAccess/3.2/JobAdapter.cs
===================================================================
--- trunk/sources/HeuristicLab.Hive.Server.ADODataAccess/3.2/JobAdapter.cs	(revision 1579)
+++ trunk/sources/HeuristicLab.Hive.Server.ADODataAccess/3.2/JobAdapter.cs	(revision 1580)
@@ -31,45 +31,7 @@
 using System.Data.Common;
 using System.Data.SqlClient;
+using HeuristicLab.Hive.Server.ADODataAccess.TableAdapterWrapper;
 
 namespace HeuristicLab.Hive.Server.ADODataAccess {
-  class JobAdapterWrapper :
-    DataAdapterWrapperBase<dsHiveServerTableAdapters.JobTableAdapter,
-                      Job,
-                      dsHiveServer.JobRow> {    
-    public override void UpdateRow(dsHiveServer.JobRow row) {
-      TransactionalAdapter.Update(row);
-    }
-
-    public override dsHiveServer.JobRow
-      InsertNewRow(Job job) {
-      dsHiveServer.JobDataTable data =
-        new dsHiveServer.JobDataTable();
-
-      dsHiveServer.JobRow row = data.NewJobRow();
-      row.JobId = job.Id;
-      data.AddJobRow(row);
-
-      return row;
-    }
-
-    public override IEnumerable<dsHiveServer.JobRow>
-      FindById(Guid id) {
-      return TransactionalAdapter.GetDataById(id);
-    }
-
-    public override IEnumerable<dsHiveServer.JobRow>
-      FindAll() {
-      return TransactionalAdapter.GetData();
-    }
-
-    protected override void SetConnection(DbConnection connection) {
-      adapter.Connection = connection as SqlConnection;
-    }
-
-    protected override void SetTransaction(DbTransaction transaction) {
-      adapter.Transaction = transaction as SqlTransaction;
-    }
-  }
-  
   class JobAdapter :
     DataAdapterBase<dsHiveServerTableAdapters.JobTableAdapter,
@@ -78,4 +40,24 @@
     IJobAdapter {
     #region Fields
+    private ManyToManyRelationHelper<
+      dsHiveServerTableAdapters.RequiredPluginsTableAdapter,
+      dsHiveServer.RequiredPluginsRow> manyToManyRelationHelper = null;
+
+    private ManyToManyRelationHelper<
+      dsHiveServerTableAdapters.RequiredPluginsTableAdapter,
+      dsHiveServer.RequiredPluginsRow> ManyToManyRelationHelper {
+      get {
+        if (manyToManyRelationHelper == null) {
+          manyToManyRelationHelper =
+            new ManyToManyRelationHelper<dsHiveServerTableAdapters.RequiredPluginsTableAdapter,
+              dsHiveServer.RequiredPluginsRow>(new RequiredPluginsAdapterWrapper());
+        }
+
+        manyToManyRelationHelper.Session = Session as Session;
+
+        return manyToManyRelationHelper;
+      }
+    }
+
     private IClientAdapter clientAdapter = null;
 
@@ -102,4 +84,17 @@
       }
     }
+
+    private IPluginInfoAdapter pluginInfoAdapter = null;
+
+    private IPluginInfoAdapter PluginInfoAdapter {
+      get {
+        if (pluginInfoAdapter == null) {
+          pluginInfoAdapter =
+            this.Session.GetDataAdapter<HivePluginInfo, IPluginInfoAdapter>();
+        }
+
+        return pluginInfoAdapter;
+      }
+    }
     #endregion
 
@@ -167,4 +162,15 @@
         else
           job.MemoryNeeded = default(int);
+
+        ICollection<Guid> requiredPlugins =
+          ManyToManyRelationHelper.GetRelationships(job.Id);
+        
+        job.PluginsNeeded.Clear();
+        foreach (Guid requiredPlugin in requiredPlugins) {
+          HivePluginInfo pluginInfo = 
+            PluginInfoAdapter.GetById(requiredPlugin);
+
+          job.PluginsNeeded.Add(pluginInfo);
+        }
 
         return job;
@@ -296,4 +302,19 @@
     }
 
+    protected override void doUpdate(Job obj) {
+      base.doUpdate(obj);
+
+      //update relationships
+      List<Guid> relationships =
+        new List<Guid>();
+      foreach (HivePluginInfo pluginInfo in obj.PluginsNeeded) {
+        PluginInfoAdapter.Update(pluginInfo);
+        relationships.Add(pluginInfo.Id);
+      }
+
+      ManyToManyRelationHelper.UpdateRelationships(
+        obj.Id, relationships);
+    }
+
     protected override bool doDelete(Job job) {
       if (job != null) {
@@ -310,4 +331,8 @@
           }
 
+          //delete all relationships
+          ManyToManyRelationHelper.UpdateRelationships(job.Id,
+            new List<Guid>());
+
           return base.doDelete(job);
         }
Index: trunk/sources/HeuristicLab.Hive.Server.ADODataAccess/3.2/JobResultsAdapter.cs
===================================================================
--- trunk/sources/HeuristicLab.Hive.Server.ADODataAccess/3.2/JobResultsAdapter.cs	(revision 1579)
+++ trunk/sources/HeuristicLab.Hive.Server.ADODataAccess/3.2/JobResultsAdapter.cs	(revision 1580)
@@ -9,42 +9,7 @@
 using System.Data.Common;
 using System.Data.SqlClient;
+using HeuristicLab.Hive.Server.ADODataAccess.TableAdapterWrapper;
 
 namespace HeuristicLab.Hive.Server.ADODataAccess {
-  class JobResultsAdapterWrapper :
-    DataAdapterWrapperBase<dsHiveServerTableAdapters.JobResultTableAdapter,
-                    JobResult,
-                    dsHiveServer.JobResultRow> {    
-    public override void UpdateRow(dsHiveServer.JobResultRow row) {
-      TransactionalAdapter.Update(row);
-    }
-
-    public override dsHiveServer.JobResultRow InsertNewRow(JobResult obj) {
-      dsHiveServer.JobResultDataTable data =
-        new dsHiveServer.JobResultDataTable();
-
-      dsHiveServer.JobResultRow row = data.NewJobResultRow();
-      row.JobResultId = obj.Id;
-      data.AddJobResultRow(row);
-
-      return row;
-    }
-
-    public override IEnumerable<dsHiveServer.JobResultRow> FindById(Guid id) {
-      return TransactionalAdapter.GetDataById(id);
-    }
-
-    public override IEnumerable<dsHiveServer.JobResultRow> FindAll() {
-      return TransactionalAdapter.GetData();
-    }
-
-    protected override void SetConnection(DbConnection connection) {
-      adapter.Connection = connection as SqlConnection;
-    }
-
-    protected override void SetTransaction(DbTransaction transaction) {
-      adapter.Transaction = transaction as SqlTransaction;
-    }
-  }
-
   class JobResultsAdapter: 
     DataAdapterBase<dsHiveServerTableAdapters.JobResultTableAdapter, 
Index: trunk/sources/HeuristicLab.Hive.Server.ADODataAccess/3.2/PluginInfoAdapter.cs
===================================================================
--- trunk/sources/HeuristicLab.Hive.Server.ADODataAccess/3.2/PluginInfoAdapter.cs	(revision 1580)
+++ trunk/sources/HeuristicLab.Hive.Server.ADODataAccess/3.2/PluginInfoAdapter.cs	(revision 1580)
@@ -0,0 +1,67 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Hive.Server.DataAccess;
+using HeuristicLab.DataAccess.ADOHelper;
+using HeuristicLab.Hive.Contracts.BusinessObjects;
+using HeuristicLab.Hive.Server.ADODataAccess.TableAdapterWrapper;
+using System.Xml.Serialization;
+using HeuristicLab.PluginInfrastructure;
+using System.IO;
+
+namespace HeuristicLab.Hive.Server.ADODataAccess {
+  class PluginInfoAdapter:
+    DataAdapterBase<dsHiveServerTableAdapters.PluginInfoTableAdapter,
+      HivePluginInfo,
+      dsHiveServer.PluginInfoRow>,
+    IPluginInfoAdapter {
+
+    public PluginInfoAdapter() : 
+      base(new PluginInfoAdapterWrapper()) {
+    }
+
+    protected override dsHiveServer.PluginInfoRow ConvertObj(HivePluginInfo pluginInfo, 
+      dsHiveServer.PluginInfoRow row) {
+      if (row != null && pluginInfo != null) {
+        row.PluginId = pluginInfo.Id;
+        row.Name = pluginInfo.Name;
+        row.Version = pluginInfo.Version;
+        row.BuildDate = pluginInfo.BuildDate;
+
+        return row;
+      } else {
+        return null;
+      }       
+    }
+
+    protected override HivePluginInfo ConvertRow(dsHiveServer.PluginInfoRow row,
+      HivePluginInfo pluginInfo) {
+      if (row != null && pluginInfo != null) {
+        pluginInfo.Id = row.PluginId;
+
+        if (!row.IsNameNull()) {
+          pluginInfo.Name = row.Name;
+        } else {
+          pluginInfo.Name = null;
+        }
+
+        if (!row.IsVersionNull()) {
+          pluginInfo.Version = row.Version;
+        } else {
+          pluginInfo.Version = null;
+        }
+
+        if (!row.IsBuildDateNull()) {
+          pluginInfo.BuildDate = row.BuildDate;
+        } else {
+          pluginInfo.BuildDate = null;
+        }
+
+        return pluginInfo;
+      } else {
+        return null;
+      } 
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Hive.Server.ADODataAccess/3.2/ResourceAdapter.cs
===================================================================
--- trunk/sources/HeuristicLab.Hive.Server.ADODataAccess/3.2/ResourceAdapter.cs	(revision 1579)
+++ trunk/sources/HeuristicLab.Hive.Server.ADODataAccess/3.2/ResourceAdapter.cs	(revision 1580)
@@ -30,46 +30,7 @@
 using System.Data.Common;
 using System.Data.SqlClient;
+using HeuristicLab.Hive.Server.ADODataAccess.TableAdapterWrapper;
 
 namespace HeuristicLab.Hive.Server.ADODataAccess {
-  class ResourceAdapterWrapper :
-    DataAdapterWrapperBase<
-      dsHiveServerTableAdapters.ResourceTableAdapter,
-      Resource,
-      dsHiveServer.ResourceRow> {    
-    public override void UpdateRow(dsHiveServer.ResourceRow row) {
-      TransactionalAdapter.Update(row);
-    }
-
-    public override dsHiveServer.ResourceRow
-      InsertNewRow(Resource resource) {
-      dsHiveServer.ResourceDataTable data =
-        new dsHiveServer.ResourceDataTable();
-
-      dsHiveServer.ResourceRow row = data.NewResourceRow();
-      row.ResourceId = resource.Id;
-      data.AddResourceRow(row);
-
-      return row;
-    }
-
-    public override IEnumerable<dsHiveServer.ResourceRow>
-      FindById(Guid id) {
-      return TransactionalAdapter.GetDataById(id);
-    }
-
-    public override IEnumerable<dsHiveServer.ResourceRow>
-      FindAll() {
-      return TransactionalAdapter.GetData();
-    }
-
-    protected override void SetConnection(DbConnection connection) {
-      adapter.Connection = connection as SqlConnection;
-    }
-
-    protected override void SetTransaction(DbTransaction transaction) {
-      adapter.Transaction = transaction as SqlTransaction;
-    }
-  }
-  
   class ResourceAdapter: 
     DataAdapterBase<
Index: trunk/sources/HeuristicLab.Hive.Server.ADODataAccess/3.2/TableAdapterWrapper/ClientAdapterWrapper.cs
===================================================================
--- trunk/sources/HeuristicLab.Hive.Server.ADODataAccess/3.2/TableAdapterWrapper/ClientAdapterWrapper.cs	(revision 1580)
+++ trunk/sources/HeuristicLab.Hive.Server.ADODataAccess/3.2/TableAdapterWrapper/ClientAdapterWrapper.cs	(revision 1580)
@@ -0,0 +1,50 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.DataAccess.ADOHelper;
+using System.Data.SqlClient;
+using HeuristicLab.Hive.Contracts.BusinessObjects;
+using System.Data.Common;
+
+namespace HeuristicLab.Hive.Server.ADODataAccess.TableAdapterWrapper {
+  class ClientAdapterWrapper :
+   TableAdapterWrapperBase<
+       dsHiveServerTableAdapters.ClientTableAdapter,
+   ClientInfo,
+   dsHiveServer.ClientRow> {
+    public override void UpdateRow(dsHiveServer.ClientRow row) {
+      TransactionalAdapter.Update(row);
+    }
+
+    public override dsHiveServer.ClientRow
+      InsertNewRow(ClientInfo client) {
+      dsHiveServer.ClientDataTable data =
+        new dsHiveServer.ClientDataTable();
+
+      dsHiveServer.ClientRow row = data.NewClientRow();
+      row.ResourceId = client.Id;
+      data.AddClientRow(row);
+
+      return row;
+    }
+
+    public override IEnumerable<dsHiveServer.ClientRow>
+      FindById(Guid id) {
+      return TransactionalAdapter.GetDataById(id);
+    }
+
+    public override IEnumerable<dsHiveServer.ClientRow>
+      FindAll() {
+      return TransactionalAdapter.GetData();
+    }
+
+    protected override void SetConnection(DbConnection connection) {
+      adapter.Connection = connection as SqlConnection;
+    }
+
+    protected override void SetTransaction(DbTransaction transaction) {
+      adapter.Transaction = transaction as SqlTransaction;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Hive.Server.ADODataAccess/3.2/TableAdapterWrapper/ClientGroupAdapterWrapper.cs
===================================================================
--- trunk/sources/HeuristicLab.Hive.Server.ADODataAccess/3.2/TableAdapterWrapper/ClientGroupAdapterWrapper.cs	(revision 1580)
+++ trunk/sources/HeuristicLab.Hive.Server.ADODataAccess/3.2/TableAdapterWrapper/ClientGroupAdapterWrapper.cs	(revision 1580)
@@ -0,0 +1,54 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.DataAccess.ADOHelper;
+using System.Data.SqlClient;
+using HeuristicLab.Hive.Contracts.BusinessObjects;
+using System.Data.Common;
+
+namespace HeuristicLab.Hive.Server.ADODataAccess.TableAdapterWrapper {
+  class ClientGroupAdapterWrapper :
+    TableAdapterWrapperBase<dsHiveServerTableAdapters.ClientGroupTableAdapter,
+    ClientGroup,
+    dsHiveServer.ClientGroupRow> {
+    public override dsHiveServer.ClientGroupRow
+     InsertNewRow(ClientGroup group) {
+      dsHiveServer.ClientGroupDataTable data =
+         new dsHiveServer.ClientGroupDataTable();
+
+      dsHiveServer.ClientGroupRow row =
+        data.NewClientGroupRow();
+
+      row.ResourceId = group.Id;
+
+      data.AddClientGroupRow(row);
+      TransactionalAdapter.Update(row);
+
+      return row;
+    }
+
+    public override void
+      UpdateRow(dsHiveServer.ClientGroupRow row) {
+      TransactionalAdapter.Update(row);
+    }
+
+    public override IEnumerable<dsHiveServer.ClientGroupRow>
+      FindById(Guid id) {
+      return TransactionalAdapter.GetDataById(id);
+    }
+
+    public override IEnumerable<dsHiveServer.ClientGroupRow>
+      FindAll() {
+      return TransactionalAdapter.GetData();
+    }
+
+    protected override void SetConnection(DbConnection connection) {
+      adapter.Connection = connection as SqlConnection;
+    }
+
+    protected override void SetTransaction(DbTransaction transaction) {
+      adapter.Transaction = transaction as SqlTransaction;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Hive.Server.ADODataAccess/3.2/TableAdapterWrapper/ClientGroup_ResourceAdapterWrapper.cs
===================================================================
--- trunk/sources/HeuristicLab.Hive.Server.ADODataAccess/3.2/TableAdapterWrapper/ClientGroup_ResourceAdapterWrapper.cs	(revision 1580)
+++ trunk/sources/HeuristicLab.Hive.Server.ADODataAccess/3.2/TableAdapterWrapper/ClientGroup_ResourceAdapterWrapper.cs	(revision 1580)
@@ -0,0 +1,55 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.DataAccess.ADOHelper;
+using System.Data.SqlClient;
+using HeuristicLab.Hive.Contracts.BusinessObjects;
+using System.Data.Common;
+
+namespace HeuristicLab.Hive.Server.ADODataAccess.TableAdapterWrapper {
+  class ClientGroup_ResourceAdapterWrapper :
+  TableAdapterWrapperBase<dsHiveServerTableAdapters.ClientGroup_ResourceTableAdapter,
+  ManyToManyRelation,
+  dsHiveServer.ClientGroup_ResourceRow> {
+    public override dsHiveServer.ClientGroup_ResourceRow
+     InsertNewRow(ManyToManyRelation relation) {
+      dsHiveServer.ClientGroup_ResourceDataTable data =
+         new dsHiveServer.ClientGroup_ResourceDataTable();
+
+      dsHiveServer.ClientGroup_ResourceRow row =
+        data.NewClientGroup_ResourceRow();
+
+      row.ClientGroupId = relation.Id;
+      row.ResourceId = relation.Id2;
+
+      data.AddClientGroup_ResourceRow(row);
+      TransactionalAdapter.Update(row);
+
+      return row;
+    }
+
+    public override void
+      UpdateRow(dsHiveServer.ClientGroup_ResourceRow row) {
+      TransactionalAdapter.Update(row);
+    }
+
+    public override IEnumerable<dsHiveServer.ClientGroup_ResourceRow>
+      FindById(Guid id) {
+      return TransactionalAdapter.GetDataByClientGroupId(id);
+    }
+
+    public override IEnumerable<dsHiveServer.ClientGroup_ResourceRow>
+      FindAll() {
+      return TransactionalAdapter.GetData();
+    }
+
+    protected override void SetConnection(DbConnection connection) {
+      adapter.Connection = connection as SqlConnection;
+    }
+
+    protected override void SetTransaction(DbTransaction transaction) {
+      adapter.Transaction = transaction as SqlTransaction;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Hive.Server.ADODataAccess/3.2/TableAdapterWrapper/JobAdapterWrapper.cs
===================================================================
--- trunk/sources/HeuristicLab.Hive.Server.ADODataAccess/3.2/TableAdapterWrapper/JobAdapterWrapper.cs	(revision 1580)
+++ trunk/sources/HeuristicLab.Hive.Server.ADODataAccess/3.2/TableAdapterWrapper/JobAdapterWrapper.cs	(revision 1580)
@@ -0,0 +1,49 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.DataAccess.ADOHelper;
+using System.Data.SqlClient;
+using HeuristicLab.Hive.Contracts.BusinessObjects;
+using System.Data.Common;
+
+namespace HeuristicLab.Hive.Server.ADODataAccess.TableAdapterWrapper {
+  class JobAdapterWrapper :
+    TableAdapterWrapperBase<dsHiveServerTableAdapters.JobTableAdapter,
+                      Job,
+                      dsHiveServer.JobRow> {
+    public override void UpdateRow(dsHiveServer.JobRow row) {
+      TransactionalAdapter.Update(row);
+    }
+
+    public override dsHiveServer.JobRow
+      InsertNewRow(Job job) {
+      dsHiveServer.JobDataTable data =
+        new dsHiveServer.JobDataTable();
+
+      dsHiveServer.JobRow row = data.NewJobRow();
+      row.JobId = job.Id;
+      data.AddJobRow(row);
+
+      return row;
+    }
+
+    public override IEnumerable<dsHiveServer.JobRow>
+      FindById(Guid id) {
+      return TransactionalAdapter.GetDataById(id);
+    }
+
+    public override IEnumerable<dsHiveServer.JobRow>
+      FindAll() {
+      return TransactionalAdapter.GetData();
+    }
+
+    protected override void SetConnection(DbConnection connection) {
+      adapter.Connection = connection as SqlConnection;
+    }
+
+    protected override void SetTransaction(DbTransaction transaction) {
+      adapter.Transaction = transaction as SqlTransaction;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Hive.Server.ADODataAccess/3.2/TableAdapterWrapper/JobResultsAdapterWrapper.cs
===================================================================
--- trunk/sources/HeuristicLab.Hive.Server.ADODataAccess/3.2/TableAdapterWrapper/JobResultsAdapterWrapper.cs	(revision 1580)
+++ trunk/sources/HeuristicLab.Hive.Server.ADODataAccess/3.2/TableAdapterWrapper/JobResultsAdapterWrapper.cs	(revision 1580)
@@ -0,0 +1,46 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.DataAccess.ADOHelper;
+using System.Data.SqlClient;
+using HeuristicLab.Hive.Contracts.BusinessObjects;
+using System.Data.Common;
+
+namespace HeuristicLab.Hive.Server.ADODataAccess.TableAdapterWrapper {
+  class JobResultsAdapterWrapper :
+    TableAdapterWrapperBase<dsHiveServerTableAdapters.JobResultTableAdapter,
+                    JobResult,
+                    dsHiveServer.JobResultRow> {
+    public override void UpdateRow(dsHiveServer.JobResultRow row) {
+      TransactionalAdapter.Update(row);
+    }
+
+    public override dsHiveServer.JobResultRow InsertNewRow(JobResult obj) {
+      dsHiveServer.JobResultDataTable data =
+        new dsHiveServer.JobResultDataTable();
+
+      dsHiveServer.JobResultRow row = data.NewJobResultRow();
+      row.JobResultId = obj.Id;
+      data.AddJobResultRow(row);
+
+      return row;
+    }
+
+    public override IEnumerable<dsHiveServer.JobResultRow> FindById(Guid id) {
+      return TransactionalAdapter.GetDataById(id);
+    }
+
+    public override IEnumerable<dsHiveServer.JobResultRow> FindAll() {
+      return TransactionalAdapter.GetData();
+    }
+
+    protected override void SetConnection(DbConnection connection) {
+      adapter.Connection = connection as SqlConnection;
+    }
+
+    protected override void SetTransaction(DbTransaction transaction) {
+      adapter.Transaction = transaction as SqlTransaction;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Hive.Server.ADODataAccess/3.2/TableAdapterWrapper/PluginInfoAdapterWrapper.cs
===================================================================
--- trunk/sources/HeuristicLab.Hive.Server.ADODataAccess/3.2/TableAdapterWrapper/PluginInfoAdapterWrapper.cs	(revision 1580)
+++ trunk/sources/HeuristicLab.Hive.Server.ADODataAccess/3.2/TableAdapterWrapper/PluginInfoAdapterWrapper.cs	(revision 1580)
@@ -0,0 +1,50 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.DataAccess.ADOHelper;
+using System.Data.SqlClient;
+using HeuristicLab.Hive.Contracts.BusinessObjects;
+using System.Data.Common;
+
+namespace HeuristicLab.Hive.Server.ADODataAccess.TableAdapterWrapper {
+  class PluginInfoAdapterWrapper :
+   TableAdapterWrapperBase<
+       dsHiveServerTableAdapters.PluginInfoTableAdapter,
+   HivePluginInfo,
+   dsHiveServer.PluginInfoRow> {
+    public override void UpdateRow(dsHiveServer.PluginInfoRow row) {
+      TransactionalAdapter.Update(row);
+    }
+
+    public override dsHiveServer.PluginInfoRow
+      InsertNewRow(HivePluginInfo pluginInfo) {
+      dsHiveServer.PluginInfoDataTable data =
+        new dsHiveServer.PluginInfoDataTable();
+
+      dsHiveServer.PluginInfoRow row = data.NewPluginInfoRow();
+      row.PluginId = pluginInfo.Id;
+      data.AddPluginInfoRow(row);
+
+      return row;
+    }
+
+    public override IEnumerable<dsHiveServer.PluginInfoRow>
+      FindById(Guid id) {
+      return TransactionalAdapter.GetDataById(id);
+    }
+
+    public override IEnumerable<dsHiveServer.PluginInfoRow>
+      FindAll() {
+      return TransactionalAdapter.GetData();
+    }
+
+    protected override void SetConnection(DbConnection connection) {
+      adapter.Connection = connection as SqlConnection;
+    }
+
+    protected override void SetTransaction(DbTransaction transaction) {
+      adapter.Transaction = transaction as SqlTransaction;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Hive.Server.ADODataAccess/3.2/TableAdapterWrapper/RequiredPluginsAdapterWrapper.cs
===================================================================
--- trunk/sources/HeuristicLab.Hive.Server.ADODataAccess/3.2/TableAdapterWrapper/RequiredPluginsAdapterWrapper.cs	(revision 1580)
+++ trunk/sources/HeuristicLab.Hive.Server.ADODataAccess/3.2/TableAdapterWrapper/RequiredPluginsAdapterWrapper.cs	(revision 1580)
@@ -0,0 +1,55 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.DataAccess.ADOHelper;
+using System.Data.SqlClient;
+using HeuristicLab.Hive.Contracts.BusinessObjects;
+using System.Data.Common;
+
+namespace HeuristicLab.Hive.Server.ADODataAccess.TableAdapterWrapper {
+  class RequiredPluginsAdapterWrapper :
+  TableAdapterWrapperBase<dsHiveServerTableAdapters.RequiredPluginsTableAdapter,
+  ManyToManyRelation,
+  dsHiveServer.RequiredPluginsRow> {
+    public override dsHiveServer.RequiredPluginsRow
+     InsertNewRow(ManyToManyRelation relation) {
+      dsHiveServer.RequiredPluginsDataTable data =
+         new dsHiveServer.RequiredPluginsDataTable();
+
+      dsHiveServer.RequiredPluginsRow row =
+        data.NewRequiredPluginsRow();
+
+      row.JobId = relation.Id;
+      row.PluginId = relation.Id2;
+
+      data.AddRequiredPluginsRow(row);
+      TransactionalAdapter.Update(row);
+
+      return row;
+    }
+
+    public override void
+      UpdateRow(dsHiveServer.RequiredPluginsRow row) {
+      TransactionalAdapter.Update(row);
+    }
+
+    public override IEnumerable<dsHiveServer.RequiredPluginsRow>
+      FindById(Guid id) {
+      return TransactionalAdapter.GetDataById(id);
+    }
+
+    public override IEnumerable<dsHiveServer.RequiredPluginsRow>
+      FindAll() {
+      return TransactionalAdapter.GetData();
+    }
+
+    protected override void SetConnection(DbConnection connection) {
+      adapter.Connection = connection as SqlConnection;
+    }
+
+    protected override void SetTransaction(DbTransaction transaction) {
+      adapter.Transaction = transaction as SqlTransaction;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Hive.Server.ADODataAccess/3.2/TableAdapterWrapper/ResourceAdapterWrapper.cs
===================================================================
--- trunk/sources/HeuristicLab.Hive.Server.ADODataAccess/3.2/TableAdapterWrapper/ResourceAdapterWrapper.cs	(revision 1580)
+++ trunk/sources/HeuristicLab.Hive.Server.ADODataAccess/3.2/TableAdapterWrapper/ResourceAdapterWrapper.cs	(revision 1580)
@@ -0,0 +1,50 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.DataAccess.ADOHelper;
+using System.Data.SqlClient;
+using HeuristicLab.Hive.Contracts.BusinessObjects;
+using System.Data.Common;
+
+namespace HeuristicLab.Hive.Server.ADODataAccess.TableAdapterWrapper {
+  class ResourceAdapterWrapper :
+  TableAdapterWrapperBase<
+    dsHiveServerTableAdapters.ResourceTableAdapter,
+    Resource,
+    dsHiveServer.ResourceRow> {
+    public override void UpdateRow(dsHiveServer.ResourceRow row) {
+      TransactionalAdapter.Update(row);
+    }
+
+    public override dsHiveServer.ResourceRow
+      InsertNewRow(Resource resource) {
+      dsHiveServer.ResourceDataTable data =
+        new dsHiveServer.ResourceDataTable();
+
+      dsHiveServer.ResourceRow row = data.NewResourceRow();
+      row.ResourceId = resource.Id;
+      data.AddResourceRow(row);
+
+      return row;
+    }
+
+    public override IEnumerable<dsHiveServer.ResourceRow>
+      FindById(Guid id) {
+      return TransactionalAdapter.GetDataById(id);
+    }
+
+    public override IEnumerable<dsHiveServer.ResourceRow>
+      FindAll() {
+      return TransactionalAdapter.GetData();
+    }
+
+    protected override void SetConnection(DbConnection connection) {
+      adapter.Connection = connection as SqlConnection;
+    }
+
+    protected override void SetTransaction(DbTransaction transaction) {
+      adapter.Transaction = transaction as SqlTransaction;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Hive.Server.DataAccess/3.2/HeuristicLab.Hive.Server.DataAccess-3.2.csproj
===================================================================
--- trunk/sources/HeuristicLab.Hive.Server.DataAccess/3.2/HeuristicLab.Hive.Server.DataAccess-3.2.csproj	(revision 1579)
+++ trunk/sources/HeuristicLab.Hive.Server.DataAccess/3.2/HeuristicLab.Hive.Server.DataAccess-3.2.csproj	(revision 1580)
@@ -76,4 +76,5 @@
   -->
   <ItemGroup>
+    <Compile Include="IPluginInfoAdapter.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
     <Compile Include="HiveServerDataAccessPlugin.cs" />
Index: trunk/sources/HeuristicLab.Hive.Server.DataAccess/3.2/IPluginInfoAdapter.cs
===================================================================
--- trunk/sources/HeuristicLab.Hive.Server.DataAccess/3.2/IPluginInfoAdapter.cs	(revision 1580)
+++ trunk/sources/HeuristicLab.Hive.Server.DataAccess/3.2/IPluginInfoAdapter.cs	(revision 1580)
@@ -0,0 +1,34 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.Hive.Contracts.BusinessObjects;
+using HeuristicLab.DataAccess.Interfaces;
+
+namespace HeuristicLab.Hive.Server.DataAccess {
+  /// <summary>
+  /// The plugin info database adapter
+  /// </summary>
+  public interface IPluginInfoAdapter : IDataAdapter<HivePluginInfo> {
+  }
+}
