From e56375d11637dd7b878544ee4fc0ed71ca0462f8 Mon Sep 17 00:00:00 2001
From: tjc <tjc@ee4ac58c-ac51-4696-9907-e4b3aa274f04>
Date: Wed, 18 Mar 2009 11:39:26 +0000
Subject: [PATCH] ensure the tool does not transfer and duplicate existing
 qualifiers

git-svn-id: svn+ssh://svn.internal.sanger.ac.uk/repos/svn/pathsoft/artemis/trunk@10162 ee4ac58c-ac51-4696-9907-e4b3aa274f04
---
 .../components/TransferAnnotationTool.java    | 110 +++++++++++++-----
 1 file changed, 81 insertions(+), 29 deletions(-)

diff --git a/uk/ac/sanger/artemis/components/TransferAnnotationTool.java b/uk/ac/sanger/artemis/components/TransferAnnotationTool.java
index 1e56b8f0e..fdde6c8b6 100644
--- a/uk/ac/sanger/artemis/components/TransferAnnotationTool.java
+++ b/uk/ac/sanger/artemis/components/TransferAnnotationTool.java
@@ -52,10 +52,12 @@ import uk.ac.sanger.artemis.components.genebuilder.GeneEdit;
 import uk.ac.sanger.artemis.components.genebuilder.GeneUtils;
 import uk.ac.sanger.artemis.io.DatabaseDocumentEntry;
 import uk.ac.sanger.artemis.io.GFFStreamFeature;
+import uk.ac.sanger.artemis.io.InvalidRelationException;
 import uk.ac.sanger.artemis.io.PartialSequence;
 import uk.ac.sanger.artemis.io.Qualifier;
 import uk.ac.sanger.artemis.io.QualifierVector;
 import uk.ac.sanger.artemis.util.DatabaseDocument;
+import uk.ac.sanger.artemis.util.StringVector;
 
 class TransferAnnotationTool extends JFrame
 {
@@ -69,12 +71,17 @@ class TransferAnnotationTool extends JFrame
     "Parent",
     "isObsolete",
     "timelastmodified",
+    "cytoplasm_location",
+    "non_cytoplasm_location",
     "orthologous_to",
     "paralogous_to",
+    "PlasmoAP_score",
+    "polypeptide_domain",
     "fasta_file",
     "blastp_file",
     "blastn_file",
     "systematic_id",
+    "transmembrane",
     "previous_systematic_id"
   };
   
@@ -311,36 +318,81 @@ class TransferAnnotationTool extends JFrame
    * @return
    */
   private String[] transfer(final FeatureVector features,
-  		                      final QualifierVector qualifiersToTransfer,
-  		                      final String key, 
-  		                      final boolean sameKey,
-  		                      final boolean isDatabaseEntry,
-  		                      String[] geneNames)
-	{
-		final TransferFeaturePredicate predicate = new TransferFeaturePredicate(
-				key, sameKey, isDatabaseEntry, geneNames);
+                            final QualifierVector qualifiersToTransfer, 
+                            final String key,
+                            final boolean sameKey, 
+                            final boolean isDatabaseEntry, 
+                            String[] geneNames)
+  {
+    final TransferFeaturePredicate predicate = new TransferFeaturePredicate(
+        key, sameKey, isDatabaseEntry, geneNames);
 
-		for (int i = 0; i < features.size(); i++)
-		{
-			Feature thisFeature = features.elementAt(i);
-			if (predicate.testPredicate(thisFeature))
-			{
-				for (int j = 0; j < qualifiersToTransfer.size(); j++)
-				{
-					Qualifier qualifier = (Qualifier) qualifiersToTransfer.elementAt(j);
-					try
-					{
-						thisFeature.addQualifierValues(qualifier);
-					} catch (Exception e1)
-					{
-						e1.printStackTrace();
-					}
-				}
-				geneNames = removeArrayElement(geneNames, predicate.getGeneName());
-			}
-		}
-		return geneNames;
-	}
+    for (int i = 0; i < features.size(); i++)
+    {
+      Feature thisFeature = features.elementAt(i);
+      if (predicate.testPredicate(thisFeature))
+      {
+        for (int j = 0; j < qualifiersToTransfer.size(); j++)
+        {
+          Qualifier newQualifier = (Qualifier) qualifiersToTransfer.elementAt(j);
+          
+          try
+          {
+            final StringVector oldValues; 
+            if(thisFeature.getQualifierByName(newQualifier.getName()) == null)
+              oldValues = null;
+            else 
+              oldValues = 
+                thisFeature.getQualifierByName(newQualifier.getName()).getValues();
+            
+            final Qualifier newQualifierTmp =
+              getQualifierWithoutDuplicateValues(newQualifier, oldValues);
+            if(newQualifierTmp == null)
+              continue;
+            thisFeature.addQualifierValues(newQualifierTmp);
+          }
+          catch (Exception e1)
+          {
+            e1.printStackTrace();
+          }
+        }
+        geneNames = removeArrayElement(geneNames, predicate.getGeneName());
+      }
+    }
+    return geneNames;
+  }
+  
+  /**
+   * Return a qualifier copy of the qualifier provided that does not contain
+   * any of the values in the StringVector.
+   * @param newQualifier
+   * @param oldValues
+   * @return
+   * @throws InvalidRelationException
+   */
+  private Qualifier getQualifierWithoutDuplicateValues( 
+      final Qualifier qualifier,
+      final StringVector values) throws InvalidRelationException
+  {
+    final Qualifier newQualifier;
+    if (values == null || values.size() < 1)
+      newQualifier = qualifier;
+    else
+    {
+      StringVector newValues =  qualifier.getValues();
+      StringVector valuesToAdd = new StringVector();
+      for (int k = 0; k < newValues.size(); k++)
+      {
+        if(!values.contains(newValues.get(k)))
+          valuesToAdd.add(newValues.get(k));
+      }
+
+      if(valuesToAdd.size() == 0)
+        return null;
+      newQualifier = new Qualifier(qualifier.getName(), valuesToAdd);
+    }
+    return newQualifier;
+  }
   
   /**
    * Remove a string from an array of strings. If the string appears multiple 
-- 
GitLab