*/
package jalview.ws;
+import java.util.Locale;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Map;
+import java.util.StringTokenizer;
+import java.util.Vector;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
import jalview.analysis.AlignSeq;
+import jalview.api.FeatureSettingsModelI;
import jalview.bin.Cache;
import jalview.datamodel.AlignmentI;
import jalview.datamodel.DBRefEntry;
import jalview.util.DBRefUtils;
import jalview.util.MessageManager;
import jalview.ws.seqfetcher.DbSourceProxy;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Enumeration;
-import java.util.Hashtable;
-import java.util.List;
-import java.util.StringTokenizer;
-import java.util.Vector;
-
import uk.ac.ebi.picr.model.UPEntry;
import uk.ac.ebi.www.picr.AccessionMappingService.AccessionMapperServiceLocator;
CutAndPasteTransfer output = new CutAndPasteTransfer();
- boolean running = false;
-
/**
* picr client instance
*/
}
this.dataset = ds;
// TODO Jalview 2.5 lots of this code should be in the gui package!
- sfetcher = jalview.gui.SequenceFetcher
- .getSequenceFetcherSingleton(progressIndicatorFrame);
+ sfetcher = jalview.gui.SequenceFetcher.getSequenceFetcherSingleton();
// set default behaviour for transferring excess sequence data to the
// dataset
trimDsSeqs = Cache.getDefault(TRIM_RETRIEVED_SEQUENCES, true);
*/
public void fetchDBRefs(boolean waitTillFinished)
{
- // TODO can we not simply write
- // if (waitTillFinished) { run(); } else { new Thread(this).start(); }
-
- Thread thread = new Thread(this);
- thread.start();
- running = true;
-
if (waitTillFinished)
{
- while (running)
- {
- try
- {
- Thread.sleep(500);
- } catch (Exception ex)
- {
- }
- }
+ run();
+ }
+ else
+ {
+ new Thread(this).start();
}
}
*/
void addSeqId(SequenceI seq, String key)
{
- key = key.toUpperCase();
+ key = key.toUpperCase(Locale.ROOT);
Vector<SequenceI> seqs;
if (seqRefs.containsKey(key))
throw new Error(MessageManager
.getString("error.implementation_error_must_init_dbsources"));
}
- running = true;
long startTime = System.currentTimeMillis();
if (progressWindow != null)
{
Arrays.asList(dataset));
List<String> warningMessages = new ArrayList<>();
+ // clear any old feature display settings recorded from past sessions
+ featureDisplaySettings = null;
+
int db = 0;
while (sdataset.size() > 0 && db < dbSources.length)
{
}
if (retrieved != null)
{
- transferReferences(sdataset, dbsource.getDbSource(), retrieved,
+ transferReferences(sdataset, dbsource, retrieved,
trimDsSeqs, warningMessages);
}
}
&& (i < 50); seqIndex++, i++)
{
SequenceI sequence = dataset[seqIndex];
- DBRefEntry[] uprefs = DBRefUtils
+ List<DBRefEntry> uprefs = DBRefUtils
.selectRefs(sequence.getDBRefs(), new String[]
{ dbsource.getDbSource() }); // jalview.datamodel.DBRefSource.UNIPROT
// });
// check for existing dbrefs to use
- if (uprefs != null && uprefs.length > 0)
+ if (uprefs != null && uprefs.size() > 0)
{
- for (int j = 0; j < uprefs.length; j++)
+ for (int j = 0, n = uprefs.size(); j < n; j++)
{
- addSeqId(sequence, uprefs[j].getAccessionId());
+ DBRefEntry upref = uprefs.get(j);
+ addSeqId(sequence, upref.getAccessionId());
queries.addElement(
- uprefs[j].getAccessionId().toUpperCase());
+ upref.getAccessionId().toUpperCase(Locale.ROOT));
}
}
else
{
+ Pattern possibleIds = Pattern.compile("[A-Za-z0-9_]+");
// generate queries from sequence ID string
- StringTokenizer st = new StringTokenizer(sequence.getName(),
- "|");
- while (st.hasMoreTokens())
+ Matcher tokens = possibleIds.matcher(sequence.getName());
+ int p=0;
+ while (tokens.find(p))
{
- String token = st.nextToken();
+ String token = tokens.group();
+ p = tokens.end();
UPEntry[] presp = null;
if (picrClient != null)
{
"Validated ID against PICR... (for what its worth):"
+ token);
addSeqId(sequence, token);
- queries.addElement(token.toUpperCase());
+ queries.addElement(token.toUpperCase(Locale.ROOT));
}
else
{
// System.out.println("Not querying source with
// token="+token+"\n");
addSeqId(sequence, token);
- queries.addElement(token.toUpperCase());
+ queries.addElement(token.toUpperCase(Locale.ROOT));
}
}
}
{
listener.finished();
}
- running = false;
}
/**
* @param warningMessages
* a list of messages to add to
*/
- boolean transferReferences(Vector<SequenceI> sdataset, String dbSource,
+ boolean transferReferences(Vector<SequenceI> sdataset,
+ DbSourceProxy dbSourceProxy,
AlignmentI retrievedAl, boolean trimDatasetSeqs,
List<String> warningMessages)
{
return false;
}
+ String dbSource = dbSourceProxy.getDbName();
boolean modified = false;
SequenceI[] retrieved = recoverDbSequences(
retrievedAl.getSequencesArray());
// taking into account all accessionIds and names in the file
Vector<SequenceI> sequenceMatches = new Vector<>();
// look for corresponding accession ids
- DBRefEntry[] entryRefs = DBRefUtils
+ List<DBRefEntry> entryRefs = DBRefUtils
.selectRefs(retrievedSeq.getDBRefs(), new String[]
{ dbSource });
if (entryRefs == null)
+ dbSource + " on " + retrievedSeq.getName());
continue;
}
- for (int j = 0; j < entryRefs.length; j++)
+ for (int j = 0, n = entryRefs.size(); j < n; j++)
{
- String accessionId = entryRefs[j].getAccessionId();
+ DBRefEntry ref = entryRefs.get(j);
+ String accessionId = ref.getAccessionId();
// match up on accessionId
- if (seqRefs.containsKey(accessionId.toUpperCase()))
+ if (seqRefs.containsKey(accessionId.toUpperCase(Locale.ROOT)))
{
Vector<SequenceI> seqs = seqRefs.get(accessionId);
for (int jj = 0; jj < seqs.size(); jj++)
// could be useful to extend this so we try to find any 'significant'
// information in common between two sequence objects.
/*
- * DBRefEntry[] entryRefs =
+ * List<DBRefEntry> entryRefs =
* jalview.util.DBRefUtils.selectRefs(entry.getDBRef(), new String[] {
* dbSource }); for (int j = 0; j < entry.getName().size(); j++) { String
* name = entry.getName().elementAt(j).toString(); if
* seqs.elementAt(jj); if (!sequenceMatches.contains(sequence)) {
* sequenceMatches.addElement(sequence); } } } }
*/
+ if (sequenceMatches.size() > 0)
+ {
+ addFeatureSettings(dbSourceProxy);
+ }
// sequenceMatches now contains the set of all sequences associated with
// the returned db record
final String retrievedSeqString = retrievedSeq.getSequenceAsString();
- String entrySeq = retrievedSeqString.toUpperCase();
+ String entrySeq = retrievedSeqString.toUpperCase(Locale.ROOT);
for (int m = 0; m < sequenceMatches.size(); m++)
{
sequence = sequenceMatches.elementAt(m);
// TODO: test for legacy where uniprot or EMBL refs exist but no
// mappings are made (but content matches retrieved set)
boolean updateRefFrame = sequence.getDBRefs() == null
- || sequence.getDBRefs().length == 0;
+ || sequence.getDBRefs().size() == 0;
// TODO:
// verify sequence against the entry sequence
boolean remoteEnclosesLocal = false;
String nonGapped = AlignSeq
.extractGaps("-. ", sequence.getSequenceAsString())
- .toUpperCase();
+ .toUpperCase(Locale.ROOT);
int absStart = entrySeq.indexOf(nonGapped);
if (absStart == -1)
{
String ngAlsq = AlignSeq
.extractGaps("-. ",
alseqs[alsq].getSequenceAsString())
- .toUpperCase();
+ .toUpperCase(Locale.ROOT);
int oldstrt = alseqs[alsq].getStart();
alseqs[alsq].setStart(sequence.getSequenceAsString()
- .toUpperCase().indexOf(ngAlsq) + sequence.getStart());
+ .toUpperCase(Locale.ROOT).indexOf(ngAlsq) + sequence.getStart());
if (oldstrt != alseqs[alsq].getStart())
{
alseqs[alsq].setEnd(
// and remove it from the rest
// TODO: decide if we should remove annotated sequence from set
sdataset.remove(sequence);
- // TODO: should we make a note of sequences that have received new DB
- // ids, so we can query all enabled DAS servers for them ?
}
}
return modified;
}
+ Map<String, FeatureSettingsModelI> featureDisplaySettings = null;
+
+ private void addFeatureSettings(DbSourceProxy dbSourceProxy)
+ {
+ FeatureSettingsModelI fsettings = dbSourceProxy
+ .getFeatureColourScheme();
+ if (fsettings != null)
+ {
+ if (featureDisplaySettings == null)
+ {
+ featureDisplaySettings = new HashMap<>();
+ }
+ featureDisplaySettings.put(dbSourceProxy.getDbName(), fsettings);
+ }
+ }
+
+ /**
+ *
+ * @return any feature settings associated with sources that have provided sequences
+ */
+ public List<FeatureSettingsModelI>getFeatureSettingsModels()
+ {
+ return featureDisplaySettings == null
+ ? Arrays.asList(new FeatureSettingsModelI[0])
+ : Arrays.asList(featureDisplaySettings.values()
+ .toArray(new FeatureSettingsModelI[1]));
+ }
/**
* Adds the message to the list unless it already contains it
*
*/
private SequenceI[] recoverDbSequences(SequenceI[] sequencesArray)
{
- Vector<SequenceI> nseq = new Vector<>();
- for (int i = 0; sequencesArray != null
- && i < sequencesArray.length; i++)
+ int n;
+ if (sequencesArray == null || (n = sequencesArray.length) == 0)
+ return sequencesArray;
+ ArrayList<SequenceI> nseq = new ArrayList<>();
+ for (int i = 0;i < n; i++)
{
- nseq.addElement(sequencesArray[i]);
- DBRefEntry[] dbr = sequencesArray[i].getDBRefs();
+ nseq.add(sequencesArray[i]);
+ List<DBRefEntry> dbr = sequencesArray[i].getDBRefs();
Mapping map = null;
- for (int r = 0; (dbr != null) && r < dbr.length; r++)
+ if (dbr != null)
{
- if ((map = dbr[r].getMap()) != null)
+ for (int r = 0, rn = dbr.size(); r < rn; r++)
{
- if (map.getTo() != null && !nseq.contains(map.getTo()))
+ if ((map = dbr.get(r).getMap()) != null)
{
- nseq.addElement(map.getTo());
- }
+ if (map.getTo() != null && !nseq.contains(map.getTo()))
+ {
+ nseq.add(map.getTo());
+ }
+ }
}
}
}
+ // BH 2019.01.25 question here if this is the right logic. Return the original if nothing found?
if (nseq.size() > 0)
{
- sequencesArray = new SequenceI[nseq.size()];
- nseq.toArray(sequencesArray);
+ return nseq.toArray(new SequenceI[nseq.size()]);
}
return sequencesArray;
}