diff --git a/apps/dnet-is-application/src/main/java/eu/dnetlib/is/MainController.java b/apps/dnet-is-application/src/main/java/eu/dnetlib/is/MainController.java index 5d03b60b..92e4aebe 100644 --- a/apps/dnet-is-application/src/main/java/eu/dnetlib/is/MainController.java +++ b/apps/dnet-is-application/src/main/java/eu/dnetlib/is/MainController.java @@ -57,6 +57,8 @@ public class MainController { return "redirect:vocs"; } else if (type.equalsIgnoreCase("context")) { return "redirect:contexts"; + } else if (type.equalsIgnoreCase("protocol")) { + return "redirect:protocols"; } else { final Optional restype = resourceTypeRepository.findById(type); if (restype.isPresent() && restype.get().isSimple()) { @@ -74,6 +76,9 @@ public class MainController { @GetMapping("/contexts") public void contexts() {} + @GetMapping("/protocols") + public void protocols() {} + @GetMapping("/wf_history") public void wfHistory(final ModelMap map, @RequestParam(required = false, defaultValue = "-1") final Long from, diff --git a/apps/dnet-is-application/src/main/java/eu/dnetlib/is/protocol/AbstractProtocolController.java b/apps/dnet-is-application/src/main/java/eu/dnetlib/is/protocol/AbstractProtocolController.java new file mode 100644 index 00000000..755da261 --- /dev/null +++ b/apps/dnet-is-application/src/main/java/eu/dnetlib/is/protocol/AbstractProtocolController.java @@ -0,0 +1,20 @@ +package eu.dnetlib.is.protocol; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; + +import eu.dnetlib.common.controller.AbstractDnetController; + +public class AbstractProtocolController extends AbstractDnetController { + + @Autowired + protected ProtocolService protocolService; + + @GetMapping("/") + public List listProtocols() { + return protocolService.listProtocols(); + } + +} diff --git a/apps/dnet-is-application/src/main/java/eu/dnetlib/is/protocol/ProtocolAjaxController.java b/apps/dnet-is-application/src/main/java/eu/dnetlib/is/protocol/ProtocolAjaxController.java new file mode 100644 index 00000000..3ffd8ccc --- /dev/null +++ b/apps/dnet-is-application/src/main/java/eu/dnetlib/is/protocol/ProtocolAjaxController.java @@ -0,0 +1,27 @@ +package eu.dnetlib.is.protocol; + +import java.util.List; + +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/ajax/protocols") +public class ProtocolAjaxController extends AbstractProtocolController { + + @DeleteMapping("/{protocol}") + public List deleteProtocol(@PathVariable final String protocol) { + protocolService.deleteProtocols(protocol); + return protocolService.listProtocols(); + } + + @PostMapping("/{protocol}/terms") + public List saveTerm(@PathVariable final ProtocolDesc protocol) { + protocolService.saveProtocol(protocol); + return protocolService.listProtocols(); + } + +} diff --git a/apps/dnet-is-application/src/main/java/eu/dnetlib/is/protocol/ProtocolApiController.java b/apps/dnet-is-application/src/main/java/eu/dnetlib/is/protocol/ProtocolApiController.java new file mode 100644 index 00000000..0c7d55ba --- /dev/null +++ b/apps/dnet-is-application/src/main/java/eu/dnetlib/is/protocol/ProtocolApiController.java @@ -0,0 +1,10 @@ +package eu.dnetlib.is.protocol; + +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/api/protocols") +public class ProtocolApiController extends AbstractProtocolController { + +} diff --git a/apps/dnet-is-application/src/main/java/eu/dnetlib/is/protocol/ProtocolDesc.java b/apps/dnet-is-application/src/main/java/eu/dnetlib/is/protocol/ProtocolDesc.java new file mode 100644 index 00000000..8a3fab28 --- /dev/null +++ b/apps/dnet-is-application/src/main/java/eu/dnetlib/is/protocol/ProtocolDesc.java @@ -0,0 +1,40 @@ +package eu.dnetlib.is.protocol; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +import eu.dnetlib.data.is.protocol.model.ProtocolParam; + +public class ProtocolDesc implements Serializable { + + private static final long serialVersionUID = -5697339401309977230L; + + private String id; + + private List params = new ArrayList<>(); + + public ProtocolDesc() {} + + public ProtocolDesc(final String id, final List params) { + this.id = id; + this.params = params; + } + + public String getId() { + return id; + } + + public void setId(final String id) { + this.id = id; + } + + public List getParams() { + return params; + } + + public void setParams(final List params) { + this.params = params; + } + +} diff --git a/apps/dnet-is-application/src/main/java/eu/dnetlib/is/protocol/ProtocolService.java b/apps/dnet-is-application/src/main/java/eu/dnetlib/is/protocol/ProtocolService.java new file mode 100644 index 00000000..97724c36 --- /dev/null +++ b/apps/dnet-is-application/src/main/java/eu/dnetlib/is/protocol/ProtocolService.java @@ -0,0 +1,70 @@ +package eu.dnetlib.is.protocol; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import javax.transaction.Transactional; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import eu.dnetlib.data.is.protocol.model.Protocol; +import eu.dnetlib.data.is.protocol.model.ProtocolParam; +import eu.dnetlib.data.is.protocol.repository.ProtocolParamRepository; +import eu.dnetlib.data.is.protocol.repository.ProtocolRepository; + +@Service +public class ProtocolService { + + @Autowired + private ProtocolRepository protocolRepository; + + @Autowired + private ProtocolParamRepository protocolParamRepository; + + private static final Log log = LogFactory.getLog(ProtocolService.class); + + @Transactional + public List listProtocols() { + + final Map> params = protocolParamRepository.findAll() + .stream() + .collect(Collectors.groupingBy(ProtocolParam::getProtocol)); + + return protocolRepository.findAll() + .stream() + .map(Protocol::getId) + .map(id -> new ProtocolDesc(id, params.containsKey(id) ? params.get(id) : new ArrayList<>())) + .collect(Collectors.toList()); + + } + + @Transactional + public void deleteProtocols(final String... ids) { + for (final String id : ids) { + protocolRepository.deleteById(id); + } + } + + @Transactional + public void saveProtocol(final ProtocolDesc protocol) { + log.info("Saving protocol: " + protocol); + + if (protocolRepository.existsById(protocol.getId())) { + protocolParamRepository.deleteByProtocol(protocol.getId()); + } else { + protocolRepository.save(new Protocol(protocol.getId())); + } + + for (final ProtocolParam p : protocol.getParams()) { + p.setProtocol(protocol.getId()); + protocolParamRepository.save(p); + } + + } + +} diff --git a/apps/dnet-is-application/src/main/resources/templates/protocols.html b/apps/dnet-is-application/src/main/resources/templates/protocols.html new file mode 100644 index 00000000..285df413 --- /dev/null +++ b/apps/dnet-is-application/src/main/resources/templates/protocols.html @@ -0,0 +1,37 @@ + + + + + + + + + +
+
+
+ {{protocols}} +
+
+
+ + + + + + + + \ No newline at end of file diff --git a/libs/dnet-is-common/src/main/java/eu/dnetlib/data/is/protocol/model/Protocol.java b/libs/dnet-is-common/src/main/java/eu/dnetlib/data/is/protocol/model/Protocol.java new file mode 100644 index 00000000..59e887a9 --- /dev/null +++ b/libs/dnet-is-common/src/main/java/eu/dnetlib/data/is/protocol/model/Protocol.java @@ -0,0 +1,34 @@ +package eu.dnetlib.data.is.protocol.model; + +import java.io.Serializable; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; + +@Entity +@Table(name = "protocols") +public class Protocol implements Serializable { + + private static final long serialVersionUID = -3448728311377943968L; + + @Id + @Column(name = "id") + private String id; + + public Protocol() {} + + public Protocol(final String id) { + this.id = id; + } + + public String getId() { + return id; + } + + public void setId(final String id) { + this.id = id; + } + +} diff --git a/libs/dnet-is-common/src/main/java/eu/dnetlib/data/is/protocol/model/ProtocolParam.java b/libs/dnet-is-common/src/main/java/eu/dnetlib/data/is/protocol/model/ProtocolParam.java new file mode 100644 index 00000000..fb71b94e --- /dev/null +++ b/libs/dnet-is-common/src/main/java/eu/dnetlib/data/is/protocol/model/ProtocolParam.java @@ -0,0 +1,89 @@ +package eu.dnetlib.data.is.protocol.model; + +import java.io.Serializable; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.Id; +import javax.persistence.IdClass; +import javax.persistence.Table; + +@Entity +@Table(name = "protocol_params") +@IdClass(ProtocolParamPK.class) +public class ProtocolParam implements Serializable { + + private static final long serialVersionUID = -8190220047985766140L; + + @Id + @Column(name = "protocol") + private String protocol; + + @Id + @Column(name = "param_name") + private String name; + + @Column(name = "param_label") + private String label; + + @Enumerated(EnumType.STRING) + @Column(name = "param_type") + private ProtocolParamType type; + + @Column(name = "optional") + private boolean optional; + + @Column(name = "has_sel_function") + private boolean hasSelFunction; + + public String getProtocol() { + return protocol; + } + + public void setProtocol(final String protocol) { + this.protocol = protocol; + } + + public String getName() { + return name; + } + + public void setName(final String name) { + this.name = name; + } + + public String getLabel() { + return label; + } + + public void setLabel(final String label) { + this.label = label; + } + + public ProtocolParamType getType() { + return type; + } + + public void setType(final ProtocolParamType type) { + this.type = type; + } + + public boolean isOptional() { + return optional; + } + + public void setOptional(final boolean optional) { + this.optional = optional; + } + + public boolean isHasSelFunction() { + return hasSelFunction; + } + + public void setHasSelFunction(final boolean hasSelFunction) { + this.hasSelFunction = hasSelFunction; + } + +} diff --git a/libs/dnet-is-common/src/main/java/eu/dnetlib/data/is/protocol/model/ProtocolParamPK.java b/libs/dnet-is-common/src/main/java/eu/dnetlib/data/is/protocol/model/ProtocolParamPK.java new file mode 100644 index 00000000..2e9b36a8 --- /dev/null +++ b/libs/dnet-is-common/src/main/java/eu/dnetlib/data/is/protocol/model/ProtocolParamPK.java @@ -0,0 +1,47 @@ +package eu.dnetlib.data.is.protocol.model; + +import java.io.Serializable; +import java.util.Objects; + +public class ProtocolParamPK implements Serializable { + + private static final long serialVersionUID = 3126524893218480136L; + + private String protocol; + private String name; + + public String getProtocol() { + return protocol; + } + + public void setProtocol(final String protocol) { + this.protocol = protocol; + } + + public String getName() { + return name; + } + + public void setName(final String name) { + this.name = name; + } + + @Override + public int hashCode() { + return Objects.hash(name, protocol); + } + + @Override + public boolean equals(final Object obj) { + if (this == obj) { return true; } + if (!(obj instanceof ProtocolParamPK)) { return false; } + final ProtocolParamPK other = (ProtocolParamPK) obj; + return Objects.equals(name, other.name) && Objects.equals(protocol, other.protocol); + } + + @Override + public String toString() { + return String.format("ProtocolParamPK [protocol=%s, name=%s]", protocol, name); + } + +} diff --git a/libs/dnet-is-common/src/main/java/eu/dnetlib/data/is/protocol/model/ProtocolParamType.java b/libs/dnet-is-common/src/main/java/eu/dnetlib/data/is/protocol/model/ProtocolParamType.java new file mode 100644 index 00000000..e2c480bd --- /dev/null +++ b/libs/dnet-is-common/src/main/java/eu/dnetlib/data/is/protocol/model/ProtocolParamType.java @@ -0,0 +1,8 @@ +package eu.dnetlib.data.is.protocol.model; + +public enum ProtocolParamType { + TEXT, + LIST, + BOOLEAN, + INT +} diff --git a/libs/dnet-is-common/src/main/java/eu/dnetlib/data/is/protocol/repository/ProtocolParamRepository.java b/libs/dnet-is-common/src/main/java/eu/dnetlib/data/is/protocol/repository/ProtocolParamRepository.java new file mode 100644 index 00000000..7deaed76 --- /dev/null +++ b/libs/dnet-is-common/src/main/java/eu/dnetlib/data/is/protocol/repository/ProtocolParamRepository.java @@ -0,0 +1,14 @@ +package eu.dnetlib.data.is.protocol.repository; + +import org.springframework.data.jpa.repository.JpaRepository; + +import eu.dnetlib.data.is.protocol.model.ProtocolParam; +import eu.dnetlib.data.is.protocol.model.ProtocolParamPK; + +public interface ProtocolParamRepository extends JpaRepository { + + Iterable findByProtocol(String protocol); + + void deleteByProtocol(String protocol); + +} diff --git a/libs/dnet-is-common/src/main/java/eu/dnetlib/data/is/protocol/repository/ProtocolRepository.java b/libs/dnet-is-common/src/main/java/eu/dnetlib/data/is/protocol/repository/ProtocolRepository.java new file mode 100644 index 00000000..8b9dcc98 --- /dev/null +++ b/libs/dnet-is-common/src/main/java/eu/dnetlib/data/is/protocol/repository/ProtocolRepository.java @@ -0,0 +1,9 @@ +package eu.dnetlib.data.is.protocol.repository; + +import org.springframework.data.jpa.repository.JpaRepository; + +import eu.dnetlib.data.is.protocol.model.Protocol; + +public interface ProtocolRepository extends JpaRepository { + +} diff --git a/libs/dnet-is-common/src/main/resources/sql/schema.sql b/libs/dnet-is-common/src/main/resources/sql/schema.sql index c7af7cba..9c1f7ef2 100644 --- a/libs/dnet-is-common/src/main/resources/sql/schema.sql +++ b/libs/dnet-is-common/src/main/resources/sql/schema.sql @@ -17,6 +17,45 @@ CREATE TABLE vocabulary_terms ( CREATE INDEX ON vocabulary_terms (vocabulary); +CREATE TABLE protocols ( + id text PRIMARY KEY +); +INSERT INTO protocols(id) VALUES ('oai'),('oai_sets'),('http'),('file'),('classpath'),('fileCSV'),('httpCSV'),('ftp'),('sftp'),('filesystem'),('files_from_metadata'),('files_from_mdstore'),('mongoDump'),('targz'),('zip'),('fileGzip'),('httpList'),('remoteMdstore'); + +CREATE TABLE protocol_params ( + protocol text NOT NULL REFERENCES protocols(id) ON UPDATE CASCADE ON DELETE CASCADE, + param_name text NOT NULL, + param_label text NOT NULL, + param_type text NOT NULL DEFAULT 'TEXT', + optional boolean NOT NULL default false, + has_sel_function boolean NOT NULL default false, + PRIMARY KEY (protocol, param_name) +); +INSERT INTO protocol_params(protocol, param_name, param_label, param_type, optional, has_sel_function) VALUES +('oai', 'set', 'OAI set', 'LIST', true, true), +('oai', 'format', 'OAI Metadata Format', 'TEXT', false, false), +('http', 'splitOnElement', 'splitOnElement', 'TEXT', false, false), +('file', 'splitOnElement', 'splitOnElement', 'TEXT', false, false), +('classpath', 'splitOnElement', 'splitOnElement', 'TEXT', false, false), +('fileCSV', 'header', 'header', 'TEXT', false, false), +('fileCSV', 'separator', 'separator', 'TEXT', false, false), +('fileCSV', 'identifier', 'identifier', 'TEXT', false, false), +('fileCSV', 'quote', 'quote', 'TEXT', false, false), +('httpCSV', 'separator', 'separator', 'TEXT', false, false), +('httpCSV', 'identifier', 'identifier', 'TEXT', false, false), +('httpCSV', 'quote', 'quote', 'TEXT', false, false), +('ftp', 'username', 'username', 'TEXT', false, false), +('ftp', 'password', 'password', 'TEXT', false, false), +('ftp', 'recursive', 'recursive', 'BOOLEAN', false, false), +('ftp', 'extensions', 'extensions', 'LIST', false, false), +('sftp', 'username', 'username', 'TEXT', false, false), +('sftp', 'password', 'password', 'TEXT', true, false), +('sftp', 'authMethod', 'authMethod', 'TEXT', true, false), +('sftp', 'privateKeyPath', 'privateKeyPath', 'TEXT', true, false), +('sftp', 'port', 'port', 'TEXT', true, false), +('sftp', 'recursive', 'recursive', 'BOOLEAN', false, false), +('sftp', 'extensions', 'extensions', 'LIST', false, false); + -- Contexts CREATE TABLE contexts ( @@ -130,4 +169,12 @@ CREATE VIEW resource_types_view AS ( count(*) AS count, false AS simple FROM contexts +) UNION ALL ( + SELECT + 'protocol' AS id, + 'Protocols' AS name, + 'text/plain' AS content_type, + count(*) AS count, + false AS simple + FROM protocols );