2019-04-01 15:30:16 +02:00
package org.gcube.data.publishing.gCatFeeder.collectors.dm.model.ckan ;
import java.io.ByteArrayOutputStream ;
2020-01-15 17:50:53 +01:00
import java.net.URL ;
2021-11-09 14:31:58 +01:00
import java.text.SimpleDateFormat ;
import java.time.LocalDateTime ;
import java.time.format.DateTimeFormatter ;
import java.time.format.DateTimeFormatterBuilder ;
2019-04-01 15:30:16 +02:00
import java.util.ArrayList ;
2019-04-02 17:46:32 +02:00
import org.gcube.data.publishing.gCatFeeder.collectors.dm.DataMinerCollectorProperties ;
2021-11-09 14:31:58 +01:00
import org.gcube.data.publishing.gCatFeeder.collectors.dm.URIResolver ;
2019-04-01 15:30:16 +02:00
import org.gcube.data.publishing.gCatFeeder.collectors.dm.model.InternalAlgorithmDescriptor ;
2019-04-03 15:59:18 +02:00
import org.gcube.data.publishing.gCatFeeder.collectors.dm.model.Parameter ;
import org.gcube.data.publishing.gCatFeeder.collectors.dm.model.UserIdentity ;
2019-04-01 15:30:16 +02:00
import org.gcube.data.publishing.gCatFeeder.model.CatalogueFormatData ;
import org.gcube.data.publishing.gCatFeeder.model.InternalConversionException ;
import org.gcube.data.publishing.gCatFeeder.utils.ContextUtils ;
import com.fasterxml.jackson.databind.ObjectMapper ;
import lombok.Getter ;
import lombok.NoArgsConstructor ;
import lombok.Setter ;
2020-01-15 17:50:53 +01:00
import lombok.extern.slf4j.Slf4j ;
2019-04-01 15:30:16 +02:00
@NoArgsConstructor
@Getter
@Setter
2020-01-15 17:50:53 +01:00
@Slf4j
2019-04-01 15:30:16 +02:00
public class GCatModel implements CatalogueFormatData {
2021-11-09 14:31:58 +01:00
private static final DateTimeFormatter dateFormatter = DateTimeFormatter . ISO_DATE ;
2019-04-01 15:30:16 +02:00
private static ObjectMapper mapper = new ObjectMapper ( ) ;
2020-01-15 17:50:53 +01:00
2019-04-01 15:30:16 +02:00
private static String profileXML = null ;
2020-01-15 17:50:53 +01:00
2019-04-12 18:13:03 +02:00
String profileID = DataMinerCollectorProperties . getProperty ( DataMinerCollectorProperties . CKAN_RESOURCE_TYPE ) ;
2020-01-15 17:50:53 +01:00
public static void setStaticProfile ( String toSet ) {
2019-04-01 15:30:16 +02:00
profileXML = toSet ;
}
2020-01-15 17:50:53 +01:00
2021-11-09 14:31:58 +01:00
public static String getItemUrl ( String name ) {
try {
URIResolver uriResolver = new URIResolver ( ) ;
log . debug ( " Evaluating item url for {} " , name ) ;
String catalogueItemURL = uriResolver . getCatalogueItemURL ( name ) ;
log . info ( " Item URL for {} is {} " , name , catalogueItemURL ) ;
return catalogueItemURL ;
} catch ( Exception e ) {
log . warn ( " Unable to evaluate item URL for " + name , e ) ;
return null ;
}
}
2019-04-01 15:30:16 +02:00
public GCatModel ( InternalAlgorithmDescriptor desc ) {
item = new CkanItem ( ) ;
2021-11-10 14:35:41 +01:00
item . setAuthor ( desc . getAuthor ( ) . getFirstName ( ) + " " + desc . getAuthor ( ) . getLastName ( ) ) ;
2020-01-15 17:50:53 +01:00
2019-04-01 15:30:16 +02:00
item . setTitle ( desc . getName ( ) + " in " + ContextUtils . getCurrentScopeName ( ) ) ;
2019-05-20 18:19:51 +02:00
item . setLicense_id ( " CC-BY-NC-SA-4.0 " ) ;
2021-11-10 14:35:41 +01:00
item . setMaintainer ( desc . getMaintainer ( ) . getFirstName ( ) + " " + desc . getMaintainer ( ) . getLastName ( ) ) ;
2019-04-01 15:30:16 +02:00
item . setName ( item . getTitle ( ) . toLowerCase ( ) . toLowerCase ( ) . replaceAll ( " " , " _ " ) ) ;
for ( String tag : desc . getTags ( ) ) {
2019-05-20 18:19:51 +02:00
item . getTags ( ) . add ( new CkanItem . Tag ( fixTag ( tag ) ) ) ;
2019-04-01 15:30:16 +02:00
}
2019-05-20 18:19:51 +02:00
item . getTags ( ) . add ( new CkanItem . Tag ( ContextUtils . getCurrentScopeName ( ) ) ) ;
item . getTags ( ) . add ( new CkanItem . Tag ( " WPS " ) ) ;
item . getTags ( ) . add ( new CkanItem . Tag ( " Analytics " ) ) ;
item . getExtras ( ) . add ( new CKanExtraField ( " system:type " , profileID ) ) ;
2020-01-15 17:50:53 +01:00
2019-05-20 18:19:51 +02:00
item . setPrivateFlag ( desc . getPrivateFlag ( ) ) ;
2020-01-15 17:50:53 +01:00
2021-11-09 16:01:17 +01:00
for ( Parameter param : desc . getInputParameters ( ) )
item . getExtras ( ) . add ( new CKanExtraField ( " TechnicalDetails:input " ,
2021-11-09 14:31:58 +01:00
String . format ( " %1$s [%2$s] %3$s : %4$s " ,
2019-06-19 15:16:04 +02:00
param . getName ( ) , param . getType ( ) ,
( ( param . getValue ( ) ! = null & & ! param . getValue ( ) . isEmpty ( ) ) ? " default : " + param . getValue ( ) : " " ) ,
param . getDescription ( ) ) ) ) ;
2020-01-15 17:50:53 +01:00
2019-06-19 15:16:04 +02:00
for ( Parameter param : desc . getOutputParameters ( ) )
2021-11-09 16:01:17 +01:00
item . getExtras ( ) . add ( new CKanExtraField ( " TechnicalDetails:output " ,
2021-11-09 14:31:58 +01:00
String . format ( " %1$s [%2$s] %3$s : %4$s " ,
2019-04-01 16:56:06 +02:00
param . getName ( ) , param . getType ( ) ,
( ( param . getValue ( ) ! = null & & ! param . getValue ( ) . isEmpty ( ) ) ? " default : " + param . getValue ( ) : " " ) ,
param . getDescription ( ) ) ) ) ;
2021-11-09 16:01:17 +01:00
2021-11-09 14:31:58 +01:00
item . getExtras ( ) . add ( new CKanExtraField ( " Identity:Creator " , desc . getAuthor ( ) . asStringValue ( ) ) ) ;
item . getExtras ( ) . add ( new CKanExtraField ( " Identity:CreationDate " , dateFormatter . format ( desc . getCreationDate ( ) ) ) ) ;
item . getExtras ( ) . add ( new CKanExtraField ( " AccessMode:UsageMode " , " as-a-Service via Blue-Cloud Infrastructure " ) ) ;
item . getExtras ( ) . add ( new CKanExtraField ( " AccessMode:Availability " , " On-Line " ) ) ;
item . getExtras ( ) . add ( new CKanExtraField ( " TechnicalDetails:Hosting Environment " , " gCube SmartGear " ) ) ;
item . getExtras ( ) . add ( new CKanExtraField ( " TechnicalDetails:Dependencies on Other SW " , " gCube DataMiner " ) ) ;
item . getExtras ( ) . add ( new CKanExtraField ( " Rights:Field/Scope of use " , " Any use " ) ) ;
item . getExtras ( ) . add ( new CKanExtraField ( " Rights:Basic rights " , " Communication " ) ) ;
item . getExtras ( ) . add ( new CKanExtraField ( " Rights:Basic rights " , " Making available to the public " ) ) ;
item . getExtras ( ) . add ( new CKanExtraField ( " Rights:Basic rights " , " Distribution " ) ) ;
item . getExtras ( ) . add ( new CKanExtraField ( " Attribution:Attribution requirements " ,
String . format ( " Cite as: %1$s (%2$d): %3$s. %4$s. %5$s. %6$s. %7$s. Retrieved from the %8$s (%9$s) operated by D4Science.org www.d4science.org " ,
desc . getAuthor ( ) . asStringValue ( ) ,
LocalDateTime . now ( ) . getYear ( ) ,
desc . getName ( ) ,
desc . getVersion ( ) ,
" Blue-Cloud " ,
" DataMiner Process " ,
getItemUrl ( item . getName ( ) ) ,
desc . getGatewayName ( ) ,
desc . getGuiLink ( ) ) ) ) ;
2020-01-15 17:50:53 +01:00
2019-06-07 17:00:47 +02:00
//Algorithm Description
2020-01-15 17:50:53 +01:00
// item.getExtras().add(new CKanExtraField(profileID+":Process Description", desc.getDescription()));
2019-06-19 15:16:04 +02:00
item . setNotes ( desc . getDescription ( ) ) ;
2020-01-15 17:50:53 +01:00
2019-06-07 17:00:47 +02:00
// Algorithm Users
2020-01-15 17:50:53 +01:00
2021-11-09 14:31:58 +01:00
//item.getExtras().add(new CKanExtraField(profileID+":Process Author",desc.getAuthor().asStringValue()));
//item.getExtras().add(new CKanExtraField(profileID+":Process Maintainer",desc.getAuthor().asStringValue()));
2020-01-15 17:50:53 +01:00
if ( desc . getGuiLink ( ) ! = null ) {
try {
URL url = new URL ( desc . getGuiLink ( ) ) ;
resources . add ( new CkanResource ( " Gateway Link " , desc . getGuiLink ( ) , url . getProtocol ( ) , " Link to the GUI designed to operate with DataMiner " ) ) ;
} catch ( Throwable t ) {
log . warn ( " Unable to generate resource from gui Link : " + desc . getGuiLink ( ) , t ) ;
}
}
2019-04-02 19:31:57 +02:00
if ( desc . getWpsLink ( ) ! = null )
2019-06-07 17:00:47 +02:00
resources . add ( new CkanResource ( " WPS Link " , desc . getWpsLink ( ) , " WPS " , " WPS Link to the " + DataMinerCollectorProperties . getProperty ( DataMinerCollectorProperties . CKAN_RESOURCE_TYPE ) ) ) ;
2020-01-15 17:50:53 +01:00
2019-04-01 15:30:16 +02:00
}
2020-01-15 17:50:53 +01:00
2020-05-07 17:43:22 +02:00
@Setter
2019-04-01 15:30:16 +02:00
private String profile = profileXML ;
2020-01-15 17:50:53 +01:00
2019-04-01 15:30:16 +02:00
private CkanItem item = null ;
private ArrayList < CkanResource > resources = new ArrayList < > ( ) ;
2020-01-15 17:50:53 +01:00
2019-04-01 15:30:16 +02:00
@Override
public String toCatalogueFormat ( ) throws InternalConversionException {
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream ( ) ;
2020-01-15 17:50:53 +01:00
mapper . writeValue ( baos , this ) ;
return baos . toString ( ) ;
2019-04-01 15:30:16 +02:00
} catch ( Throwable t ) {
throw new InternalConversionException ( " Unable to convert " , t ) ;
}
}
static final String fixTag ( String toFix ) {
String fixedTag = toFix . replaceAll ( " : " , " " ) .
replaceAll ( " [ \\ ( \\ ) \\ \\ /] " , " - " ) . replaceAll ( " [’ '] " , " _ " ) ;
if ( fixedTag . length ( ) > 100 )
fixedTag = fixedTag . substring ( 0 , 96 ) + " ... " ;
return fixedTag . trim ( ) ;
}
2020-01-15 17:50:53 +01:00
2019-04-03 15:59:18 +02:00
static final String identityString ( UserIdentity id ) {
StringBuilder builder = new StringBuilder ( id . getLastName ( ) + " , " ) ;
builder . append ( id . getFirstName ( ) + " , " ) ;
if ( id . getEmail ( ) ! = null ) builder . append ( id . getEmail ( ) + " , " ) ;
if ( id . getOrcid ( ) ! = null ) builder . append ( id . getOrcid ( ) + " , " ) ;
return builder . toString ( ) . substring ( 0 , builder . lastIndexOf ( " , " ) ) ;
}
2019-04-01 15:30:16 +02:00
}