Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
ARSnova Backend
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Jobs
Commits
Open sidebar
Moritz Lambrecht
ARSnova Backend
Commits
f9f568a8
Commit
f9f568a8
authored
Sep 26, 2017
by
Daniel Gerhardt
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Extract interface from EntityService
parent
13e18671
Changes
11
Hide whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
98 additions
and
64 deletions
+98
-64
src/main/java/de/thm/arsnova/services/CommentService.java
src/main/java/de/thm/arsnova/services/CommentService.java
+1
-1
src/main/java/de/thm/arsnova/services/CommentServiceImpl.java
...main/java/de/thm/arsnova/services/CommentServiceImpl.java
+1
-1
src/main/java/de/thm/arsnova/services/ContentService.java
src/main/java/de/thm/arsnova/services/ContentService.java
+1
-1
src/main/java/de/thm/arsnova/services/ContentServiceImpl.java
...main/java/de/thm/arsnova/services/ContentServiceImpl.java
+1
-1
src/main/java/de/thm/arsnova/services/DefaultEntityServiceImpl.java
...ava/de/thm/arsnova/services/DefaultEntityServiceImpl.java
+80
-0
src/main/java/de/thm/arsnova/services/EntityService.java
src/main/java/de/thm/arsnova/services/EntityService.java
+7
-52
src/main/java/de/thm/arsnova/services/MotdService.java
src/main/java/de/thm/arsnova/services/MotdService.java
+1
-1
src/main/java/de/thm/arsnova/services/MotdServiceImpl.java
src/main/java/de/thm/arsnova/services/MotdServiceImpl.java
+1
-1
src/main/java/de/thm/arsnova/services/SessionService.java
src/main/java/de/thm/arsnova/services/SessionService.java
+1
-1
src/main/java/de/thm/arsnova/services/SessionServiceImpl.java
...main/java/de/thm/arsnova/services/SessionServiceImpl.java
+1
-2
src/test/java/de/thm/arsnova/services/DefaultEntityServiceImplTest.java
...de/thm/arsnova/services/DefaultEntityServiceImplTest.java
+3
-3
No files found.
src/main/java/de/thm/arsnova/services/CommentService.java
View file @
f9f568a8
...
...
@@ -6,7 +6,7 @@ import de.thm.arsnova.entities.User;
import
java.util.List
;
public
interface
CommentService
{
public
interface
CommentService
extends
EntityService
<
Comment
>
{
boolean
save
(
Comment
comment
);
int
count
(
String
sessionKey
);
...
...
src/main/java/de/thm/arsnova/services/CommentServiceImpl.java
View file @
f9f568a8
...
...
@@ -24,7 +24,7 @@ import java.util.List;
* Performs all comment related operations.
*/
@Service
public
class
CommentServiceImpl
extends
EntityService
<
Comment
>
implements
CommentService
,
ApplicationEventPublisherAware
{
public
class
CommentServiceImpl
extends
DefaultEntityServiceImpl
<
Comment
>
implements
CommentService
,
ApplicationEventPublisherAware
{
private
UserService
userService
;
private
CommentRepository
commentRepository
;
...
...
src/main/java/de/thm/arsnova/services/ContentService.java
View file @
f9f568a8
...
...
@@ -27,7 +27,7 @@ import java.util.Map;
/**
* The functionality the question service should provide.
*/
public
interface
ContentService
{
public
interface
ContentService
extends
EntityService
<
Content
>
{
Content
save
(
Content
content
);
Content
get
(
String
id
);
...
...
src/main/java/de/thm/arsnova/services/ContentServiceImpl.java
View file @
f9f568a8
...
...
@@ -63,7 +63,7 @@ import java.util.stream.Collectors;
* Performs all content and answer related operations.
*/
@Service
public
class
ContentServiceImpl
extends
EntityService
<
Content
>
implements
ContentService
,
ApplicationEventPublisherAware
{
public
class
ContentServiceImpl
extends
DefaultEntityServiceImpl
<
Content
>
implements
ContentService
,
ApplicationEventPublisherAware
{
private
UserService
userService
;
private
LogEntryRepository
dbLogger
;
...
...
src/main/java/de/thm/arsnova/services/DefaultEntityServiceImpl.java
0 → 100644
View file @
f9f568a8
package
de.thm.arsnova.services
;
import
com.fasterxml.jackson.databind.JsonNode
;
import
com.fasterxml.jackson.databind.ObjectMapper
;
import
com.fasterxml.jackson.databind.ObjectReader
;
import
de.thm.arsnova.entities.Entity
;
import
de.thm.arsnova.entities.serialization.View
;
import
org.springframework.data.repository.CrudRepository
;
import
org.springframework.security.access.prepost.PreAuthorize
;
import
org.springframework.security.access.prepost.PreFilter
;
import
java.io.IOException
;
import
java.util.Collection
;
import
java.util.Map
;
public
class
DefaultEntityServiceImpl
<
T
extends
Entity
>
implements
EntityService
<
T
>
{
protected
Class
<
T
>
type
;
protected
CrudRepository
<
T
,
String
>
repository
;
private
ObjectMapper
objectMapper
;
public
DefaultEntityServiceImpl
(
Class
<
T
>
type
,
CrudRepository
<
T
,
String
>
repository
,
ObjectMapper
objectMapper
)
{
this
.
type
=
type
;
this
.
repository
=
repository
;
this
.
objectMapper
=
objectMapper
;
}
@Override
@PreAuthorize
(
"hasPermission(#id, #this.this.getTypeName(), 'read')"
)
public
T
get
(
final
String
id
)
{
return
repository
.
findOne
(
id
);
}
@Override
@PreAuthorize
(
"hasPermission(#entity, 'create')"
)
public
T
create
(
final
T
entity
)
{
if
(
entity
.
getId
()
!=
null
||
entity
.
getRevision
()
!=
null
)
{
throw
new
IllegalArgumentException
(
"Entity is not new."
);
}
return
repository
.
save
(
entity
);
}
@Override
@PreAuthorize
(
"hasPermission(#oldEntity, 'update')"
)
public
T
update
(
final
T
oldEntity
,
final
T
newEntity
)
{
newEntity
.
setId
(
oldEntity
.
getId
());
return
repository
.
save
(
newEntity
);
}
@Override
@PreAuthorize
(
"hasPermission(#entity, 'update')"
)
public
T
patch
(
final
T
entity
,
final
Map
<
String
,
Object
>
changes
)
throws
IOException
{
ObjectReader
reader
=
objectMapper
.
readerForUpdating
(
entity
).
withView
(
View
.
Public
.
class
);
JsonNode
tree
=
objectMapper
.
valueToTree
(
changes
);
reader
.
readValue
(
tree
);
return
repository
.
save
(
entity
);
}
@Override
@PreFilter
(
value
=
"hasPermission(filterObject, 'update')"
,
filterTarget
=
"entities"
)
public
Iterable
<
T
>
patch
(
final
Collection
<
T
>
entities
,
final
Map
<
String
,
Object
>
changes
)
throws
IOException
{
JsonNode
tree
=
objectMapper
.
valueToTree
(
changes
);
for
(
T
entity
:
entities
)
{
ObjectReader
reader
=
objectMapper
.
readerForUpdating
(
entity
).
withView
(
View
.
Public
.
class
);
reader
.
readValue
(
tree
);
}
return
repository
.
save
(
entities
);
}
@Override
@PreAuthorize
(
"hasPermission(#entity, 'delete')"
)
public
void
delete
(
final
T
entity
)
{
repository
.
delete
(
entity
);
}
public
String
getTypeName
()
{
return
type
.
getSimpleName
().
toLowerCase
();
}
}
src/main/java/de/thm/arsnova/services/EntityService.java
View file @
f9f568a8
package
de.thm.arsnova.services
;
import
com.fasterxml.jackson.databind.JsonNode
;
import
com.fasterxml.jackson.databind.ObjectMapper
;
import
com.fasterxml.jackson.databind.ObjectReader
;
import
de.thm.arsnova.entities.Entity
;
import
de.thm.arsnova.entities.serialization.View
;
import
org.springframework.data.repository.CrudRepository
;
import
org.springframework.security.access.prepost.PreAuthorize
;
import
org.springframework.security.access.prepost.PreFilter
;
...
...
@@ -13,62 +8,22 @@ import java.io.IOException;
import
java.util.Collection
;
import
java.util.Map
;
public
class
EntityService
<
T
extends
Entity
>
{
protected
Class
<
T
>
type
;
protected
CrudRepository
<
T
,
String
>
repository
;
private
ObjectMapper
objectMapper
;
public
EntityService
(
Class
<
T
>
type
,
CrudRepository
<
T
,
String
>
repository
,
ObjectMapper
objectMapper
)
{
this
.
type
=
type
;
this
.
repository
=
repository
;
this
.
objectMapper
=
objectMapper
;
}
public
interface
EntityService
<
T
extends
Entity
>
{
@PreAuthorize
(
"hasPermission(#id, #this.this.getTypeName(), 'read')"
)
public
T
get
(
final
String
id
)
{
return
repository
.
findOne
(
id
);
}
T
get
(
String
id
);
@PreAuthorize
(
"hasPermission(#entity, 'create')"
)
public
T
create
(
final
T
entity
)
{
if
(
entity
.
getId
()
!=
null
||
entity
.
getRevision
()
!=
null
)
{
throw
new
IllegalArgumentException
(
"Entity is not new."
);
}
return
repository
.
save
(
entity
);
}
T
create
(
T
entity
);
@PreAuthorize
(
"hasPermission(#oldEntity, 'update')"
)
public
T
update
(
final
T
oldEntity
,
final
T
newEntity
)
{
newEntity
.
setId
(
oldEntity
.
getId
());
return
repository
.
save
(
newEntity
);
}
T
update
(
T
oldEntity
,
T
newEntity
);
@PreAuthorize
(
"hasPermission(#entity, 'update')"
)
public
T
patch
(
final
T
entity
,
final
Map
<
String
,
Object
>
changes
)
throws
IOException
{
ObjectReader
reader
=
objectMapper
.
readerForUpdating
(
entity
).
withView
(
View
.
Public
.
class
);
JsonNode
tree
=
objectMapper
.
valueToTree
(
changes
);
reader
.
readValue
(
tree
);
return
repository
.
save
(
entity
);
}
T
patch
(
T
entity
,
Map
<
String
,
Object
>
changes
)
throws
IOException
;
@PreFilter
(
value
=
"hasPermission(filterObject, 'update')"
,
filterTarget
=
"entities"
)
public
Iterable
<
T
>
patch
(
final
Collection
<
T
>
entities
,
final
Map
<
String
,
Object
>
changes
)
throws
IOException
{
JsonNode
tree
=
objectMapper
.
valueToTree
(
changes
);
for
(
T
entity
:
entities
)
{
ObjectReader
reader
=
objectMapper
.
readerForUpdating
(
entity
).
withView
(
View
.
Public
.
class
);
reader
.
readValue
(
tree
);
}
return
repository
.
save
(
entities
);
}
Iterable
<
T
>
patch
(
Collection
<
T
>
entities
,
Map
<
String
,
Object
>
changes
)
throws
IOException
;
@PreAuthorize
(
"hasPermission(#entity, 'delete')"
)
public
void
delete
(
final
T
entity
)
{
repository
.
delete
(
entity
);
}
public
String
getTypeName
()
{
return
type
.
getSimpleName
().
toLowerCase
();
}
void
delete
(
T
entity
);
}
src/main/java/de/thm/arsnova/services/MotdService.java
View file @
f9f568a8
...
...
@@ -26,7 +26,7 @@ import java.util.List;
/**
* The functionality the motd service should provide.
*/
public
interface
MotdService
{
public
interface
MotdService
extends
EntityService
<
Motd
>
{
Motd
getByKey
(
String
keyword
);
List
<
Motd
>
getAdminMotds
();
//all w/o the sessionmotds
...
...
src/main/java/de/thm/arsnova/services/MotdServiceImpl.java
View file @
f9f568a8
...
...
@@ -41,7 +41,7 @@ import java.util.StringTokenizer;
* Performs all question, interposed question, and answer related operations.
*/
@Service
public
class
MotdServiceImpl
extends
EntityService
<
Motd
>
implements
MotdService
{
public
class
MotdServiceImpl
extends
DefaultEntityServiceImpl
<
Motd
>
implements
MotdService
{
private
UserService
userService
;
private
SessionService
sessionService
;
...
...
src/main/java/de/thm/arsnova/services/SessionService.java
View file @
f9f568a8
...
...
@@ -31,7 +31,7 @@ import java.util.UUID;
/**
* The functionality the session service should provide.
*/
public
interface
SessionService
{
public
interface
SessionService
extends
EntityService
<
Session
>
{
Session
getByKey
(
String
keyword
);
Session
getForAdmin
(
final
String
keyword
);
...
...
src/main/java/de/thm/arsnova/services/SessionServiceImpl.java
View file @
f9f568a8
...
...
@@ -43,7 +43,6 @@ import de.thm.arsnova.exceptions.BadRequestException;
import
de.thm.arsnova.exceptions.ForbiddenException
;
import
de.thm.arsnova.exceptions.NotFoundException
;
import
de.thm.arsnova.exceptions.PayloadTooLargeException
;
import
de.thm.arsnova.exceptions.UnauthorizedException
;
import
de.thm.arsnova.persistance.SessionRepository
;
import
de.thm.arsnova.persistance.VisitedSessionRepository
;
import
org.ektorp.UpdateConflictException
;
...
...
@@ -71,7 +70,7 @@ import java.util.UUID;
* Performs all session related operations.
*/
@Service
public
class
SessionServiceImpl
extends
EntityService
<
Session
>
implements
SessionService
,
ApplicationEventPublisherAware
{
public
class
SessionServiceImpl
extends
DefaultEntityServiceImpl
<
Session
>
implements
SessionService
,
ApplicationEventPublisherAware
{
private
static
final
long
SESSION_INACTIVITY_CHECK_INTERVAL_MS
=
30
*
60
*
1000L
;
private
static
final
Logger
logger
=
LoggerFactory
.
getLogger
(
SessionServiceImpl
.
class
);
...
...
src/test/java/de/thm/arsnova/services/
EntityService
Test.java
→
src/test/java/de/thm/arsnova/services/
DefaultEntityServiceImpl
Test.java
View file @
f9f568a8
...
...
@@ -33,7 +33,7 @@ import static org.junit.Assert.*;
@WebAppConfiguration
@ContextConfiguration
(
classes
=
{
AppConfig
.
class
,
TestAppConfig
.
class
,
TestPersistanceConfig
.
class
,
TestSecurityConfig
.
class
})
@ActiveProfiles
(
"test"
)
public
class
EntityService
Test
{
public
class
DefaultEntityServiceImpl
Test
{
@Autowired
@Qualifier
(
"defaultJsonMessageConverter"
)
private
MappingJackson2HttpMessageConverter
jackson2HttpMessageConverter
;
...
...
@@ -45,7 +45,7 @@ public class EntityServiceTest {
@WithMockUser
(
username
=
"TestUser"
)
public
void
testPatch
()
throws
IOException
{
final
ObjectMapper
objectMapper
=
jackson2HttpMessageConverter
.
getObjectMapper
();
final
EntityService
<
Session
>
entityService
=
new
EntityService
<>(
Session
.
class
,
sessionRepository
,
objectMapper
);
final
DefaultEntityServiceImpl
<
Session
>
entityService
=
new
DefaultEntityServiceImpl
<>(
Session
.
class
,
sessionRepository
,
objectMapper
);
when
(
sessionRepository
.
save
(
any
(
Session
.
class
))).
then
(
returnsFirstArg
());
...
...
@@ -78,7 +78,7 @@ public class EntityServiceTest {
@WithMockUser
(
username
=
"TestUser"
)
public
void
testPatchWithList
()
throws
IOException
{
final
ObjectMapper
objectMapper
=
jackson2HttpMessageConverter
.
getObjectMapper
();
final
EntityService
<
Session
>
entityService
=
new
EntityService
<>(
Session
.
class
,
sessionRepository
,
objectMapper
);
final
DefaultEntityServiceImpl
<
Session
>
entityService
=
new
DefaultEntityServiceImpl
<>(
Session
.
class
,
sessionRepository
,
objectMapper
);
when
(
sessionRepository
.
save
(
any
(
Session
.
class
))).
then
(
returnsFirstArg
());
...
...
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