From fdaa085fd08221c3a5bc7b97c291ec9e29b3d861 Mon Sep 17 00:00:00 2001
From: tjc <tjc@ee4ac58c-ac51-4696-9907-e4b3aa274f04>
Date: Fri, 4 Jul 2008 15:18:55 +0000
Subject: [PATCH] read and write db entry

git-svn-id: svn+ssh://svn.internal.sanger.ac.uk/repos/svn/pathsoft/artemis/trunk@8104 ee4ac58c-ac51-4696-9907-e4b3aa274f04
---
 .../sanger/artemis/io/ReadAndWriteEntry.java  | 213 ++++++++++++++++++
 1 file changed, 213 insertions(+)
 create mode 100644 uk/ac/sanger/artemis/io/ReadAndWriteEntry.java

diff --git a/uk/ac/sanger/artemis/io/ReadAndWriteEntry.java b/uk/ac/sanger/artemis/io/ReadAndWriteEntry.java
new file mode 100644
index 000000000..8b3f93e92
--- /dev/null
+++ b/uk/ac/sanger/artemis/io/ReadAndWriteEntry.java
@@ -0,0 +1,213 @@
+/* ReadAndWriteEntry.java
+
+ * This file is part of Artemis
+ *
+ * Copyright(C) 2008  Genome Research Limited
+ *
+ * This program 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 2
+ * of the License, or(at your option) any later version.
+ *
+ * This program 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 this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ *
+ */
+
+package uk.ac.sanger.artemis.io;
+
+import java.io.File;
+import java.io.IOException;
+
+import uk.ac.sanger.artemis.components.database.DatabaseEntrySource;
+import uk.ac.sanger.artemis.components.genebuilder.GeneUtils;
+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;
+import uk.ac.sanger.artemis.Entry;
+import uk.ac.sanger.artemis.FeatureVector;
+import uk.ac.sanger.artemis.Options;
+
+public class ReadAndWriteEntry
+{
+
+  private static org.apache.log4j.Logger logger4j = 
+    org.apache.log4j.Logger.getLogger(ReadAndWriteEntry.class);
+ 
+  /**
+   * Read from the database, given a srcFeature uniquename
+   * @param uniqueName
+   * @return
+   * @throws OutOfRangeException
+   * @throws NoSequenceException
+   * @throws IOException
+   */
+  public static Entry readEntryFromDatabase(final String uniqueName) 
+         throws OutOfRangeException, NoSequenceException, IOException
+  {
+    final DatabaseEntrySource entry_source = new DatabaseEntrySource();
+    boolean promptUser = true;
+    if(System.getProperty("read_only") != null)
+      promptUser = false;
+
+    if(!entry_source.setLocation(promptUser))
+      return null;
+    
+    String url = (String)entry_source.getLocation();
+    int index  = url.indexOf("?");
+    
+    String userName = url.substring(index+1).trim();
+    if(userName.startsWith("user="))
+      userName = userName.substring(5);
+    
+    final String srcFeatureId = getFeatureId(entry_source, uniqueName);
+    
+    final InputStreamProgressListener stream_progress_listener =
+        new InputStreamProgressListener() 
+    {
+      public void progressMade(final InputStreamProgressEvent event) 
+      {
+        final int char_count = event.getCharCount();
+        if(char_count != -1) 
+          logger4j.debug("chars read so far: " + char_count);
+      }
+      public void progressMade(String progress)
+      {
+        logger4j.debug(progress);
+      }
+    };
+    return entry_source.getEntry(srcFeatureId, userName, 
+                                 stream_progress_listener);
+  }
+  
+  /**
+   * Write entry to a file
+   * @param entry
+   * @param file
+   * @param flatten Flatten the gene model and combine the qualifiers if true.
+   *    If false it will write all features and qualifiers out.
+   * @param force invalid qualifiers and any features with invalid keys will 
+   *    be quietly thrown away when saving.
+   * @param destination_type Should be one of EMBL_FORMAT, GENBANK_FORMAT,
+   *    GFF_FORMAT or ANY_FORMAT.  If ANY_FORMAT then the Entry will
+   *    be saved in the same format it was created, otherwise it will be saved
+   *    in the given format.
+   * @throws IOException
+   * @throws EntryInformationException
+   */
+  public static void writeDatabaseEntryToFile(final Entry entry, final File file,
+                                              final boolean flatten, 
+                                              final boolean force,
+                                              final int destination_type) 
+         throws IOException, EntryInformationException
+  {
+    GeneUtils.lazyLoadAll(entry, null);
+
+    EntryInformation artemis_entry_information = Options.getArtemisEntryInformation();
+    if(!flatten)
+    {
+      final FeatureVector features = entry.getAllFeatures();
+      for(int i=0; i<features.size(); i++)
+        addAllKeysQualifiers(artemis_entry_information, features.elementAt(i).getEmblFeature());
+    }
+    entry.save(file, destination_type, force, artemis_entry_information);
+  }
+  
+  /**
+   * Add all keys and qualifiers for a given feature to the EntryInformation 
+   * @param entry_information
+   * @param feature
+   */
+  private static void addAllKeysQualifiers(final EntryInformation entry_information,
+                                           final Feature feature)
+  {
+    Key new_key = feature.getKey();
+    
+    new_key = PublicDBDocumentEntry.mapKeys(new_key);
+    
+    boolean keyAdded = false;
+    if(!entry_information.isValidKey(new_key))
+    {
+      entry_information.addKey(new_key);
+      keyAdded = true;
+    }
+    
+    final QualifierVector feature_qualifiers = feature.getQualifiers();
+    
+    // check the qualifiers
+    for(int i = 0 ; i < feature_qualifiers.size() ; ++i)
+    {
+      final Qualifier this_qualifier = (Qualifier)feature_qualifiers.elementAt(i);
+      final String this_qualifier_name = this_qualifier.getName();
+
+      if(!entry_information.isValidQualifier(this_qualifier_name) ||
+         !entry_information.isValidQualifier(new_key, this_qualifier_name) ||
+         keyAdded) 
+      {
+        QualifierInfo qualifierInfo = entry_information.getQualifierInfo(this_qualifier_name);
+        
+        if(qualifierInfo == null)
+        {
+          KeyVector keys = new KeyVector();
+          qualifierInfo = new QualifierInfo(this_qualifier_name, QualifierInfo.QUOTED_TEXT,
+                                            keys, null, false);
+          try
+          {
+            entry_information.addQualifierInfo(qualifierInfo);
+          }
+          catch(QualifierInfoException e)
+          {
+            e.printStackTrace();
+          }
+        }
+        
+        if(qualifierInfo.getValidKeys() != null)
+          qualifierInfo.getValidKeys().add(new_key);
+      }
+    }
+
+  }
+  
+  /**
+   * Get feature id
+   * @param entry_source
+   * @param srcUniqueName
+   * @return
+   */
+  public static String getFeatureId(
+      final DatabaseEntrySource entry_source, final String srcUniqueName)
+  {
+    final DatabaseDocument doc = entry_source.getDatabaseDocument();
+    org.gmod.schema.sequence.Feature feature = doc.getFeatureByUniquename(srcUniqueName);
+    return Integer.toString(feature.getFeatureId());
+  }
+  
+  public static void main(final String args[])
+  {
+    try
+    {
+      Entry entry = ReadAndWriteEntry.readEntryFromDatabase("Pf3D7_03");
+      ReadAndWriteEntry.writeDatabaseEntryToFile(
+          entry, new File("Pf3D7_03.flatten"), true, false, 
+          DocumentEntryFactory.EMBL_FORMAT);
+      
+      ReadAndWriteEntry.writeDatabaseEntryToFile(
+          entry, new File("Pf3D7_03.not-flatten"), false, false,
+          DocumentEntryFactory.EMBL_FORMAT);
+    }
+    catch(Exception e)
+    {
+      e.printStackTrace();
+    }
+    System.exit(0);
+  }
+  
+}
\ No newline at end of file
-- 
GitLab