Set a time of 23:59:59:999 in JpaEventQuery.toDate so that events from that date are properly returned in searches
Closes #30414 Signed-off-by: Stefan Guilhen <sguilhen@redhat.com>
This commit is contained in:
parent
e3f8e70f61
commit
db846a792d
2 changed files with 55 additions and 25 deletions
|
@ -28,7 +28,9 @@ import jakarta.persistence.criteria.CriteriaQuery;
|
||||||
import jakarta.persistence.criteria.Predicate;
|
import jakarta.persistence.criteria.Predicate;
|
||||||
import jakarta.persistence.criteria.Root;
|
import jakarta.persistence.criteria.Root;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Calendar;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
import java.util.GregorianCalendar;
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
|
@ -95,7 +97,13 @@ public class JpaEventQuery implements EventQuery {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public EventQuery toDate(Date toDate) {
|
public EventQuery toDate(Date toDate) {
|
||||||
predicates.add(cb.lessThanOrEqualTo(root.<Long>get("time"), toDate.getTime()));
|
Calendar calendar = new GregorianCalendar();
|
||||||
|
calendar.setTime(toDate);
|
||||||
|
calendar.set(Calendar.HOUR_OF_DAY, 23);
|
||||||
|
calendar.set(Calendar.MINUTE, 59);
|
||||||
|
calendar.set(Calendar.SECOND, 59);
|
||||||
|
calendar.set(Calendar.MILLISECOND, 999);
|
||||||
|
predicates.add(cb.lessThanOrEqualTo(root.<Long>get("time"), calendar.getTimeInMillis()));
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -21,12 +21,10 @@ import org.apache.commons.lang3.StringUtils;
|
||||||
import org.hamcrest.Matchers;
|
import org.hamcrest.Matchers;
|
||||||
import org.junit.After;
|
import org.junit.After;
|
||||||
import org.junit.Assert;
|
import org.junit.Assert;
|
||||||
import org.junit.Assume;
|
|
||||||
import org.junit.Rule;
|
import org.junit.Rule;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.keycloak.events.Errors;
|
import org.keycloak.events.Errors;
|
||||||
import org.keycloak.events.EventBuilder;
|
import org.keycloak.events.EventBuilder;
|
||||||
import org.keycloak.events.EventStoreProvider;
|
|
||||||
import org.keycloak.events.EventType;
|
import org.keycloak.events.EventType;
|
||||||
import org.keycloak.models.RealmModel;
|
import org.keycloak.models.RealmModel;
|
||||||
import org.keycloak.representations.idm.EventRepresentation;
|
import org.keycloak.representations.idm.EventRepresentation;
|
||||||
|
@ -35,11 +33,14 @@ import org.keycloak.testsuite.AssertEvents;
|
||||||
|
|
||||||
import java.text.ParseException;
|
import java.text.ParseException;
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
|
import java.util.Calendar;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
import java.util.GregorianCalendar;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Random;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
|
* @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
|
||||||
|
@ -120,26 +121,19 @@ public class EventStoreProviderTest extends AbstractEventsTest {
|
||||||
String d08 = "2015-03-08";
|
String d08 = "2015-03-08";
|
||||||
String d10 = "2015-03-10";
|
String d10 = "2015-03-10";
|
||||||
|
|
||||||
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
|
Calendar date04 = this.createFromDate(d04);
|
||||||
Date date04 = null, date05 = null, date06 = null, date07 = null;
|
Calendar date05 = this.createFromDate(d05);
|
||||||
|
Calendar date06 = this.createFromDate(d06);
|
||||||
|
Calendar date07 = this.createFromDate(d07);
|
||||||
|
|
||||||
try {
|
testing().onEvent(create(date04, EventType.LOGIN, realmId, "clientId", "userId", "error"));
|
||||||
date04 = formatter.parse(d04);
|
testing().onEvent(create(date04, EventType.LOGIN, realmId, "clientId", "userId", "error"));
|
||||||
date05 = formatter.parse(d05);
|
testing().onEvent(create(date05, EventType.REGISTER, realmId, "clientId", "userId", "error"));
|
||||||
date06 = formatter.parse(d06);
|
testing().onEvent(create(date05, EventType.REGISTER, realmId, "clientId", "userId", "error"));
|
||||||
date07 = formatter.parse(d07);
|
testing().onEvent(create(date06, EventType.CODE_TO_TOKEN, realmId, "clientId", "userId2", "error"));
|
||||||
} catch (ParseException e) {
|
testing().onEvent(create(date06, EventType.LOGOUT, realmId, "clientId", "userId2", "error"));
|
||||||
e.printStackTrace();
|
testing().onEvent(create(date07, EventType.UPDATE_PROFILE, realmId2, "clientId2", "userId2", "error"));
|
||||||
}
|
testing().onEvent(create(date07, EventType.UPDATE_EMAIL, realmId2, "clientId2", "userId2", "error"));
|
||||||
|
|
||||||
testing().onEvent(create(date04, EventType.LOGIN, realmId, "clientId", "userId", "127.0.0.1", "error"));
|
|
||||||
testing().onEvent(create(date04, EventType.LOGIN, realmId, "clientId", "userId", "127.0.0.1", "error"));
|
|
||||||
testing().onEvent(create(date05, EventType.REGISTER, realmId, "clientId", "userId", "127.0.0.1", "error"));
|
|
||||||
testing().onEvent(create(date05, EventType.REGISTER, realmId, "clientId", "userId", "127.0.0.1", "error"));
|
|
||||||
testing().onEvent(create(date06, EventType.CODE_TO_TOKEN, realmId, "clientId", "userId2", "127.0.0.1", "error"));
|
|
||||||
testing().onEvent(create(date06, EventType.LOGOUT, realmId, "clientId", "userId2", "127.0.0.1", "error"));
|
|
||||||
testing().onEvent(create(date07, EventType.UPDATE_PROFILE, realmId2, "clientId2", "userId2", "127.0.0.1", "error"));
|
|
||||||
testing().onEvent(create(date07, EventType.UPDATE_EMAIL, realmId2, "clientId2", "userId2", "127.0.0.1", "error"));
|
|
||||||
|
|
||||||
Assert.assertEquals(6, testing().queryEvents(realmId, null, "clientId", null, null, null, null, null, null).size());
|
Assert.assertEquals(6, testing().queryEvents(realmId, null, "clientId", null, null, null, null, null, null).size());
|
||||||
Assert.assertEquals(2, testing().queryEvents(realmId2, null, "clientId2", null, null, null, null, null, null).size());
|
Assert.assertEquals(2, testing().queryEvents(realmId2, null, "clientId2", null, null, null, null, null, null).size());
|
||||||
|
@ -168,6 +162,7 @@ public class EventStoreProviderTest extends AbstractEventsTest {
|
||||||
Assert.assertEquals(0, testing().queryEvents(realmId2, null, null, null, d08, null, null, null, null).size());
|
Assert.assertEquals(0, testing().queryEvents(realmId2, null, null, null, d08, null, null, null, null).size());
|
||||||
Assert.assertEquals(0, testing().queryEvents(realmId2, null, null, null, null, d03, null, null, null).size());
|
Assert.assertEquals(0, testing().queryEvents(realmId2, null, null, null, null, d03, null, null, null).size());
|
||||||
|
|
||||||
|
Assert.assertEquals(2, testing().queryEvents(realmId, null, null, null, d04, d04, null, null, null).size());
|
||||||
Assert.assertEquals(6, testing().queryEvents(realmId, null, null, null, d04, d07, null, null, null).size());
|
Assert.assertEquals(6, testing().queryEvents(realmId, null, null, null, d04, d07, null, null, null).size());
|
||||||
Assert.assertEquals(2, testing().queryEvents(realmId2, null, null, null, d04, d07, null, null, null).size());
|
Assert.assertEquals(2, testing().queryEvents(realmId2, null, null, null, d04, d07, null, null, null).size());
|
||||||
Assert.assertEquals(4, testing().queryEvents(realmId, null, null, null, d05, d07, null, null, null).size());
|
Assert.assertEquals(4, testing().queryEvents(realmId, null, null, null, d05, d07, null, null, null).size());
|
||||||
|
@ -304,8 +299,8 @@ public class EventStoreProviderTest extends AbstractEventsTest {
|
||||||
return create(System.currentTimeMillis(), event, realmId, clientId, userId, ipAddress, error);
|
return create(System.currentTimeMillis(), event, realmId, clientId, userId, ipAddress, error);
|
||||||
}
|
}
|
||||||
|
|
||||||
private EventRepresentation create(Date date, EventType event, String realmId, String clientId, String userId, String ipAddress, String error) {
|
private EventRepresentation create(Calendar date, EventType event, String realmId, String clientId, String userId, String error) {
|
||||||
return create(date.getTime(), event, realmId, clientId, userId, ipAddress, error);
|
return create(date.getTimeInMillis(), event, realmId, clientId, userId, "127.0.0.1", error);
|
||||||
}
|
}
|
||||||
|
|
||||||
private EventRepresentation create(long time, EventType event, String realmId, String clientId, String userId, String ipAddress, String error) {
|
private EventRepresentation create(long time, EventType event, String realmId, String clientId, String userId, String ipAddress, String error) {
|
||||||
|
@ -327,4 +322,31 @@ public class EventStoreProviderTest extends AbstractEventsTest {
|
||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a {@link Calendar} from the specified date string, which must be in the {@code yyyy-MM-dd} format. Once
|
||||||
|
* the date is parsed, this method creates a {@link Calendar} instance and sets a random time within that date.
|
||||||
|
*
|
||||||
|
* @param dateString a string representing a date in the format {@code yyyy-MM-dd}
|
||||||
|
* @return the {@link Calendar} representing the date with a random time set to it, or {@code null} if the specified
|
||||||
|
* date string is not in the expected format.
|
||||||
|
*/
|
||||||
|
private Calendar createFromDate(String dateString) {
|
||||||
|
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
|
||||||
|
Random random = new Random();
|
||||||
|
Calendar result = null;
|
||||||
|
try {
|
||||||
|
Date date = formatter.parse(dateString);
|
||||||
|
result = new GregorianCalendar();
|
||||||
|
result.setTime(date);
|
||||||
|
result.set(Calendar.HOUR_OF_DAY, random.nextInt(0, 24));
|
||||||
|
result.set(Calendar.MINUTE, random.nextInt(0, 60));
|
||||||
|
result.set(Calendar.SECOND, random.nextInt(0, 60));
|
||||||
|
result.set(Calendar.MILLISECOND, random.nextInt(0, 1000));
|
||||||
|
} catch (ParseException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue