Skip to content
Snippets Groups Projects
Commit a8c970a5 authored by pkupczyk's avatar pkupczyk
Browse files

SSDM-1286 : QGF: Setup of automatic testing of dropboxes

SVN: 33026
parent 34c50d19
No related branches found
Tags 0.2.3
No related merge requests found
Showing
with 587 additions and 9 deletions
/*
* Copyright 2014 ETH Zuerich, CISD
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package ch.systemsx.cisd.openbis.datastoreserver.systemtests;
/**
* @author pkupczyk
*/
public class DropBoxSuccessfullyFinishedCondition implements ILogMonitoringStopCondition
{
private String dropBoxName;
public DropBoxSuccessfullyFinishedCondition(String dropBoxName)
{
this.dropBoxName = dropBoxName;
}
@Override
public boolean stopConditionFulfilled(ParsedLogEntry logEntry)
{
return new LogMonitoringStopConditionBuilder(new DropBoxNameCondition(dropBoxName))
.and(new ContainsCondition("Successfully committed transaction")).getCondition().stopConditionFulfilled(logEntry);
}
}
/*
* Copyright 2014 ETH Zuerich, CISD
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package ch.systemsx.cisd.openbis.datastoreserver.systemtests;
import java.io.File;
import java.io.FileFilter;
import org.apache.commons.io.FileUtils;
import org.apache.log4j.Level;
/**
* @author pkupczyk
*/
public abstract class GenericDropboxSystemTest extends GenericSystemTest
{
private static final FileFilter SVN_FILTER = new FileFilter()
{
@Override
public boolean accept(File pathname)
{
return pathname.getName().equals(".svn") == false;
}
};
protected abstract String getDropboxName();
protected abstract String getDropboxIncomingDirectoryName();
protected void importData(String dataDirectoryName) throws Exception
{
File dataDirectory = new File("resource/test-data/" + getClass().getSimpleName() + "/" + dataDirectoryName);
File destinationDirectory = new File(getIncomingDirectory(), dataDirectory.getName());
FileUtils.copyDirectory(dataDirectory, destinationDirectory, SVN_FILTER);
}
protected void waitUntilDataImported() throws Exception
{
waitUntilDataImported(120);
}
protected void waitUntilDataImported(int maxWaitDurationInSeconds) throws Exception
{
waitUntil(new DropBoxSuccessfullyFinishedCondition(getDropboxName()), maxWaitDurationInSeconds);
}
protected void waitUntilDataReindexed(Class<?> peClass) throws Exception
{
waitUntilDataReindexed(peClass, 120);
}
protected void waitUntilDataReindexed(Class<?> peClass, int maxWaitDurationInSeconds) throws Exception
{
waitUntil(new ReindexingSuccessfullyFinishedCondition(peClass), maxWaitDurationInSeconds);
}
@Override
protected Level getLogLevel()
{
return Level.DEBUG;
}
@Override
protected File getIncomingDirectory()
{
return new File(rootDir, getDropboxIncomingDirectoryName());
}
}
/*
* Copyright 2014 ETH Zuerich, CISD
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package ch.systemsx.cisd.openbis.datastoreserver.systemtests;
import org.testng.annotations.BeforeSuite;
import ch.systemsx.cisd.openbis.generic.server.api.v1.ResourceNames;
import ch.systemsx.cisd.openbis.generic.server.util.TestInitializer;
import ch.systemsx.cisd.openbis.generic.shared.api.v1.IGeneralInformationService;
/**
* @author pkupczyk
*/
public class GenericSystemTest extends SystemTestCase
{
@Override
@BeforeSuite
public void beforeSuite() throws Exception
{
System.setProperty(TestInitializer.getScriptFolderTestDBPropertyName(), "sourceTest");
super.beforeSuite();
}
protected IGeneralInformationService getGeneralInformationService()
{
return getBean(ResourceNames.GENERAL_INFORMATION_SERVICE_SERVER);
}
}
/*
* Copyright 2014 ETH Zuerich, CISD
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package ch.systemsx.cisd.openbis.datastoreserver.systemtests;
/**
* @author pkupczyk
*/
public class ReindexingSuccessfullyFinishedCondition implements ILogMonitoringStopCondition
{
private Class<?> reindexedClass;
public ReindexingSuccessfullyFinishedCondition(Class<?> reindexedClass)
{
this.reindexedClass = reindexedClass;
}
@Override
public boolean stopConditionFulfilled(ParsedLogEntry logEntry)
{
return "Full Text Index Updater".equals(logEntry.getThreadName())
&& logEntry.getLogMessage().matches("OPERATION.FullTextIndexUpdater - REINDEX of \\d+ " + reindexedClass.getName() + "s took .*");
}
}
...@@ -85,9 +85,9 @@ public abstract class SystemTestCase extends AssertJUnit ...@@ -85,9 +85,9 @@ public abstract class SystemTestCase extends AssertJUnit
private static final String ROOT_DIR_KEY = "root-dir"; private static final String ROOT_DIR_KEY = "root-dir";
private static final String DATA_SET_IMPORTED_LOG_MARKER = "Successfully registered data set"; private static final String DATA_SET_IMPORTED_LOG_MARKER = "Successfully registered data set";
public static final ILogMonitoringStopCondition FINISHED_POST_REGISTRATION_CONDITION public static final ILogMonitoringStopCondition FINISHED_POST_REGISTRATION_CONDITION = new RegexCondition(
= new RegexCondition(".*Post registration of (\\d*). of \\1 data sets: (.*)"); ".*Post registration of (\\d*). of \\1 data sets: (.*)");
// this message appears if the dropbox has successfully completed the registration, even if no // this message appears if the dropbox has successfully completed the registration, even if no
// datasets have been imported // datasets have been imported
...@@ -265,7 +265,7 @@ public abstract class SystemTestCase extends AssertJUnit ...@@ -265,7 +265,7 @@ public abstract class SystemTestCase extends AssertJUnit
@Override @Override
public String toString() public String toString()
{ {
return "Log message contains '" + DATA_SET_IMPORTED_LOG_MARKER return "Log message contains '" + DATA_SET_IMPORTED_LOG_MARKER
+ "' or '" + REGISTRATION_FINISHED_LOG_MARKER + "'"; + "' or '" + REGISTRATION_FINISHED_LOG_MARKER + "'";
} }
}); });
...@@ -273,9 +273,12 @@ public abstract class SystemTestCase extends AssertJUnit ...@@ -273,9 +273,12 @@ public abstract class SystemTestCase extends AssertJUnit
protected void waitUntilDataSetImported(ILogMonitoringStopCondition stopCondition) throws Exception protected void waitUntilDataSetImported(ILogMonitoringStopCondition stopCondition) throws Exception
{ {
final int maxLoops = dataSetImportWaitDurationInSeconds(); waitUntil(stopCondition, dataSetImportWaitDurationInSeconds());
}
for (int loops = 0; loops < maxLoops; loops++) protected void waitUntil(ILogMonitoringStopCondition stopCondition, int maxWaitDurationInSeconds) throws Exception
{
for (int loops = 0; loops < maxWaitDurationInSeconds; loops++)
{ {
Thread.sleep(1000); Thread.sleep(1000);
List<ParsedLogEntry> logEntries = getLogEntries(); List<ParsedLogEntry> logEntries = getLogEntries();
...@@ -288,10 +291,9 @@ public abstract class SystemTestCase extends AssertJUnit ...@@ -288,10 +291,9 @@ public abstract class SystemTestCase extends AssertJUnit
} }
} }
} }
fail("Log monitoring stop condition [" + stopCondition + "] never fulfilled after " + maxLoops + " seconds."); fail("Log monitoring stop condition [" + stopCondition + "] never fulfilled after " + maxWaitDurationInSeconds + " seconds.");
} }
protected List<ParsedLogEntry> getLogEntries() protected List<ParsedLogEntry> getLogEntries()
{ {
List<ParsedLogEntry> result = new ArrayList<ParsedLogEntry>(); List<ParsedLogEntry> result = new ArrayList<ParsedLogEntry>();
......
# Experimental: Enable moving entities to trash (non-permanent deletion).
# Default value: false
enable-trash = true
# Default view mode that should be used if user doesn't have it specified in URL.
# Options: 'NORMAL' (standard mode - default), 'SIMPLE' (readonly mode with simplified GUI).
#
#default-view-mode = SIMPLE
# Flag specifying whether default login mode is anonymous or not.
# If true a user-for-anonymous-login has to be defined in service.properties
# Default value: false
#default-anonymous-login = true
# Maximal number of visible columns in tables. Default: 50.
max-visible-columns = 25
# Should the feature of adding unofficial/ad-hoc terms to vocabularies be turned on.
# Default value: false
allow-adding-unofficial-terms = true
# (optional) List of data set types for which there should be an image overview shown in dataset tables.
# If not specified image overview will not be shown for any datasets.
data-set-types-with-image-overview = HCS_IMAGE, UNKNOWN
# (optional) Allows power users adding vocabulary terms when editing the form.
# If not specified, default is false
# allow-adding-unofficial-terms = true
# Configuration of entity (experiment, sample, data set, material) detail views.
#
# Mandatory properties:
# - view (entity detail view id)
# - types (list of entity type codes)
# Optional properties:
# - hide-sections (list of section ids)
# - hide-smart-view (removes "Smart View" from Data Set Detail View -> Data View) (generic_dataset_viewer)
# - hide-file-view (removes "File View" from Data Set Detail View -> Data View) (generic_dataset_viewer)
# Available sections in entity-detail-views:
# generic_dataset_viewer
# data-set-data-section
# data-set-parents-section
# data-set-children-section
# data-set-contained-section
# query-section
# generic_experiment_viewer
# data-sets-section
# attachment-section
# query-section
# experiment-sample-section
# generic_sample_viewer
# container-sample-section
# derived-samples-section
# parent-samples-section
# data-sets-section
# attachment-section
# query-section
# generic_material_viewer
# query-section
#
# Example:
#
detail-views = sample-view, experiment-view, data-view
sample-view.view = generic_sample_viewer
sample-view.types = CELL_PLATE, CONTROL_LAYOUT
sample-view.hide-sections = attachment-section, module-section
experiment-view.view = generic_experiment_viewer
experiment-view.types = COMPOUND_HCS
experiment-view.hide-sections = attachment-section
data-view.view = generic_dataset_viewer
data-view.types = HCS_IMAGE
data-view.hide-smart-view = false
data-view.hide-file-view = false
DEMO-EXPERIMENT-1
\ No newline at end of file
DEMO-EXPERIMENT-2
\ No newline at end of file
authentication-service = dummy-authentication-service
# The time after which an inactive session is expired by the service (in minutes).
session-timeout = 720
# Authorization
# Supported: 'no-authorization' and 'active-authorization'
authorization-component-factory = active-authorization
script-folder = ./source/
core-plugins-folder = source/core-plugins
# Supported: currently only 'postgresql' is supported
database.engine = postgresql
database.create-from-scratch = false
# For debugging set this value to true.
database.script-single-step-mode = false
database.url-host-part =
# database.kind = new
# database.kind = basynthec
database.kind = dev
# database.kind = basysbio
# database.kind = system_test_strict
# database.kind = system_test_plates_on_demand
# database.kind = system_test_multi_groups
database.owner =
database.owner-password =
database.admin-user =
database.admin-password =
# Max time (in seconds) to wait for a connection to become available before throwing an exception.
# Default: 60s, set to -1 to wait indefinitely.
database.max-wait-for-connection =
# Max. number of active database connections. Default: 20.
database.max-active-connections =
# Max. number of idle database connections to keep open. Default: 20.
database.max-idle-connections =
# Log interval (in seconds) between two regular log entries of the number of active database
# connections. Default: 3600s.
database.active-connections-log-interval = 30
# User id of the user used for anonymous login
# user-for-anonymous-login = <user id>
crowd.service.host = crowd-bsse.ethz.ch
crowd.service.port = 8443
crowd.application.name = lims
crowd.application.password =
# The database instance local unique identifier. Used when the new database is created.
database-instance = CISD
# The URL of the CIFEX server
cifex-url = https://cifex.ethz.ch:443
# Cifex users that will receive and automatically manage uploaded data.
# The user names should be prepended with 'id:' prefix for example:
# cifex-recipient = id:dropboxuser, id:backpuser
cifex-recipient = id:cifexdatamanager
trusted-cross-origin-domains= *
# Comma-separated list of host names and IP addresses of clients on which an INSTANCE_ADMIN
# user is allowed to change identity
accepted-remote-hosts-for-identity-change = localhost
# Hibernate Search
# The working directory.
hibernate.search.index-base = ./targets/indices-${database.kind}
# One of NO_INDEX, SKIP_IF_MARKER_FOUND, INDEX_FROM_SCRATCH.
# If not specified, default (SKIP_IF_MARKER_FOUND) is taken.
#hibernate.search.index-mode = INDEX_FROM_SCRATCH
hibernate.search.index-mode = SKIP_IF_MARKER_FOUND
# Defines the maximum number of elements indexed before flushing the transaction-bound queue.
# Default is 1000.
hibernate.search.batch-size = 1000
# Maximum number of search results
hibernate.search.maxResults = 100000
# If 'async', the update of indices will be done in a separate thread.
hibernate.search.worker.execution=async
# Limit of entities stored in hibernate session cache during batch processing. Default 50000.
# Note - this is our own setting, not Hibernate's.
#hibernate.batch.sessionCache.maxEntities = 50000
# Online Help
#
# Online help is broken into two sections -- generic and specific. Generic help links back to
# the CISD. Specific help is provided by the host of the installation
#
# OpenBIS needs to know the root URL for the online help and a template for the individual pages.
# The template should have on parameter, called title, and should be constructed to automatically
# create the page if it does not already exist.
# The template can be created by going to the root page, adding a new link to the page, and
# replacing the title of the new page with the ${title}
onlinehelp.generic.root-url = https://wiki-bsse.ethz.ch/display/CISDDoc/OnlineHelp
onlinehelp.generic.page-template = https://wiki-bsse.ethz.ch/pages/createpage.action?spaceKey=CISDDoc&title=${title}&linkCreation=true&fromPageId=40633829
#onlinehelp.specific.root-url = https://wiki-bsse.ethz.ch/display/CISDDoc/OnlineHelp
#onlinehelp.specific.page-template = https://wiki-bsse.ethz.ch/pages/createpage.action?spaceKey=CISDDoc&title=${title}&linkCreation=true&fromPageId=40633829
# ---------------------------------------------------------------------------
# (optional) Database Configurations for Query module
# ---------------------------------------------------------------------------
# Comma separated keys of databases configured for Query module.
# Each database should have configuration properties prefixed with its key.
# Mandatory properties for each <database> include:
# <database>.label - name shown to the openBIS user when adding or editing a customized query
# <database>.database-driver - JDBC Driver of the database (e.g. org.postgresql.Driver)
# <database>.database-url - JDBC URL to the database (e.g. jdbc:postgresql://localhost/openbis)
# Optional properties for each <database> include:
# <database>.database-user - name of the database user (default: user.name from system properties)
# <database>.database-password - password of the database user
# <database>.creator-minimal-role - minimal role required to create/edit queries on this database (default: POWER_USER)
# <database>.data-space - If NOT specified OBSERVER of any space will be allowed to perform
# queries and <creator-minimal-role> of any space will allowed
# to create/edit queries on this DB.
# - If specified only OBSERVER of the space will be allowed to perform
# queries and <creator-minimal-role> of the space will allowed
# to create/edit queries on this DB.
query-databases = 1
1.label = openBIS meta data
#1.data-space = CISD
#1.creator-minimal-role = SPACE_ADMIN
1.database-driver = org.postgresql.Driver
1.database-url = jdbc:postgresql://localhost/openbis_${database.kind}
#1.database-username =
#1.database-password =
# ---------------------------------------------------------------------------
# maintenance plugins configuration
# ---------------------------------------------------------------------------
# Comma separated names of maintenance plugins.
# Each plugin should have configuration properties prefixed with its name.
# Mandatory properties for each <plugin> include:
# <plugin>.class - Fully qualified plugin class name
# <plugin>.interval - The time between plugin executions (in seconds)
# Optional properties for each <plugin> include:
# <plugin>.start - Time of the first execution (HH:mm)
# <plugin>.execute-only-once - If true the task will be executed exactly once,
# interval will be ignored. By default set to false.
#maintenance-plugins = demo, dynamic-property-evaluator, remove-unused-ad-hoc-vocabulary-terms
demo.class = ch.systemsx.cisd.openbis.generic.server.task.DemoMaintenanceTask
demo.interval = 60
#demo.execute-only-once = true
demo.property_1 = some value
demo.property_2 = some value 2
#dynamic-property-evaluator.class = ch.systemsx.cisd.openbis.generic.server.task.DynamicPropertyEvaluationMaintenanceTask
# run daily at midnight
#dynamic-property-evaluator.interval = 86400
#dynamic-property-evaluator.start = 00:00
# run every 10min
#dynamic-property-evaluator.interval = 6000
#remove-unused-ad-hoc-vocabulary-terms.class = ch.systemsx.cisd.openbis.generic.server.task.RemoveUnusedUnofficialTermsMaintenanceTask
## run once every 12 hours
#remove-unused-ad-hoc-vocabulary-terms.interval = 43200
## delete unused ad hoc terms older than 7 days
#remove-unused-ad-hoc-vocabulary-terms.older-than-days = 7
# Name of the file that stores Web Client configuration
web-client-configuration-file = etc/web-client.properties
enabled-modules = dropbox-test
\ No newline at end of file
#! /usr/bin/env python
def process(tr):
for file in tr.getIncoming().listFiles():
openFile = None
try:
openFile = open(file.getAbsolutePath())
content = openFile.read().strip()
experiment = tr.createNewExperiment("/CISD/DEFAULT/" + content, "SIRNA_HCS")
experiment.setPropertyValue("DESCRIPTION", "some description")
finally:
if openFile:
openFile.close()
incoming-dir = ${root-dir}/incoming-demo-dropbox
incoming-data-completeness-condition = auto-detection
top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2
script-path = demo-dropbox.py
storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor
/*
* Copyright 2014 ETH Zuerich, CISD
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package ch.ethz.bsse.cisd.dsu.dss.systemtests;
import java.util.List;
import org.testng.Assert;
import org.testng.annotations.Test;
import ch.systemsx.cisd.openbis.datastoreserver.systemtests.GenericDropboxSystemTest;
import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.Experiment;
import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria;
import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria.MatchClause;
import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria.MatchClauseAttribute;
import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentPE;
/**
* @author pkupczyk
*/
public class DemoDropboxTest extends GenericDropboxSystemTest
{
@Override
protected String getDropboxName()
{
return "demo-dropbox";
}
@Override
protected String getDropboxIncomingDirectoryName()
{
return "incoming-demo-dropbox";
}
@Test
public void testDropbox1() throws Exception
{
importData("demo-data");
waitUntilDataImported();
waitUntilDataReindexed(ExperimentPE.class);
String sessionToken = getGeneralInformationService().tryToAuthenticateForAllServices("test", "password");
SearchCriteria criteria = new SearchCriteria();
criteria.addMatchClause(MatchClause.createAttributeMatch(MatchClauseAttribute.CODE, "DEMO-EXPERIMENT*"));
List<Experiment> experiments = getGeneralInformationService().searchForExperiments(sessionToken, criteria);
Assert.assertEquals(experiments.size(), 2);
}
@Test(enabled = false)
public void testDropbox2() throws Exception
{
// WARNING: this test fails and shows that transaction is not rolled back after testDropbox1 is executed
// (the newly created experiments still exist)
String sessionToken = getGeneralInformationService().tryToAuthenticateForAllServices("test", "password");
SearchCriteria criteria = new SearchCriteria();
criteria.addMatchClause(MatchClause.createAttributeMatch(MatchClauseAttribute.CODE, "DEMO-EXPERIMENT*"));
List<Experiment> experiments = getGeneralInformationService().searchForExperiments(sessionToken, criteria);
Assert.assertEquals(experiments.size(), 0);
}
}
\ No newline at end of file
1 \\x636f646509555345522e6465736372697074696f6e0973747564795f4f626a6563740973747564795f6f626a6563745f547970650970726f6a6563740970726f63657373696e675f696e737472756374696f6e730963656c6c5f706c617465730a4558503509412073696d706c65206578706572696d656e7409564952555331095649525553095959093e2070726f63657373696e672d696e737472756374696f6e732e747874093e2063656c6c506c617465732e7478740a4558503609616e6f74686572206578706572696d656e7409564952555331095649525553096b6f6b6f09090a
2 \\x636f646509555345522e6465736372697074696f6e0973747564795f4f626a6563740973747564795f6f626a6563745f547970650970726f6a6563740970726f63657373696e675f696e737472756374696f6e730963656c6c5f706c617465730a4558503509412073696d706c65206578706572696d656e7409564952555331095649525553095959093e2070726f63657373696e672d696e737472756374696f6e732e747874093e2063656c6c506c617465732e7478740a4558503609616e6f74686572206578706572696d656e7409564952555331095649525553096b6f6b6f0909
3 \\x636f646509555345522e6465736372697074696f6e0973747564795f4f626a6563740973747564795f6f626a6563745f547970650970726f6a6563740970726f63657373696e675f696e737472756374696f6e730963656c6c5f706c617465730a4558503509412073696d706c65206578706572696d656e7409564952555331095649525553095959093e2070726f63657373696e672d696e737472756374696f6e732e747874093e2063656c6c506c617465732e7478740a4558503609616e6f74686572206578706572696d656e7409564952555331095649525553096b6f6b6f09
4 \\x636f646509555345522e6465736372697074696f6e0973747564795f4f626a6563740973747564795f6f626a6563745f547970650970726f6a6563740970726f63657373696e675f696e737472756374696f6e730963656c6c5f706c617465730a4558503509412073696d706c65206578706572696d656e7409564952555331095649525553095959093e2070726f63657373696e672d696e737472756374696f6e732e747874093e2063656c6c506c617465732e7478740a4558503609616e6f74686572206578706572696d656e7409564952555331095649525553096b6f6b6f
5 \\x636f646509555345522e6465736372697074696f6e0973747564795f4f626a6563740973747564795f6f626a6563745f547970650970726f6a6563740970726f63657373696e675f696e737472756374696f6e730963656c6c5f706c617465730a4558503509412073696d706c65206578706572696d656e7409564952555331095649525553095959093e2070726f63657373696e672d696e737472756374696f6e732e747874093e2063656c6c506c617465732e7478740a4558503609616e6f74686572206578706572696d656e7409564952555331095649525553096b6f
6 \\x33564350310a33564350320a3356435033
7 \\x616c610a6d610a6b6f74610a610a6b6f740a6a6573740a6964696f7461
8 \\x33564350310a33564350320a3356435033
9 \\x33564350310a33564350320a3356435033
1 2 exampleExperiments.txt 2008-12-10 13:48:17.996703+01 1 2 1 \N \N \N \N
2 2 exampleExperiments.txt 2008-12-10 13:49:14.564025+01 2 2 2 \N \N \N \N
3 2 exampleExperiments.txt 2008-12-10 13:49:20.23603+01 3 2 3 \N \N \N \N
4 2 exampleExperiments.txt 2008-12-10 13:49:27.90141+01 4 2 4 \N \N \N \N
5 8 exampleExperiments.txt 2008-12-10 13:49:48.879301+01 1 2 5 \N \N \N \N
6 8 cellPlates.txt 2008-12-10 13:51:10.050748+01 1 2 6 \N \N \N \N
7 \N sampleHistory.txt 2009-06-09 17:00:00+02 1 2 7 987 \N \N \N
8 22 cellPlates.txt 2008-12-10 13:51:10.050748+01 1 2 8 \N \N \N \N
9 \N projectDescription.txt 2012-01-03 08:27:57.123+01 1 2 9 \N 3 The Project All about it.
1 AGROUP myDescription 2008-11-05 09:18:10.893+01 2 2008-11-05 09:18:10.893+01
1 PLATE_GEOMETRY The geometry or dimensions of a plate 2008-11-05 09:18:00.622+01 1 t t 2009-03-23 15:34:44.462776+01 t \N
2 STORAGE_FORMAT The on-disk storage format of a data set 2008-11-05 09:18:00.622+01 1 t t 2009-03-23 15:34:44.462776+01 t \N
3 ORGANISM available-organism 2008-11-05 09:18:30.327+01 2 f f 2009-03-23 15:34:44.462776+01 t \N
4 GENDER \N 2008-11-05 09:18:30.421+01 2 f f 2009-03-23 15:34:44.462776+01 t \N
5 HUMAN Humans 2008-11-05 09:18:30.983+01 2 f f 2009-03-23 15:34:44.462776+01 t \N
6 TEST_VOCABULARY Test vocabulary 2008-11-05 09:18:30.983+01 2 f f 2009-03-23 15:34:44.462776+01 t \N
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment