2017-12-15 00:01:26 +01:00
package eu.eudat.controllers ;
2017-09-14 12:37:36 +02:00
2017-10-27 12:52:12 +02:00
2018-08-31 16:12:31 +02:00
import eu.eudat.configurations.dynamicproject.DynamicProjectConfiguration ;
2019-05-21 17:17:41 +02:00
import eu.eudat.criteria.DMPCriteria ;
2018-03-28 15:24:47 +02:00
import eu.eudat.data.dao.criteria.DynamicFieldsCriteria ;
import eu.eudat.data.dao.criteria.RequestItem ;
2018-03-21 11:57:56 +01:00
import eu.eudat.data.entities.DMP ;
2019-06-12 11:13:50 +02:00
import eu.eudat.data.query.items.table.datasetprofile.DatasetProfileTableRequestItem ;
2018-03-28 15:24:47 +02:00
import eu.eudat.data.query.items.table.dmp.DataManagementPlanTableRequest ;
2019-04-26 16:05:15 +02:00
import eu.eudat.data.query.items.table.dmp.DataManagmentPlanPublicTableRequest ;
2019-03-26 15:52:19 +01:00
import eu.eudat.exceptions.datamanagementplan.DMPNewVersionException ;
2018-11-30 15:57:20 +01:00
import eu.eudat.exceptions.datamanagementplan.DMPWithDatasetsDeleteException ;
2018-06-27 12:29:21 +02:00
import eu.eudat.logic.managers.DataManagementPlanManager ;
2018-10-18 11:33:13 +02:00
import eu.eudat.logic.managers.DatasetManager ;
2019-04-26 16:05:15 +02:00
import eu.eudat.logic.security.claims.ClaimedAuthorities ;
2018-08-31 16:12:31 +02:00
import eu.eudat.logic.services.ApiContext ;
2019-05-21 17:17:41 +02:00
import eu.eudat.logic.services.operations.DatabaseRepository ;
2019-06-12 11:13:50 +02:00
import eu.eudat.models.data.datasetprofile.DatasetProfileListingModel ;
2018-06-27 12:29:21 +02:00
import eu.eudat.models.data.dmp.DataManagementPlan ;
import eu.eudat.models.data.helpermodels.Tuple ;
import eu.eudat.models.data.helpers.common.DataTableData ;
import eu.eudat.models.data.helpers.responses.ResponseItem ;
import eu.eudat.models.data.listingmodels.DataManagementPlanListingModel ;
2019-05-17 17:21:56 +02:00
import eu.eudat.models.data.listingmodels.DataManagementPlanOverviewModel ;
2018-06-27 12:29:21 +02:00
import eu.eudat.models.data.security.Principal ;
2019-05-21 17:17:41 +02:00
import eu.eudat.query.DMPQuery ;
2018-01-23 16:21:38 +01:00
import eu.eudat.types.ApiMessageCode ;
2019-04-26 16:05:15 +02:00
import eu.eudat.types.Authorities ;
2017-09-14 12:37:36 +02:00
import org.springframework.beans.factory.annotation.Autowired ;
2018-10-18 11:33:13 +02:00
import org.springframework.core.env.Environment ;
2018-10-08 17:14:27 +02:00
import org.springframework.http.HttpHeaders ;
2017-09-14 12:37:36 +02:00
import org.springframework.http.HttpStatus ;
2018-10-08 17:14:27 +02:00
import org.springframework.http.MediaType ;
2018-01-22 08:41:31 +01:00
import org.springframework.http.ResponseEntity ;
2018-02-07 10:56:30 +01:00
import org.springframework.transaction.annotation.Transactional ;
2017-12-23 16:56:05 +01:00
import org.springframework.web.bind.annotation.* ;
2019-03-05 12:59:34 +01:00
import org.springframework.web.multipart.MultipartFile ;
2017-09-14 12:37:36 +02:00
2018-10-08 17:14:27 +02:00
import javax.activation.MimetypesFileTypeMap ;
2018-02-16 11:34:02 +01:00
import javax.validation.Valid ;
2019-03-05 12:59:34 +01:00
import javax.xml.bind.JAXBException ;
2018-10-18 11:33:13 +02:00
import java.io.File ;
2018-10-08 17:14:27 +02:00
import java.io.FileInputStream ;
import java.io.IOException ;
import java.io.InputStream ;
2019-06-05 15:40:47 +02:00
import java.nio.file.Files ;
2018-02-16 11:34:02 +01:00
import java.util.List ;
2019-05-23 17:03:44 +02:00
import java.util.Map ;
2018-02-16 11:34:02 +01:00
import java.util.UUID ;
2017-09-14 12:37:36 +02:00
@RestController
@CrossOrigin
2018-10-18 11:33:13 +02:00
@RequestMapping ( value = { " /api/dmps/ " } )
2018-01-03 11:44:54 +01:00
public class DMPs extends BaseController {
2018-01-04 10:32:39 +01:00
2019-05-21 17:17:41 +02:00
private DynamicProjectConfiguration dynamicProjectConfiguration ;
private Environment environment ;
private DataManagementPlanManager dataManagementPlanManager ;
private DatasetManager datasetManager ;
@Autowired
public DMPs ( ApiContext apiContext , DynamicProjectConfiguration dynamicProjectConfiguration , Environment environment ,
DataManagementPlanManager dataManagementPlanManager , DatasetManager datasetManager ) {
super ( apiContext ) ;
this . dynamicProjectConfiguration = dynamicProjectConfiguration ;
this . environment = environment ;
this . dataManagementPlanManager = dataManagementPlanManager ;
this . datasetManager = datasetManager ;
}
@Transactional
@RequestMapping ( method = RequestMethod . GET , value = { " {id}/unlock " } , produces = " application/json " )
public @ResponseBody
ResponseEntity < ResponseItem < DMP > > unlock ( @PathVariable ( value = " id " ) UUID id , Principal principal ) throws Exception {
this . dataManagementPlanManager . unlock ( id ) ;
return ResponseEntity . status ( HttpStatus . OK ) . body ( new ResponseItem < DMP > ( ) . status ( ApiMessageCode . SUCCESS_MESSAGE ) . message ( " Unlocked " ) ) ;
}
@RequestMapping ( method = RequestMethod . POST , value = { " /paged " } , consumes = " application/json " , produces = " application/json " )
public @ResponseBody
ResponseEntity < ResponseItem < DataTableData < DataManagementPlanListingModel > > > getPaged ( @Valid @RequestBody DataManagementPlanTableRequest dataManagementPlanTableRequest , @RequestParam String fieldsGroup , Principal principal ) throws Exception {
DataTableData < DataManagementPlanListingModel > dataTable = this . dataManagementPlanManager . getPaged ( dataManagementPlanTableRequest , principal , fieldsGroup ) ;
return ResponseEntity . status ( HttpStatus . OK ) . body ( new ResponseItem < DataTableData < DataManagementPlanListingModel > > ( ) . status ( ApiMessageCode . NO_MESSAGE ) . payload ( dataTable ) ) ;
}
@RequestMapping ( method = RequestMethod . GET , value = { " {id} " } )
public @ResponseBody
2019-06-04 16:04:04 +02:00
ResponseEntity getSingle ( @PathVariable String id , @RequestHeader ( " Content-Type " ) String contentType , Principal principal ) throws IllegalAccessException , InstantiationException , IOException {
2019-05-21 17:17:41 +02:00
if ( contentType . equals ( " application/xml " ) | | contentType . equals ( " application/msword " ) ) { //|| contentType.equals("application/pdf")
ResponseEntity < byte [ ] > document = this . dataManagementPlanManager . getDocument ( id , contentType ) ;
return document ;
} else {
eu . eudat . models . data . dmp . DataManagementPlan dataManagementPlan = this . dataManagementPlanManager . getSingle ( id , principal , this . dynamicProjectConfiguration ) ;
return ResponseEntity . status ( HttpStatus . OK ) . body ( new ResponseItem < DataManagementPlan > ( ) . status ( ApiMessageCode . NO_MESSAGE ) . payload ( dataManagementPlan ) ) ;
}
}
2019-06-12 11:13:50 +02:00
@RequestMapping ( method = RequestMethod . POST , value = { " /datasetProfilesUsedByDmps/paged " } , produces = " application/json " )
public @ResponseBody
ResponseEntity < ResponseItem < DataTableData < DatasetProfileListingModel > > > getUsingDatasetProfilesPaged ( @RequestBody DatasetProfileTableRequestItem datasetProfileTableRequestItem , Principal principal ) {
DataTableData < DatasetProfileListingModel > datasetProfileTableData = this . dataManagementPlanManager . getDatasetProfilesUsedByDMP ( datasetProfileTableRequestItem , principal ) ;
return ResponseEntity . status ( HttpStatus . OK ) . body ( new ResponseItem < DataTableData < DatasetProfileListingModel > > ( ) . status ( ApiMessageCode . NO_MESSAGE ) . payload ( datasetProfileTableData ) ) ;
}
2019-06-04 16:04:04 +02:00
@RequestMapping ( method = RequestMethod . GET , value = { " rda/{id} " } )
public @ResponseBody
ResponseEntity getRDAJsonDocument ( @PathVariable String id , Principal principal ) throws IOException {
return this . dataManagementPlanManager . getRDAJsonDocument ( id ) ;
}
2019-05-21 17:17:41 +02:00
@RequestMapping ( method = RequestMethod . GET , value = { " /overview/{id} " } )
public @ResponseBody
2019-06-04 16:04:04 +02:00
ResponseEntity getOverviewSingle ( @PathVariable String id , Principal principal ) throws IllegalAccessException , InstantiationException {
2019-05-21 17:17:41 +02:00
DataManagementPlanOverviewModel dataManagementPlan = this . dataManagementPlanManager . getOverviewSingle ( id , principal ) ;
return ResponseEntity . status ( HttpStatus . OK ) . body ( new ResponseItem < DataManagementPlanOverviewModel > ( ) . status ( ApiMessageCode . NO_MESSAGE ) . payload ( dataManagementPlan ) ) ;
}
@RequestMapping ( method = RequestMethod . GET , value = { " /public/{id} " } )
public @ResponseBody
2019-06-04 16:04:04 +02:00
ResponseEntity getSinglePublic ( @PathVariable String id ) {
2019-05-21 17:17:41 +02:00
try {
eu . eudat . models . data . dmp . DataManagementPlan dataManagementPlan = this . dataManagementPlanManager . getSinglePublic ( id , this . dynamicProjectConfiguration ) ;
return ResponseEntity . status ( HttpStatus . OK ) . body ( new ResponseItem < DataManagementPlan > ( ) . status ( ApiMessageCode . NO_MESSAGE ) . payload ( dataManagementPlan ) ) ;
} catch ( Exception ex ) {
return ResponseEntity . status ( HttpStatus . BAD_REQUEST ) . body ( new ResponseItem < DataManagementPlan > ( ) . status ( ApiMessageCode . NO_MESSAGE ) . message ( ex . getMessage ( ) ) ) ;
}
}
2019-06-10 11:27:16 +02:00
@RequestMapping ( method = RequestMethod . GET , value = { " /publicOverview/{id} " } )
public @ResponseBody
ResponseEntity getOverviewSinglePublic ( @PathVariable String id ) {
try {
DataManagementPlanOverviewModel dataManagementPlan = this . dataManagementPlanManager . getOverviewSinglePublic ( id ) ;
return ResponseEntity . status ( HttpStatus . OK ) . body ( new ResponseItem < DataManagementPlanOverviewModel > ( ) . status ( ApiMessageCode . NO_MESSAGE ) . payload ( dataManagementPlan ) ) ;
} catch ( Exception ex ) {
return ResponseEntity . status ( HttpStatus . BAD_REQUEST ) . body ( new ResponseItem < DataManagementPlanOverviewModel > ( ) . status ( ApiMessageCode . NO_MESSAGE ) . message ( ex . getMessage ( ) ) ) ;
}
}
2019-05-21 17:17:41 +02:00
@Transactional
@RequestMapping ( method = RequestMethod . POST , consumes = " application/json " , produces = " application/json " )
public @ResponseBody
2019-06-13 09:32:45 +02:00
ResponseEntity < ResponseItem < DMP > > createOrUpdate ( @RequestBody eu . eudat . models . data . dmp . DataManagementPlanEditorModel dataManagementPlanEditorModel , Principal principal ) throws Exception {
this . dataManagementPlanManager . createOrUpdate ( this . getApiContext ( ) , dataManagementPlanEditorModel , principal ) ;
2019-05-21 17:17:41 +02:00
return ResponseEntity . status ( HttpStatus . OK ) . body ( new ResponseItem < DMP > ( ) . status ( ApiMessageCode . SUCCESS_MESSAGE ) . message ( " Created " ) ) ;
}
@RequestMapping ( method = RequestMethod . POST , value = { " /new/{id} " } , consumes = " application/json " , produces = " application/json " )
public @ResponseBody
ResponseEntity < ResponseItem < DMP > > newVersion ( @PathVariable UUID id , @Valid @RequestBody eu . eudat . models . data . dmp . DataManagementPlanNewVersionModel dataManagementPlan , Principal principal ) throws Exception {
try {
this . dataManagementPlanManager . newVersion ( id , dataManagementPlan , principal ) ;
return ResponseEntity . status ( HttpStatus . OK ) . body ( new ResponseItem < DMP > ( ) . status ( ApiMessageCode . NO_MESSAGE ) ) ;
} catch ( DMPNewVersionException exception ) {
return ResponseEntity . status ( HttpStatus . BAD_REQUEST ) . body ( new ResponseItem < DMP > ( ) . status ( ApiMessageCode . ERROR_MESSAGE ) . message ( exception . getMessage ( ) ) ) ;
}
}
@RequestMapping ( method = RequestMethod . POST , value = { " /clone/{id} " } , consumes = " application/json " , produces = " application/json " )
public @ResponseBody
ResponseEntity < ResponseItem < DMP > > clone ( @PathVariable UUID id , @RequestBody eu . eudat . models . data . dmp . DataManagementPlanNewVersionModel dataManagementPlan , Principal principal ) throws Exception {
this . dataManagementPlanManager . clone ( id , dataManagementPlan , principal ) ;
return ResponseEntity . status ( HttpStatus . OK ) . body ( new ResponseItem < DMP > ( ) . status ( ApiMessageCode . NO_MESSAGE ) ) ;
}
@Transactional
@RequestMapping ( method = RequestMethod . DELETE , value = { " {id} " } , consumes = " application/json " , produces = " application/json " )
public @ResponseBody
ResponseEntity < ResponseItem < DMP > > delete ( @PathVariable UUID id , Principal principal ) {
try {
this . dataManagementPlanManager . delete ( id ) ;
return ResponseEntity . status ( HttpStatus . OK ) . body ( new ResponseItem < DMP > ( ) . status ( ApiMessageCode . SUCCESS_MESSAGE ) . message ( " Successfully Deleted Datamanagement Plan " ) ) ;
} catch ( DMPWithDatasetsDeleteException exception ) {
return ResponseEntity . status ( HttpStatus . BAD_REQUEST ) . body ( new ResponseItem < DMP > ( ) . status ( ApiMessageCode . ERROR_MESSAGE ) . message ( exception . getMessage ( ) ) ) ;
}
}
@RequestMapping ( method = RequestMethod . POST , value = { " /dynamic " } , consumes = " application/json " , produces = " application/json " )
public @ResponseBody
ResponseEntity < ResponseItem < List < Tuple < String , String > > > > getWithCriteria ( @RequestBody RequestItem < DynamicFieldsCriteria > criteriaRequestItem , Principal principal ) throws InstantiationException , IllegalAccessException {
List < Tuple < String , String > > dataTable = this . dataManagementPlanManager . getDynamicFields ( criteriaRequestItem . getCriteria ( ) . getId ( ) , this . dynamicProjectConfiguration , criteriaRequestItem . getCriteria ( ) ) ;
return ResponseEntity . status ( HttpStatus . OK ) . body ( new ResponseItem < List < Tuple < String , String > > > ( ) . status ( ApiMessageCode . NO_MESSAGE ) . payload ( dataTable ) ) ;
}
@RequestMapping ( method = RequestMethod . GET , value = { " /getPDF/{id} " } )
public @ResponseBody
ResponseEntity < byte [ ] > getPDFDocument ( @PathVariable String id , @RequestHeader ( " Content-Type " ) String contentType ) throws IllegalAccessException , IOException , InstantiationException , InterruptedException {
System . out . println ( contentType ) ;
File file = this . dataManagementPlanManager . getWordDocument ( id ) ;
2019-06-05 15:40:47 +02:00
String name = file . getName ( ) . substring ( 0 , file . getName ( ) . length ( ) - 5 ) ;
File pdffile = datasetManager . convertToPDF ( file , environment , name ) ;
2019-05-21 17:17:41 +02:00
InputStream resource = new FileInputStream ( pdffile ) ;
System . out . println ( " Mime Type of " + file . getName ( ) + " is " +
new MimetypesFileTypeMap ( ) . getContentType ( file ) ) ;
HttpHeaders responseHeaders = new HttpHeaders ( ) ;
responseHeaders . setContentLength ( pdffile . length ( ) ) ;
responseHeaders . setContentType ( MediaType . APPLICATION_OCTET_STREAM ) ;
responseHeaders . set ( " Content-Disposition " , " attachment;filename= " + pdffile . getName ( ) ) ;
responseHeaders . set ( " Access-Control-Expose-Headers " , " Content-Disposition " ) ;
responseHeaders . get ( " Access-Control-Expose-Headers " ) . add ( " Content-Type " ) ;
byte [ ] content = org . apache . poi . util . IOUtils . toByteArray ( resource ) ;
2019-06-05 15:40:47 +02:00
resource . close ( ) ;
Files . deleteIfExists ( file . toPath ( ) ) ;
Files . deleteIfExists ( pdffile . toPath ( ) ) ;
2019-05-21 17:17:41 +02:00
return new ResponseEntity < > ( content ,
responseHeaders ,
HttpStatus . OK ) ;
}
@RequestMapping ( method = RequestMethod . POST , value = { " /upload " } )
2019-06-10 13:02:16 +02:00
public ResponseEntity < ResponseItem > dmpXmlUpload ( @RequestParam ( " file " ) MultipartFile [ ] files , Principal principal ) throws Exception {
2019-05-21 17:17:41 +02:00
this . dataManagementPlanManager . createDmpFromXml ( this . getApiContext ( ) , files , principal ) ;
return ResponseEntity . status ( HttpStatus . OK ) . body ( new ResponseItem < List > ( )
. status ( ApiMessageCode . SUCCESS_MESSAGE ) ) ;
}
@RequestMapping ( method = RequestMethod . POST , value = { " /public/paged " } , consumes = " application/json " , produces = " application/json " )
public @ResponseBody
2019-06-10 13:02:16 +02:00
ResponseEntity < ResponseItem < DataTableData < DataManagementPlanListingModel > > > getPublicPaged ( @RequestBody DataManagmentPlanPublicTableRequest dmpTableRequest , @RequestParam String fieldsGroup ) throws Exception {
DataTableData < DataManagementPlanListingModel > dmp = this . dataManagementPlanManager . getPaged ( dmpTableRequest , fieldsGroup ) ;
2019-05-21 17:17:41 +02:00
return ResponseEntity . status ( HttpStatus . OK ) . body ( new ResponseItem < DataTableData < DataManagementPlanListingModel > > ( ) . status ( ApiMessageCode . NO_MESSAGE ) . payload ( dmp ) ) ;
}
@RequestMapping ( method = RequestMethod . POST , value = { " /test " } , consumes = " application/json " , produces = " application/json " )
public @ResponseBody
2019-05-23 17:03:44 +02:00
ResponseEntity < ResponseItem < DataTableData < Map > > > test ( @RequestBody DMPCriteria criteria , @ClaimedAuthorities ( claims = { Authorities . ANONYMOUS } ) Principal principal ) throws Exception {
2019-05-21 17:17:41 +02:00
DatabaseRepository dbRepo = this . getApiContext ( ) . getOperationsContext ( ) . getDatabaseRepository ( ) ;
2019-05-23 17:03:44 +02:00
DMPQuery query = criteria . buildQuery ( dbRepo ) ;
List < Map > models = query . getQuery ( ) . toListWithFields ( ) ;
DataTableData < Map > dmp = new DataTableData < > ( ) ;
2019-05-21 17:17:41 +02:00
dmp . setData ( models ) ;
dmp . setTotalCount ( query . getQuery ( ) . count ( ) ) ;
2019-05-23 17:03:44 +02:00
return ResponseEntity . status ( HttpStatus . OK ) . body ( new ResponseItem < DataTableData < Map > > ( ) . status ( ApiMessageCode . NO_MESSAGE ) . payload ( dmp ) ) ;
2019-05-21 17:17:41 +02:00
}
2017-09-14 12:37:36 +02:00
2019-06-20 15:25:49 +02:00
@RequestMapping ( method = RequestMethod . GET , value = { " /makepublic/{id} " } )
public ResponseEntity < ResponseItem < DMP > > makePublic ( @PathVariable String id , Principal principal ) {
try {
this . dataManagementPlanManager . makePublic ( UUID . fromString ( id ) , principal ) ;
return ResponseEntity . status ( HttpStatus . OK ) . body ( new ResponseItem < DMP > ( ) . status ( ApiMessageCode . SUCCESS_MESSAGE ) . message ( " Successfully Data Datamanagement Plan made public " ) ) ;
} catch ( Exception e ) {
return ResponseEntity . status ( HttpStatus . BAD_REQUEST ) . body ( new ResponseItem < DMP > ( ) . status ( ApiMessageCode . ERROR_MESSAGE ) . message ( e . getMessage ( ) ) ) ;
}
}
}