X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fio%2Fgff%2FGffHelperBase.java;h=22386d46ba972dd743e930e8c11554a52635635b;hb=57738a1f3c19b1c3a00bd3ac5108f8cd0af32f99;hp=ee93c5580d34594fdc310befadcb76b98415f97d;hpb=9135cbb74bbff06ea60485540194515ebcc018b0;p=jalview.git diff --git a/src/jalview/io/gff/GffHelperBase.java b/src/jalview/io/gff/GffHelperBase.java index ee93c55..22386d4 100644 --- a/src/jalview/io/gff/GffHelperBase.java +++ b/src/jalview/io/gff/GffHelperBase.java @@ -43,6 +43,8 @@ import java.util.Map.Entry; */ public abstract class GffHelperBase implements GffHelperI { + private static final String INVALID_GFF_ATTRIBUTE_FORMAT = "Invalid GFF attribute format: "; + protected static final String COMMA = ","; protected static final String EQUALS = "="; @@ -379,7 +381,8 @@ public abstract class GffHelperBase implements GffHelperI * @return */ protected SequenceFeature buildSequenceFeature(String[] gff, - int typeColumn, String group, Map> attributes) + int typeColumn, String group, + Map> attributes) { try { @@ -466,6 +469,45 @@ public abstract class GffHelperBase implements GffHelperI { Map map = new HashMap<>(); String[] fields = s.split(EQUALS); + + /* + * format validation + */ + boolean valid = true; + if (fields.length < 2) + { + /* + * need at least A=B here + */ + valid = false; + } + else if (fields[0].isEmpty() || fields[0].contains(COMMA)) + { + /* + * A,B=C is not a valid start, nor is =C + */ + valid = false; + } + else + { + for (int i = 1; i < fields.length - 1; i++) + { + if (fields[i].isEmpty() || !fields[i].contains(COMMA)) + { + /* + * intermediate tokens must include value,name + */ + valid = false; + } + } + } + + if (!valid) + { + System.err.println(INVALID_GFF_ATTRIBUTE_FORMAT + s); + return map; + } + int i = 0; while (i < fields.length - 1) { @@ -481,6 +523,14 @@ public abstract class GffHelperBase implements GffHelperI ? before.substring(before.lastIndexOf(COMMA) + 1) : before; + theKey = theKey.trim(); + if (theKey.isEmpty()) + { + System.err.println(INVALID_GFF_ATTRIBUTE_FORMAT + s); + map.clear(); + return map; + } + /* * if 'value' looks like a,b,c then all but the last token is the value, * unless this is the last field (no more = to follow), in which case