package jalview.fts.service.threedbeacons; import java.net.URI; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.List; import java.util.Map; import javax.ws.rs.core.MediaType; import org.json.simple.parser.ParseException; import com.sun.jersey.api.client.Client; import com.sun.jersey.api.client.ClientResponse; import com.sun.jersey.api.client.WebResource; import com.sun.jersey.api.client.config.DefaultClientConfig; import jalview.datamodel.SequenceI; import jalview.fts.api.FTSData; import jalview.fts.api.FTSDataColumnI; import jalview.fts.api.FTSRestClientI; import jalview.fts.core.FTSRestClient; import jalview.fts.core.FTSRestRequest; import jalview.fts.core.FTSRestResponse; import jalview.fts.service.pdb.PDBFTSRestClient; import jalview.util.JSONUtils; import jalview.util.MessageManager; import jalview.util.Platform; public class TDBeaconsFTSRestClient extends FTSRestClient { private static final String DEFAULT_THREEDBEACONS_DOMAIN = "https://wwwdev.ebi.ac.uk/pdbe/pdbe-kb/3dbeacons-hub-api/uniprot/"; private static FTSRestClientI instance = null; @SuppressWarnings("unchecked") @Override public FTSRestResponse executeRequest(FTSRestRequest tdbRestRequest) throws Exception { try { // Removed wantedFields, sortParam & facetPivot from PDBFTSRClient String wantedFields = getDataColumnsFieldsAsCommaDelimitedString( tdbRestRequest.getWantedFields()); int responseSize = (tdbRestRequest.getResponseSize() == 0) ? getDefaultResponsePageSize() : tdbRestRequest.getResponseSize(); String query = tdbRestRequest.getFieldToSearchBy() + tdbRestRequest.getSearchTerm(); Client client; Class clientResponseClass; if (Platform.isJS()) { // JavaScript only client = (Client) (Object) new jalview.javascript.web.Client(); clientResponseClass = (Class) (Object) jalview.javascript.web.ClientResponse.class; } else /** * Java only * @j2sIgnore */ { client = Client.create(new DefaultClientConfig()); clientResponseClass = ClientResponse.class; } WebResource webResource; webResource = client.resource(DEFAULT_THREEDBEACONS_DOMAIN) .queryParam("P",query); URI uri = webResource.getURI(); System.out.println(uri); // Execute the REST request ClientResponse clientResponse = webResource .accept(MediaType.APPLICATION_JSON).get(clientResponseClass); // Get the JSON string from the response object or directly from the // client (JavaScript) Map jsonObj = null; String responseString = null; System.out.println("query >>>>>>> " + tdbRestRequest.toString()); // Check the response status and report exception if one occurs int responseStatus = clientResponse.getStatus(); switch (responseStatus) { // if succesful case 200: if (Platform.isJS()) { jsonObj = clientResponse.getEntity(Map.class); } else { responseString = clientResponse.getEntity(String.class); } break; case 400: throw new Exception(parseJsonExceptionString(responseString)); default: throw new Exception( getMessageByHTTPStatusCode(responseStatus, "3DBeacons")); } // Process the response and return the result to the caller. return parseTDBeaconsJsonResponse(responseString, jsonObj, tdbRestRequest); } catch (Exception e) { String exceptionMsg = e.getMessage(); if (exceptionMsg.contains("SocketException")) { // No internet connection throw new Exception(MessageManager.getString( "exception.unable_to_detect_internet_connection")); } else if (exceptionMsg.contains("UnknownHostException")) { // The server is unreachable throw new Exception(MessageManager.formatMessage( "exception.fts_server_unreachable", "3DB Hub")); } else { throw e; } } } public static FTSRestResponse parseTDBeaconsJsonResponse( String tdbJsonResponseString, FTSRestRequest tdbRestRequest) { return parseTDBeaconsJsonResponse(tdbJsonResponseString, (Map) null, tdbRestRequest); } @SuppressWarnings("unchecked") public static FTSRestResponse parseTDBeaconsJsonResponse(String tdbJsonResponseString, Map jsonObj, FTSRestRequest tdbRestRequest) { FTSRestResponse searchResult = new FTSRestResponse(); //searchResult.setNumberOfItemsFound(1); List result = null; try { if (jsonObj == null) { jsonObj = (Map) JSONUtils.parse(tdbJsonResponseString); } Map tdbEntry = (Map) jsonObj.get("uniprot_entry"); //String seqLength = tdbEntry.get("sequence_length").toString(); int seqLength = Integer.valueOf(tdbEntry.get("sequence_length").toString()); // tdbStructures is the list of found structures // Map tdbStructures = (Map) jsonObj.get("structures"); Object[] structures = (Object[]) jsonObj.get("structures"); String accessName = ((Map) jsonObj.get("uniprot_entry")) .get("ac").toString(); // this is to be modified int numFound = structures.length; // if (numFound > 0) // { // // result = new ArrayList<>(); // List models; // //= ((Map) jsonObj.get("structures")) // //.get("model_identifier").toString(); // for (Iterator modelsIter = models.iterator(); modelsIter.hasNext();) // .hasNext();) // { // Map doc = (Map) docIter.next(); // result.add(getFTSData(doc, tdbRestRequest)); // } searchResult.setNumberOfItemsFound(numFound); // searchResult.setAccessionName(accessName); ?usefulness? // searchResult.setSearchSummary(result); // // } } catch (ParseException e) { e.printStackTrace(); } return searchResult; } // private static FTSData getFTSData(Map doc, // FTSRestRequest tdbRestRequest) // { // String primaryKey = null; // // Object[] summaryRowData; // // Collection displayFields = tdbRestRequest.getWantedFields(); // int colCounter = 0; // summaryRowData = new Object[displayFields.size() + 1]; // // return null; // } private String parseJsonExceptionString(String jsonErrorString) { // TODO Auto-generated method stub return null; } @Override public String getColumnDataConfigFileName() { // TODO Auto-generated method stub return null; } public static FTSRestClientI getInstance() { if (instance == null) { instance = new TDBeaconsFTSRestClient(); } return instance; } private Collection allDefaultDisplayedStructureDataColumns; public Collection getAllDefaultDisplayedStructureDataColumns() { if (allDefaultDisplayedStructureDataColumns == null || allDefaultDisplayedStructureDataColumns.isEmpty()) { allDefaultDisplayedStructureDataColumns = new ArrayList<>(); allDefaultDisplayedStructureDataColumns .addAll(super.getAllDefaultDisplayedFTSDataColumns()); } return allDefaultDisplayedStructureDataColumns; } }