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