/* Date: February 2, 2010 * Template: PluginScreenJavaTemplateGen.java.ftl * generator: org.molgenis.generators.ui.PluginScreenJavaTemplateGen 3.3.2-testing * * THIS FILE IS A TEMPLATE. PLEASE EDIT :-) */ package plugins.matrix.manager; import java.util.HashMap; import java.util.List; import matrix.general.DataMatrixHandler; import matrix.general.Importer; import org.molgenis.data.Data; import org.molgenis.framework.db.Database; import org.molgenis.framework.db.DatabaseException; import org.molgenis.framework.ui.FormController; import org.molgenis.framework.ui.FormModel; import org.molgenis.framework.ui.PluginModel; import org.molgenis.framework.ui.ScreenController; import org.molgenis.framework.ui.ScreenMessage; import org.molgenis.model.MolgenisModelException; import org.molgenis.pheno.ObservationElement; import org.molgenis.util.Tuple; public class MatrixManager extends PluginModel { protected DataMatrixHandler dmh = null; public static String SESSION_MATRIX_DATA = "session_inmemory_matrix_data"; protected MatrixManagerModel model = new MatrixManagerModel(); public MatrixManagerModel getMyModel() { return model; } public MatrixManager(String name, ScreenController<?> parent) { super(name, parent); } @Override public String getViewName() { return "MatrixManager"; } @Override public String getViewTemplate() { return "plugins/matrix/manager/MatrixManager.ftl"; } public void handleRequest(Database db, Tuple request) { if (request.getString("__action") != null) { try { if (this.model.isUploadMode()) { // if(request.getString("inputTextArea") != null){ // DON'T DO THIS: BAD FOR LARGE UPLOADS -> // this.getModel().setUploadTextAreaContent(request.getString("inputTextArea")); // } new Importer().performImport(request, this.model.getSelectedData(), db); // set to null to force backend check/creation of browser // instance this.model.setSelectedData(null); } else { RequestHandler.handle(this.model, request, db); } } catch (Exception e) { e.printStackTrace(); this.setMessages(new ScreenMessage(e.getMessage() != null ? e.getMessage() : "null", false)); } } } public void setHeaderAttr(Database db) throws DatabaseException, MolgenisModelException, InstantiationException, IllegalAccessException { ObservationElement target = (ObservationElement) db.getClassForName( this.model.getSelectedData().getTargetType()).newInstance(); ObservationElement feature = (ObservationElement) db.getClassForName( this.model.getSelectedData().getFeatureType()).newInstance(); this.model.setRowHeaderAttr(target.getFields()); this.model.setColHeaderAttr(feature.getFields()); } public void createOverLibText(Database db) throws Exception { List<String> rowNames = this.model.getBrowser().getModel().getSubMatrix().getRowNames(); List<String> colNames = this.model.getBrowser().getModel().getSubMatrix().getColNames(); this.model.setRowObsElem((OverlibText.getObservationElements(db, rowNames, this.model.getSelectedData() .getTargetType()))); this.model.setColObsElem((OverlibText.getObservationElements(db, colNames, this.model.getSelectedData() .getFeatureType()))); } public void createHeaders() { this.model.setColHeader(this.model.getSelectedData().getFeatureType() + " " + (this.model.getBrowser().getModel().getColStart() + 1) + "-" + this.model.getBrowser().getModel().getColStop() + " of " + this.model.getBrowser().getModel().getColMax()); this.model.setRowHeader(this.model.getSelectedData().getTargetType() + "<br>" + (this.model.getBrowser().getModel().getRowStart() + 1) + "-" + this.model.getBrowser().getModel().getRowStop() + " of " + this.model.getBrowser().getModel().getRowMax()); } public void setAllOperators() { HashMap<String, String> ops = new HashMap<String, String>(); ops.put("GREATER", "greater than"); ops.put("GREATER_EQUAL", "greater and equal"); ops.put("LESS", "less than"); ops.put("LESS_EQUAL", "less and equal"); ops.put("EQUALS", "equals exactly"); // ops.put("SORTASC", "sort asc"); // ops.put("SORTDESC", "sort desc"); // ops.put("NOT", "is not"); this.model.setAllOperators(ops); } public void setValueOperators() { HashMap<String, String> ops = new HashMap<String, String>(); // if(this.model.getSelectedData().getValueType().equals("Decimal")) // { ops.put("GREATER", "greater than"); ops.put("GREATER_EQUAL", "greater and equal"); ops.put("LESS", "less than"); ops.put("LESS_EQUAL", "less and equal"); // } ops.put("EQUALS", "equals exactly"); // ops.put("SORTASC", "sort asc"); // ops.put("SORTDESC", "sort desc"); // ops.put("NOT", "is not"); this.model.setValueOperators(ops); } public static boolean dataHasChanged(Data newData, Data oldData) { for (String f : oldData.getFields()) { Object oldAttr = oldData.get(f); Object newAttr = newData.get(f); if (oldAttr == null && newAttr == null) { // equal if both are null } else if (oldAttr == null || newAttr == null) { // unequal if either is null return true; } else if (!newAttr.equals(oldAttr)) { // if both not full, perform 'equals' return true; } else { } } return false; } @Override public void reload(Database db) { // TODO: create refresh button // TODO: review this 'core' logic carefully :) ScreenController<?> parentController = (ScreenController<?>) this.getParent().getParent(); FormModel<Data> parentForm = (FormModel<Data>) ((FormController) parentController).getModel(); Data data = parentForm.getRecords().get(0); try { if (this.dmh == null) { dmh = new DataMatrixHandler(db); } if (this.model.getSelectedFilterDiv() == null) { this.model.setSelectedFilterDiv("filter2"); } boolean newOrOtherData; // boolean createBrowserSuccess = true; //assume success, can be // false if a new instance is created but fails if (this.model.getSelectedData() == null) { newOrOtherData = true; } else { if (dataHasChanged(this.model.getSelectedData(), data)) { newOrOtherData = true; } else { newOrOtherData = false; } } this.model.setSelectedData(data); if (newOrOtherData) { // find out if the 'Data' has a proper backend boolean hasLinkedStorage = dmh.isDataStoredIn(data, data.getStorage(), db); // if not, it doesn't mean the source file is not there! e.g. // after updating your database if (!hasLinkedStorage) { // attempt to relink boolean relinked = dmh.attemptStorageRelink(data, data.getStorage(), db); if (relinked) { this.setMessages(new ScreenMessage( "INFO: Datamatrix '" + data.getName() + "' relinked to a storage file with the same (file escaped) name. Please make sure this is intented.", true)); } // and requery this.model.setHasBackend(dmh.isDataStoredIn(data, data.getStorage(), db)); } else { // already has properly linked storage this.model.setHasBackend(true); } if (this.model.isHasBackend()) { logger.info("*** creating browser instance"); Browser br = new CreateBrowserInstance(db, data, this.getApplicationController()).getBrowser(); this.model.setBrowser(br); if (!br.getModel().getInstance().getData().getValueType().equals(data.getValueType())) { String oldDt = data.getValueType(); String newDt = br.getModel().getInstance().getData().getValueType(); data.setValueType(newDt); db.update(data); this.setMessages(new ScreenMessage("WARNING: Data valuetype '" + oldDt + "' adjusted to storage specification '" + newDt + "' to prevent problems with e.g. value types", true)); } // refresh attributes, operators, filter this.model.setRowHeaderAttr(null); this.model.setColHeaderAttr(null); this.model.setAllOperators(null); this.model.setValueOperators(null); this.model.setFilter(null); } } if (this.model.isHasBackend()) { this.model.setUploadMode(false); createOverLibText(db); createHeaders(); if (model.getRowHeaderAttr() == null || model.getColHeaderAttr() == null) { setHeaderAttr(db); } if (model.getAllOperators() == null) { setAllOperators(); } if (model.getValueOperators() == null) { setValueOperators(); } } else { this.model.setUploadMode(true); } } catch (Exception e) { e.printStackTrace(); this.setMessages(new ScreenMessage(e.getMessage() != null ? e.getMessage() : "null", false)); this.model.setBrowser(null); } } }