2023-10-20 15:48:55 +02:00
package eu.eudat.query ;
2023-10-23 10:16:58 +02:00
import eu.eudat.authorization.AuthorizationFlags ;
2023-11-08 17:42:52 +01:00
import eu.eudat.authorization.Permission ;
2023-11-02 12:45:32 +01:00
import eu.eudat.commons.enums.DmpAccessType ;
2023-10-23 10:31:07 +02:00
import eu.eudat.commons.enums.DmpStatus ;
2023-10-23 10:16:58 +02:00
import eu.eudat.commons.enums.IsActive ;
import eu.eudat.commons.scope.user.UserScope ;
2023-10-23 10:31:07 +02:00
import eu.eudat.data.DmpEntity ;
2023-11-08 17:42:52 +01:00
import eu.eudat.data.DmpUserEntity ;
2023-10-23 10:31:07 +02:00
import eu.eudat.model.Dmp ;
2023-11-08 17:42:52 +01:00
import eu.eudat.query.utils.BuildSubQueryInput ;
import eu.eudat.query.utils.QueryUtilsService ;
2023-10-23 10:16:58 +02:00
import gr.cite.commons.web.authz.service.AuthorizationService ;
2023-11-08 17:42:52 +01:00
import gr.cite.tools.data.query.* ;
2023-10-23 10:16:58 +02:00
import jakarta.persistence.Tuple ;
import jakarta.persistence.criteria.CriteriaBuilder ;
import jakarta.persistence.criteria.Predicate ;
2023-11-08 17:42:52 +01:00
import jakarta.persistence.criteria.Root ;
import jakarta.persistence.criteria.Subquery ;
2023-10-23 10:16:58 +02:00
import org.springframework.beans.factory.config.ConfigurableBeanFactory ;
import org.springframework.context.annotation.Scope ;
import org.springframework.stereotype.Component ;
import java.time.Instant ;
import java.util.* ;
@Component
@Scope ( value = ConfigurableBeanFactory . SCOPE_PROTOTYPE )
2023-10-23 10:31:07 +02:00
public class DmpQuery extends QueryBase < DmpEntity > {
2023-10-23 10:16:58 +02:00
private String like ;
private Collection < UUID > ids ;
2023-10-23 13:45:05 +02:00
private Collection < UUID > excludedIds ;
2023-10-23 10:16:58 +02:00
private Collection < IsActive > isActives ;
2023-10-23 10:31:07 +02:00
private Collection < DmpStatus > statuses ;
2023-10-23 10:16:58 +02:00
2023-10-23 13:45:05 +02:00
private Collection < Integer > versions ;
2023-10-23 10:16:58 +02:00
2023-11-02 17:12:36 +01:00
private Collection < UUID > groupIds ;
2023-10-23 10:16:58 +02:00
private EnumSet < AuthorizationFlags > authorize = EnumSet . of ( AuthorizationFlags . None ) ;
private final UserScope userScope ;
private final AuthorizationService authService ;
2023-11-08 17:42:52 +01:00
private final QueryUtilsService queryUtilsService ;
public DmpQuery ( UserScope userScope , AuthorizationService authService , QueryUtilsService queryUtilsService ) {
2023-10-23 10:16:58 +02:00
this . userScope = userScope ;
this . authService = authService ;
2023-11-08 17:42:52 +01:00
this . queryUtilsService = queryUtilsService ;
2023-10-23 10:16:58 +02:00
}
2023-10-23 10:31:07 +02:00
public DmpQuery like ( String value ) {
2023-10-23 10:16:58 +02:00
this . like = value ;
return this ;
}
2023-10-23 10:31:07 +02:00
public DmpQuery ids ( UUID value ) {
2023-10-23 10:16:58 +02:00
this . ids = List . of ( value ) ;
return this ;
}
2023-10-23 10:31:07 +02:00
public DmpQuery ids ( UUID . . . value ) {
2023-10-23 10:16:58 +02:00
this . ids = Arrays . asList ( value ) ;
return this ;
}
2023-10-23 10:31:07 +02:00
public DmpQuery ids ( Collection < UUID > values ) {
2023-10-23 10:16:58 +02:00
this . ids = values ;
return this ;
}
2023-10-23 13:45:05 +02:00
public DmpQuery excludedIds ( Collection < UUID > values ) {
this . excludedIds = values ;
return this ;
}
public DmpQuery excludedIds ( UUID value ) {
this . excludedIds = List . of ( value ) ;
return this ;
}
public DmpQuery excludedIds ( UUID . . . value ) {
this . excludedIds = Arrays . asList ( value ) ;
return this ;
}
2023-10-23 10:31:07 +02:00
public DmpQuery isActive ( IsActive value ) {
2023-10-23 10:16:58 +02:00
this . isActives = List . of ( value ) ;
return this ;
}
2023-10-23 10:31:07 +02:00
public DmpQuery isActive ( IsActive . . . value ) {
2023-10-23 10:16:58 +02:00
this . isActives = Arrays . asList ( value ) ;
return this ;
}
2023-10-23 10:31:07 +02:00
public DmpQuery isActive ( Collection < IsActive > values ) {
2023-10-23 10:16:58 +02:00
this . isActives = values ;
return this ;
}
2023-10-23 10:31:07 +02:00
public DmpQuery statuses ( DmpStatus value ) {
2023-10-23 10:16:58 +02:00
this . statuses = List . of ( value ) ;
return this ;
}
2023-10-23 10:31:07 +02:00
public DmpQuery statuses ( DmpStatus . . . value ) {
2023-10-23 10:16:58 +02:00
this . statuses = Arrays . asList ( value ) ;
return this ;
}
2023-10-23 10:31:07 +02:00
public DmpQuery statuses ( Collection < DmpStatus > values ) {
2023-10-23 10:16:58 +02:00
this . statuses = values ;
return this ;
}
2023-10-23 13:45:05 +02:00
public DmpQuery versions ( Integer value ) {
this . versions = List . of ( value ) ;
2023-10-23 10:16:58 +02:00
return this ;
}
2023-10-23 13:45:05 +02:00
public DmpQuery versions ( Integer . . . value ) {
this . versions = Arrays . asList ( value ) ;
2023-10-23 10:16:58 +02:00
return this ;
}
2023-10-23 13:45:05 +02:00
public DmpQuery versions ( Collection < Integer > values ) {
this . versions = values ;
2023-10-23 10:16:58 +02:00
return this ;
}
2023-11-02 17:12:36 +01:00
public DmpQuery groupIds ( UUID value ) {
this . groupIds = List . of ( value ) ;
return this ;
}
public DmpQuery groupIds ( UUID . . . value ) {
this . groupIds = Arrays . asList ( value ) ;
return this ;
}
public DmpQuery groupIds ( Collection < UUID > values ) {
this . groupIds = values ;
return this ;
}
2023-10-23 10:31:07 +02:00
public DmpQuery authorize ( EnumSet < AuthorizationFlags > values ) {
2023-10-23 10:16:58 +02:00
this . authorize = values ;
return this ;
}
@Override
protected Boolean isFalseQuery ( ) {
return this . isEmpty ( this . ids ) | | this . isEmpty ( this . isActives ) | | this . isEmpty ( this . excludedIds ) | | this . isEmpty ( this . statuses ) ;
}
@Override
2023-10-23 10:31:07 +02:00
protected Class < DmpEntity > entityClass ( ) {
return DmpEntity . class ;
2023-10-23 10:16:58 +02:00
}
2023-11-08 17:42:52 +01:00
@Override
protected < X , Y > Predicate applyAuthZ ( QueryContext < X , Y > queryContext ) {
if ( this . authorize . contains ( AuthorizationFlags . None ) ) return null ;
if ( this . authorize . contains ( AuthorizationFlags . Permission ) & & this . authService . authorize ( Permission . BrowseDmp ) ) return null ;
UUID userId = null ;
boolean usePublic = this . authorize . contains ( AuthorizationFlags . Public ) ;
if ( this . authorize . contains ( AuthorizationFlags . DmpAssociated ) ) userId = this . userScope . getUserIdSafe ( ) ;
List < Predicate > predicates = new ArrayList < > ( ) ;
if ( userId ! = null | | usePublic ) {
predicates . add ( queryContext . CriteriaBuilder . or (
2023-11-14 11:24:14 +01:00
usePublic ? queryContext . CriteriaBuilder . and (
queryContext . CriteriaBuilder . equal ( queryContext . Root . get ( DmpEntity . _status ) , DmpStatus . FINALISED ) ,
queryContext . CriteriaBuilder . equal ( queryContext . Root . get ( DmpEntity . _accessType ) , DmpAccessType . Public )
)
: queryContext . CriteriaBuilder . or ( ) , //Creates a false query
2023-11-08 17:42:52 +01:00
userId ! = null ? queryContext . CriteriaBuilder . in ( queryContext . Root . get ( DmpEntity . _id ) ) . value ( this . queryUtilsService . buildDmpUserAuthZSubQuery ( queryContext . Query , queryContext . CriteriaBuilder , userId ) ) : queryContext . CriteriaBuilder . or ( ) //Creates a false query
) ) ;
}
if ( predicates . size ( ) > 0 ) {
Predicate [ ] predicatesArray = predicates . toArray ( new Predicate [ 0 ] ) ;
return queryContext . CriteriaBuilder . and ( predicatesArray ) ;
} else {
return queryContext . CriteriaBuilder . or ( ) ; //Creates a false query
}
}
2023-10-23 10:16:58 +02:00
@Override
protected < X , Y > Predicate applyFilters ( QueryContext < X , Y > queryContext ) {
List < Predicate > predicates = new ArrayList < > ( ) ;
2023-10-23 13:45:05 +02:00
if ( this . like ! = null & & ! this . like . isEmpty ( ) ) {
predicates . add ( queryContext . CriteriaBuilder . like ( queryContext . Root . get ( DmpEntity . _label ) , this . like ) ) ;
}
2023-10-23 10:16:58 +02:00
if ( this . ids ! = null ) {
2023-10-23 10:31:07 +02:00
CriteriaBuilder . In < UUID > inClause = queryContext . CriteriaBuilder . in ( queryContext . Root . get ( DmpEntity . _id ) ) ;
2023-10-23 10:16:58 +02:00
for ( UUID item : this . ids )
inClause . value ( item ) ;
predicates . add ( inClause ) ;
2023-11-02 17:12:36 +01:00
}
if ( this . excludedIds ! = null ) {
2023-10-23 13:45:05 +02:00
CriteriaBuilder . In < UUID > notInClause = queryContext . CriteriaBuilder . in ( queryContext . Root . get ( DmpEntity . _id ) ) ;
for ( UUID item : this . excludedIds )
notInClause . value ( item ) ;
predicates . add ( notInClause . not ( ) ) ;
2023-10-23 10:16:58 +02:00
}
if ( this . isActives ! = null ) {
2023-10-23 10:31:07 +02:00
CriteriaBuilder . In < IsActive > inClause = queryContext . CriteriaBuilder . in ( queryContext . Root . get ( DmpEntity . _isActive ) ) ;
2023-10-23 10:16:58 +02:00
for ( IsActive item : this . isActives )
inClause . value ( item ) ;
predicates . add ( inClause ) ;
}
if ( this . statuses ! = null ) {
2023-10-23 10:31:07 +02:00
CriteriaBuilder . In < DmpStatus > inClause = queryContext . CriteriaBuilder . in ( queryContext . Root . get ( DmpEntity . _status ) ) ;
for ( DmpStatus item : this . statuses )
2023-10-23 10:16:58 +02:00
inClause . value ( item ) ;
predicates . add ( inClause ) ;
}
2023-10-23 13:45:05 +02:00
if ( this . versions ! = null ) {
CriteriaBuilder . In < Integer > inClause = queryContext . CriteriaBuilder . in ( queryContext . Root . get ( DmpEntity . _version ) ) ;
for ( Integer item : this . versions )
inClause . value ( item ) ;
predicates . add ( inClause ) ;
2023-10-23 10:16:58 +02:00
}
2023-11-02 17:12:36 +01:00
if ( this . groupIds ! = null ) {
CriteriaBuilder . In < UUID > inClause = queryContext . CriteriaBuilder . in ( queryContext . Root . get ( DmpEntity . _groupId ) ) ;
for ( UUID item : this . groupIds )
inClause . value ( item ) ;
predicates . add ( inClause ) ;
}
2023-10-23 10:16:58 +02:00
if ( ! predicates . isEmpty ( ) ) {
Predicate [ ] predicatesArray = predicates . toArray ( new Predicate [ 0 ] ) ;
return queryContext . CriteriaBuilder . and ( predicatesArray ) ;
} else {
return null ;
}
}
@Override
protected String fieldNameOf ( FieldResolver item ) {
2023-10-23 10:31:07 +02:00
if ( item . match ( Dmp . _id ) ) return DmpEntity . _id ;
else if ( item . match ( Dmp . _label ) ) return DmpEntity . _label ;
else if ( item . match ( Dmp . _version ) ) return DmpEntity . _version ;
else if ( item . match ( Dmp . _status ) ) return DmpEntity . _status ;
else if ( item . match ( Dmp . _properties ) ) return DmpEntity . _properties ;
else if ( item . match ( Dmp . _groupId ) ) return DmpEntity . _groupId ;
else if ( item . match ( Dmp . _description ) ) return DmpEntity . _description ;
else if ( item . match ( Dmp . _createdAt ) ) return DmpEntity . _createdAt ;
else if ( item . match ( Dmp . _updatedAt ) ) return DmpEntity . _updatedAt ;
else if ( item . match ( Dmp . _isActive ) ) return DmpEntity . _isActive ;
else if ( item . match ( Dmp . _finalizedAt ) ) return DmpEntity . _finalizedAt ;
2023-11-02 12:45:32 +01:00
else if ( item . match ( Dmp . _accessType ) ) return DmpEntity . _accessType ;
2023-11-06 12:31:01 +01:00
else if ( item . match ( Dmp . _creator ) ) return DmpEntity . _creator ;
2023-11-02 12:45:32 +01:00
else if ( item . match ( Dmp . _blueprint ) ) return DmpEntity . _blueprint ;
else if ( item . match ( Dmp . _language ) ) return DmpEntity . _language ;
else if ( item . match ( Dmp . _publicAfter ) ) return DmpEntity . _publicAfter ;
2023-10-23 10:16:58 +02:00
else return null ;
}
@Override
2023-10-23 10:31:07 +02:00
protected DmpEntity convert ( Tuple tuple , Set < String > columns ) {
DmpEntity item = new DmpEntity ( ) ;
item . setId ( QueryBase . convertSafe ( tuple , columns , DmpEntity . _id , UUID . class ) ) ;
item . setLabel ( QueryBase . convertSafe ( tuple , columns , DmpEntity . _label , String . class ) ) ;
2023-11-02 12:45:32 +01:00
item . setVersion ( QueryBase . convertSafe ( tuple , columns , DmpEntity . _version , Short . class ) ) ;
2023-10-23 10:31:07 +02:00
item . setStatus ( QueryBase . convertSafe ( tuple , columns , DmpEntity . _status , DmpStatus . class ) ) ;
item . setProperties ( QueryBase . convertSafe ( tuple , columns , DmpEntity . _properties , String . class ) ) ;
item . setGroupId ( QueryBase . convertSafe ( tuple , columns , DmpEntity . _groupId , UUID . class ) ) ;
item . setDescription ( QueryBase . convertSafe ( tuple , columns , DmpEntity . _description , String . class ) ) ;
item . setCreatedAt ( QueryBase . convertSafe ( tuple , columns , DmpEntity . _createdAt , Instant . class ) ) ;
item . setUpdatedAt ( QueryBase . convertSafe ( tuple , columns , DmpEntity . _updatedAt , Instant . class ) ) ;
item . setIsActive ( QueryBase . convertSafe ( tuple , columns , DmpEntity . _isActive , IsActive . class ) ) ;
item . setFinalizedAt ( QueryBase . convertSafe ( tuple , columns , DmpEntity . _finalizedAt , Instant . class ) ) ;
2023-11-02 12:45:32 +01:00
item . setAccessType ( QueryBase . convertSafe ( tuple , columns , DmpEntity . _accessType , DmpAccessType . class ) ) ;
2023-11-06 12:31:01 +01:00
item . setCreator ( QueryBase . convertSafe ( tuple , columns , DmpEntity . _creator , UUID . class ) ) ;
2023-11-02 12:45:32 +01:00
item . setBlueprint ( QueryBase . convertSafe ( tuple , columns , DmpEntity . _blueprint , UUID . class ) ) ;
item . setLanguage ( QueryBase . convertSafe ( tuple , columns , DmpEntity . _language , String . class ) ) ;
item . setPublicAfter ( QueryBase . convertSafe ( tuple , columns , DmpEntity . _publicAfter , Instant . class ) ) ;
2023-10-23 10:16:58 +02:00
return item ;
}
2023-10-20 15:48:55 +02:00
}