From eb6aac4a5ee426cb63c456137657e408ac58e269 Mon Sep 17 00:00:00 2001 From: Paulo Gustavo Veiga Date: Wed, 14 Mar 2012 01:49:05 -0300 Subject: [PATCH] - Add more tests to save map - Add new rest operations for saving map content - Fix password encoding bug - Fix bug that allow different users being created with the same password. --- pom.xml | 4 - .../controller/MindmapSharingController.java | 2 +- .../controller/NewMindmapController.java | 18 +-- .../wisemapping/dao/MindmapManagerImpl.java | 2 +- .../com/wisemapping/dao/UserManagerImpl.java | 20 ++-- .../java/com/wisemapping/model/MindMap.java | 17 ++- .../com/wisemapping/rest/AdminController.java | 38 ++++-- .../wisemapping/rest/MindmapController.java | 83 ++++++++++---- .../wisemapping/rest/model/RestMindmap.java | 17 ++- .../rest/model/RestMindmapList.java | 6 +- .../com/wisemapping/rest/model/RestUser.java | 9 +- .../wisemapping/service/MindmapService.java | 4 +- .../service/MindmapServiceImpl.java | 21 ++-- .../validator/MapInfoValidator.java | 10 +- .../main/webapp/WEB-INF/wisemapping-model.xml | 2 +- .../webapp/WEB-INF/wisemapping-security.xml | 1 - .../test/rest/RestAdminITCase.java | 79 +++++++------ .../test/rest/RestMindmapTCase.java | 108 +++++++++++++++--- 18 files changed, 297 insertions(+), 144 deletions(-) diff --git a/pom.xml b/pom.xml index e63c3216..4569e0e9 100644 --- a/pom.xml +++ b/pom.xml @@ -49,10 +49,6 @@ maven-surefire-plugin 2.12 - - maven-site-plugin - 3.0 - org.apache.maven.plugins maven-resources-plugin diff --git a/wise-webapp/src/main/java/com/wisemapping/controller/MindmapSharingController.java b/wise-webapp/src/main/java/com/wisemapping/controller/MindmapSharingController.java index 028043ba..85258eee 100644 --- a/wise-webapp/src/main/java/com/wisemapping/controller/MindmapSharingController.java +++ b/wise-webapp/src/main/java/com/wisemapping/controller/MindmapSharingController.java @@ -85,7 +85,7 @@ public class MindmapSharingController extends BaseMultiActionController { final ColaborationEmail email = new ColaborationEmail(); email.setSubject(request.getParameter("subject")); email.setMessage(request.getParameter("message")); - getMindmapService().addColaborators(mindMap, emails, role, email); + getMindmapService().addCollaborators(mindMap, emails, role, email); return new MindMapBean(mindMap); } diff --git a/wise-webapp/src/main/java/com/wisemapping/controller/NewMindmapController.java b/wise-webapp/src/main/java/com/wisemapping/controller/NewMindmapController.java index d38045a1..49fb469b 100644 --- a/wise-webapp/src/main/java/com/wisemapping/controller/NewMindmapController.java +++ b/wise-webapp/src/main/java/com/wisemapping/controller/NewMindmapController.java @@ -51,25 +51,11 @@ public class NewMindmapController mindmap.setTitle(title); mindmap.setOwner(user); - final String xml = getDefaultMindmapXml(title); + final String xml = MindMap.getDefaultMindmapXml(title); mindmap.setXmlStr(xml); - final User dbUSer = getUserService().getUserBy(user.getId()); - - service.addMindmap(mindmap, dbUSer); + service.addMindmap(mindmap, user); return new ModelAndView("redirect:editor.htm?mapId=" + mindmap.getId() + "&action=open"); } - - - private String getDefaultMindmapXml(final String title) { - - final StringBuffer map = new StringBuffer(); - map.append(""); - map.append(""); - return map.toString(); - } - } diff --git a/wise-webapp/src/main/java/com/wisemapping/dao/MindmapManagerImpl.java b/wise-webapp/src/main/java/com/wisemapping/dao/MindmapManagerImpl.java index 63daab2a..246f26c0 100644 --- a/wise-webapp/src/main/java/com/wisemapping/dao/MindmapManagerImpl.java +++ b/wise-webapp/src/main/java/com/wisemapping/dao/MindmapManagerImpl.java @@ -147,7 +147,7 @@ public class MindmapManagerImpl } public MindMap getMindmapById(int mindmapId) { - return (MindMap) getHibernateTemplate().get(MindMap.class, mindmapId); + return getHibernateTemplate().get(MindMap.class, mindmapId); } public MindMap getMindmapByTitle(final String title, final User user) { diff --git a/wise-webapp/src/main/java/com/wisemapping/dao/UserManagerImpl.java b/wise-webapp/src/main/java/com/wisemapping/dao/UserManagerImpl.java index 5f4df024..9789307e 100644 --- a/wise-webapp/src/main/java/com/wisemapping/dao/UserManagerImpl.java +++ b/wise-webapp/src/main/java/com/wisemapping/dao/UserManagerImpl.java @@ -22,8 +22,10 @@ import com.wisemapping.model.Collaborator; import com.wisemapping.model.MindmapUser; import com.wisemapping.model.User; import com.wisemapping.model.UserLogin; +import com.wisemapping.security.CustomPasswordEncoder; import org.jetbrains.annotations.NotNull; import org.springframework.orm.hibernate3.support.HibernateDaoSupport; +import org.springframework.security.authentication.encoding.PasswordEncoder; //import org.acegisecurity.providers.encoding.PasswordEncoder; import java.util.List; @@ -33,12 +35,12 @@ public class UserManagerImpl extends HibernateDaoSupport implements UserManager { -// private PasswordEncoder passwordEncoder; -// -// public void setEncoder(PasswordEncoder passwordEncoder) -// { -// this.passwordEncoder = passwordEncoder; -// } + private PasswordEncoder passwordEncoder; + + public void setEncoder(PasswordEncoder passwordEncoder) + { + this.passwordEncoder = passwordEncoder; + } public List getAllUsers() { return getHibernateTemplate().find("from com.wisemapping.model.User user"); @@ -99,13 +101,13 @@ public class UserManagerImpl @Override public void createUser(User user) { assert user != null : "Trying to store a null user"; -// user.setPassword(passwordEncoder.encodePassword(user.getPassword(),null)); + user.setPassword(passwordEncoder.encodePassword(user.getPassword(),null)); getHibernateTemplate().saveOrUpdate(user); } @Override public User createUser(@NotNull User user, @NotNull Collaborator col) { -// user.setPassword(passwordEncoder.encodePassword(user.getPassword(),null)); + user.setPassword(passwordEncoder.encodePassword(user.getPassword(),null)); assert user != null : "Trying to store a null user"; final Set set = col.getMindmapUsers(); @@ -138,7 +140,7 @@ public class UserManagerImpl public void updateUser(User user) { assert user != null : "user is null"; -// user.setPassword(passwordEncoder.encodePassword(user.getPassword(),null)); + user.setPassword(passwordEncoder.encodePassword(user.getPassword(),null)); getHibernateTemplate().update(user); } diff --git a/wise-webapp/src/main/java/com/wisemapping/model/MindMap.java b/wise-webapp/src/main/java/com/wisemapping/model/MindMap.java index 54a29152..01b08db4 100644 --- a/wise-webapp/src/main/java/com/wisemapping/model/MindMap.java +++ b/wise-webapp/src/main/java/com/wisemapping/model/MindMap.java @@ -84,7 +84,11 @@ public class MindMap { } public String getXmlStr() throws UnsupportedEncodingException { - return new String(this.xml, UTF_8); + String result = null; + if (this.xml != null) { + result = new String(this.xml, UTF_8); + } + return result; } public byte[] getZippedXml() @@ -219,4 +223,15 @@ public class MindMap { public User getOwner() { return owner; } + + public static String getDefaultMindmapXml(@NotNull final String title) { + + final StringBuilder result = new StringBuilder(); + result.append(""); + result.append(""); + return result.toString(); + } + } diff --git a/wise-webapp/src/main/java/com/wisemapping/rest/AdminController.java b/wise-webapp/src/main/java/com/wisemapping/rest/AdminController.java index 3b9c14fc..b00d277e 100644 --- a/wise-webapp/src/main/java/com/wisemapping/rest/AdminController.java +++ b/wise-webapp/src/main/java/com/wisemapping/rest/AdminController.java @@ -26,7 +26,7 @@ public class AdminController extends BaseController { if (userBy == null) { throw new IllegalArgumentException("User could not be found"); } - return new ModelAndView("userView", "user", new RestUser(userBy)); + return new ModelAndView("userView", "user", new RestUser(userBy)); } @RequestMapping(method = RequestMethod.GET, value = "admin/users/email/{email}", produces = {"application/json", "text/html", "application/xml"}) @@ -39,9 +39,19 @@ public class AdminController extends BaseController { return new ModelAndView("userView", "user", new RestUser(user)); } + @RequestMapping(method = RequestMethod.GET, value = "admin/users/username/{username}", produces = {"application/json", "text/html", "application/xml"}) + @ResponseBody + public ModelAndView getUserByUsername(@PathVariable String username) throws IOException { + final User user = userService.getUserByUsername(username); + if (user == null) { + throw new IllegalArgumentException("User '" + username + "' could not be found"); + } + return new ModelAndView("userView", "user", new RestUser(user)); + } + @RequestMapping(method = RequestMethod.POST, value = "admin/users", consumes = {"application/xml", "application/json"}, produces = {"application/json", "text/html", "application/xml"}) @ResponseStatus(value = HttpStatus.CREATED) - public void getUserByEmail(@RequestBody RestUser user, HttpServletResponse response) throws IOException, WiseMappingException { + public void createUser(@RequestBody RestUser user, HttpServletResponse response) throws IOException, WiseMappingException { if (user == null) { throw new IllegalArgumentException("User could not be found"); } @@ -52,6 +62,16 @@ public class AdminController extends BaseController { throw new IllegalArgumentException("User already exists with this email."); } + final String username = user.getUsername(); + if (username == null || username.isEmpty()) { + throw new IllegalArgumentException("username can not be null"); + } + + if (userService.getUserByUsername(username) != null) { + throw new IllegalArgumentException("User already exists with this username."); + } + + // Run some other validations ... final User delegated = user.getDelegated(); final String lastname = delegated.getLastname(); if (lastname == null || lastname.isEmpty()) { @@ -59,17 +79,13 @@ public class AdminController extends BaseController { } final String firstName = delegated.getFirstname(); - if (firstName == null || firstName.isEmpty()) { - throw new IllegalArgumentException("firstname can not be null"); - } - - final String username = delegated.getUsername(); - if (username == null || username.isEmpty()) { - throw new IllegalArgumentException("username can not be null"); - } + if (firstName == null || firstName.isEmpty()) { + throw new IllegalArgumentException("firstname can not be null"); + } + // Finally create the user ... userService.createUser(delegated, false); - response.setHeader("Location","/service/admin/users/" + user.getId()); + response.setHeader("Location", "/service/admin/users/" + user.getId()); } @RequestMapping(method = RequestMethod.PUT, value = "admin/users/{id}/password", consumes = {"text/plain"}) diff --git a/wise-webapp/src/main/java/com/wisemapping/rest/MindmapController.java b/wise-webapp/src/main/java/com/wisemapping/rest/MindmapController.java index b6acfd4a..f1c4d9d2 100644 --- a/wise-webapp/src/main/java/com/wisemapping/rest/MindmapController.java +++ b/wise-webapp/src/main/java/com/wisemapping/rest/MindmapController.java @@ -7,14 +7,17 @@ import com.wisemapping.model.MindmapUser; import com.wisemapping.model.User; import com.wisemapping.rest.model.RestMindmap; import com.wisemapping.rest.model.RestMindmapList; +import com.wisemapping.rest.model.RestUser; import com.wisemapping.security.Utils; import com.wisemapping.service.MindmapService; +import org.jetbrains.annotations.NotNull; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; import org.springframework.web.servlet.ModelAndView; +import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.ArrayList; import java.util.Calendar; @@ -55,43 +58,83 @@ public class MindmapController extends BaseController { final MindMap mindMap = mindmapService.getMindmapById(id); final User user = Utils.getUser(); + // Validate arguments ... final String properties = restMindmap.getProperties(); + if (properties == null) { + throw new IllegalArgumentException("Map properties can not be null"); + } mindMap.setProperties(properties); - final Calendar now = Calendar.getInstance(); - mindMap.setLastModificationTime(now); - mindMap.setLastModifierUser(user.getUsername()); - - final Calendar lastModification = Calendar.getInstance(); - lastModification.setTime(new Date()); - mindMap.setLastModificationTime(lastModification); - + // Validate content ... final String xml = restMindmap.getXml(); + if (xml == null) { + throw new IllegalArgumentException("Map xml can not be null"); + } mindMap.setXmlStr(xml); - mindmapService.updateMindmap(mindMap, minor); + + // Update map ... + updateMindmap(minor, mindMap, user); } - @RequestMapping(method = RequestMethod.POST, value = "/maps", consumes = {"application/xml", "application/json"}, produces = {"application/json", "text/html", "application/xml"}) + @RequestMapping(method = RequestMethod.PUT, value = "/maps/{id}/xml", consumes = {"application/xml"}, produces = {"application/json", "text/html", "application/xml"}) @ResponseStatus(value = HttpStatus.NO_CONTENT) - public void createMap(@RequestBody RestMindmap restMindmap, @PathVariable int id, @RequestParam(required = false) boolean minor) throws IOException, WiseMappingException { + public void updateMapXml(@RequestBody String xml, @PathVariable int id, @RequestParam(required = false) boolean minor) throws IOException, WiseMappingException { final MindMap mindMap = mindmapService.getMindmapById(id); final User user = Utils.getUser(); - final String properties = restMindmap.getProperties(); - mindMap.setProperties(properties); + if (xml == null || xml.isEmpty()) { + throw new IllegalArgumentException("Map xml can not be null"); + } + mindMap.setXmlStr(xml); + // Update map ... + updateMindmap(minor, mindMap, user); + } + + + private void updateMindmap(boolean minor, MindMap mindMap, User user) throws WiseMappingException { final Calendar now = Calendar.getInstance(); mindMap.setLastModificationTime(now); mindMap.setLastModifierUser(user.getUsername()); - - final Calendar lastModification = Calendar.getInstance(); - lastModification.setTime(new Date()); - mindMap.setLastModificationTime(lastModification); - - final String xml = restMindmap.getXml(); - mindMap.setXmlStr(xml); mindmapService.updateMindmap(mindMap, minor); } + @RequestMapping(method = RequestMethod.POST, value = "/maps", consumes = {"application/xml", "application/json"}) + @ResponseStatus(value = HttpStatus.CREATED) + public void createMap(@RequestBody RestMindmap restMindmap, @NotNull HttpServletResponse response) throws IOException, WiseMappingException { + + final String title = restMindmap.getTitle(); + if (title == null || title.isEmpty()) { + throw new IllegalArgumentException("Map title can not be null"); + } + + final String description = restMindmap.getDescription(); + if (description == null || description.isEmpty()) { + throw new IllegalArgumentException("Map details can not be null"); + } + + // Some basic validations ... + final User user = Utils.getUser(); + final MindMap mindMap = mindmapService.getMindmapByTitle(title, user); + if (mindMap != null) { + throw new IllegalArgumentException("Map already exists with title '" + title + "'"); + } + + // If the user has not specified the xml content, add one ... + final MindMap delegated = restMindmap.getDelegated(); + String xml = restMindmap.getXml(); + if (xml == null || xml.isEmpty()) { + xml = MindMap.getDefaultMindmapXml(restMindmap.getTitle()); + } + delegated.setXmlStr(xml); + delegated.setOwner(user); + + // Add new mindmap ... + mindmapService.addMindmap(delegated, user); + + // Return the new created map ... + response.setHeader("Location", "/service/maps/" + delegated.getId()); + } + } diff --git a/wise-webapp/src/main/java/com/wisemapping/rest/model/RestMindmap.java b/wise-webapp/src/main/java/com/wisemapping/rest/model/RestMindmap.java index d9823d0c..7e042bee 100644 --- a/wise-webapp/src/main/java/com/wisemapping/rest/model/RestMindmap.java +++ b/wise-webapp/src/main/java/com/wisemapping/rest/model/RestMindmap.java @@ -4,7 +4,9 @@ package com.wisemapping.rest.model; import com.wisemapping.model.MindMap; import com.wisemapping.model.User; import org.codehaus.jackson.annotate.*; +import org.codehaus.jackson.map.annotate.JsonSerialize; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; @@ -21,6 +23,7 @@ import java.util.Date; isGetterVisibility = JsonAutoDetect.Visibility.NONE, getterVisibility = JsonAutoDetect.Visibility.PUBLIC_ONLY ) +@JsonIgnoreProperties(ignoreUnknown = true) public class RestMindmap { @JsonIgnore @@ -35,10 +38,6 @@ public class RestMindmap { this.mindmap = mindmap; } - public String getOwner() { - return mindmap.getOwner().getUsername(); - } - public Calendar getCreationTime() { return mindmap.getCreationTime(); } @@ -79,9 +78,10 @@ public class RestMindmap { return mindmap.getXmlStr(); } - public void setXml(@NotNull String xml) throws IOException { + public void setXml(@Nullable String xml) throws IOException { - mindmap.setXmlStr(xml); + if (xml != null) + mindmap.setXmlStr(xml); } public void setId(int id) { @@ -101,11 +101,10 @@ public class RestMindmap { } public void setOwner(User owner) { - mindmap.setOwner(owner); + } public void setCreator(String creatorUser) { - mindmap.setCreator(creatorUser); } @@ -114,11 +113,9 @@ public class RestMindmap { } public void setLastModificationTime(Calendar lastModificationTime) { - mindmap.setLastModificationTime(lastModificationTime); } public void setLastModifierUser(String lastModifierUser) { - mindmap.setLastModifierUser(lastModifierUser); } public String getProperties() { diff --git a/wise-webapp/src/main/java/com/wisemapping/rest/model/RestMindmapList.java b/wise-webapp/src/main/java/com/wisemapping/rest/model/RestMindmapList.java index 96022155..5e8f4569 100644 --- a/wise-webapp/src/main/java/com/wisemapping/rest/model/RestMindmapList.java +++ b/wise-webapp/src/main/java/com/wisemapping/rest/model/RestMindmapList.java @@ -16,8 +16,10 @@ import java.util.List; @XmlRootElement(name = "maps") @XmlAccessorType(XmlAccessType.PROPERTY) -@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.NONE, - getterVisibility = JsonAutoDetect.Visibility.PUBLIC_ONLY, isGetterVisibility = JsonAutoDetect.Visibility.PUBLIC_ONLY) +@JsonAutoDetect( + fieldVisibility = JsonAutoDetect.Visibility.NONE, + getterVisibility = JsonAutoDetect.Visibility.PUBLIC_ONLY, + isGetterVisibility = JsonAutoDetect.Visibility.PUBLIC_ONLY) public class RestMindmapList { private List mindmaps; diff --git a/wise-webapp/src/main/java/com/wisemapping/rest/model/RestUser.java b/wise-webapp/src/main/java/com/wisemapping/rest/model/RestUser.java index 8984d671..ff59a707 100644 --- a/wise-webapp/src/main/java/com/wisemapping/rest/model/RestUser.java +++ b/wise-webapp/src/main/java/com/wisemapping/rest/model/RestUser.java @@ -4,6 +4,8 @@ package com.wisemapping.rest.model; import com.wisemapping.model.User; import org.codehaus.jackson.annotate.JsonAutoDetect; import org.codehaus.jackson.annotate.JsonIgnore; +import org.codehaus.jackson.annotate.JsonIgnoreProperties; +import org.codehaus.jackson.map.annotate.JsonSerialize; import org.jetbrains.annotations.NotNull; import javax.xml.bind.annotation.XmlAccessType; @@ -14,8 +16,11 @@ import java.util.Set; @XmlRootElement(name = "user") @XmlAccessorType(XmlAccessType.PROPERTY) -@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.NONE, - getterVisibility = JsonAutoDetect.Visibility.PUBLIC_ONLY, isGetterVisibility = JsonAutoDetect.Visibility.PUBLIC_ONLY) +@JsonAutoDetect( + fieldVisibility = JsonAutoDetect.Visibility.NONE, + getterVisibility = JsonAutoDetect.Visibility.PUBLIC_ONLY, + isGetterVisibility = JsonAutoDetect.Visibility.PUBLIC_ONLY) +@JsonIgnoreProperties(ignoreUnknown = true) public class RestUser { private User user; diff --git a/wise-webapp/src/main/java/com/wisemapping/service/MindmapService.java b/wise-webapp/src/main/java/com/wisemapping/service/MindmapService.java index bc6f311d..a8c24e33 100755 --- a/wise-webapp/src/main/java/com/wisemapping/service/MindmapService.java +++ b/wise-webapp/src/main/java/com/wisemapping/service/MindmapService.java @@ -40,7 +40,7 @@ public interface MindmapService { public void addMindmap(MindMap map, User user) throws WiseMappingException; - public void addColaborators(MindMap mindmap, String[] colaboratorEmails, UserRole role, ColaborationEmail email) + public void addCollaborators(MindMap mindmap, String[] colaboratorEmails, UserRole role, ColaborationEmail email) throws InvalidColaboratorException; public void addTags(MindMap mindmap, String tags); @@ -61,7 +61,7 @@ public interface MindmapService { public boolean isAllowedToColaborate(User user, int mapId, UserRole grantedRole); - public boolean isAllowedToColaborate(User user, MindMap map, UserRole grantedRole); + public boolean isAllowedToCollaborate(User user, MindMap map, UserRole grantedRole); public void addWelcomeMindmap(User user) throws WiseMappingException; diff --git a/wise-webapp/src/main/java/com/wisemapping/service/MindmapServiceImpl.java b/wise-webapp/src/main/java/com/wisemapping/service/MindmapServiceImpl.java index c5548a5a..ee8841d3 100755 --- a/wise-webapp/src/main/java/com/wisemapping/service/MindmapServiceImpl.java +++ b/wise-webapp/src/main/java/com/wisemapping/service/MindmapServiceImpl.java @@ -22,6 +22,8 @@ import com.wisemapping.dao.MindmapManager; import com.wisemapping.exceptions.WiseMappingException; import com.wisemapping.mail.Mailer; import com.wisemapping.model.*; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.io.IOException; import java.util.*; @@ -36,7 +38,7 @@ public class MindmapServiceImpl public boolean isAllowedToColaborate(User user, int mapId, UserRole grantedRole) { final MindMap map = mindmapManager.getMindmapById(mapId); - return isAllowedToColaborate(user, map, grantedRole); + return isAllowedToCollaborate(user, map, grantedRole); } public boolean isAllowedToView(User user, int mapId, UserRole grantedRole) { @@ -51,13 +53,13 @@ public class MindmapServiceImpl if (map.isPublic()) { isAllowed = true; } else if (user != null) { - isAllowed = isAllowedToColaborate(user, map, grantedRole); + isAllowed = isAllowedToCollaborate(user, map, grantedRole); } } return isAllowed; } - public boolean isAllowedToColaborate(User user, MindMap map, UserRole grantedRole) { + public boolean isAllowedToCollaborate(@NotNull User user, @Nullable MindMap map, UserRole grantedRole) { boolean isAllowed = false; if (map != null) { if (map.getOwner().getId() == user.getId()) { @@ -99,6 +101,7 @@ public class MindmapServiceImpl if (mindMap.getTitle() == null || mindMap.getTitle().length() == 0) { throw new WiseMappingException("The tile can not be empty"); } + mindmapManager.updateMindmap(mindMap, saveHistory); } @@ -149,7 +152,7 @@ public class MindmapServiceImpl } } - public void addMindmap(MindMap map, User user) throws WiseMappingException { + public void addMindmap(@NotNull MindMap map, @NotNull User user) throws WiseMappingException { final String title = map.getTitle(); @@ -169,13 +172,15 @@ public class MindmapServiceImpl map.setLastModificationTime(creationTime); map.setOwner(user); - final MindmapUser mindmapUser = new MindmapUser(UserRole.OWNER.ordinal(), user, map); + // Hack to reload dbuser ... + final User dbUser = userService.getUserBy(user.getId()); + final MindmapUser mindmapUser = new MindmapUser(UserRole.OWNER.ordinal(), dbUser, map); map.getMindmapUsers().add(mindmapUser); mindmapManager.addMindmap(user, map); } - public void addColaborators(MindMap mindmap, String[] colaboratorEmails, UserRole role, ColaborationEmail email) + public void addCollaborators(MindMap mindmap, String[] colaboratorEmails, UserRole role, ColaborationEmail email) throws InvalidColaboratorException { if (colaboratorEmails != null && colaboratorEmails.length > 0) { final Collaborator owner = mindmap.getOwner(); @@ -187,7 +192,7 @@ public class MindmapServiceImpl } MindmapUser mindmapUser = getMindmapUserBy(colaboratorEmail, mindmapUsers); if (mindmapUser == null) { - addColaborator(colaboratorEmail, role, mindmap, email); + addCollaborator(colaboratorEmail, role, mindmap, email); } else if (mindmapUser.getRole() != role) { // If the relationship already exists and the role changed then only update the role mindmapUser.setRoleId(role.ordinal()); @@ -260,7 +265,7 @@ public class MindmapServiceImpl return mindmapUser; } - private void addColaborator(String colaboratorEmail, UserRole role, MindMap mindmap, ColaborationEmail email) { + private void addCollaborator(String colaboratorEmail, UserRole role, MindMap mindmap, ColaborationEmail email) { Collaborator collaborator = mindmapManager.getCollaboratorBy(colaboratorEmail); if (collaborator == null) { diff --git a/wise-webapp/src/main/java/com/wisemapping/validator/MapInfoValidator.java b/wise-webapp/src/main/java/com/wisemapping/validator/MapInfoValidator.java index 324d096f..a517b056 100755 --- a/wise-webapp/src/main/java/com/wisemapping/validator/MapInfoValidator.java +++ b/wise-webapp/src/main/java/com/wisemapping/validator/MapInfoValidator.java @@ -64,11 +64,11 @@ public class MapInfoValidator implements Validator { } } ValidatorUtils.rejectIfExceeded(errors, - "description", - "The description must have less than "+Constants.MAX_MAP_DESCRIPTION_LENGTH + " characters.", - desc, - Constants.MAX_MAP_DESCRIPTION_LENGTH); - } + "description", + "The description must have less than " + Constants.MAX_MAP_DESCRIPTION_LENGTH + " characters.", + desc, + Constants.MAX_MAP_DESCRIPTION_LENGTH); + } } diff --git a/wise-webapp/src/main/webapp/WEB-INF/wisemapping-model.xml b/wise-webapp/src/main/webapp/WEB-INF/wisemapping-model.xml index 640ebada..946b5078 100644 --- a/wise-webapp/src/main/webapp/WEB-INF/wisemapping-model.xml +++ b/wise-webapp/src/main/webapp/WEB-INF/wisemapping-model.xml @@ -5,7 +5,7 @@ - + diff --git a/wise-webapp/src/main/webapp/WEB-INF/wisemapping-security.xml b/wise-webapp/src/main/webapp/WEB-INF/wisemapping-security.xml index 0092731a..3c593de6 100644 --- a/wise-webapp/src/main/webapp/WEB-INF/wisemapping-security.xml +++ b/wise-webapp/src/main/webapp/WEB-INF/wisemapping-security.xml @@ -62,6 +62,5 @@ - \ No newline at end of file diff --git a/wise-webapp/src/test/java/com/wisemapping/test/rest/RestAdminITCase.java b/wise-webapp/src/test/java/com/wisemapping/test/rest/RestAdminITCase.java index 30f4dbee..10c2e047 100644 --- a/wise-webapp/src/test/java/com/wisemapping/test/rest/RestAdminITCase.java +++ b/wise-webapp/src/test/java/com/wisemapping/test/rest/RestAdminITCase.java @@ -26,8 +26,8 @@ import java.util.List; public class RestAdminITCase { @NonNls - private static final String HOST_PORT = "http://localhost:8080/"; - private static final String BASE_REST_URL = HOST_PORT + "service"; + private static final String HOST_PORT = "http://localhost:8080"; + private static final String BASE_REST_URL = HOST_PORT + "/service"; @Test(dataProvider = "ContentType-Provider-Function") public void changePassword(final @NotNull MediaType mediaType) { // Configure media types ... @@ -35,13 +35,7 @@ public class RestAdminITCase { final RestTemplate templateRest = createTemplate(); // Fill user data ... - final RestUser restUser = new RestUser(); - final String email = "foo-to-change" + System.nanoTime() + "@example.org"; - restUser.setEmail(email); - restUser.setUsername("foo"); - restUser.setFirstname("foo first name"); - restUser.setLastname("foo last name"); - restUser.setPassword("foo password"); + final RestUser restUser = createDummyUser(); // User has been created ... final URI location = createUser(requestHeaders, templateRest, restUser); @@ -52,7 +46,6 @@ public class RestAdminITCase { // Change password ... requestHeaders.setContentType(MediaType.TEXT_PLAIN); HttpEntity createUserEntity = new HttpEntity("some-new-password", requestHeaders); - System.out.println("Changed password to:" + email); templateRest.put(BASE_REST_URL + "/admin/users/{id}/password", createUserEntity, result.getBody().getId()); } @@ -62,14 +55,7 @@ public class RestAdminITCase { final HttpHeaders requestHeaders = createHeaders(mediaType); final RestTemplate templateRest = createTemplate(); - // Fill user data ... - final RestUser restUser = new RestUser(); - final String email = "foo-to-delete" + System.nanoTime() + "@example.org"; - restUser.setEmail(email); - restUser.setUsername("foo"); - restUser.setFirstname("foo first name"); - restUser.setLastname("foo last name"); - restUser.setPassword("foo password"); + final RestUser restUser = createDummyUser(); // User has been created ... final URI location = createUser(requestHeaders, templateRest, restUser); @@ -89,22 +75,33 @@ public class RestAdminITCase { } } + @Test(dataProvider = "ContentType-Provider-Function") - public void createNewUser(final @NotNull MediaType mediaType) { + public void findUserByUsername(final @NotNull MediaType mediaType) { // Configure media types ... + final HttpHeaders requestHeaders = createHeaders(mediaType); + final RestTemplate templateRest = createTemplate(); + + final RestUser restUser = createDummyUser(); + + // User has been created ... + createUser(requestHeaders, templateRest, restUser); + + // Check that the user has been created ... + HttpEntity findUserEntity = new HttpEntity(requestHeaders); + final ResponseEntity responseEntity = templateRest.exchange(BASE_REST_URL + "/admin/users/username/" + restUser.getUsername(), HttpMethod.GET, findUserEntity, RestUser.class); + + assertEquals(responseEntity.getBody().getUsername(), restUser.getUsername()); + + } + + public String createNewUser(final @NotNull MediaType mediaType) { // Configure media types ... final HttpHeaders requestHeaders = createHeaders(mediaType); final RestTemplate templateRest = createTemplate(); // Fill user data ... - final RestUser restUser = new RestUser(); - - final String email = "foo" + System.nanoTime() + "@example.org"; - restUser.setEmail(email); - restUser.setUsername("foo"); - restUser.setFirstname("foo first name"); - restUser.setLastname("foo last name"); - restUser.setPassword("foo password"); + final RestUser restUser = createDummyUser(); // Create a new user ... final URI location = createUser(requestHeaders, templateRest, restUser); @@ -113,16 +110,21 @@ public class RestAdminITCase { ResponseEntity result = findUser(requestHeaders, templateRest, location); assertEquals(result.getBody(), restUser, "Returned object object seems not be the same."); - // Find by email and check ... - result = findUserByEmail(requestHeaders, templateRest, email); + result = findUserByEmail(requestHeaders, templateRest, restUser.getEmail()); assertEquals(result.getBody(), restUser, "Returned object object seems not be the same."); + return restUser.getEmail(); + } + + @Test(dataProvider = "ContentType-Provider-Function") + public void createUser(final @NotNull MediaType mediaType) { + this.createNewUser(mediaType); } private ResponseEntity findUser(HttpHeaders requestHeaders, RestTemplate templateRest, URI location) { HttpEntity findUserEntity = new HttpEntity(requestHeaders); - final String url = "http://localhost:8080" + location; + final String url = HOST_PORT + location; return templateRest.exchange(url, HttpMethod.GET, findUserEntity, RestUser.class); } @@ -130,7 +132,7 @@ public class RestAdminITCase { HttpEntity findUserEntity = new HttpEntity(requestHeaders); // Add extension only to avoid the fact that the last part is extracted ... - final String url = "http://localhost:8080/service/admin/users/email/{email}.json"; + final String url = BASE_REST_URL + "/admin/users/email/{email}.json"; return templateRest.exchange(url, HttpMethod.GET, findUserEntity, RestUser.class, email); } @@ -139,7 +141,7 @@ public class RestAdminITCase { return templateRest.postForLocation(BASE_REST_URL + "/admin/users", createUserEntity); } - private HttpHeaders createHeaders(MediaType mediaType) { + private HttpHeaders createHeaders(@NotNull MediaType mediaType) { List acceptableMediaTypes = new ArrayList(); acceptableMediaTypes.add(mediaType); final HttpHeaders requestHeaders = new HttpHeaders(); @@ -164,6 +166,19 @@ public class RestAdminITCase { return new RestTemplate(s); } + private RestUser createDummyUser() { + final RestUser restUser = new RestUser(); + final String username = "foo-to-delete" + System.nanoTime(); + final String email = username + "@example.org"; + restUser.setEmail(email); + restUser.setUsername(username); + restUser.setFirstname("foo first name"); + restUser.setLastname("foo last name"); + restUser.setPassword("admin"); + return restUser; + } + + @DataProvider(name = "ContentType-Provider-Function") public Object[][] contentTypes() { return new Object[][]{{MediaType.APPLICATION_XML}, {MediaType.APPLICATION_JSON}}; diff --git a/wise-webapp/src/test/java/com/wisemapping/test/rest/RestMindmapTCase.java b/wise-webapp/src/test/java/com/wisemapping/test/rest/RestMindmapTCase.java index fd46529e..920721b3 100644 --- a/wise-webapp/src/test/java/com/wisemapping/test/rest/RestMindmapTCase.java +++ b/wise-webapp/src/test/java/com/wisemapping/test/rest/RestMindmapTCase.java @@ -1,6 +1,7 @@ package com.wisemapping.test.rest; +import com.wisemapping.rest.model.RestMindmap; import com.wisemapping.rest.model.RestUser; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; @@ -8,6 +9,8 @@ import org.springframework.http.*; import org.springframework.http.client.SimpleClientHttpRequestFactory; import org.springframework.security.crypto.codec.Base64; import org.springframework.web.client.RestTemplate; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.BeforeSuite; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; @@ -24,32 +27,102 @@ import static org.testng.Assert.fail; @Test public class RestMindmapTCase { - @NonNls - private static final String HOST_PORT = "http://localhost:8080/"; - private static final String BASE_REST_URL = HOST_PORT + "service"; + private String userEmail = "admin@wisemapping.com"; + private static final String HOST_PORT = "http://localhost:8080"; + private static final String BASE_REST_URL = HOST_PORT + "/service"; - private URI createUser(@NotNull HttpHeaders requestHeaders, @NotNull RestTemplate templateRest) { - final RestUser restUser = new RestUser(); - final String email = "foo-to-delete" + System.nanoTime() + "@example.org"; - restUser.setEmail(email); - restUser.setUsername("foo"); - restUser.setFirstname("foo first name"); - restUser.setLastname("foo last name"); - restUser.setPassword("foo password"); + @BeforeClass + void createUser() { - HttpEntity createUserEntity = new HttpEntity(restUser, requestHeaders); - return templateRest.postForLocation(BASE_REST_URL + "/admin/users", createUserEntity); + final RestAdminITCase restAdminITCase = new RestAdminITCase(); + userEmail = restAdminITCase.createNewUser(MediaType.APPLICATION_JSON); } - @Test(dataProvider = "ContentType-Provider-Function") public void createMap(final @NotNull MediaType mediaType) { // Configure media types ... final HttpHeaders requestHeaders = createHeaders(mediaType); final RestTemplate templateRest = createTemplate(); + // Create a sample map ... + final RestMindmap restMindmap = new RestMindmap(); + final String title = "My Map " + mediaType.toString(); + restMindmap.setTitle(title); + restMindmap.setDescription("My Map Desc"); + + // Create a new map ... + HttpEntity createUserEntity = new HttpEntity(restMindmap, requestHeaders); + final URI resourceLocation = templateRest.postForLocation(BASE_REST_URL + "/maps", createUserEntity); + + // Check that the map has been created ... + HttpEntity findUserEntity = new HttpEntity(requestHeaders); + final ResponseEntity response = templateRest.exchange(HOST_PORT + resourceLocation.toString(), HttpMethod.GET, findUserEntity, RestMindmap.class); + assertEquals(response.getBody().getTitle(), title); } - private HttpHeaders createHeaders(MediaType mediaType) { + + @Test(dataProvider = "ContentType-Provider-Function") + public void updateMapXml(final @NotNull MediaType mediaType) throws IOException { // Configure media types ... + final HttpHeaders requestHeaders = createHeaders(mediaType); + final RestTemplate templateRest = createTemplate(); + + // Create a sample map ... + final RestMindmap restMindmap = new RestMindmap(); + final String title = "Update XML sample " + mediaType.toString(); + restMindmap.setTitle(title); + restMindmap.setDescription("My Map Desc"); + + // Create a new map ... + HttpEntity createUserEntity = new HttpEntity(restMindmap, requestHeaders); + final URI resourceLocation = templateRest.postForLocation(BASE_REST_URL + "/maps", createUserEntity); + + // Update map xml content ... + final String resourceUrl = HOST_PORT + resourceLocation.toString(); + requestHeaders.setContentType(MediaType.APPLICATION_XML); + final String newXmlContent = "this is not valid"; + HttpEntity updateEntity = new HttpEntity(newXmlContent, requestHeaders); + templateRest.put(resourceUrl + "/xml", updateEntity); + + // Check that the map has been updated ... + HttpEntity findUserEntity = new HttpEntity(requestHeaders); + final ResponseEntity response = templateRest.exchange(HOST_PORT + resourceLocation.toString(), HttpMethod.GET, findUserEntity, RestMindmap.class); + assertEquals(response.getBody().getXml(), newXmlContent); + } + + + @Test(dataProvider = "ContentType-Provider-Function") + public void updateMap(final @NotNull MediaType mediaType) throws IOException { // Configure media types ... + final HttpHeaders requestHeaders = createHeaders(mediaType); + final RestTemplate templateRest = createTemplate(); + + // Create a sample map ... + final RestMindmap newRestMindmap = new RestMindmap(); + final String title = "Update sample " + mediaType.toString(); + newRestMindmap.setTitle(title); + newRestMindmap.setDescription("My Map Desc"); + + // Create a new map ... + final HttpEntity createUserEntity = new HttpEntity(newRestMindmap, requestHeaders); + final URI resourceLocation = templateRest.postForLocation(BASE_REST_URL + "/maps", createUserEntity); + + // Build map to update ... + final RestMindmap mapToUpdate = new RestMindmap(); + mapToUpdate.setXml("this is not valid"); + mapToUpdate.setProperties("{zoom:x}"); + + // Update map ... + final String resourceUrl = HOST_PORT + resourceLocation.toString(); + requestHeaders.setContentType(MediaType.APPLICATION_XML); + final HttpEntity updateEntity = new HttpEntity(mapToUpdate, requestHeaders); + templateRest.put(resourceUrl, updateEntity); + + // Check that the map has been updated ... + HttpEntity findUserEntity = new HttpEntity(requestHeaders); + final ResponseEntity response = templateRest.exchange(HOST_PORT + resourceLocation.toString(), HttpMethod.GET, findUserEntity, RestMindmap.class); + assertEquals(response.getBody().getXml(), mapToUpdate.getXml()); + assertEquals(response.getBody().getProperties(), mapToUpdate.getProperties()); + } + + private HttpHeaders createHeaders(@NotNull MediaType mediaType) { List acceptableMediaTypes = new ArrayList(); acceptableMediaTypes.add(mediaType); final HttpHeaders requestHeaders = new HttpHeaders(); @@ -65,11 +138,10 @@ public class RestMindmapTCase { super.prepareConnection(connection, httpMethod); //Basic Authentication for Police API - String authorisation = "admin@wisemapping.org" + ":" + "admin"; - byte[] encodedAuthorisation = Base64.encode(authorisation.getBytes()); + String authorization = userEmail + ":" + "admin"; + byte[] encodedAuthorisation = Base64.encode(authorization.getBytes()); connection.setRequestProperty("Authorization", "Basic " + new String(encodedAuthorisation)); } - }; return new RestTemplate(s); }