package plugins.matrix; import java.io.OutputStream; import java.util.ArrayList; import java.util.List; import org.molgenis.framework.db.Database; import org.molgenis.framework.db.QueryRule; import org.molgenis.framework.db.QueryRule.Operator; import org.molgenis.framework.ui.EasyPluginController; import org.molgenis.framework.ui.FormModel; import org.molgenis.framework.ui.FreemarkerView; import org.molgenis.framework.ui.ScreenController; import org.molgenis.framework.ui.ScreenView; import org.molgenis.gids.GidsSample; import org.molgenis.matrix.component.MatrixViewer; import org.molgenis.matrix.component.SliceablePhenoMatrix; import org.molgenis.matrix.component.general.MatrixQueryRule; import org.molgenis.organization.Investigation; import org.molgenis.pheno.Individual; import org.molgenis.pheno.Measurement; import org.molgenis.pheno.ObservationElement; import org.molgenis.protocol.Protocol; import org.molgenis.util.HandleRequestDelegationException; import org.molgenis.util.Tuple; /** * GidsMatrixController takes care of all user requests and application logic. * * <li>Each user request is handled by its own method based action=methodName. * <li>MOLGENIS takes care of db.commits and catches exceptions to show to the * user <li>GidsMatrixModel holds application state and business logic on top of * domain model. Get it via this.getModel()/setModel(..) <li>GidsMatrixView * holds the template to show the layout. Get/set it via * this.getView()/setView(..). */ public class IndividualMatrix extends EasyPluginController<IndividualMatrixModel> { private static final long serialVersionUID = 4513824752877779376L; public IndividualMatrix(String name, ScreenController<?> parent) { super(name, parent); this.setModel(new IndividualMatrixModel(this)); // the default model } public ScreenView getView() { return new FreemarkerView("IndividualMatrixView.ftl", getModel()); } public String getCustomHtmlHeaders() { return "<link rel=\"stylesheet\" style=\"text/css\" href=\"res/css/gids.css\">"; } @Override public void reload(Database db) throws Exception { FormModel<Investigation> form = this.getParentForm(Investigation.class); List<Investigation> investigationsList = form.getRecords(); getModel().setInvestigation(investigationsList.get(0).getName()); List<Protocol> listProtocols = db.query(Protocol.class).find(); if (listProtocols.size() == 0) { getModel().error = true; } else { if (!getModel().action.startsWith(IndividualMatrixModel.INDVMATRIX)) { getModel().setCheckForPaging(false); } if (getModel().getCheckForPaging() == false) { if (getModel().selectedScreenI == 1) { getModel().matrixViewerIndv = null; getModel().setChosenProtocolNameI("Individual_info"); getModel().individualNavClass = "nav1"; } else { getModel().individualNavClass = "nav"; } if (getModel().selectedScreenI == 2) { getModel().setChosenProtocolNameI("Personal_info"); getModel().matrixViewerIndv = null; getModel().personalNavClass = "nav1"; } else { getModel().personalNavClass = "nav"; } if (getModel().selectedScreenI == 3) { getModel().setChosenProtocolNameI("Medical_info"); getModel().matrixViewerIndv = null; getModel().medicalNavClass = "nav1"; } else { getModel().medicalNavClass = "nav"; } if (!getModel().getInvestigation().equals("Shared")) { if (getModel().selectedScreenI == 4) { getModel().setChosenProtocolNameI(getModel().getInvestigation()); getModel().matrixViewerIndv = null; getModel().projectSpecificNavClass = "nav1"; } else { getModel().projectSpecificNavClass = "nav"; } } if (getModel().selectedScreenS == 1) { getModel().setChosenProtocolNameS("Sample_info"); getModel().matrixViewerSample = null; getModel().sampleNavClass = "nav1"; } else { getModel().sampleNavClass = "nav"; } if (getModel().selectedScreenS == 2) { getModel().setChosenProtocolNameS("DNA"); getModel().matrixViewerSample = null; getModel().dnaNavClass = "nav1"; } else { getModel().dnaNavClass = "nav"; } if (getModel().selectedScreenS == 3) { getModel().setChosenProtocolNameS("RNA"); getModel().matrixViewerSample = null; getModel().rnaNavClass = "nav1"; } else { getModel().rnaNavClass = "nav"; } if (getModel().selectedScreenS == 4) { getModel().setChosenProtocolNameS("Serum"); getModel().matrixViewerSample = null; getModel().serumNavClass = "nav1"; } else { getModel().serumNavClass = "nav"; } if (getModel().selectedScreenS == 5) { getModel().setChosenProtocolNameS("Plasma"); getModel().matrixViewerSample = null; getModel().plasmaNavClass = "nav1"; } else { getModel().plasmaNavClass = "nav"; } if (getModel().selectedScreenS == 6) { getModel().setChosenProtocolNameS("Biopsies"); getModel().matrixViewerSample = null; getModel().biopsiesNavClass = "nav1"; } else { getModel().biopsiesNavClass = "nav"; } if (getModel().selectedScreenS == 7) { getModel().setChosenProtocolNameS("HLA_Typing"); getModel().matrixViewerSample = null; getModel().hlaNavClass = "nav1"; } else { getModel().hlaNavClass = "nav"; } } try { getModel().error = false; // FormModel<Investigation> form = // this.getParentForm(Investigation.class); // List<Investigation> investigationsList = form.getRecords(); getModel().setInvestigation(investigationsList.get(0).getName()); if (getModel().getInvestigation().equals("Shared")) { getModel().setProjectShared(true); } else { getModel().setProjectShared(false); } if (!getModel().getLastInvest().equals(getModel().getInvestigation())) { getModel().setCheckIfInvestchanges(true); } else { if (!getModel().action.startsWith(IndividualMatrixModel.INDVMATRIX)) { getModel().setCheckIfInvestchanges(false); } } if (getModel().matrixViewerIndv == null && !getModel().getInvestigation().equals("Shared")) { Protocol indvInfoProt = db.find(Protocol.class, new QueryRule(Protocol.NAME, Operator.EQUALS, getModel().chosenProtocolNameI)).get(0); List<String> measurementsToShow = indvInfoProt.getFeatures_Name(); getModel().setMeasExport(measurementsToShow); List<MatrixQueryRule> filterRules = new ArrayList<MatrixQueryRule>(); filterRules.add(new MatrixQueryRule(MatrixQueryRule.Type.rowHeader, Individual.INVESTIGATION_NAME, Operator.EQUALS, getModel().getInvestigation())); getModel().matrixViewerIndv = new MatrixViewer(this, IndividualMatrixModel.INDVMATRIX, new SliceablePhenoMatrix<Individual, Measurement>(Individual.class, Measurement.class), true, 2, true, false, filterRules, new MatrixQueryRule(MatrixQueryRule.Type.colHeader, Measurement.NAME, Operator.IN, measurementsToShow)); } if (getModel().getListIndividuals() != null && getModel().matrixViewerSample == null) { Protocol sampleInfoProt = db.find(Protocol.class, new QueryRule(Protocol.NAME, Operator.EQUALS, getModel().chosenProtocolNameS)).get(0); List<String> measurementsToShowSamples = sampleInfoProt.getFeatures_Name(); List<MatrixQueryRule> showTheseIndividuals = new ArrayList<MatrixQueryRule>(); List<Integer> sampleidList = new ArrayList<Integer>(); for (Integer indiId : getModel().getListIndividuals()) { Individual individual = db.findById(Individual.class, indiId); sampleidList.add(individual.getId()); } showTheseIndividuals.add(new MatrixQueryRule(MatrixQueryRule.Type.rowHeader, GidsSample.INDIVIDUALID, Operator.IN, sampleidList)); getModel().matrixViewerSample = new MatrixViewer(this, IndividualMatrixModel.SAMPLEMATRIX, new SliceablePhenoMatrix<GidsSample, Measurement>(GidsSample.class, Measurement.class), true, 2, true, false, showTheseIndividuals, new MatrixQueryRule( MatrixQueryRule.Type.colHeader, Measurement.NAME, Operator.IN, measurementsToShowSamples)); } getModel().setLastInvest(getModel().getInvestigation()); } catch (Exception e) { logger.error(e.getMessage()); } } if (getModel().matrixViewerIndv != null) { getModel().matrixViewerIndv.setDatabase(db); if (getModel().action.startsWith(getModel().matrixViewerIndv.getName())) { getModel().setCheckForPaging(false); } } if (getModel().matrixViewerSample != null) { getModel().matrixViewerSample.setDatabase(db); } } @Override public Show handleRequest(Database db, Tuple request, OutputStream out) throws HandleRequestDelegationException { if (request.getInt("selectedScreenI") != null) { getModel().setSelectedScreenI(request.getInt("selectedScreenI")); } if (request.getInt("selectedScreenS") != null) { getModel().setSelectedScreenS(request.getInt("selectedScreenS")); } getModel().action = request.getString("__action"); try { if (getModel().action.startsWith(getModel().matrixViewerIndv.getName())) { getModel().setCheckForPaging(true); getModel().matrixViewerIndv.handleRequest(db, request); } else { getModel().setCheckForPaging(false); } if (getModel().action.equals("setSelection")) { getModel().selection = ""; @SuppressWarnings("unchecked") List<ObservationElement> rows = (List<ObservationElement>) getModel().matrixViewerIndv.getSelection(db); int rowCnt = 0; List<Integer> listIndividualIds = new ArrayList<Integer>(); for (ObservationElement row : rows) { if (request.getBool(IndividualMatrixModel.INDVMATRIX + "_selected_" + rowCnt) != null) { listIndividualIds.add(row.getId()); } rowCnt++; } getModel().setListIndividuals(listIndividualIds); getModel().matrixViewerSample = null; } } catch (Exception e) { this.setError(e.getMessage()); } // default show return Show.SHOW_MAIN; } }