2021-03-08 09:56:23 +01:00
package org.gcube.informationsystem.resourceregistry.instances.multicontext ;
2021-09-16 15:23:04 +02:00
import java.net.URI ;
import java.util.List ;
2021-09-17 10:35:57 +02:00
import java.util.Set ;
2021-09-16 15:23:04 +02:00
import java.util.UUID ;
import org.gcube.informationsystem.model.impl.properties.HeaderImpl ;
import org.gcube.informationsystem.model.impl.properties.PropagationConstraintImpl ;
import org.gcube.informationsystem.model.reference.properties.Header ;
import org.gcube.informationsystem.model.reference.properties.PropagationConstraint ;
import org.gcube.informationsystem.model.reference.properties.PropagationConstraint.AddConstraint ;
import org.gcube.informationsystem.model.reference.properties.PropagationConstraint.RemoveConstraint ;
import org.gcube.informationsystem.resourceregistry.api.exceptions.AvailableInAnotherContextException ;
import org.gcube.informationsystem.resourceregistry.api.exceptions.NotFoundException ;
2021-03-08 09:56:23 +01:00
import org.gcube.informationsystem.resourceregistry.api.exceptions.schema.SchemaViolationException ;
import org.gcube.informationsystem.resourceregistry.contexts.ContextUtility ;
2021-09-16 17:23:13 +02:00
import org.gcube.informationsystem.resourceregistry.contexts.entities.ContextManagement ;
2021-03-08 09:56:23 +01:00
import org.gcube.informationsystem.resourceregistry.instances.ERManagementTest ;
import org.gcube.informationsystem.resourceregistry.instances.model.entities.FacetManagement ;
import org.gcube.informationsystem.resourceregistry.instances.model.relations.ConsistsOfManagement ;
2021-09-16 15:23:04 +02:00
import org.gcube.informationsystem.resourceregistry.instances.model.relations.IsRelatedToManagement ;
import org.gcube.informationsystem.utils.ElementMapper ;
import org.gcube.resourcemanagement.model.impl.entities.facets.ContactFacetImpl ;
import org.gcube.resourcemanagement.model.impl.entities.facets.CoverageFacetImpl ;
import org.gcube.resourcemanagement.model.impl.entities.facets.IdentifierFacetImpl ;
import org.gcube.resourcemanagement.model.impl.entities.resources.DatasetImpl ;
import org.gcube.resourcemanagement.model.impl.properties.ValueSchemaImpl ;
import org.gcube.resourcemanagement.model.impl.relations.consistsof.HasOwnerImpl ;
import org.gcube.resourcemanagement.model.impl.relations.consistsof.HasSpatialCoverageImpl ;
import org.gcube.resourcemanagement.model.impl.relations.consistsof.IsIdentifiedByImpl ;
import org.gcube.resourcemanagement.model.impl.relations.isrelatedto.IsCorrelatedToImpl ;
import org.gcube.resourcemanagement.model.reference.entities.facets.ContactFacet ;
import org.gcube.resourcemanagement.model.reference.entities.facets.CoverageFacet ;
import org.gcube.resourcemanagement.model.reference.entities.facets.IdentifierFacet ;
import org.gcube.resourcemanagement.model.reference.entities.facets.IdentifierFacet.IdentificationType ;
2021-03-08 09:56:23 +01:00
import org.gcube.resourcemanagement.model.reference.entities.facets.SoftwareFacet ;
2021-09-16 15:23:04 +02:00
import org.gcube.resourcemanagement.model.reference.entities.resources.Dataset ;
2021-03-08 09:56:23 +01:00
import org.gcube.resourcemanagement.model.reference.entities.resources.EService ;
2021-09-16 15:23:04 +02:00
import org.gcube.resourcemanagement.model.reference.properties.ValueSchema ;
import org.gcube.resourcemanagement.model.reference.relations.consistsof.HasCoverage ;
import org.gcube.resourcemanagement.model.reference.relations.consistsof.HasOwner ;
2021-03-08 09:56:23 +01:00
import org.gcube.resourcemanagement.model.reference.relations.consistsof.IsIdentifiedBy ;
2021-09-16 15:23:04 +02:00
import org.gcube.resourcemanagement.model.reference.relations.isrelatedto.IsCorrelatedTo ;
import org.junit.Assert ;
2021-03-08 09:56:23 +01:00
import org.junit.Test ;
2021-09-16 15:23:04 +02:00
import org.slf4j.Logger ;
import org.slf4j.LoggerFactory ;
2021-03-08 09:56:23 +01:00
2021-03-09 12:58:46 +01:00
public class AddToContextTest extends MultiContextTest {
2021-09-16 15:23:04 +02:00
private static Logger logger = LoggerFactory . getLogger ( AddToContextTest . class ) ;
2021-03-08 09:56:23 +01:00
@Test
public void testCreateEServiceAndRemoveFromContextRequiredFacet ( ) throws Exception {
2021-03-08 17:05:56 +01:00
EService eService = ERManagementTest . createEService ( ) ;
2021-03-08 09:56:23 +01:00
@SuppressWarnings ( " unchecked " )
2021-03-08 17:05:56 +01:00
IsIdentifiedBy < EService , SoftwareFacet > isIdentifiedBy = ( IsIdentifiedBy < EService , SoftwareFacet > ) eService . getConsistsOf ( IsIdentifiedBy . class ) . get ( 0 ) ;
2021-03-08 09:56:23 +01:00
ConsistsOfManagement consistsOfManagement = new ConsistsOfManagement ( ) ;
consistsOfManagement . setElementType ( IsIdentifiedBy . NAME ) ;
consistsOfManagement . setUUID ( isIdentifiedBy . getHeader ( ) . getUUID ( ) ) ;
try {
consistsOfManagement . removeFromContext ( ContextUtility . getCurrentSecurityContext ( ) . getUUID ( ) ) ;
throw new Exception ( " You should not be able to delete a mandatory ConsistsOf " ) ;
} catch ( SchemaViolationException e ) {
// As expected
} catch ( Exception e ) {
2021-03-08 17:05:56 +01:00
ERManagementTest . deleteResource ( eService ) ;
2021-03-08 09:56:23 +01:00
throw e ;
}
SoftwareFacet softwareFacet = isIdentifiedBy . getTarget ( ) ;
FacetManagement facetManagement = new FacetManagement ( ) ;
facetManagement . setElementType ( SoftwareFacet . NAME ) ;
facetManagement . setUUID ( softwareFacet . getHeader ( ) . getUUID ( ) ) ;
try {
facetManagement . removeFromContext ( ContextUtility . getCurrentSecurityContext ( ) . getUUID ( ) ) ;
throw new Exception ( " You should not be able to delete a mandatory Facet " ) ;
} catch ( SchemaViolationException e ) {
// As expected
} catch ( Exception e ) {
2021-03-08 17:05:56 +01:00
ERManagementTest . deleteResource ( eService ) ;
2021-03-08 09:56:23 +01:00
throw e ;
}
2021-03-08 17:05:56 +01:00
ERManagementTest . deleteResource ( eService ) ;
2021-03-08 09:56:23 +01:00
}
2021-09-16 15:23:04 +02:00
protected Dataset createDataset ( String id , String uuidString ) throws Exception {
Dataset dataset = new DatasetImpl ( ) ;
dataset . setHeader ( new HeaderImpl ( UUID . fromString ( uuidString ) ) ) ;
IdentifierFacet identifierFacet = new IdentifierFacetImpl ( ) ;
identifierFacet . setValue ( id ) ;
identifierFacet . setType ( IdentificationType . STRING ) ;
identifierFacet . setPersistent ( false ) ;
IsIdentifiedBy < Dataset , IdentifierFacet > isIdentifiedBy = new IsIdentifiedByImpl < > ( dataset , identifierFacet ) ;
dataset . addFacet ( isIdentifiedBy ) ;
ContactFacet contactFacet = new ContactFacetImpl ( ) ;
contactFacet . setTitle ( " Dr. " ) ;
contactFacet . setName ( " Luca " ) ;
contactFacet . setSurname ( " Frosini " ) ;
contactFacet . setEMail ( " luca.frosini@d4science.org " ) ;
HasOwner < Dataset , ContactFacet > hasOwner = new HasOwnerImpl < > ( dataset , contactFacet ) ;
dataset . addFacet ( hasOwner ) ;
CoverageFacet coverageFacet = new CoverageFacetImpl ( ) ;
ValueSchema coverage = new ValueSchemaImpl ( ) ;
coverage . setValue ( " Test " ) ;
coverage . setSchema ( new URI ( " String " ) ) ;
coverageFacet . setCoverage ( coverage ) ;
HasCoverage < Dataset , CoverageFacet > hasCoverage = new HasSpatialCoverageImpl < Dataset , CoverageFacet > ( dataset , coverageFacet ) ;
dataset . addFacet ( hasCoverage ) ;
try {
deleteResource ( dataset ) ;
} catch ( NotFoundException e ) {
// OK
logger . trace ( " OK " ) ;
}
return createResource ( dataset ) ;
}
protected PropagationConstraint getPropagationConstraint ( ) {
PropagationConstraint propagationConstraint = new PropagationConstraintImpl ( ) ;
propagationConstraint . setAddConstraint ( AddConstraint . propagate ) ;
propagationConstraint . setRemoveConstraint ( RemoveConstraint . cascade ) ;
return propagationConstraint ;
}
@SuppressWarnings ( " unchecked " )
2021-09-16 17:23:13 +02:00
protected IsCorrelatedTo < Dataset , Dataset > createIsCorrelatedTo ( Dataset source , Dataset target , String uuid ) throws Exception {
2021-09-16 15:23:04 +02:00
PropagationConstraint propagationConstraint = getPropagationConstraint ( ) ;
IsCorrelatedTo < Dataset , Dataset > isCorrelatedTo = new IsCorrelatedToImpl < Dataset , Dataset > ( source , target , propagationConstraint ) ;
2021-09-16 17:23:13 +02:00
isCorrelatedTo . setHeader ( new HeaderImpl ( UUID . fromString ( uuid ) ) ) ;
2021-09-16 15:23:04 +02:00
IsRelatedToManagement isRelatedToManagement = getIsRelatedToManagement ( isCorrelatedTo ) ;
String json = isRelatedToManagement . create ( ) ;
isCorrelatedTo = ElementMapper . unmarshal ( isCorrelatedTo . getClass ( ) , json ) ;
return isCorrelatedTo ;
}
2021-09-16 17:23:13 +02:00
protected void checkNumerOfContext ( Dataset datasetR1 , int r1Number , Dataset datasetR2 , int r2Number , Dataset datasetR3 , int r3Number ) throws Exception {
setContextByName ( GCUBE ) ;
ContextUtility . getHierarchicalMode ( ) . set ( true ) ;
ContextUtility . getIncludeInstanceContexts ( ) . set ( true ) ;
Dataset r1 = ElementMapper . unmarshal ( Dataset . class , getResourceManagement ( datasetR1 ) . read ( ) ) ;
@SuppressWarnings ( " unchecked " )
List < String > contextsR1 = ( List < String > ) r1 . getHeader ( ) . getAdditionalProperty ( Header . __CONTEXTS ) ;
Set < UUID > contextsR1UUID = org . gcube . informationsystem . resourceregistry . api . contexts . ContextUtility . getContextUUIDSet ( contextsR1 ) ;
Set < String > contextsR1Fullname = org . gcube . informationsystem . resourceregistry . api . contexts . ContextUtility . getContextFullNameSet ( contextsR1UUID ) ;
2021-09-17 10:35:57 +02:00
logger . info ( " Contexts of {} with UUID {} and Id {} are {} " , Dataset . NAME , r1 . getHeader ( ) . getUUID ( ) , ( ( IdentifierFacet ) r1 . getIdentificationFacets ( ) . get ( 0 ) ) . getValue ( ) , contextsR1Fullname ) ;
2021-09-16 17:23:13 +02:00
Assert . assertTrue ( contextsR1 . size ( ) = = r1Number ) ;
Dataset r2 = ElementMapper . unmarshal ( Dataset . class , getResourceManagement ( datasetR2 ) . read ( ) ) ;
@SuppressWarnings ( " unchecked " )
List < String > contextsR2 = ( List < String > ) r2 . getHeader ( ) . getAdditionalProperty ( Header . __CONTEXTS ) ;
Set < UUID > contextsR2UUID = org . gcube . informationsystem . resourceregistry . api . contexts . ContextUtility . getContextUUIDSet ( contextsR2 ) ;
Set < String > contextsR2Fullname = org . gcube . informationsystem . resourceregistry . api . contexts . ContextUtility . getContextFullNameSet ( contextsR2UUID ) ;
2021-09-17 10:35:57 +02:00
logger . info ( " Contexts of {} with UUID {} and Id {} are {} " , Dataset . NAME , r2 . getHeader ( ) . getUUID ( ) , ( ( IdentifierFacet ) r2 . getIdentificationFacets ( ) . get ( 0 ) ) . getValue ( ) , contextsR2Fullname ) ;
2021-09-16 17:23:13 +02:00
Assert . assertTrue ( contextsR2 . size ( ) = = r2Number ) ;
Dataset r3 = ElementMapper . unmarshal ( Dataset . class , getResourceManagement ( datasetR3 ) . read ( ) ) ;
@SuppressWarnings ( " unchecked " )
List < String > contextsR3 = ( List < String > ) r3 . getHeader ( ) . getAdditionalProperty ( Header . __CONTEXTS ) ;
Set < UUID > contextsR3UUID = org . gcube . informationsystem . resourceregistry . api . contexts . ContextUtility . getContextUUIDSet ( contextsR3 ) ;
Set < String > contextsR3Fullname = org . gcube . informationsystem . resourceregistry . api . contexts . ContextUtility . getContextFullNameSet ( contextsR3UUID ) ;
2021-09-17 10:35:57 +02:00
logger . info ( " Contexts of {} with UUID {} and Id {} are {} " , Dataset . NAME , r3 . getHeader ( ) . getUUID ( ) , ( ( IdentifierFacet ) r3 . getIdentificationFacets ( ) . get ( 0 ) ) . getValue ( ) , contextsR3Fullname ) ;
2021-09-16 17:23:13 +02:00
Assert . assertTrue ( contextsR3 . size ( ) = = r3Number ) ;
ContextUtility . getHierarchicalMode ( ) . set ( false ) ;
ContextUtility . getIncludeInstanceContexts ( ) . set ( false ) ;
}
2021-09-16 15:23:04 +02:00
@Test
public void testAddToContextFromDifferentSourceContext ( ) throws Exception {
setContextByName ( GCUBE ) ;
2021-09-17 10:35:57 +02:00
/* Needed to init context cache */
ContextManagement contextManagement = new ContextManagement ( ) ;
contextManagement . all ( false ) ;
2021-09-16 15:23:04 +02:00
Dataset datasetR1 = createDataset ( " R1 " , " da111111-dada-1111-1111-111111111111 " ) ;
Dataset datasetR2 = null ;
Dataset datasetR3 = null ;
try {
addToContextThenTestIfBehaveProperly ( datasetR1 , false , DEVNEXT ) ;
addToContextThenTestIfBehaveProperly ( datasetR1 , false , DEVSEC ) ;
setContextByName ( DEVNEXT ) ;
datasetR2 = createDataset ( " R2 " , " da222222-dada-2222-2222-222222222222 " ) ;
2021-09-16 17:23:13 +02:00
IsCorrelatedTo < Dataset , Dataset > isCorrelatedToR1R2 = createIsCorrelatedTo ( datasetR1 , datasetR2 , " da111111-1111-aaaa-2222-222222222222 " ) ;
2021-09-16 15:23:04 +02:00
getResourceManagement ( datasetR1 ) . exists ( ) ;
getIsRelatedToManagement ( isCorrelatedToR1R2 ) . exists ( ) ;
getResourceManagement ( datasetR2 ) . exists ( ) ;
setContextByName ( DEVSEC ) ;
datasetR3 = createDataset ( " R3 " , " da333333-dada-3333-3333-333333333333 " ) ;
2021-09-16 17:23:13 +02:00
IsCorrelatedTo < Dataset , Dataset > isCorrelatedToR1R3 = createIsCorrelatedTo ( datasetR1 , datasetR3 , " da111111-1111-aaaa-3333-333333333333 " ) ;
2021-09-16 15:23:04 +02:00
getResourceManagement ( datasetR1 ) . exists ( ) ;
getIsRelatedToManagement ( isCorrelatedToR1R3 ) . exists ( ) ;
getResourceManagement ( datasetR3 ) . exists ( ) ;
try {
getIsRelatedToManagement ( isCorrelatedToR1R2 ) . exists ( ) ;
} catch ( AvailableInAnotherContextException e ) {
// OK
logger . trace ( " As expected " ) ;
}
try {
getResourceManagement ( datasetR2 ) . exists ( ) ;
} catch ( AvailableInAnotherContextException e ) {
// OK
logger . trace ( " As expected " ) ;
}
setContextByName ( DEVNEXT ) ;
try {
getIsRelatedToManagement ( isCorrelatedToR1R3 ) . exists ( ) ;
} catch ( AvailableInAnotherContextException e ) {
// OK
logger . trace ( " As expected " ) ;
}
try {
getResourceManagement ( datasetR3 ) . exists ( ) ;
} catch ( AvailableInAnotherContextException e ) {
// OK
logger . trace ( " As expected " ) ;
}
setContextByName ( GCUBE ) ;
getResourceManagement ( datasetR1 ) . exists ( ) ;
try {
getIsRelatedToManagement ( isCorrelatedToR1R2 ) . exists ( ) ;
} catch ( AvailableInAnotherContextException e ) {
// OK
logger . trace ( " As expected " ) ;
}
try {
getResourceManagement ( datasetR2 ) . exists ( ) ;
} catch ( AvailableInAnotherContextException e ) {
// OK
logger . trace ( " As expected " ) ;
}
try {
getIsRelatedToManagement ( isCorrelatedToR1R3 ) . exists ( ) ;
} catch ( AvailableInAnotherContextException e ) {
// OK
logger . trace ( " As expected " ) ;
}
try {
getResourceManagement ( datasetR3 ) . exists ( ) ;
} catch ( AvailableInAnotherContextException e ) {
// OK
logger . trace ( " As expected " ) ;
}
2021-09-16 17:23:13 +02:00
checkNumerOfContext ( datasetR1 , 3 , datasetR2 , 1 , datasetR3 , 1 ) ;
2021-09-16 15:23:04 +02:00
2021-09-16 17:23:13 +02:00
setContextByName ( DEVNEXT ) ;
addToContextThenTestIfBehaveProperly ( datasetR1 , false , NEXTNEXT ) ;
checkNumerOfContext ( datasetR1 , 4 , datasetR2 , 2 , datasetR3 , 1 ) ;
2021-09-16 15:23:04 +02:00
2021-09-16 17:23:13 +02:00
setContextByName ( DEVSEC ) ;
addToContextThenTestIfBehaveProperly ( datasetR1 , false , DEVVRE ) ;
checkNumerOfContext ( datasetR1 , 5 , datasetR2 , 2 , datasetR3 , 2 ) ;
2021-09-16 15:23:04 +02:00
} catch ( Exception e ) {
logger . error ( " " , e ) ;
throw e ;
} finally {
ContextUtility . getHierarchicalMode ( ) . set ( false ) ;
ContextUtility . getIncludeInstanceContexts ( ) . set ( false ) ;
setContextByName ( GCUBE ) ;
deleteResource ( datasetR1 ) ;
if ( datasetR2 ! = null ) {
setContextByName ( DEVNEXT ) ;
deleteResource ( datasetR2 ) ;
}
if ( datasetR3 ! = null ) {
setContextByName ( DEVSEC ) ;
deleteResource ( datasetR3 ) ;
}
}
}
2021-03-08 09:56:23 +01:00
}