diff --git a/uk/ac/sanger/artemis/components/EntryEdit.java b/uk/ac/sanger/artemis/components/EntryEdit.java index 21c8d82c401dc3d598263bde684cf29e237f3081..5b6428efb10f9fa4c0e81171707f9a197a9d7746 100644 --- a/uk/ac/sanger/artemis/components/EntryEdit.java +++ b/uk/ac/sanger/artemis/components/EntryEdit.java @@ -20,7 +20,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - * $Header: //tmp/pathsoft/artemis/uk/ac/sanger/artemis/components/EntryEdit.java,v 1.65 2008-06-16 12:11:01 tjc Exp $ + * $Header: //tmp/pathsoft/artemis/uk/ac/sanger/artemis/components/EntryEdit.java,v 1.66 2008-06-17 15:15:54 tjc Exp $ */ package uk.ac.sanger.artemis.components; @@ -31,6 +31,7 @@ import uk.ac.sanger.artemis.chado.ClusterLazyQualifierValue; import uk.ac.sanger.artemis.chado.SimilarityLazyQualifierValue; import uk.ac.sanger.artemis.components.filetree.FileList; import uk.ac.sanger.artemis.components.filetree.FileManager; +import uk.ac.sanger.artemis.components.genebuilder.GeneUtils; import uk.ac.sanger.artemis.editor.BigPane; import uk.ac.sanger.artemis.editor.FastaTextPane; import uk.ac.sanger.artemis.editor.HitInfo; @@ -67,7 +68,7 @@ import java.util.Vector; * Each object of this class is used to edit an EntryGroup object. * * @author Kim Rutherford - * @version $Id: EntryEdit.java,v 1.65 2008-06-16 12:11:01 tjc Exp $ + * @version $Id: EntryEdit.java,v 1.66 2008-06-17 15:15:54 tjc Exp $ * */ public class EntryEdit extends JFrame @@ -702,69 +703,8 @@ public class EntryEdit extends JFrame } - if(entry.getEMBLEntry() instanceof DatabaseDocumentEntry) - { - final List lazySimilarityValues = new Vector(); - final List lazyClusterValues = new Vector(); - final FeatureVector features = entry.getAllFeatures(); - // find any lazy values to be loaded - - - for(int i=0; i<features.size(); i++) - { - QualifierVector qualifiers = features.elementAt(i).getQualifiers(); - for(int j=0; j<qualifiers.size(); j++) - { - Qualifier qualifier = (Qualifier)qualifiers.get(j); - if(qualifier instanceof QualifierLazyLoading && - !((QualifierLazyLoading)qualifier).isAllLazyValuesLoaded()) - { - if( ((QualifierLazyLoading)qualifier).getValue(0) instanceof SimilarityLazyQualifierValue ) - lazySimilarityValues.addAll( ((QualifierLazyLoading)qualifier).getLazyValues() ); - else if( ((QualifierLazyLoading)qualifier).getValue(0) instanceof ClusterLazyQualifierValue ) - { - lazyClusterValues.addAll( ((QualifierLazyLoading)qualifier).getLazyValues() ); - } - else - ((QualifierLazyLoading)qualifier).setForceLoad(true); - } - } - } - - if(lazySimilarityValues.size() > 0 || lazyClusterValues.size() > 0) - { - int n = JOptionPane.showConfirmDialog(null, - "Load and write to file all qualifers from the database?"+ - "\nThis may take a few minutes.", - "Load All Data", - JOptionPane.YES_NO_OPTION); - - if(n == JOptionPane.YES_OPTION) - { - setCursor(new Cursor(Cursor.WAIT_CURSOR)); - final DatabaseDocument document = - (DatabaseDocument)((DocumentEntry)entry.getEMBLEntry()).getDocument(); - - if(lazySimilarityValues.size() > 0) - SimilarityLazyQualifierValue.bulkRetrieve(lazySimilarityValues,document); - - if(lazyClusterValues.size() > 0) - ClusterLazyQualifierValue.setClusterFromValueList(lazyClusterValues, document); - - for(int i=0; i<features.size(); i++) - { - QualifierVector qualifiers = features.elementAt(i).getQualifiers(); - for(int j=0; j<qualifiers.size(); j++) - { - Qualifier qualifier = (Qualifier)qualifiers.get(j); - if(qualifier instanceof QualifierLazyLoading) - ((QualifierLazyLoading)qualifier).setForceLoad(true); - } - } - setCursor(new Cursor(Cursor.DEFAULT_CURSOR)); - } - } - } + if(entry.getEMBLEntry() instanceof DatabaseDocumentEntry) + GeneUtils.lazyLoadAll(entry, this); // if(!System.getProperty("os.arch").equals("alpha")) diff --git a/uk/ac/sanger/artemis/components/ReadAndWriteEntry.java b/uk/ac/sanger/artemis/components/ReadAndWriteEntry.java index 646d0fc54faec1b772b40de493f4c197f52ff5b2..63323579e96f47fc30d42784cd715d43eef5c073 100644 --- a/uk/ac/sanger/artemis/components/ReadAndWriteEntry.java +++ b/uk/ac/sanger/artemis/components/ReadAndWriteEntry.java @@ -26,9 +26,11 @@ 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.io.DocumentEntryFactory; import uk.ac.sanger.artemis.io.EntryInformationException; 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; @@ -39,13 +41,19 @@ class ReadAndWriteEntry private static org.apache.log4j.Logger logger4j = org.apache.log4j.Logger.getLogger(ReadAndWriteEntry.class); - - - - public static Entry readEntryFromDatabase(final String srcFeatureId) + + /** + * 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 { - DatabaseEntrySource entry_source = new DatabaseEntrySource(); + final DatabaseEntrySource entry_source = new DatabaseEntrySource(); boolean promptUser = true; if(System.getProperty("read_only") != null) promptUser = false; @@ -60,6 +68,8 @@ class ReadAndWriteEntry if(userName.startsWith("user=")) userName = userName.substring(5); + final String srcFeatureId = getFeatureId(entry_source, uniqueName); + final InputStreamProgressListener stream_progress_listener = new InputStreamProgressListener() { @@ -75,26 +85,47 @@ class ReadAndWriteEntry } }; return entry_source.getEntry(srcFeatureId, userName, - stream_progress_listener); + stream_progress_listener); } - public static void writeEntry(final Entry entry) + /** + * Write entry to a file + * @param entry + * @param file + * @throws IOException + * @throws EntryInformationException + */ + public static void writeEntry(final Entry entry, final File file) throws IOException, EntryInformationException { - File file = new File("x"); + System.out.println(file.getAbsolutePath()); + GeneUtils.lazyLoadAll(entry, null); entry.save(file, DocumentEntryFactory.EMBL_FORMAT, false); } + /** + * 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("1"); - ReadAndWriteEntry.writeEntry(entry); + Entry entry = ReadAndWriteEntry.readEntryFromDatabase("Pf3D7_03"); + ReadAndWriteEntry.writeEntry(entry,new File("Pf3D7_03")); } catch(Exception e) { - // TODO Auto-generated catch block e.printStackTrace(); } } diff --git a/uk/ac/sanger/artemis/components/genebuilder/GeneUtils.java b/uk/ac/sanger/artemis/components/genebuilder/GeneUtils.java index b53ff5c2a82feb5d2fde95132105b010aace42cc..639560e761960478aaf8ccc339ad86a8de0f2bab 100644 --- a/uk/ac/sanger/artemis/components/genebuilder/GeneUtils.java +++ b/uk/ac/sanger/artemis/components/genebuilder/GeneUtils.java @@ -21,6 +21,7 @@ package uk.ac.sanger.artemis.components.genebuilder; import java.awt.BorderLayout; +import java.awt.Cursor; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Collection; @@ -47,11 +48,14 @@ import org.gmod.schema.sequence.FeatureDbXRef; import org.gmod.schema.sequence.FeaturePub; import org.gmod.schema.sequence.FeatureSynonym; +import uk.ac.sanger.artemis.chado.ClusterLazyQualifierValue; +import uk.ac.sanger.artemis.chado.SimilarityLazyQualifierValue; import uk.ac.sanger.artemis.components.EditMenu; import uk.ac.sanger.artemis.components.MessageDialog; import uk.ac.sanger.artemis.components.SelectionMenu; import uk.ac.sanger.artemis.io.ChadoCanonicalGene; import uk.ac.sanger.artemis.io.DatabaseDocumentEntry; +import uk.ac.sanger.artemis.io.DocumentEntry; import uk.ac.sanger.artemis.io.EntryInformationException; import uk.ac.sanger.artemis.io.Feature; import uk.ac.sanger.artemis.io.GFFStreamFeature; @@ -60,6 +64,7 @@ import uk.ac.sanger.artemis.io.Key; import uk.ac.sanger.artemis.io.KeyVector; import uk.ac.sanger.artemis.io.Location; import uk.ac.sanger.artemis.io.Qualifier; +import uk.ac.sanger.artemis.io.QualifierLazyLoading; import uk.ac.sanger.artemis.io.QualifierVector; import uk.ac.sanger.artemis.io.Range; import uk.ac.sanger.artemis.io.RangeVector; @@ -270,6 +275,71 @@ public class GeneUtils feature.setQualifier(new Qualifier("ID", feature.getSegmentID( rv ))); } + public static void lazyLoadAll(final Entry entry, final JFrame parent) + { + final List lazySimilarityValues = new Vector(); + final List lazyClusterValues = new Vector(); + final FeatureVector features = entry.getAllFeatures(); + // find any lazy values to be loaded + + + for(int i=0; i<features.size(); i++) + { + QualifierVector qualifiers = features.elementAt(i).getQualifiers(); + for(int j=0; j<qualifiers.size(); j++) + { + Qualifier qualifier = (Qualifier)qualifiers.get(j); + if(qualifier instanceof QualifierLazyLoading && + !((QualifierLazyLoading)qualifier).isAllLazyValuesLoaded()) + { + if( ((QualifierLazyLoading)qualifier).getValue(0) instanceof SimilarityLazyQualifierValue ) + lazySimilarityValues.addAll( ((QualifierLazyLoading)qualifier).getLazyValues() ); + else if( ((QualifierLazyLoading)qualifier).getValue(0) instanceof ClusterLazyQualifierValue ) + { + lazyClusterValues.addAll( ((QualifierLazyLoading)qualifier).getLazyValues() ); + } + else + ((QualifierLazyLoading)qualifier).setForceLoad(true); + } + } + } + + if(lazySimilarityValues.size() > 0 || lazyClusterValues.size() > 0) + { + int n = JOptionPane.showConfirmDialog(null, + "Load and write to file all qualifers from the database?"+ + "\nThis may take a few minutes.", + "Load All Data", + JOptionPane.YES_NO_OPTION); + + if(n == JOptionPane.YES_OPTION) + { + if(parent != null) + parent.setCursor(new Cursor(Cursor.WAIT_CURSOR)); + final DatabaseDocument document = + (DatabaseDocument)((DocumentEntry)entry.getEMBLEntry()).getDocument(); + + if(lazySimilarityValues.size() > 0) + SimilarityLazyQualifierValue.bulkRetrieve(lazySimilarityValues,document); + + if(lazyClusterValues.size() > 0) + ClusterLazyQualifierValue.setClusterFromValueList(lazyClusterValues, document); + + for(int i=0; i<features.size(); i++) + { + QualifierVector qualifiers = features.elementAt(i).getQualifiers(); + for(int j=0; j<qualifiers.size(); j++) + { + Qualifier qualifier = (Qualifier)qualifiers.get(j); + if(qualifier instanceof QualifierLazyLoading) + ((QualifierLazyLoading)qualifier).setForceLoad(true); + } + } + if(parent != null) + parent.setCursor(new Cursor(Cursor.DEFAULT_CURSOR)); + } + } + } /** * Sorts the elements of the vector using a simple O(n^2) selection diff --git a/uk/ac/sanger/artemis/io/PublicDBDocumentEntry.java b/uk/ac/sanger/artemis/io/PublicDBDocumentEntry.java index 2c751d3efe3d722ad1ff4e29b97b77de0e3bb82a..423e2e65615fbfef5005d821db87f433301c06da 100644 --- a/uk/ac/sanger/artemis/io/PublicDBDocumentEntry.java +++ b/uk/ac/sanger/artemis/io/PublicDBDocumentEntry.java @@ -20,7 +20,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - * $Header: //tmp/pathsoft/artemis/uk/ac/sanger/artemis/io/PublicDBDocumentEntry.java,v 1.9 2008-06-16 12:13:14 tjc Exp $ + * $Header: //tmp/pathsoft/artemis/uk/ac/sanger/artemis/io/PublicDBDocumentEntry.java,v 1.10 2008-06-17 15:15:54 tjc Exp $ */ package uk.ac.sanger.artemis.io; @@ -36,7 +36,7 @@ import java.io.IOException; * entry. * * @author Kim Rutherford - * @version $Id: PublicDBDocumentEntry.java,v 1.9 2008-06-16 12:13:14 tjc Exp $ + * @version $Id: PublicDBDocumentEntry.java,v 1.10 2008-06-17 15:15:54 tjc Exp $ **/ public class PublicDBDocumentEntry extends SimpleDocumentEntry @@ -165,24 +165,27 @@ public class PublicDBDocumentEntry extends SimpleDocumentEntry qualifiers.addAll(chadoGene.getGene().getQualifiers().copy()); } + + final String[][] QUALIFIERS_TO_MAP = + { + {"comment", "note"}, + {"Dbxref", "db_xref"}, + {"private", "note"}, + {"orthologous_to", "ortholog"}, + {"paralogous_to", "paralog"} + }; + try { - int index = qualifiers.indexOfQualifierWithName("comment"); - - if(index > -1) - { - StringVector comments = ((Qualifier)qualifiers.get(index)).getValues(); - Qualifier noteQualifier = new Qualifier("note", comments); - qualifiers.setQualifier(noteQualifier); - } + for(int i=0; i<QUALIFIERS_TO_MAP.length; i++) + changeQualifierName(qualifiers, QUALIFIERS_TO_MAP[i][0], QUALIFIERS_TO_MAP[i][1]); for(int i=0; i<QUALIFIERS_TO_REMOVE.length; i++) { - index = qualifiers.indexOfQualifierWithName(QUALIFIERS_TO_REMOVE[i]); - if(index > -1) - qualifiers.removeElementAt(index); + qualifiers.removeQualifierByName(QUALIFIERS_TO_REMOVE[i]); + qualifiers.removeQualifierByName(QUALIFIERS_TO_REMOVE[i]); + qualifiers.removeQualifierByName(QUALIFIERS_TO_REMOVE[i]); } - if(key.getKeyString().equals(DatabaseDocument.EXONMODEL)) key = new Key("CDS"); @@ -196,6 +199,8 @@ public class PublicDBDocumentEntry extends SimpleDocumentEntry return null; else if(key.getKeyString().equals("gene")) return null; + else if(key.getKeyString().equals("centromere")) + return null; else if(key.getKeyString().equals("transcript") || key.getKeyString().equals("mRNA")) return null; @@ -273,6 +278,27 @@ public class PublicDBDocumentEntry extends SimpleDocumentEntry } } + /** + * Change the name of a qualifier + * @param qualifiers + * @param oldName + * @param newName + */ + private void changeQualifierName(final QualifierVector qualifiers, + final String oldName, + final String newName) + { + int index = qualifiers.indexOfQualifierWithName(oldName); + + if(index > -1) + { + StringVector values = ((Qualifier)qualifiers.get(index)).getValues(); + qualifiers.removeQualifierByName(oldName); + Qualifier newQualifier = new Qualifier(newName, values); + qualifiers.setQualifier(newQualifier); + } + } + /** * If the given Sequence can be added directly to this Entry, then return a * copy of it, otherwise create and return a new feature of the appropriate @@ -280,7 +306,7 @@ public class PublicDBDocumentEntry extends SimpleDocumentEntry **/ protected StreamSequence makeNativeSequence (final Sequence sequence) { - if(this instanceof EmblDocumentEntry) + if(this instanceof EmblDocumentEntry) return new EmblStreamSequence (sequence); else return new GenbankStreamSequence (sequence);