|
From: <de...@us...> - 2013-04-02 15:59:49
|
Revision: 8369
http://fudaa.svn.sourceforge.net/fudaa/?rev=8369&view=rev
Author: deniger
Date: 2013-04-02 15:59:38 +0000 (Tue, 02 Apr 2013)
Log Message:
-----------
Support donn?\195?\169es issues de GGCrue
Modified Paths:
--------------
trunk/soft/fudaa-crue/crue-compare/src/main/java/org/fudaa/dodico/crue/comparaison/ConvertCompare.java
trunk/soft/fudaa-crue/crue-compare/src/main/java/org/fudaa/dodico/crue/comparaison/config/ConfCompareListe.java
trunk/soft/fudaa-crue/crue-compare/src/main/java/org/fudaa/dodico/crue/comparaison/io/ReaderConfig.java
trunk/soft/fudaa-crue/crue-compare/src/main/java/org/fudaa/dodico/crue/comparaison/tester/EqualsTesterIsIncludeCollection.java
trunk/soft/fudaa-crue/crue-compare/src/main/java/org/fudaa/dodico/crue/comparaison/tester/ResultatTest.java
trunk/soft/fudaa-crue/crue-compare/src/main/resources/org/fudaa/dodico/crue/comparaison/io/default-comparaison.xml
trunk/soft/fudaa-crue/crue-core/src/main/resources/org/fudaa/dodico/crue/common/businessMessages.properties
trunk/soft/fudaa-crue/crue-emh/src/main/java/org/fudaa/dodico/crue/metier/emh/Dde.java
trunk/soft/fudaa-crue/crue-emh/src/main/java/org/fudaa/dodico/crue/metier/emh/OrdRes.java
trunk/soft/fudaa-crue/pom.xml
trunk/soft/fudaa-crue/ui-planimetry/src/main/java/org/fudaa/fudaa/crue/planimetry/action/TraceProfilSectionImporterAction.java
Modified: trunk/soft/fudaa-crue/crue-compare/src/main/java/org/fudaa/dodico/crue/comparaison/ConvertCompare.java
===================================================================
--- trunk/soft/fudaa-crue/crue-compare/src/main/java/org/fudaa/dodico/crue/comparaison/ConvertCompare.java 2013-04-02 15:27:26 UTC (rev 8368)
+++ trunk/soft/fudaa-crue/crue-compare/src/main/java/org/fudaa/dodico/crue/comparaison/ConvertCompare.java 2013-04-02 15:59:38 UTC (rev 8369)
@@ -109,6 +109,7 @@
final ConfCompareListe inObject = (ConfCompareListe) in;
final EqualsTesterIsIncludeCollection res = new EqualsTesterIsIncludeCollection(inObject.getAttribut(), inObject
.isBidirect());
+ res.setPrefixDiffMessageId(inObject.getDiffTranslation());
computeOptions(inObject, res.getContextFactory(), analyze);
return new ExecuteCompareActionOnList(res, false);
} else if (ConfCompareListeOrder.class.equals(inClass)) {
Modified: trunk/soft/fudaa-crue/crue-compare/src/main/java/org/fudaa/dodico/crue/comparaison/config/ConfCompareListe.java
===================================================================
--- trunk/soft/fudaa-crue/crue-compare/src/main/java/org/fudaa/dodico/crue/comparaison/config/ConfCompareListe.java 2013-04-02 15:27:26 UTC (rev 8368)
+++ trunk/soft/fudaa-crue/crue-compare/src/main/java/org/fudaa/dodico/crue/comparaison/config/ConfCompareListe.java 2013-04-02 15:59:38 UTC (rev 8369)
@@ -8,7 +8,8 @@
public class ConfCompareListe extends AbstractConfCompare {
private String attribut;
-
+ //si non null doit contenir le prefix pour l'id du message contenant la traduction.
+ private String diffTranslation;
private boolean bidirect;
/**
@@ -18,6 +19,15 @@
return attribut;
}
+ public String getDiffTranslation() {
+ return diffTranslation;
+ }
+
+ public void setDiffTranslation(String diffTranslation) {
+ this.diffTranslation = diffTranslation;
+ }
+
+
/**
* @param attribut the attribut to set
*/
@@ -38,5 +48,4 @@
public void setBidirect(boolean bidirect) {
this.bidirect = bidirect;
}
-
}
Modified: trunk/soft/fudaa-crue/crue-compare/src/main/java/org/fudaa/dodico/crue/comparaison/io/ReaderConfig.java
===================================================================
--- trunk/soft/fudaa-crue/crue-compare/src/main/java/org/fudaa/dodico/crue/comparaison/io/ReaderConfig.java 2013-04-02 15:27:26 UTC (rev 8368)
+++ trunk/soft/fudaa-crue/crue-compare/src/main/java/org/fudaa/dodico/crue/comparaison/io/ReaderConfig.java 2013-04-02 15:59:38 UTC (rev 8369)
@@ -34,7 +34,6 @@
public class ReaderConfig {
private final static Logger LOGGER = Logger.getLogger(ReaderConfig.class.getName());
-
private CtuluLog analyze;
public CtuluLog getAnalyze() {
@@ -63,9 +62,8 @@
}
} catch (final Exception e) {
analyze.addSevereError("file.read.error", file, e.getMessage());
- LOGGER.log(Level.SEVERE,"read " + file, e);
- }
- finally{
+ LOGGER.log(Level.SEVERE, "read " + file, e);
+ } finally {
CtuluLibFile.close(in);
}
return res;
@@ -105,6 +103,7 @@
xstream.alias("Compare-Liste", ConfCompareListe.class);
xstream.aliasAttribute(ConfCompareListe.class, "attribut", "Attribut");
xstream.aliasAttribute(ConfCompareListe.class, "bidirect", "Bidirect");
+ xstream.aliasAttribute(ConfCompareListe.class, "diffTranslation", "DiffTranslation");
xstream.alias("Compare-Liste-Order", ConfCompareListeOrder.class);
xstream.aliasAttribute(ConfCompareListeOrder.class, "attribut", "Attribut");
xstream.aliasAttribute(ConfCompareListeOrder.class, "onlyIfSameList", "OnlyIfSameList");
@@ -130,12 +129,10 @@
public Object fromString(String arg0) {
return StringUtils.trim(arg0);
}
-
}
private Converter createSingleValueConverterRequete() {
return new Converter() {
-
@Override
public boolean canConvert(final Class arg0) {
return ConfSelectionItemRequete.class.equals(arg0);
Modified: trunk/soft/fudaa-crue/crue-compare/src/main/java/org/fudaa/dodico/crue/comparaison/tester/EqualsTesterIsIncludeCollection.java
===================================================================
--- trunk/soft/fudaa-crue/crue-compare/src/main/java/org/fudaa/dodico/crue/comparaison/tester/EqualsTesterIsIncludeCollection.java 2013-04-02 15:27:26 UTC (rev 8368)
+++ trunk/soft/fudaa-crue/crue-compare/src/main/java/org/fudaa/dodico/crue/comparaison/tester/EqualsTesterIsIncludeCollection.java 2013-04-02 15:59:38 UTC (rev 8369)
@@ -29,6 +29,9 @@
private static final String DIFF_INCLUDE_DANS_A_PAS_DANS_B = BusinessMessages
.getString("diff.include.dansA.pasDansB");
private final String propName;
+ private String prefixDiffMessageId;
+ private String diffMessageIdDansBPasDansA;
+ private String diffMessageIdDansAPasDansB;
/**
* @return the propName
@@ -37,6 +40,27 @@
return propName;
}
+ private String getDansAPasDansB() {
+ if (prefixDiffMessageId == null) {
+ return DIFF_INCLUDE_DANS_A_PAS_DANS_B;
+ }
+ if (diffMessageIdDansAPasDansB == null) {
+ diffMessageIdDansAPasDansB = BusinessMessages.getString(prefixDiffMessageId + ".dansA.pasDansB");
+ }
+ return diffMessageIdDansAPasDansB;
+
+ }
+
+ private String getDansBPasDansA() {
+ if (prefixDiffMessageId == null) {
+ return DIFF_INCLUDE_DANS_B_PAS_DANS_A;
+ }
+ if (diffMessageIdDansBPasDansA == null) {
+ diffMessageIdDansBPasDansA = BusinessMessages.getString(prefixDiffMessageId + ".dansB.pasDansA");
+ }
+ return diffMessageIdDansBPasDansA;
+ }
+
/**
* @return the bidirect
*/
@@ -80,13 +104,13 @@
list.subList(0, nbMaxItemInDiff);
}
if (CollectionUtils.isNotEmpty(subtract)) {
- addDiff(DIFF_INCLUDE_DANS_A_PAS_DANS_B, res, toString(subtract), StringUtils.EMPTY);
+ addDiff(getDansAPasDansB(), res, toString(subtract), StringUtils.EMPTY);
resFinal = false;
}
if (bidirect) {
subtract = CollectionUtils.subtract(propInB, propInA);
if (CollectionUtils.isNotEmpty(subtract)) {
- addDiff(DIFF_INCLUDE_DANS_B_PAS_DANS_A, res, StringUtils.EMPTY, toString(subtract));
+ addDiff(getDansBPasDansA(), res, StringUtils.EMPTY, toString(subtract));
resFinal = false;
}
}
@@ -100,4 +124,12 @@
res.addDiff(new ResultatTest(obj1, obj2, msg, true));
}
}
+
+ public String getPrefixDiffMessageId() {
+ return prefixDiffMessageId;
+ }
+
+ public void setPrefixDiffMessageId(String prefixDiffMessageId) {
+ this.prefixDiffMessageId = prefixDiffMessageId;
+ }
}
Modified: trunk/soft/fudaa-crue/crue-compare/src/main/java/org/fudaa/dodico/crue/comparaison/tester/ResultatTest.java
===================================================================
--- trunk/soft/fudaa-crue/crue-compare/src/main/java/org/fudaa/dodico/crue/comparaison/tester/ResultatTest.java 2013-04-02 15:27:26 UTC (rev 8368)
+++ trunk/soft/fudaa-crue/crue-compare/src/main/java/org/fudaa/dodico/crue/comparaison/tester/ResultatTest.java 2013-04-02 15:59:38 UTC (rev 8369)
@@ -188,11 +188,11 @@
return String.class.equals(c) || Double.class.equals(c) || Integer.class.equals(c);
}
- public void setMsg(final String msg) {
+ public final void setMsg(final String msg) {
setMsg(msg, null);
}
- public void setMsg(final String msg, final Object... msgArguments) {
+ public final void setMsg(final String msg, final Object... msgArguments) {
this.msg = msg;
this.msgArguments = msgArguments;
}
Modified: trunk/soft/fudaa-crue/crue-compare/src/main/resources/org/fudaa/dodico/crue/comparaison/io/default-comparaison.xml
===================================================================
--- trunk/soft/fudaa-crue/crue-compare/src/main/resources/org/fudaa/dodico/crue/comparaison/io/default-comparaison.xml 2013-04-02 15:27:26 UTC (rev 8368)
+++ trunk/soft/fudaa-crue/crue-compare/src/main/resources/org/fudaa/dodico/crue/comparaison/io/default-comparaison.xml 2013-04-02 15:59:38 UTC (rev 8369)
@@ -2,29 +2,29 @@
<Comparaisons xmlns="http://www.fudaa.fr/xsd/crue" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.fudaa.fr/xsd/crue
http://www.fudaa.fr/xsd/crue/comparaison-1.0.0.xsd">
<!--
- Dans toutes les requetes, on part de EMHScenario. On a ajouté des
- methodes pour faciliter les requetes
- -->
+ Dans toutes les requetes, on part de EMHScenario. On a ajouté des
+ methodes pour faciliter les requetes
+ -->
<Comparaison>
<Id>DRSO1.1</Id>
<Nom>Quelle EMH, présente (et active) dans A, est absente (ou inactive) dans B</Nom>
<Selection>
<!--
- allSimpleEMH donne la liste des tous les EMH simple (non conteneur)
- contenu par les sous-modeles du scenario
- -->
+ allSimpleEMH donne la liste des tous les EMH simple (non conteneur)
+ contenu par les sous-modeles du scenario
+ -->
<!--
- allSimpleEMH[actuallyActive='true'] signifie que l'on ne recupere que les EMH qui sont
- actives
- -->
+ allSimpleEMH[actuallyActive='true'] signifie que l'on ne recupere que les EMH qui sont
+ actives
+ -->
<Requete Description="EMH active">
allSimpleEMH[actuallyActive='true']
</Requete>
</Selection>
<!--
- Compare-Liste Attribut="id": signifie que dans les listes obtenues on
- teste si l'id dans la liste A est présent dans B
- -->
+ Compare-Liste Attribut="id": signifie que dans les listes obtenues on
+ teste si l'id dans la liste A est présent dans B
+ -->
<!-- Bidirect="true" signifie que l'on fait le test dans les 2 sens-->
<Compare-Liste Bidirect="true" Attribut="id" />
</Comparaison>
@@ -43,9 +43,9 @@
<Nom>Quelle EMH, présente dans A et B, a un type différent</Nom>
<Selection>
<!--
- Merge signifie que l'on va "merger" le contenu de la requete "allSimpleEMH" et faire concorder les EMH qui ont le même Id Attribut="Id" La comparaison portera sur toutes les
- EMH qui ont même id
- -->
+ Merge signifie que l'on va "merger" le contenu de la requete "allSimpleEMH" et faire concorder les EMH qui ont le même Id Attribut="Id" La comparaison portera sur toutes les
+ EMH qui ont même id
+ -->
<Merge Attribut="id" Description="EMH présente dans A et B de même Id">
<Requete Description="Toutes les EMH">allSimpleEMH[actuallyActive='true']
</Requete>
@@ -80,9 +80,9 @@
</Merge>
</Selection>
<!--
- La classe CatEMHNoeud possede une methode idCasier qui renvoie
- l'identifiant du casier attache
- -->
+ La classe CatEMHNoeud possede une methode idCasier qui renvoie
+ l'identifiant du casier attache
+ -->
<Compare-Objet>
<Attribut>idCasier</Attribut>
</Compare-Objet>
@@ -99,8 +99,8 @@
<Requete Description="Toutes les sections de la branche">sections</Requete>
</Selection>
<!--
- On compare les id des emh contenues par les relations
- -->
+ On compare les id des emh contenues par les relations
+ -->
<Compare-Liste Bidirect="true" Attribut="emhId" />
</Comparaison>
<Comparaison>
@@ -118,8 +118,8 @@
</Merge>
</Selection>
<!--
- On compare les xp
- -->
+ On compare les xp
+ -->
<Compare-Objet>
<Attribut>xp</Attribut>
<Attribut>pos</Attribut>
@@ -140,9 +140,9 @@
</Merge>
</Selection>
<!--
- On compare les 3 coefficients. En ne mettant rien, on compare toutes
- les propriétés
- -->
+ On compare les 3 coefficients. En ne mettant rien, on compare toutes
+ les propriétés
+ -->
<Compare-Objet>
<Attribut>coefConv</Attribut>
<Attribut>coefDiv</Attribut>
@@ -156,9 +156,9 @@
<Requete Description="Tous les noeuds">noeuds[actuallyActive='true']</Requete>
</Selection>
<!--
- On compare les 3 coefficients. En ne mettant rien, on compare toutes
- les propriétés
- -->
+ On compare les 3 coefficients. En ne mettant rien, on compare toutes
+ les propriétés
+ -->
<Compare-Liste-Order Attribut="id" />
</Comparaison>
<Comparaison>
@@ -211,10 +211,10 @@
</Requete>
</Merge>
<!--
- les EMH ont une methode getDPTG qui liste toutes les DonPrtGeo qui
- sont nommées: soit DonPrtGeoBatiCasier,
- DonPrtGeoProfilCasier,DonPrtGeoProfilSection
- -->
+ les EMH ont une methode getDPTG qui liste toutes les DonPrtGeo qui
+ sont nommées: soit DonPrtGeoBatiCasier,
+ DonPrtGeoProfilCasier,DonPrtGeoProfilSection
+ -->
<Requete Description="Les dptg nommés">DPTGNommes</Requete>
</Selection>
<Compare-Liste Bidirect="true" Attribut="id" />
@@ -233,9 +233,9 @@
</Merge>
</Selection>
<!--
- Par defaut le Compare-Objet ne compare que les attributs simple de premier niveau Pour descendre dans l'arborescence d'objet il est possible d'utiliser le paramètre deep. Par
- exemple: <Compare-Objet Deep="2"/> si on ne veut pas de limite, il faut utiliser la valeur -1
- -->
+ Par defaut le Compare-Objet ne compare que les attributs simple de premier niveau Pour descendre dans l'arborescence d'objet il est possible d'utiliser le paramètre deep. Par
+ exemple: <Compare-Objet Deep="2"/> si on ne veut pas de limite, il faut utiliser la valeur -1
+ -->
<Compare-Objet Deep="1">
<AttributToIgnore>nombreLitNumerote</AttributToIgnore>
</Compare-Objet>
@@ -347,10 +347,10 @@
<Requete Description="Les LitNumerote">litNumerote</Requete>
</Selection>
<!--
- On va descendre dans l'arborescence des objets Deep permet de
- controler le nombre d'étage a descendre. Deep=-1 signifie que l'on ne
- s'arrete pas.
- -->
+ On va descendre dans l'arborescence des objets Deep permet de
+ controler le nombre d'étage a descendre. Deep=-1 signifie que l'on ne
+ s'arrete pas.
+ -->
<Compare-Objet Deep="-1">
<Attribut>frotId</Attribut>
<Option>
@@ -606,9 +606,9 @@
<Nom>Quel calcul, présent (et utilisé) dans A, est absent (ou inutilisé) dans B</Nom>
<Selection>
<!--
- un calcul est utilise s'il appartient a un Ordre de calcul du
- scenario?
- -->
+ un calcul est utilise s'il appartient a un Ordre de calcul du
+ scenario?
+ -->
<Requete Description="tous les calculs utilisés">
ordCalcScenario/ordCalc/calc
</Requete>
@@ -682,9 +682,9 @@
</Requete>
</Selection>
<!--
- Compare-Liste Attribut="id" : signifie que dans les listes obtenues
- on teste si l'id dans la liste A est présent dans B
- -->
+ Compare-Liste Attribut="id" : signifie que dans les listes obtenues
+ on teste si l'id dans la liste A est présent dans B
+ -->
<!-- Bidirect="true" signifie que l'on fait le test dans les 2 sens-->
<Compare-Liste Bidirect="true" Attribut="id" />
</Comparaison>
@@ -737,11 +737,17 @@
<Id>ORES1</Id>
<Nom>Quelles demandes de résultat sont différentes entre les scénarios A et B</Nom>
<Selection>
- <Requete Description="Les OrdRes du scenario">
- ordResScenario
+ <Merge Attribut="key" Description="Les OrdRes de même id">
+ <Requete Description="Les OrdRes du scenario">
+ ordResScenario/listOfOrdRes
+ </Requete>
+ </Merge>
+ <Requete Description="Les OrdRes actives">
+ activeOrdResDisplayName
</Requete>
</Selection>
- <Compare-Objet Deep="2" />
+ <!--DiffTranslation= permet de préciser le préfixe à utiliser pour les différences trouvées dans des listes-->
+ <Compare-Liste Bidirect="true" DiffTranslation="diff.include.oresActive"/>
</Comparaison>
<Comparaison>
@@ -866,9 +872,9 @@
</Compare-Objet>
</Comparaison>
<!--
- Attention, pour que cette comparaison fonctionne, il faut qu'il y le
- meme nombre de modele
- -->
+ Attention, pour que cette comparaison fonctionne, il faut qu'il y le
+ meme nombre de modele
+ -->
<Comparaison>
<Id>OPTG2</Id>
<Nom>Quel modèle, présent dans A et B, a des listes de règles à vérifier différentes</Nom>
Modified: trunk/soft/fudaa-crue/crue-core/src/main/resources/org/fudaa/dodico/crue/common/businessMessages.properties
===================================================================
--- trunk/soft/fudaa-crue/crue-core/src/main/resources/org/fudaa/dodico/crue/common/businessMessages.properties 2013-04-02 15:27:26 UTC (rev 8368)
+++ trunk/soft/fudaa-crue/crue-core/src/main/resources/org/fudaa/dodico/crue/common/businessMessages.properties 2013-04-02 15:59:38 UTC (rev 8369)
@@ -241,6 +241,8 @@
diff.include.dansA.pasDansB = Des objets sont pr\u00e9sents dans A et pas dans B
diff.include.dansB.pasDansA = Des objets sont pr\u00e9sents dans B et pas dans A
+diff.include.oresActive.dansA.pasDansB=Des OrdRes sont actives dans A et pas dans B
+diff.include.oresActive.dansB.pasDansA=Des OrdRes sont actives dans B et pas dans A
compare.nbPdt.diff=Le nombre de pas de temps est diff\u00e9rent
Modified: trunk/soft/fudaa-crue/crue-emh/src/main/java/org/fudaa/dodico/crue/metier/emh/Dde.java
===================================================================
--- trunk/soft/fudaa-crue/crue-emh/src/main/java/org/fudaa/dodico/crue/metier/emh/Dde.java 2013-04-02 15:27:26 UTC (rev 8368)
+++ trunk/soft/fudaa-crue/crue-emh/src/main/java/org/fudaa/dodico/crue/metier/emh/Dde.java 2013-04-02 15:59:38 UTC (rev 8369)
@@ -1,5 +1,6 @@
package org.fudaa.dodico.crue.metier.emh;
+import org.apache.commons.lang.StringUtils;
import org.fudaa.dodico.crue.common.contrat.ObjetWithID;
/**
@@ -21,6 +22,10 @@
return getNom();
}
+ public String getDisplayName() {
+ return StringUtils.capitalize(getNom());
+ }
+
@Override
public int hashCode() {
int hash = 7 + (valeur ? 8 : 101);
Modified: trunk/soft/fudaa-crue/crue-emh/src/main/java/org/fudaa/dodico/crue/metier/emh/OrdRes.java
===================================================================
--- trunk/soft/fudaa-crue/crue-emh/src/main/java/org/fudaa/dodico/crue/metier/emh/OrdRes.java 2013-04-02 15:27:26 UTC (rev 8368)
+++ trunk/soft/fudaa-crue/crue-emh/src/main/java/org/fudaa/dodico/crue/metier/emh/OrdRes.java 2013-04-02 15:59:38 UTC (rev 8369)
@@ -104,12 +104,12 @@
}
@UsedByComparison
- public List<String> getActiveOrdRes() {
+ public List<String> getActiveOrdResDisplayName() {
Collection<Dde> ddes = values.values();
ArrayList<String> res = new ArrayList<String>();
for (Dde dde : ddes) {
if (dde.isValeur()) {
- res.add(dde.getId());
+ res.add(dde.getDisplayName());
}
}
return res;
Modified: trunk/soft/fudaa-crue/pom.xml
===================================================================
--- trunk/soft/fudaa-crue/pom.xml 2013-04-02 15:27:26 UTC (rev 8368)
+++ trunk/soft/fudaa-crue/pom.xml 2013-04-02 15:59:38 UTC (rev 8369)
@@ -18,8 +18,8 @@
<properties>
<projetEncoding>UTF-8</projetEncoding>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
- <javaCompiler>1.6</javaCompiler>
- <targetJdk>1.6</targetJdk>
+ <javaCompiler>1.7</javaCompiler>
+ <targetJdk>1.7</targetJdk>
<fudaa-sig.version>1.4-SNAPSHOT</fudaa-sig.version>
<netbeans.run.params.ide/>
<netbeans.run.params>${netbeans.run.params.ide}</netbeans.run.params>
Modified: trunk/soft/fudaa-crue/ui-planimetry/src/main/java/org/fudaa/fudaa/crue/planimetry/action/TraceProfilSectionImporterAction.java
===================================================================
--- trunk/soft/fudaa-crue/ui-planimetry/src/main/java/org/fudaa/fudaa/crue/planimetry/action/TraceProfilSectionImporterAction.java 2013-04-02 15:27:26 UTC (rev 8368)
+++ trunk/soft/fudaa-crue/ui-planimetry/src/main/java/org/fudaa/fudaa/crue/planimetry/action/TraceProfilSectionImporterAction.java 2013-04-02 15:59:38 UTC (rev 8369)
@@ -40,7 +40,7 @@
PlanimetryController controller;
public TraceProfilSectionImporterAction(PlanimetryController controller) {
- super(NbBundle.getMessage(TraceProfilSectionImporterAction.class, "TraceProfilImporterAction.ActioName"), null, "IMPORT");
+ super(NbBundle.getMessage(TraceProfilSectionImporterAction.class, "TraceProfilImporterAction.ActionName"), null, "IMPORT");
assert controller != null;
this.controller = controller;
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|