forked from D-Net/dnet-hadoop
Merge branch 'master' of https://github.com/dnet-team/dnet-hadoop
This commit is contained in:
commit
859957d0fd
|
@ -2,8 +2,19 @@
|
||||||
.idea
|
.idea
|
||||||
*.iml
|
*.iml
|
||||||
*~
|
*~
|
||||||
|
.classpath
|
||||||
|
/*/.classpath
|
||||||
|
/*/*/.classpath
|
||||||
|
.metadata
|
||||||
|
/*/.metadata
|
||||||
|
/*/*/.metadata
|
||||||
|
.project
|
||||||
|
.log
|
||||||
|
.settings
|
||||||
|
/*/*/target
|
||||||
/*/target
|
/*/target
|
||||||
/target
|
/target
|
||||||
|
/*/*/build
|
||||||
/*/build
|
/*/build
|
||||||
/build
|
/build
|
||||||
spark-warehouse
|
spark-warehouse
|
||||||
|
|
|
@ -0,0 +1,92 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<groupId>eu.dnetlib</groupId>
|
||||||
|
<artifactId>dhp-mdstore-manager-app</artifactId>
|
||||||
|
<version>1.1.0-SNAPSHOT</version>
|
||||||
|
|
||||||
|
<!-- Inherit defaults from Spring Boot -->
|
||||||
|
<parent>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-parent</artifactId>
|
||||||
|
<version>2.1.3.RELEASE</version>
|
||||||
|
<relativePath></relativePath>
|
||||||
|
</parent>
|
||||||
|
|
||||||
|
<!-- <repositories> <repository> <id>dnet-deps</id> <name>dnet-dependencies</name>
|
||||||
|
<url>http://maven.research-infrastructures.eu/nexus/content/repositories/dnet-deps</url>
|
||||||
|
<layout>default</layout> </repository> <repository> <id>dnet45-releases</id>
|
||||||
|
<name>D-Net 45 Releases</name> <url>http://maven.research-infrastructures.eu/nexus/content/repositories/dnet45-releases</url>
|
||||||
|
<layout>default</layout> <snapshots> <enabled>true</enabled> </snapshots>
|
||||||
|
</repository> <repository> <id>dnet45-snapshots</id> <name>D-Net 45 Snapshots</name>
|
||||||
|
<url>http://maven.research-infrastructures.eu/nexus/content/repositories/dnet45-snapshots</url>
|
||||||
|
<layout>default</layout> <snapshots> <enabled>true</enabled> </snapshots>
|
||||||
|
</repository> </repositories> -->
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<!-- Add typical dependencies for a web application -->
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-web</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-data-jpa</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-json</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.postgresql</groupId>
|
||||||
|
<artifactId>postgresql</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.vladmihalcea</groupId>
|
||||||
|
<artifactId>hibernate-types-52</artifactId>
|
||||||
|
<version>2.3.5</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>commons-io</groupId>
|
||||||
|
<artifactId>commons-io</artifactId>
|
||||||
|
<version>2.6</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- Swagger -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.springfox</groupId>
|
||||||
|
<artifactId>springfox-swagger2</artifactId>
|
||||||
|
<version>2.9.2</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.springfox</groupId>
|
||||||
|
<artifactId>springfox-swagger-ui</artifactId>
|
||||||
|
<version>2.9.2</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- JUnit -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>junit</groupId>
|
||||||
|
<artifactId>junit</artifactId>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||||
|
<configuration>
|
||||||
|
<executable>true</executable>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
|
||||||
|
</project>
|
|
@ -0,0 +1,30 @@
|
||||||
|
package eu.dnetlib.data.mdstore.manager;
|
||||||
|
|
||||||
|
public class MDStoreManagerException extends Exception{
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
private static final long serialVersionUID = -7503316126409002675L;
|
||||||
|
|
||||||
|
public MDStoreManagerException() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
public MDStoreManagerException(String message, Throwable cause, boolean enableSuppression,
|
||||||
|
boolean writableStackTrace) {
|
||||||
|
super(message, cause, enableSuppression, writableStackTrace);
|
||||||
|
}
|
||||||
|
|
||||||
|
public MDStoreManagerException(String message, Throwable cause) {
|
||||||
|
super(message, cause);
|
||||||
|
}
|
||||||
|
|
||||||
|
public MDStoreManagerException(String message) {
|
||||||
|
super(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
public MDStoreManagerException(Throwable cause) {
|
||||||
|
super(cause);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,49 @@
|
||||||
|
package eu.dnetlib.data.mdstore.manager;
|
||||||
|
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
import org.springframework.boot.SpringApplication;
|
||||||
|
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||||
|
import org.springframework.cache.annotation.EnableCaching;
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
|
||||||
|
import springfox.documentation.builders.ApiInfoBuilder;
|
||||||
|
import springfox.documentation.builders.RequestHandlerSelectors;
|
||||||
|
import springfox.documentation.service.ApiInfo;
|
||||||
|
import springfox.documentation.spi.DocumentationType;
|
||||||
|
import springfox.documentation.spring.web.plugins.Docket;
|
||||||
|
import springfox.documentation.swagger2.annotations.EnableSwagger2;
|
||||||
|
|
||||||
|
@SpringBootApplication
|
||||||
|
@EnableSwagger2
|
||||||
|
@EnableCaching
|
||||||
|
public class MainApplication {
|
||||||
|
|
||||||
|
private static final Logger log = LoggerFactory.getLogger(MainApplication.class);
|
||||||
|
|
||||||
|
public static void main(final String[] args) {
|
||||||
|
SpringApplication.run(MainApplication.class, args);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public static Docket newSwaggerDocket() {
|
||||||
|
log.info("Initializing SWAGGER...");
|
||||||
|
|
||||||
|
return new Docket(DocumentationType.SWAGGER_2)
|
||||||
|
.select()
|
||||||
|
.apis(RequestHandlerSelectors.any())
|
||||||
|
.paths(p -> p.startsWith("/api/"))
|
||||||
|
.build().apiInfo(new ApiInfoBuilder()
|
||||||
|
.title("MDStore Manager APIs")
|
||||||
|
.description("APIs documentation")
|
||||||
|
.version("1.1")
|
||||||
|
.contact(ApiInfo.DEFAULT_CONTACT)
|
||||||
|
.license("Apache 2.0")
|
||||||
|
.licenseUrl("http://www.apache.org/licenses/LICENSE-2.0")
|
||||||
|
.build());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,14 @@
|
||||||
|
package eu.dnetlib.data.mdstore.manager;
|
||||||
|
|
||||||
|
import org.springframework.stereotype.Controller;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMethod;
|
||||||
|
|
||||||
|
@Controller
|
||||||
|
public class SwaggerController {
|
||||||
|
|
||||||
|
@RequestMapping(value = { "/", "/apidoc", "/api-doc", "/doc", "/swagger" }, method = RequestMethod.GET)
|
||||||
|
public String apiDoc() {
|
||||||
|
return "redirect:swagger-ui.html";
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,79 @@
|
||||||
|
package eu.dnetlib.data.mdstore.manager.controller;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.web.bind.annotation.PathVariable;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMethod;
|
||||||
|
import org.springframework.web.bind.annotation.RequestParam;
|
||||||
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
|
import eu.dnetlib.data.mdstore.manager.MDStoreManagerException;
|
||||||
|
import eu.dnetlib.data.mdstore.manager.model.MDStore;
|
||||||
|
import eu.dnetlib.data.mdstore.manager.model.MDStoreWithInfo;
|
||||||
|
import eu.dnetlib.data.mdstore.manager.model.Transaction;
|
||||||
|
import eu.dnetlib.data.mdstore.manager.repository.MDStoreRepository;
|
||||||
|
import eu.dnetlib.data.mdstore.manager.repository.MDStoreWithInfoRepository;
|
||||||
|
import eu.dnetlib.data.mdstore.manager.repository.TransactionRepository;
|
||||||
|
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("/api/mdstores")
|
||||||
|
public class MDStoreController {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private MDStoreRepository mdstoreRepository;
|
||||||
|
@Autowired
|
||||||
|
private TransactionRepository transactionRepository;
|
||||||
|
@Autowired
|
||||||
|
private MDStoreWithInfoRepository mdstoreWithInfoRepository;
|
||||||
|
|
||||||
|
@RequestMapping(value = "/", method = RequestMethod.GET)
|
||||||
|
public final Iterable<MDStoreWithInfo> find() {
|
||||||
|
return mdstoreWithInfoRepository.findAll();
|
||||||
|
}
|
||||||
|
|
||||||
|
@RequestMapping(value = "/identifiers", method = RequestMethod.GET)
|
||||||
|
public final List<String> findIdentifiers() {
|
||||||
|
return mdstoreRepository.findAll().stream().map(MDStore::getId).collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
|
||||||
|
@RequestMapping(value = "/byId/{id}", method = RequestMethod.GET)
|
||||||
|
public final MDStoreWithInfo get(@PathVariable final String id) {
|
||||||
|
return mdstoreWithInfoRepository.findById(id).orElse(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@RequestMapping(value = "/count", method = RequestMethod.GET)
|
||||||
|
public final long count() {
|
||||||
|
return mdstoreRepository.count();
|
||||||
|
}
|
||||||
|
|
||||||
|
@RequestMapping(value = "/new/{format}/{layout}/{interpretation}", method = RequestMethod.PUT)
|
||||||
|
public MDStoreWithInfo createMDStore(
|
||||||
|
@PathVariable String format,
|
||||||
|
@PathVariable String layout,
|
||||||
|
@PathVariable String interpretation,
|
||||||
|
@RequestParam(required=false) String dsId,
|
||||||
|
@RequestParam(required=false) String apiId) throws MDStoreManagerException {
|
||||||
|
final MDStore md = MDStore.newInstance(dsId, apiId, format, layout, interpretation);
|
||||||
|
mdstoreRepository.save(md);
|
||||||
|
|
||||||
|
final Transaction t = Transaction.newInstance(md.getId());
|
||||||
|
t.setCurrent(true);
|
||||||
|
transactionRepository.save(t);
|
||||||
|
|
||||||
|
return mdstoreWithInfoRepository.findById(md.getId()).orElseThrow(() -> new MDStoreManagerException("MDStore not found"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
|
||||||
|
public void delete(@PathVariable final String id) throws MDStoreManagerException {
|
||||||
|
if (transactionRepository.countByMdstoreAndActive(id, true) == 0) {
|
||||||
|
transactionRepository.deleteByMdstore(id);
|
||||||
|
mdstoreRepository.deleteById(id);
|
||||||
|
} else {
|
||||||
|
throw new MDStoreManagerException("Active transactions found on mdstore : " + id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,41 @@
|
||||||
|
package eu.dnetlib.data.mdstore.manager.controller;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.web.bind.annotation.PathVariable;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMethod;
|
||||||
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
|
import eu.dnetlib.data.mdstore.manager.model.Transaction;
|
||||||
|
import eu.dnetlib.data.mdstore.manager.repository.TransactionRepository;
|
||||||
|
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("/api/transactions")
|
||||||
|
public class TransactionController {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private TransactionRepository repo;
|
||||||
|
|
||||||
|
@RequestMapping(value = "/", method = RequestMethod.GET)
|
||||||
|
public final List<Transaction> find() {
|
||||||
|
return repo.findAll();
|
||||||
|
}
|
||||||
|
|
||||||
|
@RequestMapping(value = "/identifiers", method = RequestMethod.GET)
|
||||||
|
public final List<String> findIdentifiers() {
|
||||||
|
return repo.findAll().stream().map(Transaction::getId).collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
|
||||||
|
@RequestMapping(value = "/{id}", method = RequestMethod.GET)
|
||||||
|
public final Transaction get(@PathVariable final String id) {
|
||||||
|
return repo.findById(id).orElse(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@RequestMapping(value = "/count", method = RequestMethod.GET)
|
||||||
|
public final long count() {
|
||||||
|
return repo.count();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,108 @@
|
||||||
|
package eu.dnetlib.data.mdstore.manager.model;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
import javax.persistence.Column;
|
||||||
|
import javax.persistence.Entity;
|
||||||
|
import javax.persistence.Id;
|
||||||
|
import javax.persistence.Table;
|
||||||
|
|
||||||
|
@Entity
|
||||||
|
@Table(name = "mdstores")
|
||||||
|
public class MDStore implements Serializable {
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
private static final long serialVersionUID = 3160530489149700055L;
|
||||||
|
|
||||||
|
@Id
|
||||||
|
@Column(name = "id")
|
||||||
|
private String id;
|
||||||
|
|
||||||
|
@Column(name = "format")
|
||||||
|
private String format;
|
||||||
|
|
||||||
|
@Column(name = "layout")
|
||||||
|
private String layout;
|
||||||
|
|
||||||
|
|
||||||
|
@Column(name = "interpretation")
|
||||||
|
private String interpretation;
|
||||||
|
|
||||||
|
@Column(name = "datasource_id")
|
||||||
|
private String datasourceId;
|
||||||
|
|
||||||
|
@Column(name = "api_id")
|
||||||
|
private String apiId ;
|
||||||
|
|
||||||
|
|
||||||
|
public String getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId(String id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getFormat() {
|
||||||
|
return format;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFormat(String format) {
|
||||||
|
this.format = format;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getLayout() {
|
||||||
|
return layout;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLayout(String layout) {
|
||||||
|
this.layout = layout;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getInterpretation() {
|
||||||
|
return interpretation;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setInterpretation(String interpretation) {
|
||||||
|
this.interpretation = interpretation;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDatasourceId() {
|
||||||
|
return datasourceId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDatasourceId(String datasourceId) {
|
||||||
|
this.datasourceId = datasourceId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getApiId() {
|
||||||
|
return apiId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setApiId(String apiId) {
|
||||||
|
this.apiId = apiId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static MDStore newInstance(final String format, final String layout, final String interpretation) {
|
||||||
|
return newInstance(null, null, format, layout, interpretation);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static MDStore newInstance(final String dsId, final String apiId, final String format, final String layout, final String interpretation) {
|
||||||
|
final MDStore md = new MDStore();
|
||||||
|
md.setId("md-" + UUID.randomUUID());
|
||||||
|
md.setDatasourceId(dsId);
|
||||||
|
md.setApiId(apiId);
|
||||||
|
md.setFormat(format);
|
||||||
|
md.setLayout(layout);
|
||||||
|
md.setInterpretation(interpretation);
|
||||||
|
return md;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,124 @@
|
||||||
|
package eu.dnetlib.data.mdstore.manager.model;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
import javax.persistence.Column;
|
||||||
|
import javax.persistence.Entity;
|
||||||
|
import javax.persistence.Id;
|
||||||
|
import javax.persistence.Table;
|
||||||
|
import javax.persistence.Temporal;
|
||||||
|
import javax.persistence.TemporalType;
|
||||||
|
|
||||||
|
@Entity
|
||||||
|
@Table(name = "mdstores_with_info")
|
||||||
|
public class MDStoreWithInfo implements Serializable {
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
private static final long serialVersionUID = -8445784770687571492L;
|
||||||
|
|
||||||
|
@Id
|
||||||
|
@Column(name = "id")
|
||||||
|
private String id;
|
||||||
|
|
||||||
|
@Column(name = "format")
|
||||||
|
private String format;
|
||||||
|
|
||||||
|
@Column(name = "layout")
|
||||||
|
private String layout;
|
||||||
|
|
||||||
|
@Column(name = "interpretation")
|
||||||
|
private String interpretation;
|
||||||
|
|
||||||
|
@Column(name = "datasource_id")
|
||||||
|
private String datasourceId;
|
||||||
|
|
||||||
|
@Column(name = "api_id")
|
||||||
|
private String apiId ;
|
||||||
|
|
||||||
|
@Column(name = "current_version")
|
||||||
|
private String currentVersion;
|
||||||
|
|
||||||
|
@Column(name = "lastupdate")
|
||||||
|
@Temporal(TemporalType.TIMESTAMP)
|
||||||
|
private Date lastUpdate;
|
||||||
|
|
||||||
|
@Column(name = "size")
|
||||||
|
private int size;
|
||||||
|
|
||||||
|
public String getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId(String id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getFormat() {
|
||||||
|
return format;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFormat(String format) {
|
||||||
|
this.format = format;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getLayout() {
|
||||||
|
return layout;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLayout(String layout) {
|
||||||
|
this.layout = layout;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getInterpretation() {
|
||||||
|
return interpretation;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setInterpretation(String interpretation) {
|
||||||
|
this.interpretation = interpretation;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDatasourceId() {
|
||||||
|
return datasourceId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDatasourceId(String datasourceId) {
|
||||||
|
this.datasourceId = datasourceId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getApiId() {
|
||||||
|
return apiId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setApiId(String apiId) {
|
||||||
|
this.apiId = apiId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getCurrentVersion() {
|
||||||
|
return currentVersion;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCurrentVersion(String currentVersion) {
|
||||||
|
this.currentVersion = currentVersion;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Date getLastUpdate() {
|
||||||
|
return lastUpdate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLastUpdate(Date lastUpdate) {
|
||||||
|
this.lastUpdate = lastUpdate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getSize() {
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSize(int size) {
|
||||||
|
this.size = size;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,114 @@
|
||||||
|
package eu.dnetlib.data.mdstore.manager.model;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
import javax.persistence.Column;
|
||||||
|
import javax.persistence.Entity;
|
||||||
|
import javax.persistence.Id;
|
||||||
|
import javax.persistence.Table;
|
||||||
|
import javax.persistence.Temporal;
|
||||||
|
import javax.persistence.TemporalType;
|
||||||
|
|
||||||
|
@Entity
|
||||||
|
@Table(name = "transactions")
|
||||||
|
public class Transaction implements Serializable{
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
private static final long serialVersionUID = -4763494442274298339L;
|
||||||
|
|
||||||
|
@Id
|
||||||
|
@Column(name = "id")
|
||||||
|
private String id;
|
||||||
|
|
||||||
|
@Column(name = "mdstore")
|
||||||
|
private String mdstore;
|
||||||
|
|
||||||
|
@Column(name = "current")
|
||||||
|
private boolean current;
|
||||||
|
|
||||||
|
@Column(name = "active")
|
||||||
|
private boolean active;
|
||||||
|
|
||||||
|
@Column(name = "readcount")
|
||||||
|
private int readCount;
|
||||||
|
|
||||||
|
@Column(name = "lastupdate")
|
||||||
|
@Temporal(TemporalType.TIMESTAMP)
|
||||||
|
private Date lastUpdate;
|
||||||
|
|
||||||
|
@Column(name = "size")
|
||||||
|
private int size;
|
||||||
|
|
||||||
|
public String getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId(String id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getMdstore() {
|
||||||
|
return mdstore;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMdstore(String mdstore) {
|
||||||
|
this.mdstore = mdstore;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isCurrent() {
|
||||||
|
return current;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCurrent(boolean current) {
|
||||||
|
this.current = current;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isActive() {
|
||||||
|
return active;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setActive(boolean active) {
|
||||||
|
this.active = active;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getReadCount() {
|
||||||
|
return readCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setReadCount(int readCount) {
|
||||||
|
this.readCount = readCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Date getLastUpdate() {
|
||||||
|
return lastUpdate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLastUpdate(Date lastUpdate) {
|
||||||
|
this.lastUpdate = lastUpdate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getSize() {
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSize(int size) {
|
||||||
|
this.size = size;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Transaction newInstance(final String mdId) {
|
||||||
|
final Transaction t = new Transaction();
|
||||||
|
t.setId(mdId + "-" + new Date().getTime());
|
||||||
|
t.setMdstore(mdId);
|
||||||
|
t.setLastUpdate(null);
|
||||||
|
t.setActive(false);
|
||||||
|
t.setCurrent(false);
|
||||||
|
t.setReadCount(0);
|
||||||
|
t.setSize(0);
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
package eu.dnetlib.data.mdstore.manager.repository;
|
||||||
|
|
||||||
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
|
import org.springframework.stereotype.Repository;
|
||||||
|
|
||||||
|
import eu.dnetlib.data.mdstore.manager.model.MDStore;
|
||||||
|
|
||||||
|
@Repository
|
||||||
|
public interface MDStoreRepository extends JpaRepository<MDStore, String> {
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,10 @@
|
||||||
|
package eu.dnetlib.data.mdstore.manager.repository;
|
||||||
|
|
||||||
|
import org.springframework.stereotype.Repository;
|
||||||
|
|
||||||
|
import eu.dnetlib.data.mdstore.manager.model.MDStoreWithInfo;
|
||||||
|
|
||||||
|
@Repository
|
||||||
|
public interface MDStoreWithInfoRepository extends ReadOnlyRepository<MDStoreWithInfo, String> {
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,18 @@
|
||||||
|
package eu.dnetlib.data.mdstore.manager.repository;
|
||||||
|
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
import org.springframework.data.repository.NoRepositoryBean;
|
||||||
|
import org.springframework.data.repository.Repository;
|
||||||
|
|
||||||
|
@NoRepositoryBean
|
||||||
|
public interface ReadOnlyRepository<T, ID> extends Repository<T, ID> {
|
||||||
|
|
||||||
|
Optional<T> findById(ID id);
|
||||||
|
|
||||||
|
boolean existsById(ID id);
|
||||||
|
|
||||||
|
Iterable<T> findAll();
|
||||||
|
|
||||||
|
long count();
|
||||||
|
}
|
|
@ -0,0 +1,14 @@
|
||||||
|
package eu.dnetlib.data.mdstore.manager.repository;
|
||||||
|
|
||||||
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
|
import org.springframework.stereotype.Repository;
|
||||||
|
|
||||||
|
import eu.dnetlib.data.mdstore.manager.model.Transaction;
|
||||||
|
|
||||||
|
@Repository
|
||||||
|
public interface TransactionRepository extends JpaRepository<Transaction, String> {
|
||||||
|
|
||||||
|
void deleteByMdstore(String id);
|
||||||
|
|
||||||
|
int countByMdstoreAndActive(String id, boolean active);
|
||||||
|
}
|
|
@ -0,0 +1,14 @@
|
||||||
|
spring.main.banner-mode = console
|
||||||
|
logging.level.root = INFO
|
||||||
|
|
||||||
|
spring.datasource.url=jdbc:postgresql://localhost:5432/mdstoremanager
|
||||||
|
spring.datasource.username=
|
||||||
|
spring.datasource.password=
|
||||||
|
|
||||||
|
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect
|
||||||
|
|
||||||
|
# Hibernate ddl auto (create, create-drop, validate, update)
|
||||||
|
spring.jpa.hibernate.ddl-auto = validate
|
||||||
|
spring.jpa.properties.hibernate.hbm2dll.extra_physical_table_types = MATERIALIZED VIEW
|
||||||
|
spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true
|
||||||
|
spring.jpa.open-in-view=true
|
|
@ -0,0 +1,38 @@
|
||||||
|
DROP VIEW IF EXISTS mdstores_with_info;
|
||||||
|
DROP TABLE IF EXISTS transactions;
|
||||||
|
DROP TABLE IF EXISTS mdstores;
|
||||||
|
|
||||||
|
CREATE TABLE mdstores (
|
||||||
|
id text PRIMARY KEY,
|
||||||
|
format text,
|
||||||
|
layout text,
|
||||||
|
interpretation text,
|
||||||
|
datasource_id text,
|
||||||
|
api_id text
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE transactions (
|
||||||
|
id text PRIMARY KEY,
|
||||||
|
mdstore text REFERENCES mdstores(id),
|
||||||
|
current boolean,
|
||||||
|
active boolean,
|
||||||
|
readcount int,
|
||||||
|
lastupdate timestamp,
|
||||||
|
size int
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE VIEW mdstores_with_info AS SELECT
|
||||||
|
md.id AS id,
|
||||||
|
md.format AS format,
|
||||||
|
md.layout AS layout,
|
||||||
|
md.interpretation AS interpretation,
|
||||||
|
md.datasource_id AS datasource_id,
|
||||||
|
md.api_id AS api_id,
|
||||||
|
t.id AS current_version,
|
||||||
|
t.lastupdate AS lastupdate,
|
||||||
|
t.size AS size
|
||||||
|
FROM
|
||||||
|
mdstores md
|
||||||
|
LEFT OUTER JOIN transactions t ON (md.id = t.mdstore)
|
||||||
|
WHERE
|
||||||
|
t.current = TRUE;
|
|
@ -0,0 +1,15 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<parent>
|
||||||
|
<groupId>eu.dnetlib.dhp</groupId>
|
||||||
|
<artifactId>dhp</artifactId>
|
||||||
|
<version>1.0.0-SNAPSHOT</version>
|
||||||
|
</parent>
|
||||||
|
<artifactId>dhp-applications</artifactId>
|
||||||
|
<packaging>pom</packaging>
|
||||||
|
<modules>
|
||||||
|
<module>dhp-mdstore-manager-app</module>
|
||||||
|
</modules>
|
||||||
|
|
||||||
|
</project>
|
1
pom.xml
1
pom.xml
|
@ -23,6 +23,7 @@
|
||||||
<!--<module>dhp-build</module>-->
|
<!--<module>dhp-build</module>-->
|
||||||
<module>dhp-common</module>
|
<module>dhp-common</module>
|
||||||
<module>dhp-workflows</module>
|
<module>dhp-workflows</module>
|
||||||
|
<module>dhp-applications</module>
|
||||||
</modules>
|
</modules>
|
||||||
|
|
||||||
<issueManagement>
|
<issueManagement>
|
||||||
|
|
Loading…
Reference in New Issue