package org.molgenis.dataexplorer.settings;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import org.molgenis.data.meta.model.Attribute;
import org.molgenis.data.settings.DefaultSettingsEntity;
import org.molgenis.data.settings.DefaultSettingsEntityType;
import org.molgenis.dataexplorer.controller.DataExplorerController;
import org.springframework.stereotype.Component;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.LinkedHashMap;
import java.util.Map;
import static org.molgenis.data.meta.AttributeType.*;
@Component
public class DataExplorerSettings extends DefaultSettingsEntity
{
private static final long serialVersionUID = 1L;
private static final String ID = DataExplorerController.ID;
public DataExplorerSettings()
{
super(ID);
}
@Component
private static class Meta extends DefaultSettingsEntityType
{
public static final String GENERAL = "general_";
public static final String GENERAL_SEARCHBOX = "searchbox";
public static final String GENERAL_ITEM_SELECT_PANEL = "item_select_panel";
public static final String GENERAL_LAUNCH_WIZARD = "launch_wizard";
public static final String GENERAL_HEADER_ABBREVIATE = "header_abbreviate";
private static final boolean DEFAULT_GENERAL_SEARCHBOX = true;
private static final boolean DEFAULT_GENERAL_ITEM_SELECT_PANEL = true;
private static final boolean DEFAULT_GENERAL_LAUNCH_WIZARD = false;
private static final int DEFAULT_GENERAL_HEADER_ABBREVIATE = 180;
public static final String MOD = "mods";
public static final String MOD_AGGREGATES = "mod_aggregates";
public static final String MOD_ANNOTATORS = "mod_annotators";
public static final String MOD_CHARTS = "mod_charts";
public static final String MOD_DATA = "mod_data";
public static final String MOD_REPORTS = "mod_reports";
private static final boolean DEFAULT_MOD_AGGREGATES = true;
private static final boolean DEFAULT_MOD_ANNOTATORS = true;
private static final boolean DEFAULT_MOD_CHARTS = true;
private static final boolean DEFAULT_MOD_DATA = true;
private static final boolean DEFAULT_MOD_REPORT = true;
public static final String DATA = "data";
public static final String DATA_GALAXY_EXPORT = "data_galaxy_export";
public static final String DATA_GALAXY_URL = "data_galaxy_url";
public static final String DATA_GALAXY_API_KEY = "data_galaxy_api_key";
public static final String DATA_GENOME_BROWSER = "data_genome_browser";
private static final boolean DEFAULT_DATA_GALAXY_EXPORT = true;
private static final boolean DEFAULT_DATA_GENOME_BROWSER = true;
public static final String GENOMEBROWSER = "genomebrowser";
public static final String GENOMEBROWSER_INIT = "gb_init";
public static final String GENOMEBROWSER_INIT_BROWSER_LINKS = "gb_init_browser_links";
public static final String GENOMEBROWSER_INIT_COORD_SYSTEM = "gb_init_coord_system";
public static final String GENOMEBROWSER_INIT_LOCATION = "gb_init_location";
public static final String GENOMEBROWSER_INIT_SOURCES = "gb_init_sources";
public static final String GENOMEBROWSER_INIT_HIGHLIGHT_REGION = "gb_init_highlight_region";
private static final String DEFAULT_GENOMEBROWSER_INIT_BROWSER_LINKS = "{Ensembl: 'http://www.ensembl.org/Homo_sapiens/Location/View?r=${chr}:${start}-${end}',UCSC: 'http://genome.ucsc.edu/cgi-bin/hgTracks?db=hg19&position=chr${chr}:${start}-${end}',Sequence: 'http://www.derkholm.net:8080/das/hg19comp/sequence?segment=${chr}:${start},${end}'}";
private static final String DEFAULT_GENOMEBROWSER_INIT_COORD_SYSTEM = "{speciesName: 'Human',taxon: 9606,auth: 'GRCh',version: '37',ucscName: 'hg19'}";
private static final String DEFAULT_GENOMEBROWSER_INIT_LOCATION = "chr:'1',viewStart:10000000,viewEnd:10100000,cookieKey:'human',nopersist:true";
private static final String DEFAULT_GENOMEBROWSER_INIT_SOURCES = "[{name:'Genome',twoBitURI:'//www.biodalliance.org/datasets/hg19.2bit',tier_type: 'sequence'},{name: 'Genes',desc: 'Gene structures from GENCODE 19',bwgURI: '//www.biodalliance.org/datasets/gencode.bb',stylesheet_uri: '//www.biodalliance.org/stylesheets/gencode.xml',collapseSuperGroups: true,trixURI:'//www.biodalliance.org/datasets/geneIndex.ix'},{name: 'Repeats',desc: 'Repeat annotation from Ensembl 59',bwgURI: '//www.biodalliance.org/datasets/repeats.bb',stylesheet_uri: '//www.biodalliance.org/stylesheets/bb-repeats.xml'},{name: 'Conservation',desc: 'Conservation',bwgURI: '//www.biodalliance.org/datasets/phastCons46way.bw',noDownsample: true}]";
private static final boolean DEFAULT_GENOMEBROWSER_INIT_HIGHLIGHT_REGION = false;
public static final String AGGREGATES = "aggregates";
public static final String AGGREGATES_DISTINCT_SELECT = "agg_distinct";
public static final String AGGREGATES_DISTINCT_OVERRIDES = "agg_distinct_overrides";
public static final String REPORTS = "reports";
public static final String REPORTS_ENTITIES = "reports_entities";
private static final boolean DEFAULT_AGGREGATES_DISTINCT_SELECT = true;
public Meta()
{
super(ID);
}
@Override
public void init()
{
super.init();
setLabel("Data explorer settings");
setDescription("Settings for the data explorer plugin.");
addGeneralSettings();
addModulesSettings();
}
private void addGeneralSettings()
{
Attribute generalAttr = addAttribute(GENERAL).setDataType(COMPOUND).setLabel("General");
addAttribute(GENERAL_SEARCHBOX).setParent(generalAttr).setDataType(BOOL).setNillable(false)
.setDefaultValue(String.valueOf(DEFAULT_GENERAL_SEARCHBOX)).setLabel("Show search box");
addAttribute(GENERAL_ITEM_SELECT_PANEL).setParent(generalAttr).setDataType(BOOL).setNillable(false)
.setDefaultValue(String.valueOf(DEFAULT_GENERAL_ITEM_SELECT_PANEL))
.setLabel("Show data item selection");
addAttribute(GENERAL_LAUNCH_WIZARD).setParent(generalAttr).setDataType(BOOL).setNillable(false)
.setDefaultValue(String.valueOf(DEFAULT_GENERAL_LAUNCH_WIZARD))
.setLabel("Launch data item filter wizard");
addAttribute(GENERAL_HEADER_ABBREVIATE).setParent(generalAttr).setDataType(INT).setNillable(false)
.setDefaultValue(String.valueOf(DEFAULT_GENERAL_HEADER_ABBREVIATE))
.setLabel("Entity description abbreviation length");
}
private void addModulesSettings()
{
Attribute modAttr = addAttribute(MOD).setDataType(COMPOUND).setLabel("Modules");
addAttribute(MOD_AGGREGATES).setParent(modAttr).setDataType(BOOL).setNillable(false)
.setDefaultValue(String.valueOf(DEFAULT_MOD_AGGREGATES)).setLabel("Aggregates");
createModAggregatesSettings(modAttr);
addAttribute(MOD_ANNOTATORS).setParent(modAttr).setDataType(BOOL).setNillable(false)
.setDefaultValue(String.valueOf(DEFAULT_MOD_ANNOTATORS)).setLabel("Annotators");
addAttribute(MOD_CHARTS).setParent(modAttr).setDataType(BOOL).setNillable(false)
.setDefaultValue(String.valueOf(DEFAULT_MOD_CHARTS)).setLabel("Charts");
addAttribute(MOD_DATA).setParent(modAttr).setDataType(BOOL).setNillable(false)
.setDefaultValue(String.valueOf(DEFAULT_MOD_DATA)).setLabel("Data");
createModDataSettings(modAttr);
addAttribute(MOD_REPORTS).setParent(modAttr).setDataType(BOOL).setNillable(false)
.setDefaultValue(String.valueOf(DEFAULT_MOD_REPORT)).setLabel("Reports");
createModReportSettings(modAttr);
}
private void createModDataSettings(Attribute modAttr)
{
Attribute dataAttr = addAttribute(DATA).setParent(modAttr).setDataType(COMPOUND).setLabel("Data")
.setVisibleExpression("$('" + MOD_DATA + "').eq(true).value()");
addAttribute(DATA_GALAXY_EXPORT).setParent(dataAttr).setDataType(BOOL).setNillable(false)
.setDefaultValue(String.valueOf(DEFAULT_DATA_GALAXY_EXPORT)).setLabel("Galaxy export");
addAttribute(DATA_GALAXY_URL).setParent(dataAttr).setDataType(HYPERLINK).setNillable(true).setLabel("Galaxy URL")
.setVisibleExpression("$('" + DATA_GALAXY_EXPORT + "').eq(true).value()");
addAttribute(DATA_GALAXY_API_KEY).setParent(dataAttr).setNillable(true).setLabel("Galaxy API key")
.setVisibleExpression("$('" + DATA_GALAXY_EXPORT + "').eq(true).value()");
// genome browser
Attribute genomeBrowserAttr = addAttribute(GENOMEBROWSER).setParent(dataAttr).setDataType(COMPOUND)
.setLabel("Genome Browser")
.setVisibleExpression("$('" + DATA_GENOME_BROWSER + "').eq(true).value()");
Attribute genomeBrowserInitAttr = addAttribute(GENOMEBROWSER_INIT).setParent(genomeBrowserAttr)
.setDataType(COMPOUND).setLabel("Initialization");
addAttribute(GENOMEBROWSER_INIT_BROWSER_LINKS).setParent(genomeBrowserInitAttr).setNillable(false).setDataType(TEXT)
.setDefaultValue(DEFAULT_GENOMEBROWSER_INIT_BROWSER_LINKS).setLabel("Browser links");
addAttribute(GENOMEBROWSER_INIT_COORD_SYSTEM).setParent(genomeBrowserInitAttr).setNillable(false).setDataType(TEXT)
.setDefaultValue(DEFAULT_GENOMEBROWSER_INIT_COORD_SYSTEM).setLabel("Coordinate system");
addAttribute(GENOMEBROWSER_INIT_LOCATION).setParent(genomeBrowserInitAttr).setNillable(false).setDataType(TEXT)
.setDefaultValue(DEFAULT_GENOMEBROWSER_INIT_LOCATION).setLabel("Location");
addAttribute(GENOMEBROWSER_INIT_SOURCES).setParent(genomeBrowserInitAttr).setNillable(false).setDataType(TEXT)
.setDefaultValue(DEFAULT_GENOMEBROWSER_INIT_SOURCES).setLabel("Sources");
addAttribute(GENOMEBROWSER_INIT_HIGHLIGHT_REGION).setParent(genomeBrowserInitAttr).setNillable(false)
.setDataType(BOOL).setDefaultValue(String.valueOf(DEFAULT_GENOMEBROWSER_INIT_HIGHLIGHT_REGION))
.setLabel("Highlight region");
addAttribute(DATA_GENOME_BROWSER).setParent(dataAttr).setDataType(BOOL).setNillable(false)
.setDefaultValue(String.valueOf(DEFAULT_DATA_GENOME_BROWSER)).setLabel("Genome Browser");
}
private void createModAggregatesSettings(Attribute modAttr)
{
Attribute aggregatesAttr = addAttribute(AGGREGATES).setParent(modAttr).setDataType(COMPOUND)
.setLabel("Aggregates").setVisibleExpression("$('" + MOD_AGGREGATES + "').eq(true).value()");
addAttribute(AGGREGATES_DISTINCT_SELECT).setParent(aggregatesAttr).setNillable(false).setDataType(BOOL)
.setDefaultValue(String.valueOf(DEFAULT_AGGREGATES_DISTINCT_SELECT))
.setLabel("Distinct aggregates");
addAttribute(AGGREGATES_DISTINCT_OVERRIDES).setParent(aggregatesAttr).setDataType(TEXT)
.setLabel("Distinct attribute overrides")
.setDescription("JSON object that maps entity names to attribute names")
.setVisibleExpression("$('" + AGGREGATES_DISTINCT_SELECT + "').eq(true).value()");
}
private void createModReportSettings(Attribute modAttr)
{
Attribute reportsAttr = addAttribute(REPORTS).setParent(modAttr).setDataType(COMPOUND).setLabel("Reports")
.setVisibleExpression("$('" + MOD_REPORTS + "').eq(true).value()");
addAttribute(REPORTS_ENTITIES).setParent(reportsAttr).setNillable(true).setDataType(TEXT).setLabel("Reports")
.setDescription(
"Comma-seperated report strings (e.g. MyDataSet:myreport,OtherDataSet:otherreport). The report name refers to an existing FreemarkerTemplate entity or file with name view-<report>-entitiesreport.ftl (e.g. view-myreport-entitiesreport.ftl)");
}
}
public boolean getModAggregates()
{
Boolean value = getBoolean(Meta.MOD_AGGREGATES);
return value != null ? value.booleanValue() : false;
}
public void setModAggregates(boolean modAggregates)
{
set(Meta.MOD_AGGREGATES, modAggregates);
}
public boolean getModAnnotators()
{
Boolean value = getBoolean(Meta.MOD_ANNOTATORS);
return value != null ? value.booleanValue() : false;
}
public void setModAnnotators(boolean modAnnotators)
{
set(Meta.MOD_ANNOTATORS, modAnnotators);
}
public boolean getModCharts()
{
Boolean value = getBoolean(Meta.MOD_CHARTS);
return value != null ? value.booleanValue() : false;
}
public void setModCharts(boolean modCharts)
{
set(Meta.MOD_CHARTS, modCharts);
}
public boolean getModData()
{
Boolean value = getBoolean(Meta.MOD_DATA);
return value != null ? value : false;
}
public void setModData(boolean modData)
{
set(Meta.MOD_DATA, modData);
}
public boolean getModReports()
{
Boolean value = getBoolean(Meta.MOD_REPORTS);
return value != null ? value : false;
}
public void setModReports(boolean modReports)
{
set(Meta.MOD_REPORTS, modReports);
}
public Boolean getGalaxyExport()
{
return getBoolean(Meta.DATA_GALAXY_EXPORT);
}
public void setGalaxyExport(boolean galaxyExport)
{
set(Meta.DATA_GALAXY_EXPORT, galaxyExport);
}
public Map<String, String> getAggregatesDistinctOverrides()
{
String distinctAttrOverridesStr = getString(Meta.AGGREGATES_DISTINCT_OVERRIDES);
return new Gson().fromJson(distinctAttrOverridesStr, new TypeToken<Map<String, String>>()
{
}.getType());
}
public void setAggregatesDistinctOverrides(Map<String, String> aggregatesDistinctOverrides)
{
String value = aggregatesDistinctOverrides != null ? new Gson().toJson(aggregatesDistinctOverrides) : null;
set(Meta.AGGREGATES_DISTINCT_OVERRIDES, value);
}
public boolean getSearchbox()
{
Boolean value = getBoolean(Meta.GENERAL_SEARCHBOX);
return value != null ? value : false;
}
public void setSearchbox(boolean searchbox)
{
set(Meta.GENERAL_SEARCHBOX, searchbox);
}
public boolean getItemSelection()
{
Boolean value = getBoolean(Meta.GENERAL_ITEM_SELECT_PANEL);
return value != null ? value : false;
}
public void setItemSelection(boolean itemSelection)
{
set(Meta.GENERAL_ITEM_SELECT_PANEL, itemSelection);
}
public boolean getLaunchWizard()
{
Boolean value = getBoolean(Meta.GENERAL_LAUNCH_WIZARD);
return value != null ? value : false;
}
public void setLaunchWizard(boolean launchWizard)
{
set(Meta.GENERAL_LAUNCH_WIZARD, launchWizard);
}
public int getHeaderAbbreviate()
{
Integer value = getInt(Meta.GENERAL_HEADER_ABBREVIATE);
return value != null ? value : -1;
}
public void setHeaderAbbreviate(int headerAbbreviate)
{
set(Meta.GENERAL_HEADER_ABBREVIATE, headerAbbreviate);
}
public URI getGalaxyUrl()
{
String galaxyUrl = getString(Meta.DATA_GALAXY_URL);
if (galaxyUrl != null)
{
try
{
return new URI(galaxyUrl);
}
catch (URISyntaxException e)
{
throw new RuntimeException(e);
}
}
else
{
return null;
}
}
public void setGalaxyUrl(URI galaxyUrl)
{
set(Meta.DATA_GALAXY_URL, galaxyUrl.toString());
}
public boolean getGenomeBrowser()
{
Boolean value = getBoolean(Meta.DATA_GENOME_BROWSER);
return value != null ? value.booleanValue() : false;
}
public void setGenomeBrowser(boolean genomeBrowser)
{
set(Meta.DATA_GENOME_BROWSER, genomeBrowser);
}
public String getGenomeBrowserLocation()
{
return getString(Meta.GENOMEBROWSER_INIT_LOCATION);
}
public void setGenomeBrowserLocation(String genomeBrowserLocation)
{
set(Meta.GENOMEBROWSER_INIT_LOCATION, genomeBrowserLocation);
}
public String getGenomeBrowserCoordSystem()
{
return getString(Meta.GENOMEBROWSER_INIT_COORD_SYSTEM);
}
public void setGenomeBrowserCoordSystem(String genomeBrowserCoordSystem)
{
set(Meta.GENOMEBROWSER_INIT_COORD_SYSTEM, genomeBrowserCoordSystem);
}
public String getGenomeBrowserSources()
{
return getString(Meta.GENOMEBROWSER_INIT_SOURCES);
}
public void setGenomeBrowserSources(String genomeBrowserSources)
{
set(Meta.GENOMEBROWSER_INIT_SOURCES, genomeBrowserSources);
}
public String getGenomeBrowserLinks()
{
return getString(Meta.GENOMEBROWSER_INIT_BROWSER_LINKS);
}
public void setGenomeBrowserLinks(String genomeBrowserLinks)
{
set(Meta.GENOMEBROWSER_INIT_BROWSER_LINKS, genomeBrowserLinks);
}
public boolean getGenomeBrowserHighlightRegion()
{
Boolean value = getBoolean(Meta.GENOMEBROWSER_INIT_HIGHLIGHT_REGION);
return value != null ? value : false;
}
public void setGenomeBrowserHighlightRegion(boolean genomeBrowserHighlightRegion)
{
set(Meta.GENOMEBROWSER_INIT_HIGHLIGHT_REGION, genomeBrowserHighlightRegion);
}
public boolean getAggregatesDistinctSelect()
{
Boolean value = getBoolean(Meta.AGGREGATES_DISTINCT_SELECT);
return value != null ? value : false;
}
public void setAggregatesDistinctSelect(boolean aggregatesDistinctSelect)
{
set(Meta.AGGREGATES_DISTINCT_SELECT, aggregatesDistinctSelect);
}
public String getEntityReports()
{
return getString(Meta.REPORTS_ENTITIES);
}
public String getEntityReport(String entityName)
{
Map<String, String> entityReports = getEntityReportsAsMap();
return entityReports != null ? entityReports.get(entityName) : null;
}
public void setEntityReports(String entityReportsStr)
{
set(Meta.REPORTS_ENTITIES, entityReportsStr);
}
private Map<String, String> getEntityReportsAsMap()
{
String entityReportsStr = getEntityReports();
if (entityReportsStr != null)
{
Map<String, String> entityReports = new LinkedHashMap<String, String>();
for (String entityReport : entityReportsStr.split(","))
{
String[] tokens = entityReport.split(":");
String entityName = tokens[0];
String reportName = tokens[1];
entityReports.put(entityName, reportName);
}
return entityReports;
}
else
{
return null;
}
}
}