
org.biojava.bio.seq.db.biosql.BioSQLAssembly Maven / Gradle / Ivy
/*
* 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.seq.db.biosql;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Iterator;
import java.util.List;
import java.util.NoSuchElementException;
import org.biojava.bio.Annotation;
import org.biojava.bio.BioError;
import org.biojava.bio.BioException;
import org.biojava.bio.BioRuntimeException;
import org.biojava.bio.seq.ComponentFeature;
import org.biojava.bio.seq.Feature;
import org.biojava.bio.seq.FeatureFilter;
import org.biojava.bio.seq.FeatureHolder;
import org.biojava.bio.seq.MergeFeatureHolder;
import org.biojava.bio.seq.RealizingFeatureHolder;
import org.biojava.bio.seq.Sequence;
import org.biojava.bio.seq.SimpleFeatureHolder;
import org.biojava.bio.seq.impl.AssembledSymbolList;
import org.biojava.bio.symbol.Alphabet;
import org.biojava.bio.symbol.AlphabetManager;
import org.biojava.bio.symbol.Edit;
import org.biojava.bio.symbol.RangeLocation;
import org.biojava.bio.symbol.Symbol;
import org.biojava.bio.symbol.SymbolList;
import org.biojava.utils.AssertionFailure;
import org.biojava.utils.ChangeListener;
import org.biojava.utils.ChangeType;
import org.biojava.utils.ChangeVetoException;
/**
* Sequence keyed off a BioSQL biosequence.
*
* @author Thomas Down
* @author Matthew Pocock
* @author David Huen
* @author Richard Holland
* @deprecated Use hibernate and org.biojavax.bio.db.*
* @since 1.3
*/
class BioSQLAssembly
implements
Sequence,
RealizingFeatureHolder,
BioSQLSequenceI
{
private BioSQLSequenceDB seqDB;
private String name;
private int assembly_id;
private int bioentry_id;
private Annotation annotation;
private Alphabet alphabet;
private int length;
private RealizingFeatureHolder features;
private SimpleFeatureHolder componentFeatures;
private MergeFeatureHolder allFeatures;
public BioSQLSequenceDB getSequenceDB() {
return seqDB;
}
public int getBioEntryID() {
return bioentry_id;
}
BioSQLAssembly(BioSQLSequenceDB seqDB,
String name,
int bioentry_id,
int assembly_id,
String alphaName,
int length)
throws BioException
{
this.seqDB = seqDB;
this.name = name;
this.bioentry_id = bioentry_id;
this.assembly_id = assembly_id;
this.length = length;
try {
this.alphabet = AlphabetManager.alphabetForName(alphaName.toUpperCase());
} catch (NoSuchElementException ex) {
throw new BioException("Can't load sequence with unknown alphabet " + alphaName, ex);
}
features = new BioSQLAllFeatures(this, seqDB, bioentry_id);
}
public String getName() {
return name;
}
public String getURN() {
return name;
}
//
// implements Annotatable
//
public Annotation getAnnotation() {
if (annotation == null) {
annotation = new BioSQLSequenceAnnotation(seqDB, bioentry_id);
}
return annotation;
}
//
// implements SymbolList
//
public Alphabet getAlphabet() {
return alphabet;
}
public int length() {
return getSymbols().length();
}
public Symbol symbolAt(int i) {
return getSymbols().symbolAt(i);
}
public SymbolList subList(int start, int end) {
return getSymbols().subList(start, end);
}
public List toList() {
return getSymbols().toList();
}
public Iterator iterator() {
return getSymbols().iterator();
}
public String seqString() {
return getSymbols().seqString();
}
public String subStr(int start, int end) {
return getSymbols().subStr(start, end);
}
public void edit(Edit e)
throws ChangeVetoException
{
throw new ChangeVetoException("Can't edit sequence in BioSQL -- or at least not yet...");
}
protected synchronized SimpleFeatureHolder getComponentFeatures() {
if (componentFeatures == null) {
componentFeatures = new SimpleFeatureHolder();
Connection conn = null;
try {
conn = seqDB.getDataSource().getConnection();
PreparedStatement get_assembly = conn.prepareStatement("select assembly_fragment_id, fragment_name, assembly_start, assembly_end, fragment_start, fragment_end, strand " +
" from assembly_fragment " +
" where assembly_id = ?");
get_assembly.setInt(1, assembly_id);
ResultSet rs = get_assembly.executeQuery();
while (rs.next()) {
int assembly_fragment_id = rs.getInt(1);
String fragment_name = rs.getString(2);
int assembly_start = rs.getInt(3);
int assembly_end = rs.getInt(4);
int fragment_start = rs.getInt(5);
int fragment_end = rs.getInt(6);
ComponentFeature.Template temp = new ComponentFeature.Template();
temp.type = "component";
temp.source = "biosql";
temp.location = new RangeLocation(assembly_start, assembly_end);
temp.componentSequenceName = fragment_name;
temp.componentLocation = new RangeLocation(fragment_start, fragment_end);
componentFeatures.addFeature(new BioSQLComponentFeature(seqDB, this, temp, assembly_fragment_id));
}
rs.close();
get_assembly.close();
conn.close();
} catch (SQLException ex) {
if (conn!=null) try {conn.close();} catch (SQLException ex3) {}
throw new BioRuntimeException("Error fetching assembly data", ex);
} catch (ChangeVetoException ex) {
if (conn!=null) try {conn.close();} catch (SQLException ex3) {}
throw new AssertionFailure("Assertion failure: Couldn't modify private featureholder", ex);
}
}
return componentFeatures;
}
private AssembledSymbolList symbols;
protected synchronized SymbolList getSymbols() {
if (symbols == null) {
FeatureHolder components = getComponentFeatures();
symbols = new AssembledSymbolList();
symbols.setLength(length);
for (Iterator i = components.features(); i.hasNext(); ) {
ComponentFeature cf = (ComponentFeature) i.next();
symbols.putComponent(cf);
}
}
return symbols;
}
//
// implements FeatureHolder
//
private RealizingFeatureHolder getFeatures() {
return features;
}
private FeatureHolder getAllFeatures() {
if (allFeatures == null) {
try {
allFeatures = new MergeFeatureHolder();
allFeatures.addFeatureHolder(getComponentFeatures());
allFeatures.addFeatureHolder(getFeatures());
} catch (ChangeVetoException ex) {
throw new BioError("Assertion failure: Couldn't modify private featureholder");
}
}
return allFeatures;
}
public Iterator features() {
return getAllFeatures().features();
}
public int countFeatures() {
return getAllFeatures().countFeatures();
}
public boolean containsFeature(Feature f) {
return getAllFeatures().containsFeature(f);
}
public FeatureHolder filter(FeatureFilter ff, boolean recurse) {
return getAllFeatures().filter(ff, recurse);
}
public FeatureHolder filter(FeatureFilter ff) {
return getAllFeatures().filter(ff);
}
public FeatureFilter getSchema() {
return getFeatures().getSchema();
}
public Feature createFeature(Feature.Template ft)
throws ChangeVetoException, BioException
{
return getFeatures().createFeature(ft);
}
public void removeFeature(Feature f)
throws ChangeVetoException, BioException
{
getFeatures().removeFeature(f);
}
public Feature realizeFeature(FeatureHolder parent, Feature.Template templ)
throws BioException
{
return getFeatures().realizeFeature(parent, templ);
}
public void persistFeature(Feature f, int parent_id)
throws BioException
{
seqDB.getFeaturesSQL().persistFeature(f, parent_id, bioentry_id);
}
public void addChangeListener(ChangeListener cl) {
addChangeListener(cl, ChangeType.UNKNOWN);
}
public void addChangeListener(ChangeListener cl, ChangeType ct) {
getSequenceDB().getEntryChangeHub().addListener(bioentry_id, cl, ct);
}
public void removeChangeListener(ChangeListener cl) {
removeChangeListener(cl, ChangeType.UNKNOWN);
}
public void removeChangeListener(ChangeListener cl, ChangeType ct) {
getSequenceDB().getEntryChangeHub().removeListener(bioentry_id, cl, ct);
}
public boolean isUnchanging(ChangeType ct) {
return false;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy