package jalview.fts.service.uniprot;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+
+import javax.help.HelpSetException;
+
+import jalview.bin.Console;
import jalview.fts.api.FTSDataColumnI;
import jalview.fts.api.FTSRestClientI;
import jalview.fts.core.FTSRestRequest;
import jalview.gui.SequenceFetcher;
import jalview.util.MessageManager;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-
-import javax.help.HelpSetException;
-
@SuppressWarnings("serial")
public class UniprotFTSPanel extends GFTSPanel
{
private static Map<String, Integer> tempUserPrefs = new HashMap<>();
- private static final String UNIPROT_FTS_CACHE_KEY = "CACHE.UNIPROT_FTS";
+ private static final String UNIPROT_FTS_CACHE_KEY = "CACHE.UNIPROT_2022_FTS";
private static final String UNIPROT_AUTOSEARCH = "FTS.UNIPROT.AUTOSEARCH";
@Override
public void searchAction(boolean isFreshSearch)
{
+ searchAction(null, isFreshSearch);
+ }
+
+ public void searchAction(String cursor, boolean isFreshSearch)
+ {
mainFrame.requestFocusInWindow();
if (isFreshSearch)
{
offSet = 0;
+ UniProtFTSRestClient c = UniProtFTSRestClient.getInstance();
+ c.clearCursors();
+ c.setCursorPage(0);
+ c.setCursor(0, "");
}
new Thread()
{
request.setSearchTerm(searchTerm);
request.setOffSet(offSet);
request.setWantedFields(wantedFields);
- FTSRestClientI uniProtRestClient = UniProtFTSRestClient
+ UniProtFTSRestClient uniProtRestClient = UniProtFTSRestClient
.getInstance();
FTSRestResponse resultList;
try
{
- resultList = uniProtRestClient.executeRequest(request);
+ resultList = uniProtRestClient.executeRequest(request, cursor);
} catch (Exception e)
{
setErrorMessage(e.getMessage());
e1.printStackTrace();
}
}
+
+ /*
+ * 2022-07-20 bsoares
+ * The new Uniprot API has a strange pagination process described at
+ * https://www.uniprot.org/help/pagination
+ * When a successful request returns results, with more results past the size
+ * limit, the response sends a "Link" header with a URL containing the a "cursor"
+ * parameter with an opaque string that refers to the next page of results.
+ * These are store as nextCursor in the UniProtFTSRestClient along with the currCursor.
+ * When navigation across pages occurs these should be swapped around.
+ */
+ @Override
+ public void refreshPaginatorState()
+ {
+ UniProtFTSRestClient c = UniProtFTSRestClient.getInstance();
+ setNextPageButtonEnabled(c.getNextCursor() != null);
+ setPrevPageButtonEnabled(c.getPrevCursor() != null);
+ }
+
+ @Override
+ public void prevPageAction()
+ {
+ updatePaginatorCart();
+ UniProtFTSRestClient c = UniProtFTSRestClient.getInstance();
+ String prevCursor = c.getPrevCursor();
+ if (prevCursor != null)
+ {
+ if (offSet >= pageLimit)
+ {
+ offSet -= pageLimit;
+ }
+ else
+ {
+ // not sure what's happening if we get here though it wouldn't surprise
+ // me
+ Console.warn(
+ "UniprotFTSPanel: prevCursor exists but offset < pageLimit. This probably shouldn't be happening.");
+ }
+ c.setPrevCursorPage();
+ searchAction(prevCursor, false);
+ }
+ else
+ {
+ refreshPaginatorState();
+ }
+ }
+
+ @Override
+ public void nextPageAction()
+ {
+ UniProtFTSRestClient c = UniProtFTSRestClient.getInstance();
+ String nextCursor = c.getNextCursor();
+ if (nextCursor != null)
+ {
+ offSet += pageLimit;
+ c.setNextCursorPage();
+ searchAction(nextCursor, false);
+ }
+ else
+ {
+ refreshPaginatorState();
+ }
+ }
+
+ public String getDbName()
+ {
+ return "UniProt";
+ }
}