package model; import gui.ErrorDialog; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.concurrent.CopyOnWriteArrayList; import javax.swing.JOptionPane; import requests.AddAnnotationRequest; import requests.AddExperimentRequest; import requests.AddGenomeReleaseRequest; import requests.AddNewAnnotationValueRequest; import requests.CancelProcessRequest; import requests.ChangeExperimentRequest; import requests.ChangePasswordRequest; import requests.CreateUserRequest; import requests.DeleteUserRequest; import requests.FileConversionRequest; import requests.GetAnnotationRequest; import requests.GetGenomeReleasesRequest; import requests.GetGenomeSpecieReleasesRequest; import requests.GetUserNamesRequest; import requests.LoginRequest; import requests.ProcessFeedbackRequest; import requests.RemoveAnnotationFieldRequest; import requests.RemoveAnnotationValueRequest; import requests.RemoveExperimentRequest; import requests.RemoveFileFromExperimentRequest; import requests.RemoveGenomeReleaseRequest; import requests.RenameAnnotationFieldRequest; import requests.RenameAnnotationValueRequest; import requests.RequestFactory; import requests.RetrieveExperimentRequest; import requests.SearchRequest; import requests.UpdateUserRequest; import responses.ResponseParser; import responses.sysadmin.AddGenomeReleaseResponse; import util.AnnotationDataType; import util.AnnotationDataValue; import util.Constants; import util.ExperimentData; import util.GenomeReleaseData; import util.ProcessFeedbackData; import util.RequestException; import communication.Connection; import communication.ConnectionFactory; import communication.DownloadHandler; import communication.HTTPURLUpload; // TODO Ge feedback till status bar i alla try-catch? public class Model implements GenomizerModel { private ArrayList<String> searchHistory; private UpdaterModel updateTabModel; private ProcessModel processingModel; public Model() { searchHistory = new ArrayList<>(); updateTabModel = new UpdaterModel(); processingModel = new ProcessModel(); } @Override public void uploadFile(String expName, File f, String type, boolean isPrivate, String release) throws IllegalArgumentException, RequestException, IOException { // TODO: Remove indirection when ready updateTabModel.uploadFile(expName, f, type, isPrivate, release); } @Override public void downloadFile(final String url, String fileID, final String path, String fileName) throws RequestException { // TODO: Remove indirection when ready updateTabModel.downloadFile(url, fileID, path, fileName); } public CopyOnWriteArrayList<DownloadHandler> getOngoingDownloads() { // TODO: Move to tabmodel when ready return updateTabModel.getOngoingDownloads(); } public CopyOnWriteArrayList<HTTPURLUpload> getOngoingUploads() { // TODO: Move to tabmodel when ready return updateTabModel.getOngoingUploads(); } @Override public ArrayList<ExperimentData> search(String pubmedString) throws RequestException { searchHistory.add(pubmedString); SearchRequest request = RequestFactory.makeSearchRequest(pubmedString); Connection conn = SessionHandler.getInstance().makeConnection(); conn.sendRequest(request, User.getInstance().getToken(), Constants.TEXT_PLAIN); ExperimentData[] searchResponses = ResponseParser .parseSearchResponse(conn.getResponseBody()); if (searchResponses != null && searchResponses.length > 0) { for (int i = 0; i < searchResponses.length; i++) { searchResponses[i].convertToUTF8(); searchResponses[i].updateFileSize(); } } if (searchResponses == null) { return new ArrayList<>(); } return new ArrayList<>(Arrays.asList(searchResponses)); } @Override public void addNewAnnotation(String name, String[] categories, boolean forced) throws IllegalArgumentException, RequestException { if (name.isEmpty()) { throw new IllegalArgumentException( "Must have a name for the annotation!"); } AnnotationDataType[] annotations = getAnnotations(); if (annotations == null) { throw new NullPointerException("Annotations not initialized"); } for (int i = 0; i < annotations.length; i++) { AnnotationDataType a = annotations[i]; if (a.getName().equalsIgnoreCase(name)) { throw new IllegalArgumentException( "Annotations must have a unique name, " + name + " already exists"); } } if (categories == null || categories.length == 0) { categories = new String[] { "Yes", "No", "Unknown" }; } AddAnnotationRequest request = RequestFactory.makeAddAnnotationRequest( name, categories, forced); Connection conn = SessionHandler.getInstance().makeConnection(); conn.sendRequest(request, User.getInstance().getToken(), Constants.JSON); } @Override public boolean editAnnotation(String name, String[] categories, boolean forced, AnnotationDataType oldAnnotation) throws RequestException { if (!(oldAnnotation.getName().equals(name))) { // System.out // .println("Name has been changed! Calling renameAnnotationField!"); renameAnnotationField(oldAnnotation.name, name); } else { // TODO: This if part looks messy (OO) // System.out.println("No changes were made in name!"); } // TODO: This part looks very broken ! (OO) if (!(oldAnnotation.isForced() == forced)) { // System.out // .println("Forced value changed! Calling changeAnnotationForced (?)"); // changeAnnotationForced(name); } else { // System.out.println("Forced value not changed"); } // TODO: This part looks very broken ! (OO) // TODO: If an annotation value has been added, call // addAnnotationValue(name, valueName) // TODO: If an annotation value has been removed, call // removeAnnotationValue(name, valueName) for (int i = 0; i < categories.length; i++) { if (!(categories[i].equals(oldAnnotation.getValues()[i]))) { // System.out // .println("A change was made in annotation value! Calling renameAnnotationValue"); renameAnnotationValue(name, oldAnnotation.getValues()[i], categories[i]); } } return false; } @Override public void deleteAnnotation(String deleteAnnoationData) throws RequestException { RemoveAnnotationFieldRequest request = RequestFactory .makeDeleteAnnotationRequest(deleteAnnoationData); Connection conn = SessionHandler.getInstance().makeConnection(); conn.sendRequest(request, User.getInstance().getToken(), Constants.JSON); } public synchronized AnnotationDataType[] getAnnotations() { AnnotationDataType[] annotations = null; try { GetAnnotationRequest request = RequestFactory .makeGetAnnotationRequest(); Connection conn = SessionHandler.getInstance().makeConnection(); conn.sendRequest(request, User.getInstance().getToken(), Constants.TEXT_PLAIN); annotations = ResponseParser.parseGetAnnotationResponse(conn .getResponseBody()); } catch (RequestException e) { new ErrorDialog("Couldn't get annotations", e).showDialog(); } if (annotations == null) { annotations = new AnnotationDataType[] {}; } return annotations; } public GenomeReleaseData[] getGenomeReleases() { GenomeReleaseData[] genomeReleases; try { GetGenomeReleasesRequest request = RequestFactory .makeGetGenomeReleaseRequest(); Connection conn = SessionHandler.getInstance().makeConnection(); conn.sendRequest(request, User.getInstance().getToken(), Constants.TEXT_PLAIN); genomeReleases = ResponseParser.parseGetGenomeReleaseResponse(conn .getResponseBody()); } catch (RequestException e) { new ErrorDialog("Couldn't get genome releases", e).showDialog(); genomeReleases = new GenomeReleaseData[] {}; } return genomeReleases; } @Override public void addGenomeReleaseFile(String[] filePaths, String species, String version) throws RequestException, IllegalArgumentException, IOException { File[] files = new File[filePaths.length]; String[] names = new String[filePaths.length]; for (int i = 0; i < filePaths.length; i++) { files[i] = new File(filePaths[i]); names[i] = files[i].getName(); } AddGenomeReleaseRequest request = RequestFactory.makeAddGenomeRelease( names, species, version); Connection conn = SessionHandler.getInstance().makeConnection(); conn.sendRequest(request, User.getInstance().getToken(), Constants.JSON); AddGenomeReleaseResponse[] aGRR = ResponseParser .parseGenomeUploadResponse(conn.getResponseBody()); for (int i = 0; i < files.length; i++) { HTTPURLUpload upload = new HTTPURLUpload(aGRR[i].URLupload, files[i].getAbsolutePath(), files[i].getName()); updateTabModel.addUpload(upload); upload.sendFile(User.getInstance().getToken()); } } @Override public void addNewExperiment(String expName, AnnotationDataValue[] annotations) throws RequestException { AddExperimentRequest aER = RequestFactory.makeAddExperimentRequest( expName, annotations); Connection conn = SessionHandler.getInstance().makeConnection(); conn.sendRequest(aER, User.getInstance().getToken(), Constants.JSON); } public void changeExperiment(String expName, AnnotationDataValue[] annotations) throws RequestException { ChangeExperimentRequest cER = RequestFactory .makeChangeExperimentRequest(expName, annotations); Connection conn = SessionHandler.getInstance().makeConnection(); conn.sendRequest(cER, User.getInstance().getToken(), Constants.JSON); } public ExperimentData retrieveExperiment(String expID) { try { RetrieveExperimentRequest rER = RequestFactory .makeRetrieveExperimentRequest(expID); Connection conn = SessionHandler.getInstance().makeConnection(); conn.sendRequest(rER, User.getInstance().getToken(), "plain/text"); return ResponseParser.parseRetrieveExp(conn.getResponseBody()); } catch (RequestException e) { new ErrorDialog("Couldn't retrieve experiment", e).showDialog(); return new ExperimentData(); } } public void renameAnnotationField(String oldname, String newname) throws RequestException { RenameAnnotationFieldRequest request = RequestFactory .makeRenameAnnotationFieldRequest(oldname, newname); Connection conn = SessionHandler.getInstance().makeConnection(); conn.sendRequest(request, User.getInstance().getToken(), Constants.JSON); } public void renameAnnotationValue(String name, String oldValue, String newValue) throws RequestException { RenameAnnotationValueRequest request = RequestFactory .makeRenameAnnotationValueRequest(name, oldValue, newValue); Connection conn = SessionHandler.getInstance().makeConnection(); conn.sendRequest(request, User.getInstance().getToken(), Constants.JSON); } public void removeAnnotationValue(String annotationName, String valueName) throws RequestException { RemoveAnnotationValueRequest request = RequestFactory .makeRemoveAnnotationValueRequest(annotationName, valueName); Connection conn = SessionHandler.getInstance().makeConnection(); conn.sendRequest(request, User.getInstance().getToken(), Constants.JSON); } public void addNewAnnotationValue(String annotationName, String valueName) throws RequestException { AddNewAnnotationValueRequest request = RequestFactory .makeAddNewAnnotationValueRequest(annotationName, valueName); Connection conn = SessionHandler.getInstance().makeConnection(); conn.sendRequest(request, User.getInstance().getToken(), Constants.JSON); } @Override public void deleteGenomeRelease(String specie, String version) throws RequestException { RemoveGenomeReleaseRequest request = RequestFactory .makeRemoveGenomeReleaseRequest(specie, version); Connection conn = SessionHandler.getInstance().makeConnection(); conn.sendRequest(request, User.getInstance().getToken(), Constants.JSON); JOptionPane.showMessageDialog(null, "Succesfully removed " + version); } public GenomeReleaseData[] getSpeciesGenomeReleases(String species) { GetGenomeSpecieReleasesRequest request = RequestFactory .makeGetGenomeSpecieReleaseRequest(species); Connection conn = SessionHandler.getInstance().makeConnection(); try { conn.sendRequest(request, User.getInstance().getToken(), Constants.TEXT_PLAIN); return ResponseParser.parseGetGenomeReleaseResponse(conn .getResponseBody()); } catch (RequestException e) { new ErrorDialog("Couldn't get genome releases", e).showDialog(); return new GenomeReleaseData[] {}; } } @Override public void deleteFileFromExperiment(String id) throws RequestException { RemoveFileFromExperimentRequest request = RequestFactory .makeRemoveFileFromExperimentRequest(id); Connection conn = SessionHandler.getInstance().makeConnection(); conn.sendRequest(request, User.getInstance().getToken(), Constants.TEXT_PLAIN); } @Override public void deleteExperimentFromDatabase(String name) throws RequestException { RemoveExperimentRequest request = RequestFactory .makeRemoveExperimentRequest(name); Connection conn = SessionHandler.getInstance().makeConnection(); conn.sendRequest(request, User.getInstance().getToken(), Constants.TEXT_PLAIN); } public void resetModel() { User.getInstance().setToken(""); searchHistory = new ArrayList<>(); // TODO: probably a lot of other things needs doing !!! updateTabModel.resetUpdaterModel(); } // TODO: Not working (JH) @Override public boolean addGenomeRelease() { return false; } @Override public void setIP(String ip) { SessionHandler.getInstance().setIP(ip); } public void addTickingTask(Runnable task) { updateTabModel.addTickingTask(task); } public void clearTickingTasks() { updateTabModel.clearTickingThread(); } public void setProcessingExperiment(ExperimentData selectedExperiment) { processingModel.setSelectedExperiment(selectedExperiment); } public ProcessModel getProcessingModel() { return this.processingModel; } public boolean convertFile(String fileid, String toformat) throws RequestException { FileConversionRequest request = RequestFactory .makeFileConversionRequest(fileid, toformat); Connection conn = SessionHandler.getInstance().makeConnection(); conn.sendRequest(request, User.getInstance().getToken(), Constants.JSON); return conn.getResponseCode() == 200; } public boolean createUser(String username, String password, String privileges, String name, String email) throws RequestException { CreateUserRequest request = RequestFactory.makeCreateUserRequest( username, password, privileges, name, email); Connection conn = SessionHandler.getInstance().makeConnection(); conn.sendRequest(request, User.getInstance().getToken(), Constants.JSON); return conn.getResponseCode() == 200; } public boolean updateUser(String username, String password, String privileges, String name, String email) throws RequestException { UpdateUserRequest request = RequestFactory.makeUpdateUserRequest( username, password, privileges, name, email); Connection conn = SessionHandler.getInstance().makeConnection(); conn.sendRequest(request, User.getInstance().getToken(), Constants.JSON); return conn.getResponseCode() == 200; } public boolean deleteUser(String username) throws RequestException { DeleteUserRequest request = RequestFactory .makeDeleteUserRequest(username); Connection conn = SessionHandler.getInstance().makeConnection(); conn.sendRequest(request, User.getInstance().getToken(), Constants.TEXT_PLAIN); return conn.getResponseCode() == 200; } public boolean updateUserSettings(String oldPass, String newPass, String name, String email) throws RequestException { ChangePasswordRequest request = RequestFactory .makeChangePasswordRequest(oldPass, newPass, name, email); Connection conn = SessionHandler.getInstance().makeConnection(); conn.sendRequest(request, User.getInstance().getToken(), Constants.JSON); return conn.getResponseCode() == 200; } public String[] getUserNames() throws RequestException { GetUserNamesRequest request = RequestFactory.getUserNamesRequest(); Connection conn = SessionHandler.getInstance().makeConnection(); conn.sendRequest(request, User.getInstance().getToken(), Constants.TEXT_PLAIN); return ResponseParser.getUserNamesResponse(conn.getResponseBody()); } }