From: <fab...@us...> - 2009-04-24 06:17:32
|
Revision: 4209 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4209&view=rev Author: fabiomaulo Date: 2009-04-24 06:17:30 +0000 (Fri, 24 Apr 2009) Log Message: ----------- - Minor (reformatting) - Added methods to apply a test for a specific QueryTranslator Modified Paths: -------------- trunk/nhibernate/src/NHibernate.Test/HQL/Ast/BaseFixture.cs trunk/nhibernate/src/NHibernate.Test/Legacy/FooBarTest.cs trunk/nhibernate/src/NHibernate.Test/TestCase.cs Modified: trunk/nhibernate/src/NHibernate.Test/HQL/Ast/BaseFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/HQL/Ast/BaseFixture.cs 2009-04-23 20:31:58 UTC (rev 4208) +++ trunk/nhibernate/src/NHibernate.Test/HQL/Ast/BaseFixture.cs 2009-04-24 06:17:30 UTC (rev 4209) @@ -2,7 +2,6 @@ using NHibernate.Hql.Ast.ANTLR; using System.Collections.Generic; using NHibernate.Util; -using NUnit.Framework; namespace NHibernate.Test.HQL.Ast { @@ -10,12 +9,9 @@ { private readonly IDictionary<string, IFilter> emptyfilters = new CollectionHelper.EmptyMapClass<string, IFilter>(); - protected override void OnSetUp() + protected override bool AppliesTo(Engine.ISessionFactoryImplementor factory) { - if (!(sessions.Settings.QueryTranslatorFactory is ASTQueryTranslatorFactory)) - { - Assert.Ignore("ASTQueryTranslator specific test"); - } + return sessions.Settings.QueryTranslatorFactory is ASTQueryTranslatorFactory; } #region Overrides of TestCase Modified: trunk/nhibernate/src/NHibernate.Test/Legacy/FooBarTest.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Legacy/FooBarTest.cs 2009-04-23 20:31:58 UTC (rev 4208) +++ trunk/nhibernate/src/NHibernate.Test/Legacy/FooBarTest.cs 2009-04-24 06:17:30 UTC (rev 4209) @@ -514,19 +514,20 @@ { if (!(Dialect is FirebirdDialect)) { - if (IsClassicParser) - { - list = - s.CreateQuery("from foo in class NHibernate.DomainModel.Foo where ? = some foo.Component.ImportantDates.elements") - .SetDateTime(0, DateTime.Today).List(); - - } - else - { - list = - s.CreateQuery("from foo in class NHibernate.DomainModel.Foo where ? = some elements(foo.Component.ImportantDates)") - .SetDateTime(0, DateTime.Today).List(); - } + if (IsClassicParser) + { + list = + s.CreateQuery("from foo in class NHibernate.DomainModel.Foo where ? = some foo.Component.ImportantDates.elements") + .SetDateTime(0, DateTime.Today).List(); + + } + else + { + list = + s.CreateQuery( + "from foo in class NHibernate.DomainModel.Foo where ? = some elements(foo.Component.ImportantDates)"). + SetDateTime(0, DateTime.Today).List(); + } Assert.AreEqual(2, list.Count, "component query"); } @@ -601,18 +602,19 @@ IsEmpty(s.CreateQuery("from bar in class Bar where bar.String='a string' or bar.String='a string'").Enumerable() )); - if (IsClassicParser) - { - enumerable = s.CreateQuery( - "select foo.Component.Name, foo.Component.ImportantDates.elements from foo in class Foo where foo.TheFoo.id=?" - ).SetString(0, foo.TheFoo.Key).Enumerable(); - } - else - { - enumerable = s.CreateQuery( - "select foo.Component.Name, elements(foo.Component.ImportantDates) from foo in class Foo where foo.TheFoo.id=?" - ).SetString(0, foo.TheFoo.Key).Enumerable(); - } + if (IsClassicParser) + { + enumerable = s.CreateQuery( + "select foo.Component.Name, foo.Component.ImportantDates.elements from foo in class Foo where foo.TheFoo.id=?" + ).SetString(0, foo.TheFoo.Key).Enumerable(); + } + else + { + enumerable = + s.CreateQuery( + "select foo.Component.Name, elements(foo.Component.ImportantDates) from foo in class Foo where foo.TheFoo.id=?"). + SetString(0, foo.TheFoo.Key).Enumerable(); + } int i = 0; foreach (object[] row in enumerable) @@ -623,18 +625,18 @@ } Assert.AreEqual(3, i); //WAS: 4 - if (IsClassicParser) - { - enumerable = s.CreateQuery( - "select max(foo.Component.ImportantDates.elements) from foo in class Foo group by foo.id" - ).Enumerable(); - } - else - { - enumerable = s.CreateQuery( - "select max(elements(foo.Component.ImportantDates)) from foo in class Foo group by foo.id" - ).Enumerable(); - } + if (IsClassicParser) + { + enumerable = s.CreateQuery( + "select max(foo.Component.ImportantDates.elements) from foo in class Foo group by foo.id" + ).Enumerable(); + } + else + { + enumerable = + s.CreateQuery("select max(elements(foo.Component.ImportantDates)) from foo in class Foo group by foo.id"). + Enumerable(); + } IEnumerator enumerator = enumerable.GetEnumerator(); Assert.IsTrue(enumerator.MoveNext()); @@ -838,18 +840,18 @@ "from Baz baz where 'a' in elements(baz.CollectionComponent.Nested.Foos) and 1.0 in elements(baz.CollectionComponent.Nested.Floats)") .List(); - if (IsClassicParser) - { - s.CreateQuery( - "from Baz baz where 'b' in baz.CollectionComponent.Nested.Foos.elements and 1.0 in baz.CollectionComponent.Nested.Floats.elements") - .List(); - } - else - { - s.CreateQuery( - "from Baz baz where 'b' in elements(baz.CollectionComponent.Nested.Foos) and 1.0 in elements(baz.CollectionComponent.Nested.Floats)") - .List(); - } + if (IsClassicParser) + { + s.CreateQuery( + "from Baz baz where 'b' in baz.CollectionComponent.Nested.Foos.elements and 1.0 in baz.CollectionComponent.Nested.Floats.elements") + .List(); + } + else + { + s.CreateQuery( + "from Baz baz where 'b' in elements(baz.CollectionComponent.Nested.Foos) and 1.0 in elements(baz.CollectionComponent.Nested.Floats)") + .List(); + } } s.CreateQuery("from Foo foo join foo.TheFoo where foo.TheFoo in ('1','2','3')").List(); @@ -2441,16 +2443,10 @@ s.CreateQuery(hql).List(); } - if (IsClassicParser) - { - hql = "select fum1.Friends.elements from fum1 in class Fum"; - } - else - { - hql = "select elements(fum1.Friends) from fum1 in class Fum"; - } - s.CreateQuery(hql).List(); + hql = IsClassicParser ? "select fum1.Friends.elements from fum1 in class Fum" : "select elements(fum1.Friends) from fum1 in class Fum"; + s.CreateQuery(hql).List(); + hql = "from fum1 in class Fum, fr in elements( fum1.Friends )"; s.CreateQuery(hql).List(); @@ -2579,14 +2575,14 @@ Assert.AreEqual(1, s.CreateQuery("from Bar bar join bar.Baz.FooArray foo").List().Count); - if (IsClassicParser) - { - Assert.AreEqual(0, s.CreateQuery("from bar in class Bar, foo in bar.Baz.FooSet.elements").List().Count); - } - else - { - Assert.AreEqual(0, s.CreateQuery("from bar in class Bar, foo in elements(bar.Baz.FooSet)").List().Count); - } + if (IsClassicParser) + { + Assert.AreEqual(0, s.CreateQuery("from bar in class Bar, foo in bar.Baz.FooSet.elements").List().Count); + } + else + { + Assert.AreEqual(0, s.CreateQuery("from bar in class Bar, foo in elements(bar.Baz.FooSet)").List().Count); + } Assert.AreEqual(1, s.CreateQuery("from bar in class Bar, foo in elements( bar.Baz.FooArray )").List().Count); @@ -2615,14 +2611,10 @@ Assert.IsTrue(enumer.MoveNext()); Assert.AreSame(baz, enumer.Current); - if (IsClassicParser) - { - enumer = s.CreateQuery("select baz.StringArray.elements from baz in class Baz").Enumerable().GetEnumerator(); - } - else - { - enumer = s.CreateQuery("select elements(baz.StringArray) from baz in class Baz").Enumerable().GetEnumerator(); - } + enumer = IsClassicParser + ? s.CreateQuery("select baz.StringArray.elements from baz in class Baz").Enumerable().GetEnumerator() + : s.CreateQuery("select elements(baz.StringArray) from baz in class Baz").Enumerable().GetEnumerator(); + bool found = false; while (enumer.MoveNext()) { @@ -2635,28 +2627,21 @@ baz.StringArray = null; s.CreateQuery("from baz in class Baz").Enumerable(); // no flush - if (IsClassicParser) - { - enumer = s.CreateQuery("select baz.StringArray.elements from baz in class Baz").Enumerable().GetEnumerator(); - } - else - { - enumer = s.CreateQuery("select elements(baz.StringArray) from baz in class Baz").Enumerable().GetEnumerator(); - } + + enumer = IsClassicParser + ? s.CreateQuery("select baz.StringArray.elements from baz in class Baz").Enumerable().GetEnumerator() + : s.CreateQuery("select elements(baz.StringArray) from baz in class Baz").Enumerable().GetEnumerator(); + Assert.IsFalse(enumer.MoveNext()); baz.StringList.Add("1E1"); enumer = s.CreateQuery("from foo in class Foo").Enumerable().GetEnumerator(); // no flush Assert.IsFalse(enumer.MoveNext()); - if (IsClassicParser) - { - enumer = s.CreateQuery("select baz.StringList.elements from baz in class Baz").Enumerable().GetEnumerator(); - } - else - { - enumer = s.CreateQuery("select elements(baz.StringList) from baz in class Baz").Enumerable().GetEnumerator(); - } + enumer = IsClassicParser + ? s.CreateQuery("select baz.StringList.elements from baz in class Baz").Enumerable().GetEnumerator() + : s.CreateQuery("select elements(baz.StringList) from baz in class Baz").Enumerable().GetEnumerator(); + found = false; while (enumer.MoveNext()) { @@ -2668,23 +2653,19 @@ Assert.IsTrue(found); baz.StringList.Remove("1E1"); - if (IsClassicParser) - { - s.CreateQuery("select baz.StringArray.elements from baz in class Baz").Enumerable(); //no flush - } - else - { - s.CreateQuery("select elements(baz.StringArray) from baz in class Baz").Enumerable(); //no flush - } + if (IsClassicParser) + { + s.CreateQuery("select baz.StringArray.elements from baz in class Baz").Enumerable(); //no flush + } + else + { + s.CreateQuery("select elements(baz.StringArray) from baz in class Baz").Enumerable(); //no flush + } - if (IsClassicParser) - { - enumer = s.CreateQuery("select baz.StringList.elements from baz in class Baz").Enumerable().GetEnumerator(); - } - else - { - enumer = s.CreateQuery("select elements(baz.StringList) from baz in class Baz").Enumerable().GetEnumerator(); - } + enumer = IsClassicParser + ? s.CreateQuery("select baz.StringList.elements from baz in class Baz").Enumerable().GetEnumerator() + : s.CreateQuery("select elements(baz.StringList) from baz in class Baz").Enumerable().GetEnumerator(); + found = false; while (enumer.MoveNext()) { @@ -2702,14 +2683,11 @@ s.CreateQuery("from foo in class Foo").Enumerable().GetEnumerator(); //no flush baz.StringList = null; - if (IsClassicParser) - { - enumer = s.CreateQuery("select baz.StringList.elements from baz in class Baz").Enumerable().GetEnumerator(); - } - else - { - enumer = s.CreateQuery("select elements(baz.StringList) from baz in class Baz").Enumerable().GetEnumerator(); - } + + enumer = IsClassicParser + ? s.CreateQuery("select baz.StringList.elements from baz in class Baz").Enumerable().GetEnumerator() + : s.CreateQuery("select elements(baz.StringList) from baz in class Baz").Enumerable().GetEnumerator(); + Assert.IsFalse(enumer.MoveNext()); s.Delete(baz); @@ -2764,20 +2742,20 @@ // disable this for dbs with no subselects if (Dialect.SupportsSubSelects) { - if (IsClassicParser) - { - list = - s.CreateQuery( - "select foo from foo in class NHibernate.DomainModel.Foo, baz in class NHibernate.DomainModel.Baz where foo in baz.FooArray.elements and 3 = some baz.IntArray.elements and 4 > all baz.IntArray.indices") - .List(); - } - else - { - list = - s.CreateQuery( - "select foo from foo in class NHibernate.DomainModel.Foo, baz in class NHibernate.DomainModel.Baz where foo in elements(baz.FooArray) and 3 = some elements(baz.IntArray) and 4 > all indices(baz.IntArray)") - .List(); - } + if (IsClassicParser) + { + list = + s.CreateQuery( + "select foo from foo in class NHibernate.DomainModel.Foo, baz in class NHibernate.DomainModel.Baz where foo in baz.FooArray.elements and 3 = some baz.IntArray.elements and 4 > all baz.IntArray.indices") + .List(); + } + else + { + list = + s.CreateQuery( + "select foo from foo in class NHibernate.DomainModel.Foo, baz in class NHibernate.DomainModel.Baz where foo in elements(baz.FooArray) and 3 = some elements(baz.IntArray) and 4 > all indices(baz.IntArray)") + .List(); + } Assert.AreEqual(2, list.Count, "collection.elements find"); } @@ -2785,29 +2763,25 @@ // sapdb doesn't like distinct with binary type //if( !(dialect is Dialect.SAPDBDialect) ) //{ - if (IsClassicParser) - { - list = - s.CreateQuery("select distinct foo from baz in class NHibernate.DomainModel.Baz, foo in baz.FooArray.elements").List - (); - } - else - { - list = - s.CreateQuery("select distinct foo from baz in class NHibernate.DomainModel.Baz, foo in elements(baz.FooArray)").List - (); - } + if (IsClassicParser) + { + list = + s.CreateQuery("select distinct foo from baz in class NHibernate.DomainModel.Baz, foo in baz.FooArray.elements").List + (); + } + else + { + list = + s.CreateQuery("select distinct foo from baz in class NHibernate.DomainModel.Baz, foo in elements(baz.FooArray)"). + List(); + } Assert.AreEqual(2, list.Count, "collection.elements find"); //} - if (IsClassicParser) - { - list = s.CreateQuery("select foo from baz in class NHibernate.DomainModel.Baz, foo in baz.FooSet.elements").List(); - } - else - { - list = s.CreateQuery("select foo from baz in class NHibernate.DomainModel.Baz, foo in elements(baz.FooSet)").List(); - } + list = IsClassicParser + ? s.CreateQuery("select foo from baz in class NHibernate.DomainModel.Baz, foo in baz.FooSet.elements").List() + : s.CreateQuery("select foo from baz in class NHibernate.DomainModel.Baz, foo in elements(baz.FooSet)").List(); + Assert.AreEqual(1, list.Count, "association.elements find"); txn.Commit(); @@ -5022,20 +4996,20 @@ baz = (Baz) s.Load(typeof(Baz), baz.Code); baz.StringArray[0] = "bark"; - IEnumerator e; + IEnumerator e; - if (IsClassicParser) - { - e = s.CreateQuery("select baz.StringArray.elements from baz in class NHibernate.DomainModel.Baz") - .Enumerable() - .GetEnumerator(); - } - else - { - e = s.CreateQuery("select elements(baz.StringArray) from baz in class NHibernate.DomainModel.Baz") - .Enumerable() - .GetEnumerator(); - } + if (IsClassicParser) + { + e = + s.CreateQuery("select baz.StringArray.elements from baz in class NHibernate.DomainModel.Baz").Enumerable(). + GetEnumerator(); + } + else + { + e = + s.CreateQuery("select elements(baz.StringArray) from baz in class NHibernate.DomainModel.Baz").Enumerable(). + GetEnumerator(); + } bool found = false; while (e.MoveNext()) @@ -5048,33 +5022,33 @@ Assert.IsTrue(found); baz.StringArray = null; - if (IsClassicParser) - { - e = s.CreateQuery("select distinct baz.StringArray.elements from baz in class NHibernate.DomainModel.Baz") - .Enumerable() - .GetEnumerator(); - } - else - { - e = s.CreateQuery("select distinct elements(baz.StringArray) from baz in class NHibernate.DomainModel.Baz") - .Enumerable() - .GetEnumerator(); - } + if (IsClassicParser) + { + e = s.CreateQuery("select distinct baz.StringArray.elements from baz in class NHibernate.DomainModel.Baz") + .Enumerable() + .GetEnumerator(); + } + else + { + e = + s.CreateQuery("select distinct elements(baz.StringArray) from baz in class NHibernate.DomainModel.Baz").Enumerable() + .GetEnumerator(); + } Assert.IsFalse(e.MoveNext()); baz.StringArray = new string[] {"foo", "bar"}; - if (IsClassicParser) - { - e = s.CreateQuery("select baz.StringArray.elements from baz in class NHibernate.DomainModel.Baz") - .Enumerable() - .GetEnumerator(); - } - else - { - e = s.CreateQuery("select elements(baz.StringArray) from baz in class NHibernate.DomainModel.Baz") - .Enumerable() - .GetEnumerator(); - } + if (IsClassicParser) + { + e = s.CreateQuery("select baz.StringArray.elements from baz in class NHibernate.DomainModel.Baz") + .Enumerable() + .GetEnumerator(); + } + else + { + e = + s.CreateQuery("select elements(baz.StringArray) from baz in class NHibernate.DomainModel.Baz").Enumerable(). + GetEnumerator(); + } Assert.IsTrue(e.MoveNext()); Foo foo = new Foo(); @@ -5082,18 +5056,18 @@ s.Flush(); baz.FooArray = new Foo[] {foo}; - if (IsClassicParser) - { - e = s.CreateQuery("select foo from baz in class NHibernate.DomainModel.Baz, foo in baz.FooArray.elements") - .Enumerable() - .GetEnumerator(); - } - else - { - e = s.CreateQuery("select foo from baz in class NHibernate.DomainModel.Baz, foo in elements(baz.FooArray)") - .Enumerable() - .GetEnumerator(); - } + if (IsClassicParser) + { + e = s.CreateQuery("select foo from baz in class NHibernate.DomainModel.Baz, foo in baz.FooArray.elements") + .Enumerable() + .GetEnumerator(); + } + else + { + e = + s.CreateQuery("select foo from baz in class NHibernate.DomainModel.Baz, foo in elements(baz.FooArray)").Enumerable() + .GetEnumerator(); + } found = false; while (e.MoveNext()) { @@ -5106,61 +5080,66 @@ baz.FooArray[0] = null; - if (IsClassicParser) - { - e = s.CreateQuery("select foo from baz in class NHibernate.DomainModel.Baz, foo in baz.FooArray.elements") - .Enumerable() - .GetEnumerator(); - } - else - { - e = s.CreateQuery("select foo from baz in class NHibernate.DomainModel.Baz, foo in elements(baz.FooArray)") - .Enumerable() - .GetEnumerator(); - } + if (IsClassicParser) + { + e = s.CreateQuery("select foo from baz in class NHibernate.DomainModel.Baz, foo in baz.FooArray.elements") + .Enumerable() + .GetEnumerator(); + } + else + { + e = + s.CreateQuery("select foo from baz in class NHibernate.DomainModel.Baz, foo in elements(baz.FooArray)").Enumerable() + .GetEnumerator(); + } Assert.IsFalse(e.MoveNext()); baz.FooArray[0] = foo; - if (IsClassicParser) - { - e = s.CreateQuery("select baz.FooArray.elements from baz in class NHibernate.DomainModel.Baz") - .Enumerable() - .GetEnumerator(); - } - else - { - e = s.CreateQuery("select elements(baz.FooArray) from baz in class NHibernate.DomainModel.Baz") - .Enumerable() - .GetEnumerator(); - } + if (IsClassicParser) + { + e = s.CreateQuery("select baz.FooArray.elements from baz in class NHibernate.DomainModel.Baz") + .Enumerable() + .GetEnumerator(); + } + else + { + e = + s.CreateQuery("select elements(baz.FooArray) from baz in class NHibernate.DomainModel.Baz").Enumerable(). + GetEnumerator(); + } Assert.IsTrue(e.MoveNext()); if (Dialect.SupportsSubSelects && !(Dialect is FirebirdDialect)) { baz.FooArray[0] = null; - if (IsClassicParser) - { - e = s.CreateQuery("from baz in class NHibernate.DomainModel.Baz where ? in baz.FooArray.elements") - .SetEntity(0, foo).Enumerable().GetEnumerator(); - } - else - { - e = s.CreateQuery("from baz in class NHibernate.DomainModel.Baz where ? in elements(baz.FooArray)") - .SetEntity(0, foo).Enumerable().GetEnumerator(); - } + if (IsClassicParser) + { + e = s.CreateQuery("from baz in class NHibernate.DomainModel.Baz where ? in baz.FooArray.elements") + .SetEntity(0, foo).Enumerable().GetEnumerator(); + } + else + { + e = + s.CreateQuery("from baz in class NHibernate.DomainModel.Baz where ? in elements(baz.FooArray)").SetEntity(0, foo). + Enumerable().GetEnumerator(); + } Assert.IsFalse(e.MoveNext()); baz.FooArray[0] = foo; - if (IsClassicParser) - { - e = s.CreateQuery("select foo from foo in class NHibernate.DomainModel.Foo where foo in " - + "(select elt from baz in class NHibernate.DomainModel.Baz, elt in baz.FooArray.elements)").Enumerable().GetEnumerator(); - } - else - { - e = s.CreateQuery("select foo from foo in class NHibernate.DomainModel.Foo where foo in " - + "(select elt from baz in class NHibernate.DomainModel.Baz, elt in elements(baz.FooArray))").Enumerable().GetEnumerator(); - } + if (IsClassicParser) + { + e = + s.CreateQuery("select foo from foo in class NHibernate.DomainModel.Foo where foo in " + + "(select elt from baz in class NHibernate.DomainModel.Baz, elt in baz.FooArray.elements)"). + Enumerable().GetEnumerator(); + } + else + { + e = + s.CreateQuery("select foo from foo in class NHibernate.DomainModel.Foo where foo in " + + "(select elt from baz in class NHibernate.DomainModel.Baz, elt in elements(baz.FooArray))"). + Enumerable().GetEnumerator(); + } Assert.IsTrue(e.MoveNext()); } s.Delete(foo); Modified: trunk/nhibernate/src/NHibernate.Test/TestCase.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/TestCase.cs 2009-04-23 20:31:58 UTC (rev 4208) +++ trunk/nhibernate/src/NHibernate.Test/TestCase.cs 2009-04-24 06:17:30 UTC (rev 4209) @@ -11,6 +11,8 @@ using NHibernate.Tool.hbm2ddl; using NHibernate.Type; using NUnit.Framework; +using NHibernate.Hql.Classic; +using NHibernate.Hql.Ast.ANTLR; namespace NHibernate.Test { @@ -27,15 +29,28 @@ get { return NHibernate.Dialect.Dialect.GetDialect(cfg.Properties); } } - protected bool IsClassicParser - { - get - { - return cfg.Properties[Cfg.Environment.QueryTranslator] == - typeof(NHibernate.Hql.Classic.ClassicQueryTranslatorFactory).FullName; - } - } + /// <summary> + /// To use in in-line test + /// </summary> + protected bool IsClassicParser + { + get + { + return sessions.Settings.QueryTranslatorFactory is ClassicQueryTranslatorFactory; + } + } + /// <summary> + /// To use in in-line test + /// </summary> + protected bool IsAntlrParser + { + get + { + return sessions.Settings.QueryTranslatorFactory is ASTQueryTranslatorFactory; + } + } + protected ISession lastOpenedSession; private DebugConnectionProvider connectionProvider; @@ -74,6 +89,12 @@ CreateSchema(); BuildSessionFactory(); + if (!AppliesTo(sessions)) + { + DropSchema(); + Cleanup(); + Assert.Ignore(GetType() + " does not apply with the current session-factory configuration"); + } } catch (Exception e) { @@ -223,7 +244,10 @@ private void Cleanup() { - sessions.Close(); + if (sessions != null) + { + sessions.Close(); + } sessions = null; connectionProvider = null; lastOpenedSession = null; @@ -318,6 +342,11 @@ return true; } + protected virtual bool AppliesTo(ISessionFactoryImplementor factory) + { + return true; + } + protected virtual void Configure(Configuration configuration) { } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |