Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Sign in / Register
Toggle navigation
S
spring-boot
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
DEMO
spring-boot
Commits
44d81d43
Commit
44d81d43
authored
Jan 06, 2015
by
Phillip Webb
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch '1.1.x'
parents
1c518309
bd83aca6
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
102 additions
and
34 deletions
+102
-34
InMemoryAuditEventRepository.java
...work/boot/actuate/audit/InMemoryAuditEventRepository.java
+37
-24
InMemoryAuditEventRepositoryTests.java
...boot/actuate/audit/InMemoryAuditEventRepositoryTests.java
+65
-10
No files found.
spring-boot-actuator/src/main/java/org/springframework/boot/actuate/audit/InMemoryAuditEventRepository.java
View file @
44d81d43
...
...
@@ -16,54 +16,67 @@
package
org
.
springframework
.
boot
.
actuate
.
audit
;
import
java.util.ArrayList
;
import
java.util.Collections
;
import
java.util.Date
;
import
java.util.
HashMap
;
import
java.util.
LinkedList
;
import
java.util.List
;
import
java.util.Map
;
/**
* In-memory {@link AuditEventRepository} implementation.
*
* @author Dave Syer
* @author Phillip Webb
*/
public
class
InMemoryAuditEventRepository
implements
AuditEventRepository
{
private
int
capacity
=
1
00
;
private
static
final
int
DEFAULT_CAPACITY
=
40
00
;
private
final
Map
<
String
,
List
<
AuditEvent
>>
events
=
new
HashMap
<
String
,
List
<
AuditEvent
>>();
/**
* Circular buffer of the event with tail pointing to the last element.
*/
private
AuditEvent
[]
events
;
private
volatile
int
tail
=
-
1
;
public
InMemoryAuditEventRepository
()
{
this
(
DEFAULT_CAPACITY
);
}
public
InMemoryAuditEventRepository
(
int
capacity
)
{
this
.
events
=
new
AuditEvent
[
capacity
];
}
/**
* @param capacity the capacity to set
*/
public
void
setCapacity
(
int
capacity
)
{
this
.
capacity
=
capacity
;
public
synchronized
void
setCapacity
(
int
capacity
)
{
this
.
events
=
new
AuditEvent
[
capacity
]
;
}
@Override
public
List
<
AuditEvent
>
find
(
String
principal
,
Date
after
)
{
synchronized
(
this
.
events
)
{
return
Collections
.
unmodifiableList
(
getEvents
(
principal
));
public
synchronized
List
<
AuditEvent
>
find
(
String
principal
,
Date
after
)
{
LinkedList
<
AuditEvent
>
events
=
new
LinkedList
<
AuditEvent
>();
for
(
int
i
=
0
;
i
<
this
.
events
.
length
;
i
++)
{
int
index
=
((
this
.
tail
+
this
.
events
.
length
-
i
)
%
this
.
events
.
length
);
AuditEvent
event
=
this
.
events
[
index
];
if
(
event
==
null
)
{
break
;
}
if
(
isMatch
(
event
,
principal
,
after
))
{
events
.
addFirst
(
event
);
}
}
return
events
;
}
private
List
<
AuditEvent
>
getEvents
(
String
principal
)
{
if
(!
this
.
events
.
containsKey
(
principal
))
{
this
.
events
.
put
(
principal
,
new
ArrayList
<
AuditEvent
>());
}
return
this
.
events
.
get
(
principal
);
private
boolean
isMatch
(
AuditEvent
auditEvent
,
String
principal
,
Date
after
)
{
return
(
principal
==
null
||
auditEvent
.
getPrincipal
().
equals
(
principal
))
&&
(
after
==
null
||
auditEvent
.
getTimestamp
().
compareTo
(
after
)
>=
0
);
}
@Override
public
void
add
(
AuditEvent
event
)
{
synchronized
(
this
.
events
)
{
List
<
AuditEvent
>
list
=
getEvents
(
event
.
getPrincipal
());
while
(
list
.
size
()
>=
this
.
capacity
)
{
list
.
remove
(
0
);
}
list
.
add
(
event
);
}
public
synchronized
void
add
(
AuditEvent
event
)
{
this
.
tail
=
(
this
.
tail
+
1
)
%
this
.
events
.
length
;
this
.
events
[
this
.
tail
]
=
event
;
}
}
spring-boot-actuator/src/test/java/org/springframework/boot/actuate/audit/InMemoryAuditEventRepositoryTests.java
View file @
44d81d43
...
...
@@ -16,30 +16,85 @@
package
org
.
springframework
.
boot
.
actuate
.
audit
;
import
java.util.Calendar
;
import
java.util.Date
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.Map
;
import
org.junit.Test
;
import
static
org
.
junit
.
Assert
.
assertEquals
;
import
static
org
.
hamcrest
.
Matchers
.
equalTo
;
import
static
org
.
junit
.
Assert
.
assertThat
;
/**
* Tests for {@link InMemoryAuditEventRepository}.
*
* @author Dave Syer
* @author Phillip Webb
*/
public
class
InMemoryAuditEventRepositoryTests
{
private
final
InMemoryAuditEventRepository
repository
=
new
InMemoryAuditEventRepository
();
@Test
public
void
lessThanCapacity
()
throws
Exception
{
InMemoryAuditEventRepository
repository
=
new
InMemoryAuditEventRepository
();
repository
.
add
(
new
AuditEvent
(
"dave"
,
"a"
));
repository
.
add
(
new
AuditEvent
(
"dave"
,
"b"
));
List
<
AuditEvent
>
events
=
repository
.
find
(
"dave"
,
null
);
assertThat
(
events
.
size
(),
equalTo
(
2
));
assertThat
(
events
.
get
(
0
).
getType
(),
equalTo
(
"a"
));
assertThat
(
events
.
get
(
1
).
getType
(),
equalTo
(
"b"
));
}
@Test
public
void
capacity
()
throws
Exception
{
InMemoryAuditEventRepository
repository
=
new
InMemoryAuditEventRepository
(
2
);
repository
.
add
(
new
AuditEvent
(
"dave"
,
"a"
));
repository
.
add
(
new
AuditEvent
(
"dave"
,
"b"
));
repository
.
add
(
new
AuditEvent
(
"dave"
,
"c"
));
List
<
AuditEvent
>
events
=
repository
.
find
(
"dave"
,
null
);
assertThat
(
events
.
size
(),
equalTo
(
2
));
assertThat
(
events
.
get
(
0
).
getType
(),
equalTo
(
"b"
));
assertThat
(
events
.
get
(
1
).
getType
(),
equalTo
(
"c"
));
}
@Test
public
void
findByPrincipal
()
throws
Exception
{
InMemoryAuditEventRepository
repository
=
new
InMemoryAuditEventRepository
();
repository
.
add
(
new
AuditEvent
(
"dave"
,
"a"
));
repository
.
add
(
new
AuditEvent
(
"phil"
,
"b"
));
repository
.
add
(
new
AuditEvent
(
"dave"
,
"c"
));
repository
.
add
(
new
AuditEvent
(
"phil"
,
"d"
));
List
<
AuditEvent
>
events
=
repository
.
find
(
"dave"
,
null
);
assertThat
(
events
.
size
(),
equalTo
(
2
));
assertThat
(
events
.
get
(
0
).
getType
(),
equalTo
(
"a"
));
assertThat
(
events
.
get
(
1
).
getType
(),
equalTo
(
"c"
));
}
@Test
public
void
testAddToCapacity
()
throws
Exception
{
this
.
repository
.
setCapacity
(
2
);
this
.
repository
.
add
(
new
AuditEvent
(
"phil"
,
"UNKNOWN"
));
this
.
repository
.
add
(
new
AuditEvent
(
"phil"
,
"UNKNOWN"
));
this
.
repository
.
add
(
new
AuditEvent
(
"dave"
,
"UNKNOWN"
));
this
.
repository
.
add
(
new
AuditEvent
(
"dave"
,
"UNKNOWN"
));
this
.
repository
.
add
(
new
AuditEvent
(
"phil"
,
"UNKNOWN"
));
assertEquals
(
2
,
this
.
repository
.
find
(
"phil"
,
new
Date
(
0L
)).
size
());
public
void
findByDate
()
throws
Exception
{
Calendar
calendar
=
Calendar
.
getInstance
();
calendar
.
set
(
2000
,
1
,
1
,
0
,
0
,
0
);
calendar
.
set
(
Calendar
.
MILLISECOND
,
0
);
Map
<
String
,
Object
>
data
=
new
HashMap
<
String
,
Object
>();
InMemoryAuditEventRepository
repository
=
new
InMemoryAuditEventRepository
();
repository
.
add
(
new
AuditEvent
(
calendar
.
getTime
(),
"dave"
,
"a"
,
data
));
calendar
.
add
(
Calendar
.
DAY_OF_YEAR
,
1
);
repository
.
add
(
new
AuditEvent
(
calendar
.
getTime
(),
"phil"
,
"b"
,
data
));
calendar
.
add
(
Calendar
.
DAY_OF_YEAR
,
1
);
Date
after
=
calendar
.
getTime
();
repository
.
add
(
new
AuditEvent
(
calendar
.
getTime
(),
"dave"
,
"c"
,
data
));
calendar
.
add
(
Calendar
.
DAY_OF_YEAR
,
1
);
repository
.
add
(
new
AuditEvent
(
calendar
.
getTime
(),
"phil"
,
"d"
,
data
));
calendar
.
add
(
Calendar
.
DAY_OF_YEAR
,
1
);
List
<
AuditEvent
>
events
=
repository
.
find
(
null
,
after
);
assertThat
(
events
.
size
(),
equalTo
(
2
));
assertThat
(
events
.
get
(
0
).
getType
(),
equalTo
(
"c"
));
assertThat
(
events
.
get
(
1
).
getType
(),
equalTo
(
"d"
));
events
=
repository
.
find
(
"dave"
,
after
);
assertThat
(
events
.
size
(),
equalTo
(
1
));
assertThat
(
events
.
get
(
0
).
getType
(),
equalTo
(
"c"
));
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment