Skip to content

Commit c2e50b6

Browse files
committed
Add new event subclasses and improve auditing APIs
Add two abstract event types to easily identify events that affect the needs attention and troubled flags. Add new APIs for retrieving all the auditables that have an event of a given type. Use generic types.
1 parent e6124b7 commit c2e50b6

18 files changed

+376
-290
lines changed

gemma-core/src/main/java/ubic/gemma/core/analysis/report/ArrayDesignReportServiceImpl.java

+7-8
Original file line numberDiff line numberDiff line change
@@ -28,15 +28,14 @@
2828
import org.springframework.security.access.annotation.Secured;
2929
import org.springframework.stereotype.Component;
3030
import ubic.basecode.util.FileTools;
31-
import ubic.gemma.model.common.auditAndSecurity.Auditable;
31+
import ubic.gemma.core.config.Settings;
3232
import ubic.gemma.model.common.auditAndSecurity.AuditEvent;
3333
import ubic.gemma.model.common.auditAndSecurity.eventType.*;
3434
import ubic.gemma.model.expression.arrayDesign.ArrayDesign;
3535
import ubic.gemma.model.expression.arrayDesign.ArrayDesignValueObject;
3636
import ubic.gemma.persistence.service.common.auditAndSecurity.AuditEventService;
3737
import ubic.gemma.persistence.service.expression.arrayDesign.ArrayDesignService;
3838
import ubic.gemma.persistence.util.EntityUtils;
39-
import ubic.gemma.core.config.Settings;
4039

4140
import java.io.*;
4241
import java.util.*;
@@ -287,14 +286,14 @@ public void fillEventInformation( Collection<ArrayDesignValueObject> adVos ) {
287286

288287
Map<Long, ArrayDesign> idMap = EntityUtils.getIdMap( arrayDesigns );
289288

290-
Map<Class<? extends AuditEventType>, Map<Auditable, AuditEvent>> events = auditEventService
289+
Map<Class<? extends AuditEventType>, Map<ArrayDesign, AuditEvent>> events = auditEventService
291290
.getLastEvents( arrayDesigns, typesToGet );
292291

293-
Map<Auditable, AuditEvent> geneMappingEvents = events.get( ArrayDesignGeneMappingEvent.class );
294-
Map<Auditable, AuditEvent> sequenceUpdateEvents = events.get( ArrayDesignSequenceUpdateEvent.class );
295-
Map<Auditable, AuditEvent> sequenceAnalysisEvents = events.get( ArrayDesignSequenceAnalysisEvent.class );
296-
Map<Auditable, AuditEvent> repeatAnalysisEvents = events.get( ArrayDesignRepeatAnalysisEvent.class );
297-
Map<Auditable, AuditEvent> creationEvents = auditEventService.getCreateEvents( arrayDesigns );
292+
Map<ArrayDesign, AuditEvent> geneMappingEvents = events.get( ArrayDesignGeneMappingEvent.class );
293+
Map<ArrayDesign, AuditEvent> sequenceUpdateEvents = events.get( ArrayDesignSequenceUpdateEvent.class );
294+
Map<ArrayDesign, AuditEvent> sequenceAnalysisEvents = events.get( ArrayDesignSequenceAnalysisEvent.class );
295+
Map<ArrayDesign, AuditEvent> repeatAnalysisEvents = events.get( ArrayDesignRepeatAnalysisEvent.class );
296+
Map<ArrayDesign, AuditEvent> creationEvents = auditEventService.getCreateEvents( arrayDesigns );
298297

299298
for ( ArrayDesignValueObject adVo : adVos ) {
300299

gemma-core/src/main/java/ubic/gemma/core/analysis/report/ExpressionExperimentReportServiceImpl.java

+10-12
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,8 @@
3232
import org.springframework.transaction.annotation.Transactional;
3333
import ubic.gemma.core.visualization.ExperimentalDesignVisualizationService;
3434
import ubic.gemma.model.analysis.expression.diff.DifferentialExpressionAnalysisValueObject;
35-
import ubic.gemma.model.common.auditAndSecurity.Auditable;
3635
import ubic.gemma.model.common.auditAndSecurity.AuditEvent;
36+
import ubic.gemma.model.common.auditAndSecurity.Auditable;
3737
import ubic.gemma.model.common.auditAndSecurity.eventType.*;
3838
import ubic.gemma.model.expression.experiment.BatchEffectType;
3939
import ubic.gemma.model.expression.experiment.ExpressionExperiment;
@@ -195,16 +195,16 @@ public void populateEventInformation( Collection<ExpressionExperimentDetailsValu
195195
Map<Long, Date> lastArrayDesignUpdates = expressionExperimentService.getLastArrayDesignUpdate( ees );
196196
Collection<Class<? extends AuditEventType>> typesToGet = Arrays.asList( eventTypes );
197197

198-
Map<Class<? extends AuditEventType>, Map<Auditable, AuditEvent>> events = this.getEvents( ees, typesToGet );
198+
Map<Class<? extends AuditEventType>, Map<ExpressionExperiment, AuditEvent>> events = this.getEvents( ees, typesToGet );
199199

200-
Map<Auditable, AuditEvent> linkAnalysisEvents = events.get( LinkAnalysisEvent.class );
201-
Map<Auditable, AuditEvent> missingValueAnalysisEvents = events.get( MissingValueAnalysisEvent.class );
202-
Map<Auditable, AuditEvent> rankComputationEvents = events.get( ProcessedVectorComputationEvent.class );
200+
Map<ExpressionExperiment, AuditEvent> linkAnalysisEvents = events.get( LinkAnalysisEvent.class );
201+
Map<ExpressionExperiment, AuditEvent> missingValueAnalysisEvents = events.get( MissingValueAnalysisEvent.class );
202+
Map<ExpressionExperiment, AuditEvent> rankComputationEvents = events.get( ProcessedVectorComputationEvent.class );
203203

204-
Map<Auditable, AuditEvent> differentialAnalysisEvents = events.get( DifferentialExpressionAnalysisEvent.class );
205-
Map<Auditable, AuditEvent> batchFetchEvents = events.get( BatchInformationFetchingEvent.class );
206-
Map<Auditable, AuditEvent> batchMissingEvents = events.get( BatchInformationMissingEvent.class );
207-
Map<Auditable, AuditEvent> pcaAnalysisEvents = events.get( PCAAnalysisEvent.class );
204+
Map<ExpressionExperiment, AuditEvent> differentialAnalysisEvents = events.get( DifferentialExpressionAnalysisEvent.class );
205+
Map<ExpressionExperiment, AuditEvent> batchFetchEvents = events.get( BatchInformationFetchingEvent.class );
206+
Map<ExpressionExperiment, AuditEvent> batchMissingEvents = events.get( BatchInformationMissingEvent.class );
207+
Map<ExpressionExperiment, AuditEvent> pcaAnalysisEvents = events.get( PCAAnalysisEvent.class );
208208

209209
Map<Long, Collection<AuditEvent>> sampleRemovalEvents = this.getSampleRemovalEvents( ees );
210210

@@ -435,11 +435,9 @@ public void recalculateExperimentBatchInfo( ExpressionExperiment ee ) {
435435
}
436436
}
437437

438-
private Map<Class<? extends AuditEventType>, Map<Auditable, AuditEvent>> getEvents(
438+
private Map<Class<? extends AuditEventType>, Map<ExpressionExperiment, AuditEvent>> getEvents(
439439
Collection<ExpressionExperiment> ees, Collection<Class<? extends AuditEventType>> types ) {
440-
441440
return auditEventService.getLastEvents( ees, types );
442-
443441
}
444442

445443
private Map<Long, Collection<AuditEvent>> getSampleRemovalEvents( Collection<ExpressionExperiment> ees ) {

gemma-core/src/main/java/ubic/gemma/core/analysis/report/WhatsNewServiceImpl.java

+6-2
Original file line numberDiff line numberDiff line change
@@ -215,11 +215,15 @@ private WhatsNew getReportAsAnonymousUser( Date date ) {
215215
private WhatsNew getReport( Date date ) {
216216
WhatsNew wn = new WhatsNew( date );
217217

218-
Collection<Auditable> updatedObjects = auditEventService.getUpdatedSinceDate( date );
218+
Collection<Auditable> updatedObjects = new HashSet<>();
219+
updatedObjects.addAll( auditEventService.getUpdatedSinceDate( ArrayDesign.class, date ) );
220+
updatedObjects.addAll( auditEventService.getUpdatedSinceDate( ExpressionExperiment.class, date ) );
219221
wn.setUpdatedObjects( updatedObjects );
220222
WhatsNewServiceImpl.log.info( wn.getUpdatedObjects().size() + " updated objects since " + date );
221223

222-
Collection<Auditable> newObjects = auditEventService.getNewSinceDate( date );
224+
Collection<Auditable> newObjects = new HashSet<>();
225+
newObjects.addAll( auditEventService.getNewSinceDate( ArrayDesign.class, date ) );
226+
newObjects.addAll( auditEventService.getNewSinceDate( ExpressionExperiment.class, date ) );
223227
wn.setNewObjects( newObjects );
224228
WhatsNewServiceImpl.log.info( wn.getNewObjects().size() + " new objects since " + date );
225229

gemma-core/src/main/java/ubic/gemma/core/context/SpringContextUtils.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@
2727
import org.springframework.context.support.AbstractXmlApplicationContext;
2828
import org.springframework.context.support.ClassPathXmlApplicationContext;
2929
import org.springframework.security.core.context.SecurityContextHolder;
30-
import ubic.gemma.core.util.BuildInfo;
3130
import ubic.gemma.core.config.Settings;
31+
import ubic.gemma.core.util.BuildInfo;
3232

3333
import java.util.ArrayList;
3434
import java.util.Arrays;

gemma-core/src/main/java/ubic/gemma/model/common/auditAndSecurity/eventType/DoesNotNeedAttentionEvent.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
*
2828
* @author Paul
2929
*/
30-
public class DoesNotNeedAttentionEvent extends CurationDetailsEvent {
30+
public class DoesNotNeedAttentionEvent extends NeedsAttentionAlteringEvent {
3131

3232
/**
3333
* The serial version UID of this class. Needed for serialization.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package ubic.gemma.model.common.auditAndSecurity.eventType;
2+
3+
import ubic.gemma.model.common.auditAndSecurity.curation.CurationDetails;
4+
5+
/**
6+
* Base class for events altering {@link CurationDetails#getNeedsAttention()}.
7+
*/
8+
public abstract class NeedsAttentionAlteringEvent extends CurationDetailsEvent {
9+
}

gemma-core/src/main/java/ubic/gemma/model/common/auditAndSecurity/eventType/NeedsAttentionEvent.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
*
2929
* @author Paul
3030
*/
31-
public class NeedsAttentionEvent extends CurationDetailsEvent {
31+
public class NeedsAttentionEvent extends NeedsAttentionAlteringEvent {
3232

3333
/**
3434
* The serial version UID of this class. Needed for serialization.

gemma-core/src/main/java/ubic/gemma/model/common/auditAndSecurity/eventType/NotTroubledStatusFlagEvent.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
*
2727
* @author Paul
2828
*/
29-
public class NotTroubledStatusFlagEvent extends CurationDetailsEvent {
29+
public class NotTroubledStatusFlagEvent extends TroubledStatusFlagAlteringEvent {
3030

3131
/**
3232
* The serial version UID of this class. Needed for serialization.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package ubic.gemma.model.common.auditAndSecurity.eventType;
2+
3+
import ubic.gemma.model.common.auditAndSecurity.curation.CurationDetails;
4+
5+
/**
6+
* Base class for events that alter the {@link CurationDetails#getTroubled()} flag.
7+
* @author poirigui
8+
*/
9+
public abstract class TroubledStatusFlagAlteringEvent extends CurationDetailsEvent {
10+
}

gemma-core/src/main/java/ubic/gemma/model/common/auditAndSecurity/eventType/TroubledStatusFlagEvent.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
*
2727
* @author Paul
2828
*/
29-
public class TroubledStatusFlagEvent extends CurationDetailsEvent {
29+
public class TroubledStatusFlagEvent extends TroubledStatusFlagAlteringEvent {
3030

3131
/**
3232
* The serial version UID of this class. Needed for serialization.

gemma-core/src/main/java/ubic/gemma/persistence/service/common/auditAndSecurity/AuditEventDao.java

+33-26
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,12 @@
1818
*/
1919
package ubic.gemma.persistence.service.common.auditAndSecurity;
2020

21-
import ubic.gemma.model.common.auditAndSecurity.Auditable;
2221
import ubic.gemma.model.common.auditAndSecurity.AuditEvent;
22+
import ubic.gemma.model.common.auditAndSecurity.Auditable;
2323
import ubic.gemma.model.common.auditAndSecurity.eventType.AuditEventType;
2424
import ubic.gemma.persistence.service.BaseDao;
2525

26+
import javax.annotation.Nullable;
2627
import java.util.Collection;
2728
import java.util.Date;
2829
import java.util.List;
@@ -35,47 +36,53 @@
3536
public interface AuditEventDao extends BaseDao<AuditEvent> {
3637

3738
/**
38-
* @param auditable auditable
39-
* @return events for the given auditable.
39+
* Obtain the audit events associated to a given auditable.
40+
* <p>
41+
* Events are sorted by date in ascending order.
4042
*/
4143
List<AuditEvent> getEvents( Auditable auditable );
4244

4345
/**
44-
* @param auditable auditable
45-
* @param type type
46-
* @return the last AuditEvent of the specified type from the given auditable.
46+
* Obtain the creation events for the given auditables.
47+
* <p>
48+
* If an auditable has more than one creation event (which is in itself a bug), the earliest one is returned.
49+
*/
50+
<T extends Auditable> Map<T, AuditEvent> getCreateEvents( Collection<T> auditables );
51+
52+
/**
53+
* Obtain the latest event of a given type for a given auditable.
54+
* @see #getLastEvent(Auditable, Class)
4755
*/
56+
@Nullable
4857
AuditEvent getLastEvent( Auditable auditable, Class<? extends AuditEventType> type );
4958

5059
/**
51-
* Obtain the latest {@link AuditEvent} of a specified type, excluding a certain number of types.
60+
* Obtain the latest event of a given type, excluding a certain number of types.
61+
* @param type type of event to retrieve, augmented by its hierarchy
62+
* @param excludedTypes excluded event types (their hierarchy is also excluded)
5263
*/
64+
@Nullable
5365
AuditEvent getLastEvent( Auditable auditable, Class<? extends AuditEventType> type, Collection<Class<? extends AuditEventType>> excludedTypes );
5466

55-
Map<Class<? extends AuditEventType>, Map<Auditable, AuditEvent>> getLastEventsByType(
56-
Collection<? extends Auditable> auditables, Collection<Class<? extends AuditEventType>> types );
57-
5867
/**
59-
* Get auditables that have been Created since the given date
60-
*
61-
* @param date date
62-
* @return auditables
68+
* Obtain the latest events of a specified type for all given auditables.
69+
* @see #getLastEvent(Auditable, Class)
6370
*/
64-
Collection<Auditable> getNewSinceDate( Date date );
71+
<T extends Auditable> Map<T, AuditEvent> getLastEvents( Collection<T> auditables, Class<? extends AuditEventType> type );
6572

6673
/**
67-
* Get auditables that have been Updated since the given date
68-
*
69-
* @param date date
70-
* @return auditables
74+
* Obtain the latest events of a specified type for all auditable of a given type.
75+
* @see #getLastEvent(Auditable, Class)
7176
*/
72-
Collection<Auditable> getUpdatedSinceDate( Date date );
77+
<T extends Auditable> Map<T, AuditEvent> getLastEvents( Class<T> auditableClass, Class<? extends AuditEventType> type );
7378

74-
boolean hasEvent( Auditable a, Class<? extends AuditEventType> type );
75-
76-
void retainHavingEvent( Collection<? extends Auditable> a, Class<? extends AuditEventType> type );
77-
78-
void retainLackingEvent( Collection<? extends Auditable> a, Class<? extends AuditEventType> type );
79+
/**
80+
* Get auditables that have been created since the given date.
81+
*/
82+
<T extends Auditable> Collection<T> getNewSinceDate( Class<T> auditableClass, Date date );
7983

80-
Map<Auditable, AuditEvent> getCreateEvents( Collection<? extends Auditable> auditables );
84+
/**
85+
* Get auditables that have been updated since the given date.
86+
*/
87+
<T extends Auditable> Collection<T> getUpdatedSinceDate( Class<T> auditableClass, Date date );
8188
}

0 commit comments

Comments
 (0)