From 3b41b3dee4bba29ebd7c94b631e5a48228bc747c Mon Sep 17 00:00:00 2001
From: tjc <tjc@ee4ac58c-ac51-4696-9907-e4b3aa274f04>
Date: Fri, 9 Jan 2009 16:18:57 +0000
Subject: [PATCH] updates

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

diff --git a/uk/ac/sanger/artemis/components/TransferAnnotationTool.java b/uk/ac/sanger/artemis/components/TransferAnnotationTool.java
index 74e92767f..fdb113c41 100644
--- a/uk/ac/sanger/artemis/components/TransferAnnotationTool.java
+++ b/uk/ac/sanger/artemis/components/TransferAnnotationTool.java
@@ -38,14 +38,25 @@ import javax.swing.JLabel;
 import javax.swing.JPanel;
 import javax.swing.JTextArea;
 
+import uk.ac.sanger.artemis.Entry;
 import uk.ac.sanger.artemis.EntryGroup;
 import uk.ac.sanger.artemis.Feature;
 import uk.ac.sanger.artemis.FeaturePredicate;
 import uk.ac.sanger.artemis.FeatureVector;
+import uk.ac.sanger.artemis.SimpleEntryGroup;
+import uk.ac.sanger.artemis.chado.ChadoTransactionManager;
+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.PartialSequence;
 import uk.ac.sanger.artemis.io.Qualifier;
 import uk.ac.sanger.artemis.io.QualifierVector;
+import uk.ac.sanger.artemis.sequence.NoSequenceException;
+import uk.ac.sanger.artemis.util.DatabaseDocument;
+import uk.ac.sanger.artemis.util.InputStreamProgressEvent;
+import uk.ac.sanger.artemis.util.InputStreamProgressListener;
+import uk.ac.sanger.artemis.util.OutOfRangeException;
 
 class TransferAnnotationTool extends JFrame
 {
@@ -62,9 +73,12 @@ class TransferAnnotationTool extends JFrame
     "orthologous_to",
     "paralogous_to",
     "fasta_file",
-    "blastp_file"
+    "blastp_file",
+    "blastn_file",
+    "systematic_id",
+    "previous_systematic_id"
   };
-
+  
   public TransferAnnotationTool(final Feature feature, 
   		                          final EntryGroup entryGroup)
   {
@@ -106,6 +120,8 @@ class TransferAnnotationTool extends JFrame
       c.gridy = ++nrows;
     }
 
+    
+    
     c.gridx = 1;
     c.gridy = 1;
     c.gridheight = nrows;
@@ -132,16 +148,23 @@ class TransferAnnotationTool extends JFrame
     });
     pane.add(toggle, c);
 
+    final JCheckBox sameKeyCheckBox = new JCheckBox("Add to feature of same key", true);
+
     final JButton transfer = new JButton(">>TRANSFER");
     transfer.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
       {
-        transferAnnotation(qualifierCheckBoxes, geneNameTextArea, feature, entryGroup);
+        transferAnnotation(qualifierCheckBoxes, geneNameTextArea, feature, 
+        		entryGroup, sameKeyCheckBox.isSelected());
       }
     });
     c.gridx = 1;
     pane.add(transfer, c);
+    
+    c.gridy = ++nrows;
+    c.gridx = 1;
+    pane.add(sameKeyCheckBox, c);
 
     final JButton close = new JButton("CLOSE");
     close.addActionListener(new ActionListener()
@@ -182,11 +205,12 @@ class TransferAnnotationTool extends JFrame
    */
   private void transferAnnotation(final Vector qualifierCheckBoxes, 
   		                            final JTextArea geneNameTextArea,
-  		                            final Feature feature,
-  		                            final EntryGroup entryGroup)
+  		                            final Feature orginatingFeature,
+  		                            final EntryGroup entryGroup,
+  		                            final boolean sameKey)
   {
     // transfer selected annotation to genes
-  	final QualifierVector qualifiers = feature.getQualifiers();
+  	final QualifierVector qualifiers = orginatingFeature.getQualifiers();
   	final QualifierVector qualifiersToTransfer = new QualifierVector();
   	for(int i = 0; i < qualifierCheckBoxes.size(); i++)
     {
@@ -198,59 +222,185 @@ class TransferAnnotationTool extends JFrame
   		}
     }
   	
-  	final String geneNames[] = geneNameTextArea.getText().split("\\s");
-  	final String key = feature.getKey().getKeyString();
+  	String geneNames[] = geneNameTextArea.getText().split("\\s");
+
+  	final String key = orginatingFeature.getKey().getKeyString();
   	final FeatureVector features = entryGroup.getAllFeatures();
 
-  	final FeaturePredicate predicate = new FeaturePredicate()
+  	// transfer selected annotation
+  	entryGroup.getActionController().startAction();
+  	geneNames = transfer(features, qualifiersToTransfer, key, 
+  			                 sameKey, GeneUtils.isDatabaseEntry(entryGroup), geneNames);
+  	entryGroup.getActionController().endAction();
+  	
+  	//
+  	// Commit changes to genes not in Artemis but in the database
+  	//
+   /* DatabaseDocumentEntry db_entry = 
+    	(DatabaseDocumentEntry) orginatingFeature.getEntry().getEMBLEntry();
+    DatabaseDocument doc = (DatabaseDocument) db_entry.getDocument();
+
+  	for(int i=0; i<geneNames.length; i++)
   	{
-			public boolean testPredicate(Feature feature)
+  		System.out.println(geneNames[i]);
+  		DatabaseDocumentEntry newDbEntry = GeneEdit.makeGeneEntry(null, geneNames[i], doc, null);
+  		char[] c = new char[1];
+      PartialSequence ps = new PartialSequence(c, 100, 0, null, null);
+      newDbEntry.setPartialSequence(ps);
+      Entry entry = null;
+      try
+      {
+        entry = new Entry(newDbEntry);
+      }
+      catch(Exception e) { e.printStackTrace(); }
+      
+      SimpleEntryGroup entry_group = new SimpleEntryGroup();
+      entry_group.addElement(entry);
+      
+      ChadoTransactionManager ctm = new ChadoTransactionManager();
+      entry_group.addFeatureChangeListener(ctm);
+      entry_group.addEntryChangeListener(ctm);
+      ctm.setEntryGroup(entry_group);
+      
+  		geneNames = transfer(entry.getAllFeatures(), qualifiersToTransfer, key, 
+          sameKey, true, geneNames);
+  		ChadoTransactionManager.commit(
+  				(DatabaseDocument)newDbEntry.getDocument(), false, ctm);
+  		
+      //if(newDbEntry != null)
+      //  GeneEdit.showGeneEditor(null, geneNames[i], newDbEntry);
+  	}*/
+  }
+  
+  /**
+   * 
+   * @param features
+   * @param qualifiersToTransfer
+   * @param key
+   * @param sameKey
+   * @param isDatabaseEntry
+   * @param geneNames
+   * @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);
+
+		for (int i = 0; i < features.size(); i++)
+		{
+			Feature thisFeature = features.elementAt(i);
+			if (predicate.testPredicate(thisFeature))
 			{
-	     	String chadoGeneName = null;
-	     	if(GeneUtils.isDatabaseEntry(entryGroup))
-	     	{	
-	     		GFFStreamFeature gffFeature = ((GFFStreamFeature)feature.getEmblFeature());
-	     		if(gffFeature.getChadoGene() != null)
-	     		  chadoGeneName = gffFeature.getChadoGene().getGeneUniqueName();
-	     	}
-	      	
-				String thisFeatureSystematicName = feature.getSystematicName();
-				for(int i=0;i<geneNames.length;i++)
+				for (int j = 0; j < qualifiersToTransfer.size(); j++)
 				{
-					if(feature.getKey().getKeyString().equals(key))
+					Qualifier qualifier = (Qualifier) qualifiersToTransfer.elementAt(j);
+					try
 					{
-						if( geneNames[i].equals(thisFeatureSystematicName) ||
-								(chadoGeneName != null && geneNames[i].equals(chadoGeneName)) )
-						{
-							return true;
-						}
+						thisFeature.addQualifierValues(qualifier);
+					} catch (Exception e1)
+					{
+						e1.printStackTrace();
 					}
 				}
-				return false;
+				geneNames = removeArrayElement(geneNames, predicate.getGeneName());
 			}
-  	};
+		}
+		return geneNames;
+	}
+  
+  /**
+   * Remove a string from an array of strings. If the string appears multiple 
+   * times in the array this method will delete all occurrences.
+   * @param strArr
+   * @param str
+   * @return
+   */
+  private String[] removeArrayElement(final String strArr[], final String str)
+  {
+  	String[] newarray = new String[strArr.length - 1];
+  	int count = 0;
+  	for(int i=0;i<strArr.length; i++)
+  	{
+  		if(strArr[i].equals(str))
+  			continue;
+  		
+  	  // not found str return original array
+  		if(count>=newarray.length) 
+  			return strArr;
+  		newarray[count] = strArr[i];
+  		count++;
+  	}
   	
-  	// transfer selected annotation
-  	entryGroup.getActionController().startAction();
-  	for(int i=0; i<features.size(); i++)
+  	if(count < newarray.length)
   	{
-  	  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();
-					} 
-  	  	}
-  	  }
+  		String[] tmparray = new String[count];
+  		System.arraycopy(newarray, 0, tmparray, 0, count);
+  		newarray = tmparray;
   	}
-  	entryGroup.getActionController().endAction();
+  	
+    return newarray;
+  }
+   
+  /**
+   * Test if the feature is nominated to have annotation transferred
+   * to it.
+   */
+  class TransferFeaturePredicate implements FeaturePredicate
+  {
+  	private String geneName;
+  	private String key;
+  	private boolean sameKey;
+  	private boolean isDatabaseEntry;
+  	private String[] geneNames;
+  	
+  	public TransferFeaturePredicate(final String key, 
+  			                            final boolean sameKey,
+  			                            final boolean isDatabaseEntry,
+  			                            final String[] geneNames)
+  	{
+  		this.key             = key;
+  		this.sameKey         = sameKey;
+  		this.isDatabaseEntry = isDatabaseEntry;
+  		this.geneNames       = geneNames;
+  	}
+  	
+		public boolean testPredicate(Feature targetFeature)
+		{
+			String targetKey = targetFeature.getKey().getKeyString();
+			if(!sameKey || !targetKey.equals(key))
+				return false;
+			
+     	String chadoGeneName = null;
+     	if(isDatabaseEntry)
+     	{	
+     		GFFStreamFeature gffFeature = ((GFFStreamFeature)targetFeature.getEmblFeature());
+     		if(gffFeature.getChadoGene() != null)
+     		  chadoGeneName = gffFeature.getChadoGene().getGeneUniqueName();
+     	}
+      	
+			String thisFeatureSystematicName = targetFeature.getSystematicName();
+			
+			for(int i=0;i<geneNames.length;i++)
+			{
+				if( geneNames[i].equals(thisFeatureSystematicName) ||
+						(chadoGeneName != null && geneNames[i].equals(chadoGeneName)) )
+				{
+					geneName = geneNames[i];
+					return true;
+				}
+			}
+			return false;
+		}
+		
+		public String getGeneName()
+		{
+			return geneName;
+		}
   }
 }
-- 
GitLab