/*
* 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/
*
*/
package org.biojava.bio.program.ssbind;
import org.biojava.bio.search.SearchContentHandler;
import org.biojava.utils.stax.DelegationManager;
import org.biojava.utils.stax.StAXContentHandler;
import org.biojava.utils.stax.StAXContentHandlerBase;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
/**
* SeqSimilarityStAXAdapter
is a handler for XML
* conforming to the BioJava BlastLike DTD. Together with its modular
* delegate handlers it converts XML into calls on a
* SearchContentHandler
interface. Implementations of the
* at interface create various types of Java object from the XML data.
*
* @author Keith James
* @since 1.3
*/
public class SeqSimilarityStAXAdapter extends StAXContentHandlerBase
{
public static final String NAMESPACE = "http://www.biojava.org";
// Incremented on startElement, decremented on endElement. Used to
// identify which method calls to handle here and which to
// delegate.
private int depth;
// The target handler
private SearchContentHandler scHandler;
// The name of the program which generated the results
private String program = "unknown";
public void startElement(String nsURI,
String localName,
String qName,
Attributes attrs,
DelegationManager dm)
throws SAXException
{
depth++;
if (! nsURI.equals(NAMESPACE))
throw new SAXException("Failed to handle Element " + localName
+ " in namespace " + nsURI);
if (depth == 1)
{
if (localName.equals("BlastLikeDataSetCollection"))
{
scHandler.setMoreSearches(true);
}
}
else
{
if (localName.equals("BlastLikeDataSet"))
{
scHandler.startSearch();
program = attrs.getValue("program");
scHandler.addSearchProperty("program", program);
scHandler.addSearchProperty("version", attrs.getValue("version"));
return;
}
else if (localName.equals("Header"))
{
// Capture Header element and subtree
dm.delegate(HeaderStAXHandler.HEADER_HANDLER_FACTORY.getHandler(this));
return;
}
else if (localName.equals("Hit"))
{
// Drop through the Detail element to the Hit elements
// and their subtrees
dm.delegate(HitStAXHandler.HIT_HANDLER_FACTORY.getHandler(this));
}
}
}
public void endElement(String nsURI,
String localName,
String qName,
StAXContentHandler handler)
throws SAXException
{
depth--;
if (depth == 0)
{
if (localName.equals("BlastLikeDataSetCollection"))
{
scHandler.setMoreSearches(false);
}
}
else
{
if (localName.equals("BlastLikeDataSet"))
{
scHandler.endSearch();
}
}
}
/**
* getSearchContentHandler
gets the handler which
* will receive the method calls generated by the adapter.
*
* @return a SearchContentHandler
.
*/
public SearchContentHandler getSearchContentHandler()
{
return scHandler;
}
/**
* setSearchContentHandler
sets the handler which
* will recieve the method calls generated by the adapter.
*
* @param scHandler a SearchContentHandler
.
*/
public void setSearchContentHandler(SearchContentHandler scHandler)
{
this.scHandler = scHandler;
}
/**
* getProgram
returns the program type which
* generated the results.
*
* @return a String
indicating the progam
* name.
*/
String getProgram()
{
return program;
}
/**
* setProgram
informs the adapter which program type
* it is working on.
*
* @param program a String
indicating the progam
* name.
*/
void setProgram(String program)
{
this.program = program;
}
}