/* * BioJava development code * * This code may be freely distributed and modified under the * terms of the GNU Lesser General Public Licence. This should * be distributed with the code. If you do not have a copy, * see: * * http://www.gnu.org/copyleft/lesser.html * * Copyright for this code is held jointly by the individual * authors. These should be listed in @author doc comments. * * For more information on the BioJava project and its aims, * or to join the biojava-l mailing list, visit the home page * at: * * http://www.biojava.org/ * * Created on 19.03.2004 * @author Andreas Prlic * */ package org.biojava.dasobert.das; import java.util.*; import org.xml.sax.*; import org.xml.sax.helpers.*; /** * a class to parse the response of a DAS - Feature request * * @author Andreas Prlic Adapted for jalview use. * @author Andrew Waterhouse Updated to Das 1.53e feature spec. * @author Jim Procter * */ public class DAS_Feature_Handler extends DefaultHandler { /** * */ List features; boolean first_flag; HashMap feature; String featurefield; StringBuffer characterdata; String dasCommand; int comeBackLater; int maxFeatures; String segmentId; String version; String type_id; String type_category; public DAS_Feature_Handler() { super(); features = new ArrayList(); first_flag = true; featurefield = ""; characterdata = new StringBuffer(); dasCommand = ""; comeBackLater = -1; maxFeatures = -1; segmentId = ""; version = ""; type_id = ""; type_category = ""; } /** * get the id information specified int the SEGMENT field of the DAS response * * @return the segmentId or an emtpy string if not available */ public String getSegmentId() { return segmentId; } /** * get the version informationspecified in the SEGMENT field of the DAS * response * * @return the version information of an empty string if not available */ public String getVersion() { return version; } public boolean isMD5Checksum() { if ((version != null) && (version.length() == 32)) return true; return false; } /** * specifies a maximum number of features to be downloaded. if a server * returns more, they will be ignored. default is to load all features * * @param max * the maximium number of features to be downloaded */ public void setMaxFeatures(int max) { maxFeatures = max; } public int getMaxFeatures() { return maxFeatures; } public void setDASCommand(String cmd) { dasCommand = cmd; } public String getDASCommand() { return dasCommand; } public List get_features() { return features; } public int getComBackLater() { return comeBackLater; } void start_feature(String uri, String name, String qName, Attributes atts) { if ((maxFeatures > 0) && (features.size() > maxFeatures)) { characterdata = new StringBuffer(); return; } feature = new HashMap(); String id = atts.getValue("id"); feature.put("id", id); feature.put("dassource", dasCommand); characterdata = new StringBuffer(); } void add_featuredata(String uri, String name, String qName) { // System.out.println("featurefield "+featurefield+ " data "+characterdata); // NOTE can have multiple lines .. if ((maxFeatures > 0) && (features.size() > maxFeatures)) { return; } String data = (String) feature.get(featurefield); String featureText = characterdata.toString(); if (data != null) { featureText = data + " " + featureText; } if (qName.equals("TYPE")) { if (featureText.length() < 1) featureText = type_id; feature.put("TYPE_ID", type_id); feature.put("TYPE_CATEGORY", type_category); type_id = ""; type_category = ""; } feature.put(featurefield, featureText); featurefield = ""; characterdata = new StringBuffer(); } private void addLink(String uri, String name, String qName, Attributes atts) { String href = atts.getValue("href"); feature.put("LINK", href); characterdata = new StringBuffer(); featurefield = "LINK-TEXT"; } private void addGroup(String uri, String name, String qName, Attributes atts) { String id = atts.getValue("id"); feature.put("GROUP", id); characterdata = new StringBuffer(); featurefield = "GROUP"; } public void startElement(String uri, String name, String qName, Attributes atts) { // System.out.println("new element "+qName); if (qName.equals("FEATURE")) { start_feature(uri, name, qName, atts); } else if (qName.equals("LINK")) { addLink(uri, name, qName, atts); } else if (qName.equals("GROUP")) { addGroup(uri, name, qName, atts); } else if (qName.equals("METHOD") || qName.equals("TYPE") || qName.equals("START") || qName.equals("END") || qName.equals("NOTE") || qName.equals("SCORE") || qName.equals("ORIENTATION")) { characterdata = new StringBuffer(); featurefield = qName; } else if (qName.equals("SEGMENT")) { String id = atts.getValue("id"); if (id != null) segmentId = id; String v = atts.getValue("version"); if (v != null) version = v; } if (qName.equals("TYPE")) { type_id = atts.getValue("id"); type_category = atts.getValue("category"); } } public void startDocument() { } public void endDocument() { } public void endElement(String uri, String name, String qName) { if (qName.equals("METHOD") || qName.equals("TYPE") || qName.equals("START") || qName.equals("END") || qName.equals("NOTE") || qName.equals("LINK") || qName.equals("SCORE") || qName.equals("ORIENTATION") || qName.equals("GROUP")) { add_featuredata(uri, name, qName); } else if (qName.equals("FEATURE")) { if (maxFeatures > 0) { if (features.size() < maxFeatures) { features.add(feature); } } else { // no restriction features.add(feature); } } } public void characters(char ch[], int start, int length) { if (maxFeatures > 0) if (features.size() > maxFeatures) return; for (int i = start; i < start + length; i++) { characterdata.append(ch[i]); } } }