Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,17 @@
import org.apache.causeway.extensions.commandlog.applib.dom.mixins.CommandLogEntry_openResultObject;
import org.apache.causeway.extensions.commandlog.applib.dom.mixins.CommandLogEntry_siblingCommands;
import org.apache.causeway.extensions.commandlog.applib.dom.replay.CommandExportManager;
import org.apache.causeway.extensions.commandlog.applib.dom.replay.HasBaseline_changeBaseline;
import org.apache.causeway.extensions.commandlog.applib.dom.replay.CommandExportManager_exportSelected;
import org.apache.causeway.extensions.commandlog.applib.dom.replay.CommandExportManager_makeSelectedExportable;
import org.apache.causeway.extensions.commandlog.applib.dom.replay.HasBaseline_nextHour;
import org.apache.causeway.extensions.commandlog.applib.dom.replay.HasBaseline_previousHour;
import org.apache.causeway.extensions.commandlog.applib.dom.replay.CommandReplayManager;
import org.apache.causeway.extensions.commandlog.applib.dom.replay.CommandReplayManager_deleteSelectedPendingOrFailed;
import org.apache.causeway.extensions.commandlog.applib.dom.replay.CommandReplayManager_deleteSelectedSucceededOrExcluded;
import org.apache.causeway.extensions.commandlog.applib.dom.replay.CommandReplayManager_excludeSelectedFromReplay;
import org.apache.causeway.extensions.commandlog.applib.dom.replay.CommandReplayManager_importCommands;
import org.apache.causeway.extensions.commandlog.applib.dom.replay.CommandReplayManager_replayOrRetrySelected;
import org.apache.causeway.extensions.commandlog.applib.dom.replay.ReplayContext;
import org.apache.causeway.extensions.commandlog.applib.dom.replay.ReplayableCommand_delete;
import org.apache.causeway.extensions.commandlog.applib.dom.replay.ReplayableCommand_excludeFromReplay;
Expand Down Expand Up @@ -76,19 +86,17 @@
ReplayableCommand_replayOrRetry.class,
ReplayableCommand_excludeFromReplay.class,
ReplayableCommand_delete.class,
CommandExportManager.changeBaseline.class,
CommandExportManager.previousHour.class,
CommandExportManager.nextHour.class,
CommandExportManager.exportSelected.class,
CommandExportManager.makeSelectedExportable.class,
CommandReplayManager.changeBaseline.class,
CommandExportManager.previousHour.class,
CommandReplayManager.nextHour.class,
CommandReplayManager.importCommands.class,
CommandReplayManager.replayOrRetrySelected.class,
CommandReplayManager.excludeSelectedFromReplay.class,
CommandReplayManager.deleteSelectedSucceededOrExcluded.class,
CommandReplayManager.deleteSelectedPendingOrFailed.class,
HasBaseline_changeBaseline.class,
HasBaseline_previousHour.class,
HasBaseline_previousHour.class,
HasBaseline_nextHour.class,
CommandExportManager_exportSelected.class,
CommandExportManager_makeSelectedExportable.class,
CommandReplayManager_importCommands.class,
CommandReplayManager_replayOrRetrySelected.class,
CommandReplayManager_excludeSelectedFromReplay.class,
CommandReplayManager_deleteSelectedSucceededOrExcluded.class,
CommandReplayManager_deleteSelectedPendingOrFailed.class,

// @Component's
RunBackgroundCommandsJob.class,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,9 @@
import org.apache.causeway.extensions.commandlog.applib.dom.CommandLogEntry;
import org.apache.causeway.extensions.commandlog.applib.dom.CommandLogEntryRepository;
import org.apache.causeway.extensions.commandlog.applib.dom.replay.CommandExportManager;
import org.apache.causeway.extensions.commandlog.applib.dom.replay.CommandExportManager_changeLimit;
import org.apache.causeway.extensions.commandlog.applib.dom.replay.CommandReplayManager;
import org.apache.causeway.extensions.commandlog.applib.dom.replay.CommandReplayManager_importCommands;
import org.apache.causeway.extensions.commandlog.applib.dom.replay.ReplayContext;
import org.jspecify.annotations.NonNull;
import org.springframework.lang.Nullable;
Expand Down Expand Up @@ -90,7 +92,9 @@ public static abstract class ActionDomainEvent<T>
)
@ActionLayout(cssClassFa = "fa-bolt", sequence="10")
public class activeCommands {
public class DomainEvent extends ActionDomainEvent<activeCommands> { }
public class DomainEvent extends ActionDomainEvent<activeCommands> {
public DomainEvent() { }
}

@MemberSupport public List<? extends CommandLogEntry> act() {
return commandLogEntryRepository.findCurrent();
Expand Down Expand Up @@ -124,7 +128,9 @@ public class DomainEvent extends ActionDomainEvent<findMostRecent> { }
)
@ActionLayout(cssClassFa = "fa-search", sequence="30")
public class findCommands {
public class DomainEvent extends ActionDomainEvent<findCommands> { }
public class DomainEvent extends ActionDomainEvent<findCommands> {
public DomainEvent() { }
}

@MemberSupport public List<? extends CommandLogEntry> act(
final @Nullable LocalDate from,
Expand All @@ -151,7 +157,9 @@ public class DomainEvent extends ActionDomainEvent<findCommands> { }
)
@ActionLayout(cssClassFa = "fa-search", sequence="40")
public class findAll {
public class DomainEvent extends ActionDomainEvent<findAll> { }
public class DomainEvent extends ActionDomainEvent<findAll> {
public DomainEvent() { }
}

@MemberSupport public List<? extends CommandLogEntry> act() {
return commandLogEntryRepository.findAll();
Expand All @@ -167,13 +175,15 @@ public class DomainEvent extends ActionDomainEvent<findAll> { }
)
@ActionLayout(cssClassFa = "solid share-from-square", sequence="50")
public class exportManager {
public class DomainEvent extends ActionDomainEvent<exportManager> { }
public class DomainEvent extends ActionDomainEvent<exportManager> {
public DomainEvent() { }
}

@MemberSupport public CommandExportManager act(
@ParameterLayout(describedAs = "Limits the commands shown; only commands since this timestamp are available for export. Set to a time immediately before the commands to be replayed.")
final java.sql.Timestamp since
) {
return new CommandExportManager(since, replayContext);
) {
return new CommandExportManager(new CommandExportManager.State(since, CommandExportManager_changeLimit.MAX_LIMIT, CommandExportManager.Mode.EXPORT), replayContext);
}

@MemberSupport public java.sql.Timestamp defaultSince() {
Expand All @@ -191,7 +201,9 @@ public class DomainEvent extends ActionDomainEvent<exportManager> { }
)
@ActionLayout(cssClassFa = "solid circle-play", sequence="51")
public class replayManager {
public class DomainEvent extends ActionDomainEvent<replayManager> { }
public class DomainEvent extends ActionDomainEvent<replayManager> {
public DomainEvent() { }
}

@MemberSupport public CommandReplayManager act(
@Parameter(
Expand All @@ -207,8 +219,8 @@ public class DomainEvent extends ActionDomainEvent<replayManager> { }
.orElse(commandReplayManager);
}

private CommandReplayManager.importCommands importCommands(CommandReplayManager commandReplayManager) {
return factoryService.mixin(CommandReplayManager.importCommands.class, commandReplayManager);
private CommandReplayManager_importCommands importCommands(CommandReplayManager commandReplayManager) {
return factoryService.mixin(CommandReplayManager_importCommands.class, commandReplayManager);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,8 @@ public static class Nq {
public static final String FIND_MOST_RECENT_COMPLETED = LOGICAL_TYPE_NAME + ".findMostRecentCompleted";
public static final String FIND_FOREGROUND_BY_TIMESTAMP_AFTER_AND_REPLAY_STATE
= LOGICAL_TYPE_NAME + ".findForegroundByTimestampAfterAndReplayState";
public static final String FIND_FOREGROUND_BY_TIMESTAMP_BEFORE_AND_REPLAY_STATE
= LOGICAL_TYPE_NAME + ".findForegroundByTimestampBeforeAndReplayState";
public static final String FIND_FOREGROUND_BY_TIMESTAMP_AFTER_AND_REPLAY_STATES
= LOGICAL_TYPE_NAME + ".findForegroundByTimestampAfterAndReplayStates";
public static final String FIND_BACKGROUND_AND_NOT_YET_STARTED = LOGICAL_TYPE_NAME + ".findBackgroundAndNotYetStarted";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -122,9 +122,21 @@ List<CommandLogEntry> findByTargetAndFromAndTo(
*/
List<CommandLogEntry> findSince(final UUID interactionId, final Integer batchSize);

List<CommandLogEntry> findForegroundSinceTimestampAndCanBeExported(final Timestamp since);
default List<CommandLogEntry> findForegroundSinceTimestampAndCanBeExported(final Timestamp since) {
return findForegroundSinceTimestampAndCanBeExported(since, null);
}

List<CommandLogEntry> findForegroundSinceTimestampAndCanBeExported(final Timestamp since, final Integer limitIfAny);

List<CommandLogEntry> findForegroundBeforeTimestampAndCanBeExported(final Timestamp before, final Integer limitIfAny);

default List<CommandLogEntry> findForegroundSinceTimestampAndHasBeenExported(final Timestamp since) {
return findForegroundSinceTimestampAndHasBeenExported(since, null);
}

List<CommandLogEntry> findForegroundSinceTimestampAndHasBeenExported(final Timestamp since, final Integer limitIfAny);

List<CommandLogEntry> findForegroundSinceTimestampAndHasBeenExported(final Timestamp since);
List<CommandLogEntry> findForegroundBeforeTimestampAndHasBeenExported(final Timestamp before, final Integer limitIfAny);

/**
* Command Replay feature: Can replay or retry.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,8 @@

import javax.inject.Inject;
import javax.inject.Provider;


import org.apache.causeway.applib.query.NamedQuery;
import org.apache.causeway.applib.query.Query;
import org.apache.causeway.applib.query.QueryRange;
import org.apache.causeway.applib.services.bookmark.Bookmark;
Expand Down Expand Up @@ -388,32 +389,37 @@ private C findByInteractionIdElseNull(final UUID interactionId) {

private List<CommandLogEntry> findSince(
final Timestamp timestamp,
final Integer batchSize) {

// DN generates incorrect SQL for SQL Server if count set to 1; so we set to 2 and then trim
// XXX that's a historic workaround, should rather be fixed upstream
var needsTrimFix = batchSize != null && batchSize == 1;
final Integer batchSizeIfAny) {

var q = Query.named(commandLogEntryClass, CommandLogEntry.Nq.FIND_SINCE)
.withParameter("timestamp", timestamp)
.withRange(QueryRange.limit(
needsTrimFix ? 2L : batchSize
));
var query = Query.named(commandLogEntryClass, CommandLogEntry.Nq.FIND_SINCE)
.withParameter("timestamp", timestamp);

final List<CommandLogEntry> commandJdos = _Casts.uncheckedCast(repositoryService().allMatches(q));
return needsTrimFix && commandJdos.size() > 1
? commandJdos.subList(0,1)
: commandJdos;
return allMatches(query, batchSizeIfAny);
}

@Override
public List<CommandLogEntry> findForegroundSinceTimestampAndCanBeExported(final Timestamp since) {
return findForegroundSinceTimestampWithState(since, ReplayState.UNDEFINED);
return findForegroundSinceTimestampAndCanBeExported(since, null);
}

@Override
public List<CommandLogEntry> findForegroundSinceTimestampAndHasBeenExported(final Timestamp since) {
return findForegroundSinceTimestampWithState(since, ReplayState.EXPORTED);
public List<CommandLogEntry> findForegroundSinceTimestampAndCanBeExported(final Timestamp since, Integer batchSizeIfAny) {
return findForegroundSinceTimestampWithState(since, ReplayState.UNDEFINED, batchSizeIfAny);
}

@Override
public List<CommandLogEntry> findForegroundBeforeTimestampAndCanBeExported(final Timestamp before, Integer batchSizeIfAny) {
return findForegroundBeforeTimestampWithState(before, ReplayState.UNDEFINED, batchSizeIfAny);
}

@Override
public List<CommandLogEntry> findForegroundSinceTimestampAndHasBeenExported(final Timestamp since, Integer batchSizeIfAny) {
return findForegroundSinceTimestampWithState(since, ReplayState.EXPORTED, batchSizeIfAny);
}

@Override
public List<CommandLogEntry> findForegroundBeforeTimestampAndHasBeenExported(final Timestamp before, Integer batchSizeIfAny) {
return findForegroundBeforeTimestampWithState(before, ReplayState.EXPORTED, batchSizeIfAny);
}

@Override
Expand All @@ -429,14 +435,23 @@ public List<CommandLogEntry> findSinceAndWithReplayOkOrExcluded(final Timestamp
return findForegroundSinceTimestampWithStates(since, ReplayState.OK, ReplayState.EXCLUDED);
}

private List<CommandLogEntry> findForegroundSinceTimestampWithState(Timestamp from, ReplayState replayState) {
return _Casts.uncheckedCast(
repositoryService().allMatches(
Query.named(commandLogEntryClass, CommandLogEntry.Nq.FIND_FOREGROUND_BY_TIMESTAMP_AFTER_AND_REPLAY_STATE)
.withParameter("from", from)
.withParameter("replayState", replayState)));
private List<CommandLogEntry> findForegroundSinceTimestampWithState(Timestamp from, ReplayState replayState, Integer batchSizeIfAny) {
var query = Query.named(commandLogEntryClass, CommandLogEntry.Nq.FIND_FOREGROUND_BY_TIMESTAMP_AFTER_AND_REPLAY_STATE)
.withParameter("from", from)
.withParameter("replayState", replayState);

return allMatches(query, batchSizeIfAny);
}

private List<CommandLogEntry> findForegroundBeforeTimestampWithState(Timestamp to, ReplayState replayState, Integer batchSizeIfAny) {
var query = Query.named(commandLogEntryClass, CommandLogEntry.Nq.FIND_FOREGROUND_BY_TIMESTAMP_BEFORE_AND_REPLAY_STATE)
.withParameter("to", to)
.withParameter("replayState", replayState);

return allMatches(query, batchSizeIfAny);
}


private List<CommandLogEntry> findForegroundSinceTimestampWithStates(Timestamp from, ReplayState replayState1, ReplayState replayState2) {
return _Casts.uncheckedCast(
repositoryService().allMatches(
Expand All @@ -461,6 +476,23 @@ private static Timestamp toTimestampStartOfDayWithOffset(
: null;
}

private List<CommandLogEntry> allMatches(NamedQuery<C> query, Integer batchSizeIfAny) {

// DN generates incorrect SQL for SQL Server if count set to 1; so we set to 2 and then trim
// XXX that's a historic workaround, should rather be fixed upstream
var needsTrimFix = batchSizeIfAny != null && batchSizeIfAny == 1;

if(batchSizeIfAny != null) {
query = query.withRange(QueryRange.limit(needsTrimFix ? 2L : batchSizeIfAny));
}

final List<CommandLogEntry> commandLogEntries = _Casts.uncheckedCast(repositoryService().allMatches(query));
return needsTrimFix && commandLogEntries.size() > 1
? commandLogEntries.subList(0, 1)
: commandLogEntries;
}


/**
* intended for testing purposes only
*/
Expand Down
Loading
Loading