From 2009.igem.org
/*
Copyright: synbiowave
License: GPL
Authors: Jörg Wassolesk
Version: 0.1
DESCRIPTION:
This class provides the methods for the handling of DAS feature requests.
*/
package org.synbiowave.biobrick;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.Attributes;
import java.util.ArrayList ;
import java.util.HashMap ;
import java.util.List;
import java.util.Map;
// TODO: Auto-generated Javadoc
/**
* a class to parse the response of a DAS - Feature request.
*
* @author Andreas Prlic
*/
public class BioBrick_DAS_Feature_Handler extends DefaultHandler{
/** The features. */
List<Map<String,String>> features ;
/** The first_flag. */
boolean first_flag ;
/** The feature. */
Map<String,String> feature ;
/** The featurefield. */
String featurefield ;
/** The characterdata. */
StringBuffer characterdata ;
/** The das command. */
String dasCommand ;
/** The come back later. */
int comeBackLater ;
/** The max features. */
int maxFeatures ;
/** The segment id. */
String segmentId ;
/** The version. */
String version;
/** The type_id. */
String type_id;
/** The type_category. */
String type_category;
/**
* Instantiates a new bio brick_ da s_ feature_ handler.
*/
public BioBrick_DAS_Feature_Handler() {
super();
features= new ArrayList<Map<String, String>>() ;
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;
}
/**
* Checks if is m d5 checksum.
*
* @return true, if is m d5 checksum
*/
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;
}
/**
* Gets the max features.
*
* @return the max features
*/
public int getMaxFeatures() {
return maxFeatures;
}
/**
* Sets the dAS command.
*
* @param cmd the new dAS command
*/
public void setDASCommand(String cmd) { dasCommand = cmd ;}
/**
* Gets the dAS command.
*
* @return the dAS command
*/
public String getDASCommand() { return dasCommand; }
/**
* Gets the _features.
*
* @return the _features
*/
public List<Map<String,String>> get_features() {
return features ;
}
/**
* Gets the com back later.
*
* @return the com back later
*/
public int getComBackLater(){
return comeBackLater;
}
/**
* Start_feature.
*
* @param uri the uri
* @param name the name
* @param qName the q name
* @param atts the atts
*/
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,String>() ;
String id = atts.getValue("id");
feature.put("id",id);
feature.put("dassource",dasCommand);
characterdata = new StringBuffer();
}
/**
* Add_featuredata.
*
* @param uri the uri
* @param name the name
* @param qName the q name
*/
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();
}
/**
* Adds the link.
*
* @param uri the uri
* @param name the name
* @param qName the q name
* @param atts the atts
*/
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";
}
/**
* Adds the group.
*
* @param uri the uri
* @param name the name
* @param qName the q name
* @param atts the atts
*/
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";
}
/* (non-Javadoc)
* @see org.xml.sax.helpers.DefaultHandler#startElement(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
*/
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");
}
}
/* (non-Javadoc)
* @see org.xml.sax.helpers.DefaultHandler#endElement(java.lang.String, java.lang.String, java.lang.String)
*/
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);
}
}
}
/* (non-Javadoc)
* @see org.xml.sax.helpers.DefaultHandler#characters(char[], int, int)
*/
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]);
}
}
}