diff --git a/wise-api/pom.xml b/wise-api/pom.xml index aecf4ca6..30c6510b 100644 --- a/wise-api/pom.xml +++ b/wise-api/pom.xml @@ -4,7 +4,7 @@ org.springframework.boot spring-boot-starter-parent - 3.2.1 + 3.2.2 org.wisemapping @@ -199,7 +199,6 @@ - org.apache.maven.plugins diff --git a/wise-api/src/main/java/com/wisemapping/Application.java b/wise-api/src/main/java/com/wisemapping/Application.java index 5ac5f722..5283b2f5 100644 --- a/wise-api/src/main/java/com/wisemapping/Application.java +++ b/wise-api/src/main/java/com/wisemapping/Application.java @@ -1,7 +1,6 @@ package com.wisemapping; import com.wisemapping.config.common.CommonConfig; -import com.wisemapping.config.mvc.MvcAppConfig; import com.wisemapping.config.rest.RestAppConfig; import org.springframework.boot.WebApplicationType; import org.springframework.boot.builder.SpringApplicationBuilder; diff --git a/wise-api/src/main/java/com/wisemapping/config/mvc/InterceptorsConfig.java b/wise-api/src/main/java/com/wisemapping/config/mvc/InterceptorsConfig.java deleted file mode 100644 index 400a68e5..00000000 --- a/wise-api/src/main/java/com/wisemapping/config/mvc/InterceptorsConfig.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright [2022] [wisemapping] - * - * Licensed under WiseMapping Public License, Version 1.0 (the "License"). - * It is basically the Apache License, Version 2.0 (the "License") plus the - * "powered by wisemapping" text requirement on every single page; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the license at - * - * http://www.wisemapping.org/license - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.wisemapping.config.mvc; - -import com.wisemapping.filter.RequestPropertiesInterceptor; -import com.wisemapping.filter.UserLocaleInterceptor; -import org.jetbrains.annotations.NotNull; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.servlet.config.annotation.InterceptorRegistry; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; - -//@Configuration -//@ComponentScan(basePackageClasses = UserLocaleInterceptor.class) -public class InterceptorsConfig implements WebMvcConfigurer { - @Autowired - private UserLocaleInterceptor userLocaleInterceptor; - - @Autowired - private RequestPropertiesInterceptor requestPropertiesInterceptor; - - @Override - public void addInterceptors(@NotNull final InterceptorRegistry registry) { - registry.addInterceptor(userLocaleInterceptor); - registry.addInterceptor(requestPropertiesInterceptor); - } -} \ No newline at end of file diff --git a/wise-api/src/main/java/com/wisemapping/config/mvc/MvcAppConfig.java b/wise-api/src/main/java/com/wisemapping/config/mvc/MvcAppConfig.java deleted file mode 100644 index c17f0b51..00000000 --- a/wise-api/src/main/java/com/wisemapping/config/mvc/MvcAppConfig.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.wisemapping.config.mvc; - -import com.wisemapping.webmvc.MvcMindmapController; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Import; -import org.springframework.web.servlet.HandlerExceptionResolver; -import org.springframework.web.servlet.ViewResolver; -import org.springframework.web.servlet.config.annotation.EnableWebMvc; -import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; -import org.springframework.web.servlet.handler.SimpleMappingExceptionResolver; -import org.springframework.web.servlet.view.InternalResourceViewResolver; -import org.springframework.web.servlet.view.JstlView; - - -//@SpringBootApplication -//@Import({MvcMindmapController.class, MvcSecurityConfig.class}) -//@EnableWebMvc -public class MvcAppConfig implements WebMvcConfigurer { - @Override - public void addResourceHandlers(ResourceHandlerRegistry registry) { - registry - .addResourceHandler("/**") - .addResourceLocations("classpath:/public/"); - } - - @Bean - public ViewResolver viewResolver() { - InternalResourceViewResolver resolver = new InternalResourceViewResolver(); - resolver.setPrefix("/WEB-INF/jsp/"); - resolver.setSuffix(".jsp"); - resolver.setViewClass(JstlView.class); - return resolver; - } - - @Bean - HandlerExceptionResolver errorHandler() { - final SimpleMappingExceptionResolver result = new SimpleMappingExceptionResolver(); - - //mapping status code with view response. - result.addStatusCode("reactInclude", 403); - - //setting default error view - result.setDefaultErrorView("reactInclude"); - result.setDefaultStatusCode(500); - return result; - } -} \ No newline at end of file diff --git a/wise-api/src/main/java/com/wisemapping/config/mvc/MvcSecurityConfig.java b/wise-api/src/main/java/com/wisemapping/config/mvc/MvcSecurityConfig.java deleted file mode 100644 index cb236793..00000000 --- a/wise-api/src/main/java/com/wisemapping/config/mvc/MvcSecurityConfig.java +++ /dev/null @@ -1,100 +0,0 @@ -package com.wisemapping.config.mvc; - -import org.jetbrains.annotations.NotNull; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.core.annotation.Order; -import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer; -import org.springframework.security.web.SecurityFilterChain; -import org.springframework.security.web.servlet.util.matcher.MvcRequestMatcher; -import org.springframework.web.servlet.handler.HandlerMappingIntrospector; - -@Configuration -@EnableWebSecurity -public class MvcSecurityConfig { - @Bean - @Order(1) - public SecurityFilterChain embeddedDisabledXOrigin(@NotNull final HttpSecurity http, @NotNull final MvcRequestMatcher.Builder mvc) throws Exception { - http - .securityMatchers((matchers) -> - matchers.requestMatchers(mvc.pattern("/c/maps/*/embed"))) - .authorizeHttpRequests( - (auth) -> auth.requestMatchers(mvc.pattern(("/c/maps/*/embed"))).permitAll()) - .headers((header -> header.frameOptions() - .disable() - )) - .csrf(AbstractHttpConfigurer::disable); - - return http.build(); - } - - @Bean - MvcRequestMatcher.Builder mvc(HandlerMappingIntrospector introspector) { - return new MvcRequestMatcher.Builder(introspector); - } - - @Bean - @Order(2) - public SecurityFilterChain mvcFilterChain(@NotNull final HttpSecurity http, @NotNull final MvcRequestMatcher.Builder mvc) throws Exception { - http - .securityMatchers((matchers) -> - matchers.requestMatchers(mvc.pattern("/c/**"))) - .authorizeHttpRequests( - (auth) -> - auth - .requestMatchers(mvc.pattern("/c/login")).permitAll() - .requestMatchers(mvc.pattern("/c/logout")).permitAll() - .requestMatchers(mvc.pattern("/c/registration")).permitAll() - .requestMatchers(mvc.pattern("/c/registration-success")).permitAll() - .requestMatchers(mvc.pattern("/c/registration-google")).permitAll() - - .requestMatchers(mvc.pattern("/c/forgot-password")).permitAll() - .requestMatchers(mvc.pattern("/c/forgot-password-success")).permitAll() - .requestMatchers(mvc.pattern("/c/maps/*/try")).permitAll() - .requestMatchers(mvc.pattern("/c/maps/*/public")).permitAll() - .requestMatchers(mvc.pattern("/c/**")).hasAnyRole("USER", "ADMIN") - .anyRequest().authenticated()) - .formLogin((loginForm) -> - loginForm.loginPage("/c/login") - .loginProcessingUrl("/c/perform-login") - .defaultSuccessUrl("/c/maps/") - .failureUrl("/c/login?login_error=2")) - .logout((logout) -> - logout - .logoutUrl("/c/logout") - .logoutSuccessUrl("/c/login") - .invalidateHttpSession(true) - .deleteCookies("JSESSIONID") - .permitAll() - ).rememberMe(remember -> - remember - .tokenValiditySeconds(2419200) - .rememberMeParameter("remember-me" - ) - ).headers((header -> header.frameOptions() - .disable() - )) - .csrf((csrf) -> - csrf.ignoringRequestMatchers(mvc.pattern("/c/logout"))); - - return http.build(); - } - - @Bean - @Order(3) - public SecurityFilterChain shareResourcesFilterChain(@NotNull final HttpSecurity http, @NotNull final MvcRequestMatcher.Builder mvc) throws Exception { - return http.authorizeHttpRequests( - (auth) -> - auth.requestMatchers(mvc.pattern("/static/**")).permitAll(). - requestMatchers(mvc.pattern("/css/**")).permitAll(). - requestMatchers(mvc.pattern("/js/**")).permitAll(). - // @todo: Why this is required ... - requestMatchers(mvc.pattern("/WEB-INF/jsp/*.jsp")).permitAll(). - requestMatchers(mvc.pattern("/images/**")).permitAll(). - requestMatchers(mvc.pattern("/*")).permitAll() - - ).build(); - } -} diff --git a/wise-api/src/main/java/com/wisemapping/config/rest/RestAppConfig.java b/wise-api/src/main/java/com/wisemapping/config/rest/RestAppConfig.java index 7ee683a9..65546bd1 100644 --- a/wise-api/src/main/java/com/wisemapping/config/rest/RestAppConfig.java +++ b/wise-api/src/main/java/com/wisemapping/config/rest/RestAppConfig.java @@ -54,7 +54,7 @@ public class RestAppConfig { })) .csrf(AbstractHttpConfigurer::disable) .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) -// .httpBasic(withDefaults()) + .httpBasic(withDefaults()) .build(); } } diff --git a/wise-api/src/main/java/com/wisemapping/rest/MindmapController.java b/wise-api/src/main/java/com/wisemapping/rest/MindmapController.java index 526c5fcb..b1d1df7d 100644 --- a/wise-api/src/main/java/com/wisemapping/rest/MindmapController.java +++ b/wise-api/src/main/java/com/wisemapping/rest/MindmapController.java @@ -24,6 +24,7 @@ import com.wisemapping.rest.model.*; import com.wisemapping.security.Utils; import com.wisemapping.service.*; import com.wisemapping.validator.MapInfoValidator; +import com.wisemapping.view.MindMapBean; import jakarta.servlet.http.HttpServletResponse; import org.apache.commons.validator.routines.EmailValidator; import org.apache.logging.log4j.LogManager; @@ -32,6 +33,7 @@ import org.jetbrains.annotations.NotNull; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.i18n.LocaleContextHolder; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; @@ -72,7 +74,7 @@ public class MindmapController extends BaseController { @RequestMapping(method = RequestMethod.GET, value = "/{id}", produces = {"application/json"}) @ResponseBody public RestMindmap retrieve(@PathVariable int id) throws WiseMappingException { - final User user = Utils.getUser(); + final User user = Utils.getUser(true); final Mindmap mindMap = findMindmapById(id); return new RestMindmap(mindMap, user); } @@ -80,17 +82,28 @@ public class MindmapController extends BaseController { @PreAuthorize("isAuthenticated() and hasRole('ROLE_USER')") @RequestMapping(method = RequestMethod.GET, value = "/{id}/metadata", produces = {"application/json"}) @ResponseBody - public RestMindmap retrieveMetadata(@PathVariable int id) throws WiseMappingException { - final User user = Utils.getUser(); - - final Mindmap mindMap = findMindmapById(id); - return new RestMindmap(mindMap, user); + public RestMindmapMetadata retrieveMetadata(@PathVariable int id) throws WiseMappingException { + final User user = Utils.getUser(true); + final Mindmap mindmap = findMindmapById(id); + final MindMapBean mindMapBean = new MindMapBean(mindmap, user); + + // Is the mindmap locked ?. + boolean isLocked = false; + final LockManager lockManager = this.mindmapService.getLockManager(); + String lockFullName = null; + if (lockManager.isLocked(mindmap) && !lockManager.isLockedBy(mindmap, user)) { + final LockInfo lockInfo = lockManager.getLockInfo(mindmap); + isLocked = true; + lockFullName = lockInfo.getUser().getFullName(); + } + + return new RestMindmapMetadata(mindmap.getTitle(), mindMapBean.getProperties(), isLocked, lockFullName); } @PreAuthorize("isAuthenticated() and hasRole('ROLE_USER')") @RequestMapping(method = RequestMethod.GET, value = "/", produces = {"application/json"}) public RestMindmapList retrieveList(@RequestParam(required = false) String q) { - final User user = Utils.getUser(); + final User user = Utils.getUser(true); final MindmapFilter filter = MindmapFilter.parse(q); List mindmaps = mindmapService.findMindmapsByUser(user); @@ -119,7 +132,7 @@ public class MindmapController extends BaseController { public void updateDocument(@RequestBody RestMindmap restMindmap, @PathVariable int id, @RequestParam(required = false) boolean minor) throws WiseMappingException, IOException { final Mindmap mindmap = findMindmapById(id); - final User user = Utils.getUser(); + final User user = Utils.getUser(true); // Validate arguments ... final String properties = restMindmap.getProperties(); @@ -148,7 +161,7 @@ public class MindmapController extends BaseController { @ResponseStatus(value = HttpStatus.NO_CONTENT) public void updateRevertMindmap(@PathVariable int id, @PathVariable String hid) throws WiseMappingException, IOException { final Mindmap mindmap = findMindmapById(id); - final User user = Utils.getUser(); + final User user = Utils.getUser(true); if (LATEST_HISTORY_REVISION.equals(hid)) { // Revert to the latest stored version ... @@ -178,7 +191,7 @@ public class MindmapController extends BaseController { @ResponseBody public void updateDocument(@PathVariable int id, @RequestBody String xmlDoc) throws WiseMappingException { final Mindmap mindmap = findMindmapById(id); - final User user = Utils.getUser(); + final User user = Utils.getUser(true); mindmap.setXmlStr(xmlDoc); saveMindmapDocument(false, mindmap, user); @@ -203,7 +216,7 @@ public class MindmapController extends BaseController { public void updateProperties(@RequestBody RestMindmap restMindmap, @PathVariable int id, @RequestParam(required = false) boolean minor) throws IOException, WiseMappingException { final Mindmap mindmap = findMindmapById(id); - final User user = Utils.getUser(); + final User user = Utils.getUser(true); final String xml = restMindmap.getXml(); if (xml != null && !xml.isEmpty()) { @@ -239,7 +252,7 @@ public class MindmapController extends BaseController { @NotNull private Mindmap findMindmapById(int id) throws MapCouldNotFoundException, AccessDeniedSecurityException { // Has enough permissions ? - final User user = Utils.getUser(); + final User user = Utils.getUser(true); if (!mindmapService.hasPermissions(user, id, CollaborationRole.VIEWER)) { throw new AccessDeniedSecurityException(id, user); } @@ -258,7 +271,7 @@ public class MindmapController extends BaseController { public void updateTitle(@RequestBody String title, @PathVariable int id) throws WiseMappingException { final Mindmap mindMap = findMindmapById(id); - final User user = Utils.getUser(); + final User user = Utils.getUser(true); // Is there a map with the same name ? if (mindmapService.getMindmapByTitle(title, user) != null) { diff --git a/wise-api/src/main/java/com/wisemapping/rest/model/RestMindmapMetadata.java b/wise-api/src/main/java/com/wisemapping/rest/model/RestMindmapMetadata.java index 63158ce3..050cf876 100644 --- a/wise-api/src/main/java/com/wisemapping/rest/model/RestMindmapMetadata.java +++ b/wise-api/src/main/java/com/wisemapping/rest/model/RestMindmapMetadata.java @@ -20,18 +20,10 @@ package com.wisemapping.rest.model; import com.fasterxml.jackson.annotation.JsonAutoDetect; -import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.wisemapping.exceptions.InvalidMindmapException; -import com.wisemapping.exceptions.WiseMappingException; -import com.wisemapping.model.*; -import com.wisemapping.util.TimeUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.io.IOException; -import java.util.Calendar; - @JsonAutoDetect( fieldVisibility = JsonAutoDetect.Visibility.NONE, setterVisibility = JsonAutoDetect.Visibility.PUBLIC_ONLY, @@ -40,8 +32,49 @@ import java.util.Calendar; ) @JsonIgnoreProperties(ignoreUnknown = true) public class RestMindmapMetadata { + private String jsonProps; + private boolean locked; + private String title; - public RestMindmapMetadata() throws WiseMappingException { + public String getJsonProps() { + return jsonProps; + } + + public void setJsonProps(String jsonProps) { + this.jsonProps = jsonProps; + } + + public boolean isLocked() { + return locked; + } + + public void setLocked(boolean locked) { + this.locked = locked; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getLockFullName() { + return lockFullName; + } + + public void setLockFullName(String lockFullName) { + this.lockFullName = lockFullName; + } + + private String lockFullName; + + public RestMindmapMetadata(@NotNull String title, @NotNull String jsonProps, boolean locked, @Nullable String lockFullName) { + this.jsonProps = jsonProps; + this.title = title; + this.locked = locked; + this.lockFullName = lockFullName; } } diff --git a/wise-api/src/main/java/com/wisemapping/view/MindMapBean.java b/wise-api/src/main/java/com/wisemapping/view/MindMapBean.java index 4b806f3a..b62da707 100644 --- a/wise-api/src/main/java/com/wisemapping/view/MindMapBean.java +++ b/wise-api/src/main/java/com/wisemapping/view/MindMapBean.java @@ -127,10 +127,6 @@ public class MindMapBean { mindmap.setDescription(d); } - public String getXmlAsJsLiteral() throws IOException { - return this.mindmap.getXmlAsJsLiteral(); - } - public String getProperties() throws WiseMappingException { String result = null; diff --git a/wise-api/src/main/resources/public/favicon.ico b/wise-api/src/main/resources/public/favicon.ico deleted file mode 100644 index 955c5116..00000000 Binary files a/wise-api/src/main/resources/public/favicon.ico and /dev/null differ diff --git a/wise-api/src/main/resources/public/favicon.png b/wise-api/src/main/resources/public/favicon.png deleted file mode 100644 index bb62808d..00000000 Binary files a/wise-api/src/main/resources/public/favicon.png and /dev/null differ diff --git a/wise-api/src/main/resources/public/index.html b/wise-api/src/main/resources/public/index.html deleted file mode 100644 index 02dcf806..00000000 --- a/wise-api/src/main/resources/public/index.html +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/wise-api/src/test/java/com/wisemapping/test/rest/RestMindmapControllerTest.java b/wise-api/src/test/java/com/wisemapping/test/rest/RestMindmapControllerTest.java index 078e2928..6e01a87a 100644 --- a/wise-api/src/test/java/com/wisemapping/test/rest/RestMindmapControllerTest.java +++ b/wise-api/src/test/java/com/wisemapping/test/rest/RestMindmapControllerTest.java @@ -22,6 +22,7 @@ import org.springframework.web.util.DefaultUriBuilderFactory; import java.io.IOException; import java.net.URI; +import java.net.URISyntaxException; import java.util.List; import java.util.Objects; import java.util.Optional; @@ -35,7 +36,7 @@ public class RestMindmapControllerTest { private RestUser user; - @Autowired + @Autowired private TestRestTemplate restTemplate; @BeforeEach @@ -52,7 +53,7 @@ public class RestMindmapControllerTest { } @Test - public void listMaps() { + public void listMaps() throws URISyntaxException { final HttpHeaders requestHeaders = createHeaders(MediaType.APPLICATION_JSON); final TestRestTemplate restTemplate = this.restTemplate.withBasicAuth(user.getEmail(), user.getPassword()); @@ -81,7 +82,7 @@ public class RestMindmapControllerTest { } @Test - public void deleteMap() { + public void deleteMap() throws URISyntaxException { final HttpHeaders requestHeaders = createHeaders(MediaType.APPLICATION_JSON); final TestRestTemplate restTemplate = this.restTemplate.withBasicAuth(user.getEmail(), user.getPassword()); @@ -103,7 +104,7 @@ public class RestMindmapControllerTest { } @Test - public void changeMapTitle() { + public void changeMapTitle() throws URISyntaxException { final HttpHeaders requestHeaders = createHeaders(MediaType.APPLICATION_JSON); final TestRestTemplate restTemplate = this.restTemplate.withBasicAuth(user.getEmail(), user.getPassword()); @@ -117,7 +118,7 @@ public class RestMindmapControllerTest { } @Test - public void validateMapsCreation() { // Configure media types ... + public void validateMapsCreation() throws URISyntaxException { // Configure media types ... final HttpHeaders requestHeaders = createHeaders(MediaType.APPLICATION_JSON); requestHeaders.set(HttpHeaders.ACCEPT_LANGUAGE, "en"); final TestRestTemplate restTemplate = this.restTemplate.withBasicAuth(user.getEmail(), user.getPassword()); @@ -135,7 +136,7 @@ public class RestMindmapControllerTest { @Test - public void changeMapDescription() { + public void changeMapDescription() throws URISyntaxException { final HttpHeaders requestHeaders = createHeaders(MediaType.APPLICATION_JSON); final TestRestTemplate restTemplate = this.restTemplate.withBasicAuth(user.getEmail(), user.getPassword()); @@ -155,7 +156,7 @@ public class RestMindmapControllerTest { @Test - public void updateMapXml() throws IOException { // Configure media types ... + public void updateMapXml() throws IOException, URISyntaxException { // Configure media types ... final HttpHeaders requestHeaders = createHeaders(MediaType.APPLICATION_JSON); final TestRestTemplate restTemplate = this.restTemplate.withBasicAuth(user.getEmail(), user.getPassword()); @@ -183,7 +184,7 @@ public class RestMindmapControllerTest { @Test - public void cloneMap() throws IOException { + public void cloneMap() throws IOException, URISyntaxException { final HttpHeaders requestHeaders = createHeaders(MediaType.APPLICATION_JSON); final TestRestTemplate restTemplate = this.restTemplate.withBasicAuth(user.getEmail(), user.getPassword()); @@ -211,7 +212,7 @@ public class RestMindmapControllerTest { @Test - public void updateStarred() { // Configure media types ... + public void updateStarred() throws URISyntaxException { // Configure media types ... final HttpHeaders requestHeaders = createHeaders(MediaType.APPLICATION_JSON); final TestRestTemplate restTemplate = this.restTemplate.withBasicAuth(user.getEmail(), user.getPassword()); @@ -238,7 +239,7 @@ public class RestMindmapControllerTest { @Test - public void verifyMapOwnership() { + public void verifyMapOwnership() throws URISyntaxException { final HttpHeaders requestHeaders = createHeaders(MediaType.APPLICATION_JSON); final TestRestTemplate firstUser = this.restTemplate.withBasicAuth(user.getEmail(), user.getPassword()); @@ -266,7 +267,7 @@ public class RestMindmapControllerTest { } @Test - public void updateMap() throws IOException, WiseMappingException { + public void updateMap() throws IOException, WiseMappingException, URISyntaxException { final HttpHeaders requestHeaders = createHeaders(MediaType.APPLICATION_JSON); final TestRestTemplate restTemplate = this.restTemplate.withBasicAuth(user.getEmail(), user.getPassword()); @@ -303,7 +304,7 @@ public class RestMindmapControllerTest { @Test - public void addCollabs() { + public void addCollabs() throws URISyntaxException { final HttpHeaders requestHeaders = createHeaders(MediaType.APPLICATION_JSON); final TestRestTemplate restTemplate = this.restTemplate.withBasicAuth(user.getEmail(), user.getPassword()); @@ -324,7 +325,7 @@ public class RestMindmapControllerTest { } @Test - public void updateCollabType() { + public void updateCollabType() throws URISyntaxException { final HttpHeaders requestHeaders = createHeaders(MediaType.APPLICATION_JSON); final TestRestTemplate restTemplate = this.restTemplate.withBasicAuth(user.getEmail(), user.getPassword()); @@ -361,7 +362,7 @@ public class RestMindmapControllerTest { @Test - public void deleteCollabs() { + public void deleteCollabs() throws URISyntaxException { final HttpHeaders requestHeaders = createHeaders(MediaType.APPLICATION_JSON); final TestRestTemplate restTemplate = this.restTemplate.withBasicAuth(user.getEmail(), user.getPassword()); @@ -400,7 +401,7 @@ public class RestMindmapControllerTest { @Test - public void deleteCollabsWithInvalidEmail() { + public void deleteCollabsWithInvalidEmail() throws URISyntaxException { final HttpHeaders requestHeaders = createHeaders(MediaType.APPLICATION_JSON); final TestRestTemplate restTemplate = this.restTemplate.withBasicAuth(user.getEmail(), user.getPassword()); @@ -418,7 +419,7 @@ public class RestMindmapControllerTest { } @Test - public void deleteCollabsWithoutOwnerPermission() { + public void deleteCollabsWithoutOwnerPermission() throws URISyntaxException { final TestRestTemplate restTemplate = this.restTemplate.withBasicAuth(user.getEmail(), user.getPassword()); final URI resourceUri = addNewMap(restTemplate, "deleteWithoutOwnerPermission"); @@ -439,7 +440,7 @@ public class RestMindmapControllerTest { } @Test - public void deleteOwnerCollab() { + public void deleteOwnerCollab() throws URISyntaxException { final TestRestTemplate restTemplate = this.restTemplate.withBasicAuth(user.getEmail(), user.getPassword()); // Create a sample map ... @@ -458,7 +459,7 @@ public class RestMindmapControllerTest { } @Test - public void addCollabsInvalidOwner() { + public void addCollabsInvalidOwner() throws URISyntaxException { final HttpHeaders requestHeaders = createHeaders(MediaType.APPLICATION_JSON); final TestRestTemplate restTemplate = this.restTemplate.withBasicAuth(user.getEmail(), user.getPassword()); @@ -479,7 +480,7 @@ public class RestMindmapControllerTest { } @Test - public void removeLabelFromMindmap() { // Configure media types ... + public void removeLabelFromMindmap() throws URISyntaxException { // Configure media types ... final HttpHeaders requestHeaders = createHeaders(MediaType.APPLICATION_JSON); final TestRestTemplate restTemplate = this.restTemplate.withBasicAuth(user.getEmail(), user.getPassword()); @@ -524,7 +525,7 @@ public class RestMindmapControllerTest { } @Test - public void addLabelToMindmap() { // Configure media types ... + public void addLabelToMindmap() throws URISyntaxException { // Configure media types ... final HttpHeaders requestHeaders = createHeaders(MediaType.APPLICATION_JSON); final TestRestTemplate restTemplate = this.restTemplate.withBasicAuth(user.getEmail(), user.getPassword()); @@ -548,7 +549,23 @@ public class RestMindmapControllerTest { } @Test - public void updateCollabs() { + public void fetchMapMetadata() throws URISyntaxException { + final HttpHeaders requestHeaders = createHeaders(MediaType.APPLICATION_JSON); + final TestRestTemplate restTemplate = this.restTemplate.withBasicAuth(user.getEmail(), user.getPassword()); + + // Create a sample map ... + final String mapTitle = "Maps 1 !"; + final URI mindmapUri = addNewMap(restTemplate, mapTitle); + final String mapId = mindmapUri.getPath().replace("/api/restful/maps/", ""); + + final ResponseEntity exchange = restTemplate.exchange(mindmapUri + "/metadata", HttpMethod.GET, null, RestMindmapMetadata.class); + assertTrue(exchange.getStatusCode().is2xxSuccessful()); + assertEquals(mapTitle, exchange.getBody().getTitle()); + + } + + @Test + public void updateCollabs() throws URISyntaxException { // Create a sample map ... final HttpHeaders requestHeaders = createHeaders(MediaType.APPLICATION_JSON); @@ -592,7 +609,7 @@ public class RestMindmapControllerTest { @Test - public void updateProperties() throws IOException, WiseMappingException { + public void updateProperties() throws IOException, WiseMappingException, URISyntaxException { final HttpHeaders requestHeaders = createHeaders(MediaType.APPLICATION_JSON); final TestRestTemplate restTemplate = this.restTemplate.withBasicAuth(user.getEmail(), user.getPassword()); @@ -623,7 +640,7 @@ public class RestMindmapControllerTest { @Test - public void batchDelete() { + public void batchDelete() throws URISyntaxException { final HttpHeaders requestHeaders = createHeaders(MediaType.APPLICATION_JSON); final TestRestTemplate restTemplate = this.restTemplate.withBasicAuth(user.getEmail(), user.getPassword()); @@ -646,7 +663,7 @@ public class RestMindmapControllerTest { @Test - public void updatePublishState() { + public void updatePublishState() throws URISyntaxException { final HttpHeaders requestHeaders = createHeaders(MediaType.APPLICATION_JSON); final TestRestTemplate restTemplate = this.restTemplate.withBasicAuth(user.getEmail(), user.getPassword()); @@ -663,7 +680,7 @@ public class RestMindmapControllerTest { } @Test - public void fetchMapHistory() { + public void fetchMapHistory() throws URISyntaxException { final HttpHeaders requestHeaders = createHeaders(MediaType.APPLICATION_JSON); final TestRestTemplate restTemplate = this.restTemplate.withBasicAuth(user.getEmail(), user.getPassword()); @@ -681,7 +698,7 @@ public class RestMindmapControllerTest { @Test - public void updateRevertMindmap() throws IOException { + public void updateRevertMindmap() throws IOException, URISyntaxException { final HttpHeaders requestHeaders = createHeaders(MediaType.APPLICATION_JSON); final TestRestTemplate restTemplate = this.restTemplate.withBasicAuth(user.getEmail(), user.getPassword()); @@ -709,7 +726,7 @@ public class RestMindmapControllerTest { @Test - public void addCollabWhitoutOwnerPermission() { + public void addCollabWhitoutOwnerPermission() throws URISyntaxException { final HttpHeaders requestHeaders = createHeaders(MediaType.APPLICATION_JSON); final TestRestTemplate restTemplate = this.restTemplate.withBasicAuth(user.getEmail(), user.getPassword()); @@ -736,7 +753,7 @@ public class RestMindmapControllerTest { } @Test - public void addCollabWhitOwnerRole() { + public void addCollabWhitOwnerRole() throws URISyntaxException { final HttpHeaders requestHeaders = createHeaders(MediaType.APPLICATION_JSON); final TestRestTemplate restTemplate = this.restTemplate.withBasicAuth(user.getEmail(), user.getPassword()); @@ -800,14 +817,19 @@ public class RestMindmapControllerTest { } // - private URI addNewMap(@NotNull TestRestTemplate template, @NotNull String title, @Nullable String xml) { + private URI addNewMap(@NotNull TestRestTemplate template, @NotNull String title, @Nullable String xml) throws URISyntaxException { // Create a new map ... final HttpHeaders requestHeaders = createHeaders(MediaType.APPLICATION_XML); - HttpEntity createUserEntity = new HttpEntity<>(xml, requestHeaders); - return template.postForLocation("/api/restful/maps?title=" + title, createUserEntity); + final HttpEntity createUserEntity = new HttpEntity<>(xml, requestHeaders); + + final ResponseEntity exchange = template.exchange("/api/restful/maps?title=" + title, HttpMethod.POST, createUserEntity, String.class); + assertTrue(exchange.getStatusCode().is2xxSuccessful()); + + final List locations = exchange.getHeaders().get(HttpHeaders.LOCATION); + return new URI(locations.stream().findFirst().get()); } - private URI addNewMap(@NotNull TestRestTemplate template, @NotNull String title) { + private URI addNewMap(@NotNull TestRestTemplate template, @NotNull String title) throws URISyntaxException { return addNewMap(template, title, null); }