Skip to content
Snippets Groups Projects
Commit 8d601bd1 authored by Piotr Gawron's avatar Piotr Gawron
Browse files

structures for plugin data

parent 981d9a9f
No related branches found
No related tags found
1 merge request!221Resolve "plugin API should allow to store user data"
Showing
with 435 additions and 9 deletions
package lcsb.mapviewer.model.plugin;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.CollectionTable;
import javax.persistence.Column;
import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.Table;
/**
* Meta data of the plugin used in the system.
*
* @author Piotr Gawron
*
*/
@Entity
@Table(name = "plugin_table")
public class Plugin implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
/**
* Unique database identifier.
*/
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "idDb", unique = true, nullable = false)
private int id;
/**
* Hash of the plugin code used as identifier to distinguish between plugins.
*/
private String hash;
/**
* Name of the plugin.
*/
private String name;
/**
* Version of the plugin.
*/
private String version;
/**
* List of urls from which plugin can be downloaded.
*/
@ElementCollection
@CollectionTable(name = "plugin_urls", joinColumns = @JoinColumn(name = "plugin_iddb"))
@Column(name = "url")
private Set<String> urls = new HashSet<>();
public String getHash() {
return hash;
}
public void setHash(String hash) {
this.hash = hash;
}
public Set<String> getUrls() {
return urls;
}
public void setUrls(Set<String> urls) {
this.urls = urls;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getVersion() {
return version;
}
public void setVersion(String version) {
this.version = version;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
package lcsb.mapviewer.model.plugin;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import lcsb.mapviewer.model.user.User;
/**
* Single entry of data stored by the plugin.
*
* @author Piotr Gawron
*
*/
@Entity
@Table(name = "plugin_data_entry")
public class PluginDataEntry implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
/**
* Unique database identifier.
*/
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "idDb", unique = true, nullable = false)
private int id;
@ManyToOne(fetch = FetchType.LAZY, optional = true)
private User user;
@ManyToOne(fetch = FetchType.LAZY, optional = false)
private Plugin plugin;
@Column(name = "entry_key", nullable = false)
private String key;
@Column(name = "entry_value", nullable = false)
private String value;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public Plugin getPlugin() {
return plugin;
}
public void setPlugin(Plugin plugin) {
this.plugin = plugin;
}
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
CREATE SEQUENCE plugin_table_iddb_seq
INCREMENT 1
MINVALUE 1
MAXVALUE 9223372036854775807
START 1
CACHE 1;
CREATE TABLE plugin_table
(
iddb integer NOT NULL DEFAULT nextval('plugin_table_iddb_seq'::regclass),
hash character varying(255) NOT NULL,
name character varying(255) NOT NULL,
version character varying(255) NOT NULL,
CONSTRAINT plugin_pkey PRIMARY KEY (iddb),
CONSTRAINT plugin_hash_unique UNIQUE (hash)
);
CREATE TABLE plugin_urls
(
plugin_iddb integer NOT NULL,
url character varying(1024) NOT NULL,
CONSTRAINT plugin_urls_pkey PRIMARY KEY (plugin_iddb, url),
CONSTRAINT plugin_urls_fk FOREIGN KEY (plugin_iddb)
REFERENCES public.plugin_table (iddb) MATCH SIMPLE
ON UPDATE CASCADE ON DELETE CASCADE
);
CREATE SEQUENCE plugin_data_entry_iddb_seq
INCREMENT 1
MINVALUE 1
MAXVALUE 9223372036854775807
START 1
CACHE 1;
CREATE TABLE plugin_data_entry
(
iddb integer NOT NULL DEFAULT nextval('plugin_table_iddb_seq'::regclass),
plugin_iddb integer NOT NULL,
user_iddb integer,
entry_key character varying(1024) NOT NULL,
entry_value character varying(2048) NOT NULL,
CONSTRAINT plugin_data_entry_pkey PRIMARY KEY (iddb),
CONSTRAINT plugin_data_entry_plugin_fk FOREIGN KEY (plugin_iddb)
REFERENCES public.plugin_table (iddb) MATCH SIMPLE
ON UPDATE CASCADE ON DELETE CASCADE,
CONSTRAINT plugin_data_entry_user_fk FOREIGN KEY (user_iddb)
REFERENCES public.user_table (iddb) MATCH SIMPLE
ON UPDATE CASCADE ON DELETE CASCADE
);
...@@ -220,7 +220,11 @@ public abstract class BaseDao<T> { ...@@ -220,7 +220,11 @@ public abstract class BaseDao<T> {
if (!firstParam) { if (!firstParam) {
queryString += " AND "; queryString += " AND ";
} }
queryString += key + " = :param_val_" + key + " "; if (param.getRight() == null) {
queryString += key + " is null ";
} else {
queryString += key + " = :param_val_" + key + " ";
}
firstParam = false; firstParam = false;
} }
...@@ -229,7 +233,9 @@ public abstract class BaseDao<T> { ...@@ -229,7 +233,9 @@ public abstract class BaseDao<T> {
for (Pair<String, Object> param : params) { for (Pair<String, Object> param : params) {
String key = param.getLeft(); String key = param.getLeft();
Object value = param.getRight(); Object value = param.getRight();
query = query.setParameter("param_val_" + key, value); if (value != null) {
query = query.setParameter("param_val_" + key, value);
}
} }
List<?> list = query.list(); List<?> list = query.list();
return (List<T>) list; return (List<T>) list;
......
package lcsb.mapviewer.persist.dao.plugin;
import lcsb.mapviewer.model.plugin.Plugin;
import lcsb.mapviewer.persist.dao.BaseDao;
/**
* Data access object class for {@link Plugin} objects.
*
* @author Piotr Gawron
*
*/
public class PluginDao extends BaseDao<Plugin> {
/**
* Default constructor.
*/
public PluginDao() {
super(Plugin.class);
}
}
package lcsb.mapviewer.persist.dao.plugin;
import java.util.ArrayList;
import java.util.List;
import lcsb.mapviewer.common.Pair;
import lcsb.mapviewer.model.plugin.Plugin;
import lcsb.mapviewer.model.plugin.PluginDataEntry;
import lcsb.mapviewer.model.user.User;
import lcsb.mapviewer.persist.dao.BaseDao;
/**
* Data access object class for {@link PluginDataEntry} objects.
*
* @author Piotr Gawron
*
*/
public class PluginDataEntryDao extends BaseDao<PluginDataEntry> {
/**
* Default constructor.
*/
public PluginDataEntryDao() {
super(PluginDataEntry.class);
}
public PluginDataEntry getByKey(Plugin plugin, String key, User user) {
List<Pair<String, Object>> params = new ArrayList<>();
params.add(new Pair<String, Object>("plugin_iddb", plugin.getId()));
params.add(new Pair<String, Object>("entry_key", key));
if (user == null) {
params.add(new Pair<String, Object>("user_iddb", null));
} else {
params.add(new Pair<String, Object>("user_iddb", user.getId()));
}
List<PluginDataEntry> entries = getElementsByParameters(params);
if (entries.size() > 0) {
return entries.get(0);
} else {
return null;
}
}
}
...@@ -25,6 +25,9 @@ ...@@ -25,6 +25,9 @@
<bean id="DataMiningSetDao" class="lcsb.mapviewer.persist.dao.map.graph.DataMiningSetDao" parent="BaseDao"/> <bean id="DataMiningSetDao" class="lcsb.mapviewer.persist.dao.map.graph.DataMiningSetDao" parent="BaseDao"/>
<bean id="ElementDao" class="lcsb.mapviewer.persist.dao.map.species.ElementDao" parent="BaseDao"/> <bean id="ElementDao" class="lcsb.mapviewer.persist.dao.map.species.ElementDao" parent="BaseDao"/>
<bean id="PluginDao" class="lcsb.mapviewer.persist.dao.plugin.PluginDao" parent="BaseDao"/>
<bean id="PluginDataEntryDao" class="lcsb.mapviewer.persist.dao.plugin.PluginDataEntryDao" parent="BaseDao"/>
<bean id="ReferenceGenomeDao" class="lcsb.mapviewer.persist.dao.map.layout.ReferenceGenomeDao" parent="BaseDao"/> <bean id="ReferenceGenomeDao" class="lcsb.mapviewer.persist.dao.map.layout.ReferenceGenomeDao" parent="BaseDao"/>
<bean id="ReferenceGenomeGeneMappingDao" class="lcsb.mapviewer.persist.dao.map.layout.ReferenceGenomeGeneMappingDao" parent="BaseDao"/> <bean id="ReferenceGenomeGeneMappingDao" class="lcsb.mapviewer.persist.dao.map.layout.ReferenceGenomeGeneMappingDao" parent="BaseDao"/>
...@@ -49,6 +52,8 @@ ...@@ -49,6 +52,8 @@
<property name="dataSource" ref="DataSource" /> <property name="dataSource" ref="DataSource" />
<property name="annotatedClasses"> <property name="annotatedClasses">
<list> <list>
<value>lcsb.mapviewer.model.plugin.Plugin</value>
<value>lcsb.mapviewer.model.plugin.PluginDataEntry</value>
<value>lcsb.mapviewer.model.map.graph.DataMining</value> <value>lcsb.mapviewer.model.map.graph.DataMining</value>
<value>lcsb.mapviewer.model.map.graph.DataMiningSet</value> <value>lcsb.mapviewer.model.map.graph.DataMiningSet</value>
......
...@@ -7,17 +7,19 @@ import lcsb.mapviewer.persist.dao.cache.AllCacheDbTests; ...@@ -7,17 +7,19 @@ import lcsb.mapviewer.persist.dao.cache.AllCacheDbTests;
import lcsb.mapviewer.persist.dao.graphics.AllGraphicsDaoTests; import lcsb.mapviewer.persist.dao.graphics.AllGraphicsDaoTests;
import lcsb.mapviewer.persist.dao.log.AllLogTests; import lcsb.mapviewer.persist.dao.log.AllLogTests;
import lcsb.mapviewer.persist.dao.map.AllMapDaoTests; import lcsb.mapviewer.persist.dao.map.AllMapDaoTests;
import lcsb.mapviewer.persist.dao.plugin.AllPluginTests;
import lcsb.mapviewer.persist.dao.user.AllUserTests; import lcsb.mapviewer.persist.dao.user.AllUserTests;
@RunWith(Suite.class) @RunWith(Suite.class)
@Suite.SuiteClasses({ AllCacheDbTests.class, // @Suite.SuiteClasses({ AllCacheDbTests.class, //
AllGraphicsDaoTests.class, // AllGraphicsDaoTests.class, //
AllLogTests.class, // AllLogTests.class, //
AllMapDaoTests.class, // AllMapDaoTests.class, //
AllUserTests.class, // AllPluginTests.class, //
BaseDaoTest.class, // AllUserTests.class, //
ConfigurationDaoTest.class, // BaseDaoTest.class, //
ProjectDaoTest.class, // ConfigurationDaoTest.class, //
ProjectDaoTest.class, //
}) })
public class AllDaoTests { public class AllDaoTests {
......
package lcsb.mapviewer.persist.dao.plugin;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;
@RunWith(Suite.class)
@SuiteClasses({ PluginDaoTest.class, //
PluginDataEntryDaoTest.class })
public class AllPluginTests {
}
package lcsb.mapviewer.persist.dao.plugin;
import static org.junit.Assert.assertTrue;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import lcsb.mapviewer.model.plugin.Plugin;
import lcsb.mapviewer.persist.PersistTestFunctions;
public class PluginDaoTest extends PersistTestFunctions {
@Autowired
PluginDao pluginDao;
@Test
public void testGetPlugins() {
assertTrue(pluginDao.getAll().size() >= 0);
}
@Test
public void testAddPlugin() {
Plugin plugin =new Plugin();
plugin.setHash("x");
plugin.setName("Plugin name");
plugin.setVersion("0.0.1");
plugin.getUrls().add("htpp://google.pl/");
pluginDao.add(plugin);
assertTrue(pluginDao.getAll().size() > 0);
}
}
package lcsb.mapviewer.persist.dao.plugin;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import lcsb.mapviewer.model.plugin.Plugin;
import lcsb.mapviewer.model.plugin.PluginDataEntry;
import lcsb.mapviewer.persist.PersistTestFunctions;
public class PluginDataEntryDaoTest extends PersistTestFunctions {
@Autowired
PluginDataEntryDao pluginDataEntryDao;
@Autowired
PluginDao pluginDao;
@Test
public void testGetByKeyForGlobalParam() {
Plugin plugin =new Plugin();
plugin.setHash("x");
plugin.setName("Plugin name");
plugin.setVersion("0.0.1");
pluginDao.add(plugin);
PluginDataEntry entry = new PluginDataEntry();
entry.setPlugin(plugin);
entry.setKey("x");
entry.setValue("y");
pluginDataEntryDao.add(entry);
PluginDataEntry entry2 = pluginDataEntryDao.getByKey(entry.getPlugin(), entry.getKey(), entry.getUser());
assertEquals(entry, entry2);
assertNull(pluginDataEntryDao.getByKey(entry.getPlugin(), "blabla", entry.getUser()));
}
@Test
public void testGetByKeyForUserParam() {
createUser();
Plugin plugin =new Plugin();
plugin.setHash("x");
plugin.setName("Plugin name");
plugin.setVersion("0.0.1");
pluginDao.add(plugin);
PluginDataEntry entry = new PluginDataEntry();
entry.setPlugin(plugin);
entry.setUser(user);
entry.setKey("x");
entry.setValue("y");
pluginDataEntryDao.add(entry);
PluginDataEntry entry2 = pluginDataEntryDao.getByKey(entry.getPlugin(), entry.getKey(), user);
assertEquals(entry, entry2);
assertNull(pluginDataEntryDao.getByKey(entry.getPlugin(), "blabla", user));
assertNull(pluginDataEntryDao.getByKey(entry.getPlugin(), entry.getKey(), null));
}
}
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