/*
- * Jalview - A Sequence Alignment Editor and Viewer (Development Version 2.4.1)
- * Copyright (C) 2009 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle
+ * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8)
+ * Copyright (C) 2012 J Procter, AM Waterhouse, LM Lui, J Engelhardt, G Barton, M Clamp, S Searle
*
- * 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 file is part of Jalview.
*
- * 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.
+ * Jalview 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 3 of the License, or (at your option) any later version.
+ *
+ * Jalview 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ * You should have received a copy of the GNU General Public License along with Jalview. If not, see <http://www.gnu.org/licenses/>.
*/
package jalview.io;
private java.util.Hashtable parseDescription(String desc)
{
java.util.Hashtable fields = new java.util.Hashtable();
- java.util.StringTokenizer st = new java.util.StringTokenizer(desc, ":");
+ java.util.StringTokenizer st = new java.util.StringTokenizer(desc, ":",
+ true);
+
String field;
int type = -1;
if (st.countTokens() > 0)
if (i < seqTypes.length)
{
+ st.nextToken(); // skip ':'
// valid seqType for modeller
type = i;
i = 1; // continue parsing fields
{
if ((field = st.nextToken(":")) != null)
{
- // validate residue field value
- if (Types[i] == 1)
+ if (!field.equals(":"))
{
- resCode val = validResidueCode(field);
- if (val != null)
+ // validate residue field value
+ if (Types[i] == 1)
{
- fields.put(new String(Fields[i] + "num"), val);
+ resCode val = validResidueCode(field);
+ if (val != null)
+ {
+ fields.put(new String(Fields[i] + "num"), val);
+ }
+ else
+ {
+ // jalview.bin.Cache.log.debug(
+ // "Ignoring non-Modeller description: invalid integer-like
+ // field '" + field + "'");
+ type = -1; /* invalid field! - throw the FieldSet away */
+ }
+ ;
}
- else
+ fields.put(Fields[i++], field);
+ if (st.hasMoreTokens())
{
- // jalview.bin.Cache.log.debug(
- // "Ignoring non-Modeller description: invalid integer-like
- // field '" + field + "'");
- type = -1; /* invalid field! - throw the FieldSet away */
+ st.nextToken(); // skip token sep.
}
- ;
}
- fields.put(Fields[i++], field);
+ else
+ {
+ i++;
+ }
}
}
if (i == TAIL)
// slurp remaining fields
while (st.hasMoreTokens())
{
- field += ":" + st.nextToken(":");
+ String tl = st.nextToken(":");
+ field += tl.equals(":") ? tl : (":" + tl);
}
fields.put(Fields[TAIL], field);
}
* make a possibly updated modeller field line for the sequence object
*
* @param seq
- * SequenceI
+ * SequenceI
*/
ModellerDescription(SequenceI seq)
{
{
// Set start and end before we update the type (in the case of a
// synthesized field set)
- if (getStartNum() != seq.getStart() && getStartCode().val != null)
+ if (getStartCode() == null
+ || (getStartNum() != seq.getStart() && getStartCode().val != null))
{
+ // unset or user updated sequence start position
setStartCode(seq.getStart());
}
- if (getEndNum() != seq.getEnd() && getStartCode().val != null)
+ if (getEndCode() == null
+ || (getEndNum() != seq.getEnd() && getStartCode() != null && getStartCode().val != null))
{
setEndCode(seq.getEnd());
}
setStartCode(seq.getStart());
setEndCode(seq.getEnd());
fields.put(Fields[LOCALID], seq.getName()); // this may be overwritten
- // below...
+ // below...
// type - decide based on evidence of PDB database references - this also
// sets the local reference field
int t = 0; // sequence
{
int start = 0;
resCode val = getStartCode();
- if (val.val != null)
+ if (val != null && val.val != null)
{
return val.val.intValue();
}
{
int end = 0;
resCode val = getEndCode();
- if (val.val != null)
+ if (val != null && val.val != null)
{
return val.val.intValue();
}
* returns true if sequence object was modifed with a valid modellerField set
*
* @param newSeq
- * SequenceI
+ * SequenceI
* @return boolean
*/
boolean updateSequenceI(SequenceI newSeq)
{
if (isModellerFieldset())
{
- if (getStartCode().val != null)
+ resCode rc = getStartCode();
+ if (rc != null && rc.val != null)
{
newSeq.setStart(getStartNum());
}
{
newSeq.setStart(1);
}
- if (getEndCode().val != null)
+ rc = getEndCode();
+ if (rc != null && rc.val != null)
{
newSeq.setEnd(getEndNum());
}