2 * BioJava development code
4 * This code may be freely distributed and modified under the
5 * terms of the GNU Lesser General Public Licence. This should
6 * be distributed with the code. If you do not have a copy,
9 * http://www.gnu.org/copyleft/lesser.html
11 * Copyright for this code is held jointly by the individual
12 * authors. These should be listed in @author doc comments.
14 * For more information on the BioJava project and its aims,
15 * or to join the biojava-l mailing list, visit the home page
18 * http://www.biojava.org/
20 * Created on 21.09.2004
21 * @author Andreas Prlic
25 package org.biojava.dasobert.das;
29 import java.util.logging.*;
31 import org.biojava.dasobert.dasregistry.*;
32 import org.biojava.dasobert.eventmodel.*;
34 /** a thread that connects to a DAS - Feature service and gets the features
36 * @author Andreas Prlic
41 public class FeatureThread
45 /** number of times the client tries to reconnect to the server if a "come back later" is returned.
46 * the server should provide a reasonable estimation how long it will take him to create results.
47 * if this number of requests is still not successfull, give up.
49 public static int MAX_COME_BACK_ITERATIONS = 5;
51 public static int MAX_NR_FEATURES = 300;
53 static Logger logger = Logger.getLogger("org.biojava.spice");
57 List featureListeners;
60 public FeatureThread(String accessionCode, Das1Source dasSource)
62 this.dasSource = dasSource;
63 this.ac = accessionCode;
64 featureListeners = new ArrayList();
67 public void addFeatureListener(FeatureListener li)
69 featureListeners.add(li);
72 public void clearFeatureListeners()
74 featureListeners.clear();
77 public synchronized void stop()
85 Thread me = Thread.currentThread();
88 String url = dasSource.getUrl();
89 String queryString = url + "features?segment=" + ac;
93 cmd = new URL(queryString);
95 catch (MalformedURLException e)
97 logger.warning("got MalformedURL from das source " + dasSource);
102 logger.info("requesting features from " + cmd);
103 DAS_FeatureRetrieve ftmp = new DAS_FeatureRetrieve(cmd);
105 int comeBackLater = ftmp.getComeBackLater();
106 int securityCounter = 0;
107 while ( (thread == me) && (comeBackLater > 0))
110 if (securityCounter >= MAX_COME_BACK_ITERATIONS)
116 notifyComeBackLater(comeBackLater);
117 // server is still calculating - asks us to come back later
122 catch (InterruptedException e)
129 comeBackLater = ftmp.getComeBackLater();
132 if (! (thread == me))
137 List features = ftmp.get_features();
139 // a fallback mechanism to prevent DAS sources from bringing down spice
140 if (features.size() > MAX_NR_FEATURES)
142 logger.warning("DAS source returned more than " + MAX_NR_FEATURES +
144 " throwing away excess features at " + cmd);
145 features = features.subList(0, MAX_NR_FEATURES);
148 // notify FeatureListeners
149 Map[] feats = (Map[]) features.toArray(new Map[features.size()]);
150 notifyFeatureListeners(feats);
161 thread = new Thread(this);
165 private void notifyFeatureListeners(Map[] feats)
167 logger.finest("FeatureThread found " + feats.length + " features");
168 FeatureEvent fevent = new FeatureEvent(feats, dasSource);
169 Iterator fiter = featureListeners.iterator();
170 while (fiter.hasNext())
172 FeatureListener fi = (FeatureListener) fiter.next();
173 fi.newFeatures(fevent);
177 /** the Annotation server requested to be queried again in a while
179 * @param comeBackLater
181 private void notifyComeBackLater(int comeBackLater)
183 FeatureEvent event = new FeatureEvent(new HashMap[0], dasSource);
184 event.setComeBackLater(comeBackLater);
185 Iterator fiter = featureListeners.iterator();
186 while (fiter.hasNext())
188 FeatureListener fi = (FeatureListener) fiter.next();
189 fi.comeBackLater(event);