/* Date: October 5, 2010
* Template: PluginScreenJavaTemplateGen.java.ftl
* generator: org.molgenis.generators.ui.PluginScreenJavaTemplateGen 3.3.3
*
* THIS FILE IS A TEMPLATE. PLEASE EDIT :-)
*/
package org.molgenis.plantqtl.header;
import java.io.File;
import matrix.general.DataMatrixHandler;
import org.molgenis.auth.MolgenisPermission;
import org.molgenis.data.Data;
import org.molgenis.framework.db.Database;
import org.molgenis.framework.ui.ScreenController;
import org.molgenis.framework.ui.ScreenMessage;
import org.molgenis.util.Tuple;
import plugins.system.database.Settings;
import app.ExcelImport;
public class HomePage extends plugins.cluster.demo.ClusterDemo
{
private static final long serialVersionUID = -3744678801173089268L;
public HomePage(String name, ScreenController<?> parent)
{
super(name, parent);
}
@Override
public String getViewName()
{
return "org_molgenis_plantqtl_header_HomePage";
}
@Override
public String getViewTemplate()
{
return "org/molgenis/plantqtl/header/HomePage.ftl";
}
@Override
public void handleRequest(Database db, Tuple request)
{
String action = request.getString("__action");
if (action.equals("setPathAndLoad"))
{
setupStorageAndLoadExample(db, request.getString("fileDirPath"));
addPanaceaPermissionsAndTryToImportData(db);
}
}
private void addPanaceaPermissionsAndTryToImportData(Database db)
{
try
{
String[] qtlFinderPerms = new String[]
{
// allow to see the QTL finder
"app.ui.QtlFinderPublic2Plugin",
// allow to see genome browser
"app.ui.GenomeBrowserPlugin",
// allow to see experiment overview
"app.ui.ExpTablePlugin",
// allow to see help
"app.ui.HelpPlugin",
// enable the Browse Data menu (minus Inspector and matrix
// removal)
"app.ui.InvestigationsFormController",
"app.ui.DatasFormController",
"app.ui.ManagerPlugin",
// needed to query elements for investigation overview
"org.molgenis.pheno.ObservationElement",
// needed to view the generated annotation menus
// some unused datatypes in the current wormqtl release are
// left out for anonymous
"app.ui.PanelsFormController", "org.molgenis.pheno.Panel",
"app.ui.ChromosomesFormController", "org.molgenis.xgap.Chromosome",
"app.ui.MarkersFormController", "org.molgenis.xgap.Marker",
"app.ui.GenesFormController", "org.molgenis.xgap.Gene",
"app.ui.TranscriptsFormController", "org.molgenis.xgap.Transcript",
"app.ui.MeasurementsFormController", "org.molgenis.pheno.Measurement",
"app.ui.DerivedTraitsFormController", "org.molgenis.xgap.DerivedTrait",
"app.ui.ProbesFormController", "org.molgenis.xgap.Probe",
"app.ui.SamplesFormController",
"org.molgenis.xgap.Sample",
// allow reading datasets and investigations
"org.molgenis.organization.Investigation", "org.molgenis.data.Data",
"org.molgenis.data.BinaryDataMatrix", "org.molgenis.data.CSVDataMatrix",
"org.molgenis.data.DecimalDataElement", "org.molgenis.data.TextDataElement",
// allow reading dataset backend files (include seperate
// InvestigationFile for overview plugin)
"org.molgenis.core.MolgenisFile", "org.molgenis.xgap.InvestigationFile",
// allow to see how uploaded this dataset
"org.molgenis.protocol.ProtocolApplication_Performer",
// allow to see analysis metadata
"org.molgenis.cluster.DataSet", "org.molgenis.cluster.DataName", "org.molgenis.cluster.DataValue",
};
for (String e : qtlFinderPerms)
{
MolgenisPermission mp = new MolgenisPermission();
mp.setEntity_ClassName(e);
mp.setRole_Name("anonymous");
mp.setPermission("read");
db.add(mp);
}
DataMatrixHandler dmh = new DataMatrixHandler(db);
if (dmh.hasValidFileStorage(db))
{
// check metadata.xls
String importDir = dmh.getFileStorage(true, db).getAbsolutePath();
File metadata = new File(importDir + File.separator + "metadata.xls");
if (!metadata.exists())
{
throw new Exception("Annotation Excel file is missing!");
}
ExcelImport.importAll(metadata, db, null);
// relink datasets
// fails if filenames have uppercase characters!
// convert using :
// for i in *; do mv "$i" "$(echo $i|tr A-Z a-z)"; done
relinkDatasets(db, dmh);
// remove clusterdemo example investigation
Settings.deleteExampleInvestigation("ClusterDemo", db);
// all done
this.setMessages(new ScreenMessage("Annotation import and data relink succeeded", true));
}
else
{
this.setMessages(new ScreenMessage(
"Permissions loaded, but could not import annotations because storagedir setup failed", false));
}
}
catch (Exception e)
{
e.printStackTrace();
this.setMessages(new ScreenMessage(e.getMessage(), false));
}
}
/**
* Relink datasets if needed: but expected is that ALL are relinked when the
* function ends, or else error
*
* @param db
* @param dmh
* @throws Exception
*/
private void relinkDatasets(Database db, DataMatrixHandler dmh) throws Exception
{
for (Data data : db.find(Data.class))
{
// 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)
{
throw new Exception("Could not relink data matrix '" + data.getName() + "'");
}
if (!dmh.isDataStoredIn(data, data.getStorage(), db))
{
throw new Exception("SEVERE: Data matrix '" + data.getName()
+ "' is supposed to be relinked, but the isDataStoredIn check failed!");
}
}
}
}
}