Java tutorial
/* * Copyright (C) 2017 Daniel H. Huson * * (Some files contain contributions from other authors, who are then mentioned separately.) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package rusch.megan5client.connector; import jloda.util.CanceledException; import jloda.util.ProgressListener; import jloda.util.Single; import megan.data.*; import org.apache.commons.codec.binary.Base64; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.http.ResponseEntity; import org.springframework.web.client.RestTemplate; import rusch.megan5client.*; import java.io.IOException; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; /** * The {@link IConnector} instance for datasets hosted at the Megan5Server * * @author Hans-Joachim Ruscheweyh * 4:08:22 PM - Nov 1, 2014 */ public class Megan5ServerConnector implements IConnector { private RestTemplate restTemplate; private HttpEntity<String> request; private String url; private String fileId; /** * Create connection and apply authentication. * <p/> * !this method doesn't test the connection. So things can still go wrong later! * * @param url * @param userName * @param password */ public Megan5ServerConnector(String url, String userName, String password) { String plainCreds = userName + ":" + password; byte[] plainCredsBytes = plainCreds.getBytes(); byte[] base64CredsBytes = Base64.encodeBase64(plainCredsBytes); String base64Creds = new String(base64CredsBytes); HttpHeaders headers = new HttpHeaders(); headers.add("Authorization", "Basic " + base64Creds); request = new HttpEntity<>(headers); restTemplate = new RestTemplate(); if (url.endsWith("/")) { this.url = url; } else { this.url = url + "/"; } } public RMADataset[] getAvailiableDatasets() { ResponseEntity<RMADataset[]> response = restTemplate.exchange( url + RMAControllerMappings.LIST_DATASETS_MAPPING, HttpMethod.GET, request, RMADataset[].class); return response.getBody(); } @Override public void setFile(String filename) throws IOException { this.fileId = filename; } @Override public boolean isReadOnly() throws IOException { ResponseEntity<Boolean> response = restTemplate.exchange( url + RMAControllerMappings.IS_READ_ONLY_MAPPING + "?fileId=" + fileId, HttpMethod.GET, request, Boolean.class); return response.getBody(); } @Override public long getUId() throws IOException { ResponseEntity<Long> response = restTemplate.exchange( url + RMAControllerMappings.GET_UID_MAPPING + "?fileId=" + fileId, HttpMethod.GET, request, Long.class); return response.getBody(); } @Override public IReadBlockIterator getAllReadsIterator(float minScore, float maxExpected, boolean wantReadSequence, boolean wantMatches) throws IOException { ResponseEntity<ReadBlockPage> response = restTemplate.exchange( url + RMAControllerMappings.GET_ALL_READS_ITERATOR_MAPPING + "?fileId=" + fileId + "&minScore=" + minScore + "&maxExpected=" + maxExpected + "&dataSelection=" + httpArray2(DataSelectionSerializer.serializeDataSelection(wantReadSequence, wantMatches)), HttpMethod.GET, request, ReadBlockPage.class); ReadBlockPage blocks = response.getBody(); return new ReadBlockIterator(this, blocks); } @Override public IReadBlockIterator getReadsIterator(String classification, int classId, float minScore, float maxExpected, boolean wantReadSequence, boolean wantMatches) throws IOException { ResponseEntity<ReadBlockPage> response = restTemplate .exchange( url + RMAControllerMappings.GET_READS_ITERATOR_MAPPING + "?fileId=" + fileId + "&minScore=" + minScore + "&maxExpected=" + maxExpected + "&classification=" + classification + "&classId=" + classId + "&dataSelection=" + httpArray2(DataSelectionSerializer .serializeDataSelection(wantReadSequence, wantMatches)), HttpMethod.GET, request, ReadBlockPage.class); ReadBlockPage blocks = response.getBody(); return new ReadBlockIterator(this, blocks); } @Override public IReadBlockIterator getReadsIteratorForListOfClassIds(String classification, Collection<Integer> classIds, float minScore, float maxExpected, boolean wantReadSequence, boolean wantMatches) throws IOException { ResponseEntity<ReadBlockPage> response = restTemplate .exchange( url + RMAControllerMappings.GET_READS_ITERATOR_FOR_MULTIPLE_CLASSIDS_MAPPING + "?fileId=" + fileId + "&minScore=" + minScore + "&maxExpected=" + maxExpected + "&classification=" + classification + "&classIds=" + httpArray(classIds) + "&dataSelection=" + httpArray2(DataSelectionSerializer .serializeDataSelection(wantReadSequence, wantMatches)), HttpMethod.GET, request, ReadBlockPage.class); ReadBlockPage blocks = response.getBody(); return new ReadBlockIterator(this, blocks); } @Override public IReadBlockGetter getReadBlockGetter(float minScore, float maxExpected, boolean wantReadSequence, boolean wantMatches) throws IOException { return new ReadBlockGetter(fileId, minScore, maxExpected, wantReadSequence, wantMatches, this); } @Override public String[] getAllClassificationNames() throws IOException { ResponseEntity<String[]> response = restTemplate.exchange( url + RMAControllerMappings.GET_ALL_CLASSIFICATION_NAMES_MAPPING + "?fileId=" + fileId, HttpMethod.GET, request, String[].class); return response.getBody(); } @Override public int getClassificationSize(String classificationName) throws IOException { ResponseEntity<Integer> response = restTemplate .exchange(url + RMAControllerMappings.GET_CLASSIFICATION_SIZE_MAPPING + "?fileId=" + fileId + "&classification=" + classificationName, HttpMethod.GET, request, Integer.class); return response.getBody(); } @Override public int getClassSize(String classificationName, int classId) throws IOException { ResponseEntity<Integer> response = restTemplate .exchange( url + RMAControllerMappings.GET_CLASS_SIZE_MAPPING + "?fileId=" + fileId + "&classification=" + classificationName + "&classId=" + classId, HttpMethod.GET, request, Integer.class); return response.getBody(); } @Override public IClassificationBlock getClassificationBlock(String classificationName) throws IOException { ResponseEntity<ClassificationBlockServer> response3 = restTemplate.exchange( url + RMAControllerMappings.GET_CLASSIFICATIONBLOCK_MAPPING + "?fileId=" + fileId + "&classification=" + classificationName, HttpMethod.GET, request, ClassificationBlockServer.class); return new ClassificationBlock(response3.getBody()); } @Override public void updateClassifications(String[] classificationNames, List<UpdateItem> updateItems, ProgressListener progressListener) throws IOException, CanceledException { System.err.println( "updateClassifications(String[] classificationNames,List<UpdateItem> updateItems, ProgressListener progressListener): not implemented"); } @Override public IReadBlockIterator getFindAllReadsIterator(String regEx, FindSelection findSelection, Single<Boolean> canceled) throws IOException { ResponseEntity<ReadBlockPage> response = restTemplate.exchange( url + RMAControllerMappings.GET_FIND_ALL_READS_ITERATOR_MAPPING + "?fileId=" + fileId + "®Ex=" + regEx + "&findSelection=" + httpArray2(DataSelectionSerializer.serializeFindSelection(findSelection)), HttpMethod.GET, request, ReadBlockPage.class); ReadBlockPage blocks = response.getBody(); return new ReadBlockIterator(this, blocks); } @Override public int getNumberOfReads() throws IOException { ResponseEntity<Integer> response = restTemplate.exchange( url + RMAControllerMappings.GET_NUMBER_OF_READS_MAPPING + "?fileId=" + fileId, HttpMethod.GET, request, Integer.class); return response.getBody(); } @Override public int getNumberOfMatches() throws IOException { ResponseEntity<Integer> response = restTemplate.exchange( url + RMAControllerMappings.GET_NUMBER_OF_MATCHES_MAPPING + "?fileId=" + fileId, HttpMethod.GET, request, Integer.class); return response.getBody(); } @Override public void setNumberOfReads(int numberOfReads) throws IOException { System.err.println("setNumberOfReads(int numberOfReads): not implemented"); } @Override public void putAuxiliaryData(Map<String, byte[]> label2data) throws IOException { System.err.println("putAuxiliaryData(Map<String, byte[]> label2data): not implemented"); } @Override public Map<String, byte[]> getAuxiliaryData() throws IOException { ResponseEntity<Map> response = restTemplate.exchange( url + RMAControllerMappings.GET_AUXILIARY_MAPPING + "?fileId=" + fileId, HttpMethod.GET, request, Map.class); Map<String, String> map = response.getBody(); Map<String, byte[]> map2 = new HashMap<>(); for (Entry<String, String> entry : map.entrySet()) { map2.put(entry.getKey(), entry.getValue().getBytes()); } return map2; } /** * Concatenate with comma * * @param classIds * @return */ private String httpArray(Collection<Integer> classIds) { String s = ""; for (Object o : classIds) { s = s + o.toString() + ","; } return s.substring(0, s.length() - 1); } /** * Concatenate with comma * * @param classIds * @return */ public static String httpArray2(List<String> classIds) { String s = ""; for (Object o : classIds) { s = s + o.toString() + ","; } return s.substring(0, s.length() - 1); } public IReadBlock getReadBlock(long readUid, String fileId, float minScore, float maxExpected, boolean wantReadText, boolean wantMatches) { ResponseEntity<ReadBlockServer> response = restTemplate.exchange( url + RMAControllerMappings.GET_READ_MAPPING + "?fileId=" + fileId + "&readUid=" + readUid + "&minScore=" + minScore + "&maxExpected=" + maxExpected, HttpMethod.GET, request, ReadBlockServer.class); ReadBlockServer blocks = response.getBody(); return new ReadBlock(blocks); } /** * Get next {@link ReadBlockPage}. * * @param pageId * @return */ public ReadBlockPage retrieveReadBlockPage(String pageId) { ResponseEntity<ReadBlockPage> response = restTemplate.exchange( url + RMAControllerMappings.LOAD_READ_PAGE_MAPPING + "?pageId=" + pageId, HttpMethod.GET, request, ReadBlockPage.class); return response.getBody(); } /** * Get a List of users * * @return */ public String[] listUsers() { ResponseEntity<String[]> response = restTemplate.exchange(url + RMAControllerMappings.LIST_USERS_MAPPING, HttpMethod.GET, request, String[].class); return response.getBody(); } /** * Add a single user * * @param user * @param password * @param isAdmin * @return */ public String addUser(String user, String password, boolean isAdmin) { ResponseEntity<String> response = restTemplate.exchange(url + RMAControllerMappings.ADD_USER_MAPPING + "userName=" + user + "&password=" + password + "&isAdmin=" + isAdmin, HttpMethod.GET, request, String.class); return response.getBody(); } /** * Remove a user * * @param user * @return */ public String removeUser(String user) { ResponseEntity<String> response = restTemplate.exchange( url + RMAControllerMappings.REMOVE_USER_MAPPING + "userName=" + user, HttpMethod.GET, request, String.class); return response.getBody(); } /** * Get log entries * * @return */ public String[] getLogEntries() { ResponseEntity<String[]> response = restTemplate.exchange(url + RMAControllerMappings.GET_LOG_MAPPING, HttpMethod.GET, request, String[].class); return response.getBody(); } /** * Get Info text * * @return */ public String getInfo() { ResponseEntity<String> response = restTemplate.exchange(url + RMAControllerMappings.GET_INFO_MAPPING, HttpMethod.GET, request, String.class); return response.getBody(); } }