diff --git a/pom.xml b/pom.xml
index b0997dcd3d..8a6874fd9a 100644
--- a/pom.xml
+++ b/pom.xml
@@ -510,6 +510,7 @@
UTF-8
SCM-BSD
+ 1.2.0.Final
diff --git a/scm-webapp/pom.xml b/scm-webapp/pom.xml
index bc78d8f9e9..43c30ef465 100644
--- a/scm-webapp/pom.xml
+++ b/scm-webapp/pom.xml
@@ -552,7 +552,6 @@
javascript:S3827
**.js
src/main/webapp/resources/extjs/**,src/main/webapp/resources/moment/**,src/main/webapp/resources/syntaxhighlighter/**
- 1.2.0.Final
diff --git a/scm-webapp/src/main/java/sonia/scm/ScmContextListener.java b/scm-webapp/src/main/java/sonia/scm/ScmContextListener.java
index 4b835d9d0b..e4ac1939eb 100644
--- a/scm-webapp/src/main/java/sonia/scm/ScmContextListener.java
+++ b/scm-webapp/src/main/java/sonia/scm/ScmContextListener.java
@@ -39,34 +39,31 @@ import com.google.common.base.Throwables;
import com.google.common.collect.Lists;
import com.google.inject.Injector;
import com.google.inject.Module;
-import java.util.Collections;
-
import org.apache.shiro.guice.web.ShiroWebModule;
-
+import org.jboss.resteasy.plugins.guice.GuiceResteasyBootstrapServletContextListener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-
+import sonia.scm.api.rest.resources.MapperModule;
import sonia.scm.cache.CacheManager;
+import sonia.scm.debug.DebugModule;
+import sonia.scm.filter.WebElementModule;
import sonia.scm.group.GroupManager;
import sonia.scm.plugin.DefaultPluginLoader;
import sonia.scm.plugin.ExtensionProcessor;
import sonia.scm.plugin.PluginWrapper;
import sonia.scm.repository.RepositoryManager;
+import sonia.scm.schedule.Scheduler;
import sonia.scm.upgrade.UpgradeManager;
import sonia.scm.user.UserManager;
import sonia.scm.util.IOUtil;
-//~--- JDK imports ------------------------------------------------------------
-
+import javax.servlet.ServletContext;
+import javax.servlet.ServletContextEvent;
+import java.util.Collections;
import java.util.List;
import java.util.Set;
-import javax.servlet.ServletContext;
-import javax.servlet.ServletContextEvent;
-import org.jboss.resteasy.plugins.guice.GuiceResteasyBootstrapServletContextListener;
-import sonia.scm.debug.DebugModule;
-import sonia.scm.filter.WebElementModule;
-import sonia.scm.schedule.Scheduler;
+//~--- JDK imports ------------------------------------------------------------
/**
*
@@ -148,6 +145,7 @@ public class ScmContextListener extends GuiceResteasyBootstrapServletContextList
if (SCMContext.getContext().getStage() == Stage.DEVELOPMENT){
moduleList.add(new DebugModule());
}
+ moduleList.add(new MapperModule());
return moduleList;
}
diff --git a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/MapperModule.java b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/MapperModule.java
new file mode 100644
index 0000000000..77037f4092
--- /dev/null
+++ b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/MapperModule.java
@@ -0,0 +1,12 @@
+package sonia.scm.api.rest.resources;
+
+import com.google.inject.AbstractModule;
+import org.mapstruct.factory.Mappers;
+
+public class MapperModule extends AbstractModule {
+ @Override
+ protected void configure() {
+ bind(UserDto2UserMapper.class).to(Mappers.getMapper(UserDto2UserMapper.class).getClass());
+ bind(User2UserDtoMapper.class).to(Mappers.getMapper(User2UserDtoMapper.class).getClass());
+ }
+}
diff --git a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/User2UserDtoMapper.java b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/User2UserDtoMapper.java
index 86601a7132..6a4b3d43e1 100644
--- a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/User2UserDtoMapper.java
+++ b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/User2UserDtoMapper.java
@@ -4,7 +4,6 @@ import org.mapstruct.AfterMapping;
import org.mapstruct.Context;
import org.mapstruct.Mapper;
import org.mapstruct.MappingTarget;
-import org.mapstruct.factory.Mappers;
import sonia.scm.user.User;
import javax.ws.rs.core.UriInfo;
@@ -13,17 +12,16 @@ import java.util.Map;
@Mapper
public abstract class User2UserDtoMapper {
- public static User2UserDtoMapper INSTANCE = Mappers.getMapper(User2UserDtoMapper.class);
- abstract public UserDto userToUserDto(User user, @Context UriInfo uriInfo);
+ public abstract UserDto userToUserDto(User user, @Context UriInfo uriInfo);
@AfterMapping
- public void removePassword(User source, @MappingTarget UserDto target, @Context UriInfo uriInfo) {
+ void removePassword(@MappingTarget UserDto target) {
target.setPassword(UserResource.DUMMY_PASSWORT);
}
@AfterMapping
- public void appendLinks(User source, @MappingTarget UserDto target, @Context UriInfo uriInfo) {
+ void appendLinks(@MappingTarget UserDto target, @Context UriInfo uriInfo) {
Map links = new LinkedHashMap<>();
links.put("self", new Link(uriInfo.getAbsolutePath()));
target.setLinks(links);
diff --git a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/UserDto2UserMapper.java b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/UserDto2UserMapper.java
index 613ce6cd44..342dfb9c59 100644
--- a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/UserDto2UserMapper.java
+++ b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/UserDto2UserMapper.java
@@ -1,11 +1,11 @@
package sonia.scm.api.rest.resources;
+import com.google.inject.Inject;
import org.apache.shiro.authc.credential.PasswordService;
import org.mapstruct.Context;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Named;
-import org.mapstruct.factory.Mappers;
import sonia.scm.user.User;
import static sonia.scm.api.rest.resources.UserResource.DUMMY_PASSWORT;
@@ -13,13 +13,14 @@ import static sonia.scm.api.rest.resources.UserResource.DUMMY_PASSWORT;
@Mapper
public abstract class UserDto2UserMapper {
- public static UserDto2UserMapper INSTANCE = Mappers.getMapper(UserDto2UserMapper.class);
+ @Inject
+ private PasswordService passwordService;
@Mapping(source = "password", target = "password", qualifiedByName = "encrypt")
- abstract public User userDtoToUser(UserDto userDto, @Context String originalPassword, @Context PasswordService passwordService);
+ public abstract User userDtoToUser(UserDto userDto, @Context String originalPassword);
@Named("encrypt")
- public String encrypt(String password, @Context String originalPassword, @Context PasswordService passwordService) {
+ String encrypt(String password, @Context String originalPassword) {
if (DUMMY_PASSWORT.equals(password))
{
diff --git a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/UserNewResource.java b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/UserNewResource.java
index f60c7f5c48..ad725366b5 100644
--- a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/UserNewResource.java
+++ b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/UserNewResource.java
@@ -7,7 +7,6 @@ import com.webcohesion.enunciate.metadata.rs.ResponseHeader;
import com.webcohesion.enunciate.metadata.rs.StatusCodes;
import com.webcohesion.enunciate.metadata.rs.TypeHint;
import org.apache.shiro.SecurityUtils;
-import org.apache.shiro.authc.credential.PasswordService;
import sonia.scm.security.Role;
import sonia.scm.user.User;
import sonia.scm.user.UserException;
@@ -26,12 +25,14 @@ public class UserNewResource extends AbstractManagerResource items = fetchItems(sortby, desc, start, limit);
- items.stream().map(user -> User2UserDtoMapper.INSTANCE.userToUserDto(user, uriInfo)).collect(Collectors.toList());
+ items.stream().map(user -> userToDtoMapper.userToUserDto(user, uriInfo)).collect(Collectors.toList());
return Response.ok(new GenericEntity>(items) {}).build();
}
@@ -116,7 +117,7 @@ public class UserNewResource extends AbstractManagerResource