diff --git a/spring-mvc-velocity/src/main/webapp/WEB-INF/views/index.vm b/spring-mvc-velocity/src/main/webapp/WEB-INF/views/index.vm
index d1ae0b02cb..8883a50658 100644
--- a/spring-mvc-velocity/src/main/webapp/WEB-INF/views/index.vm
+++ b/spring-mvc-velocity/src/main/webapp/WEB-INF/views/index.vm
@@ -1,19 +1,4 @@
Index
-
Tutorials list
-
-
- Tutorial Id
- Tutorial Title
- Tutorial Description
- Tutorial Author
-
-#foreach($tut in $tutorials)
-
- $tut.tutId
- $tut.title
- $tut.description
- $tut.author
-
-#end
-
\ No newline at end of file
+
Welcome page
+This is just the welcome page
\ No newline at end of file
diff --git a/spring-mvc-velocity/src/main/webapp/WEB-INF/views/list.vm b/spring-mvc-velocity/src/main/webapp/WEB-INF/views/list.vm
new file mode 100644
index 0000000000..9e06a09e4f
--- /dev/null
+++ b/spring-mvc-velocity/src/main/webapp/WEB-INF/views/list.vm
@@ -0,0 +1,19 @@
+
Index
+
+
Tutorials list
+
+
+ Tutorial Id
+ Tutorial Title
+ Tutorial Description
+ Tutorial Author
+
+#foreach($tut in $tutorials)
+
+ $tut.tutId
+ $tut.title
+ $tut.description
+ $tut.author
+
+#end
+
\ No newline at end of file
diff --git a/spring-mvc-velocity/src/main/webapp/WEB-INF/web.xml b/spring-mvc-velocity/src/main/webapp/WEB-INF/web_old.xml
similarity index 100%
rename from spring-mvc-velocity/src/main/webapp/WEB-INF/web.xml
rename to spring-mvc-velocity/src/main/webapp/WEB-INF/web_old.xml
diff --git a/spring-mvc-velocity/src/test/java/com/baeldung/mvc/velocity/test/DataContentControllerTest.java b/spring-mvc-velocity/src/test/java/com/baeldung/mvc/velocity/test/DataContentControllerTest.java
index 36453eef92..a9fb242755 100644
--- a/spring-mvc-velocity/src/test/java/com/baeldung/mvc/velocity/test/DataContentControllerTest.java
+++ b/spring-mvc-velocity/src/test/java/com/baeldung/mvc/velocity/test/DataContentControllerTest.java
@@ -1,12 +1,19 @@
package com.baeldung.mvc.velocity.test;
-import com.baeldung.mvc.velocity.domain.Tutorial;
-import com.baeldung.mvc.velocity.service.ITutorialsService;
-import com.baeldung.mvc.velocity.service.TutorialsService;
+import static org.hamcrest.Matchers.allOf;
+import static org.hamcrest.Matchers.hasItem;
+import static org.hamcrest.Matchers.hasProperty;
+import static org.hamcrest.Matchers.hasSize;
+import static org.hamcrest.Matchers.is;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.model;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.view;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.xpath;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.mockito.Mockito;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@@ -15,72 +22,40 @@ import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;
-import java.util.Arrays;
-
-import static org.hamcrest.Matchers.allOf;
-import static org.hamcrest.Matchers.containsString;
-import static org.hamcrest.Matchers.hasItem;
-import static org.hamcrest.Matchers.hasProperty;
-import static org.hamcrest.Matchers.hasSize;
-import static org.hamcrest.Matchers.is;
-import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
-import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
-import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.model;
-import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
-import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.view;
+import com.baeldung.mvc.velocity.spring.config.WebConfig;
+import com.baeldung.mvc.velocity.test.config.TestConfig;
@RunWith(SpringJUnit4ClassRunner.class)
-@ContextConfiguration(locations = {"classpath:mvc-servlet.xml"})
+// @ContextConfiguration(locations = {"classpath:mvc-servlet.xml"})
+@ContextConfiguration(classes = { TestConfig.class, WebConfig.class })
@WebAppConfiguration
public class DataContentControllerTest {
-
private MockMvc mockMvc;
- @Autowired
- private ITutorialsService tutServiceMock;
-
@Autowired
private WebApplicationContext webApplicationContext;
-
+
@Before
public void setUp() {
- tutServiceMock = Mockito.mock(TutorialsService.class);
- Mockito.reset(tutServiceMock);
+
mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
}
-
- @Test
- public void testModel() throws Exception{
- Mockito.when(tutServiceMock.listTutorials()).thenReturn(Arrays.asList(
- new Tutorial(1, "Guava", "Introduction to Guava", "GuavaAuthor"),
- new Tutorial(2, "Android", "Introduction to Android", "AndroidAuthor")
- ));
-
- mockMvc.perform(get("/"))
- .andExpect(status().isOk())
- .andExpect(view().name("index"))
- .andExpect(content().string(containsString("GuavaAuthor")))
- .andExpect(content().string(containsString("Introduction to Guava")))
- .andExpect(content().string(containsString("AndroidAuthor")))
- .andExpect(content().string(containsString("Introduction to Android")))
- .andExpect(model().attribute("tutorials", hasSize(2)))
- .andExpect(model().attribute("tutorials", hasSize(2)))
- .andExpect(model().attribute("tutorials", hasItem(
- allOf(
- hasProperty("tutId", is(1)),
- hasProperty("author", is("GuavaAuthor")),
- hasProperty("title", is("Guava"))
- )
- )))
- .andExpect(model().attribute("tutorials", hasItem(
- allOf(
- hasProperty("tutId", is(2)),
- hasProperty("author", is("AndroidAuthor")),
- hasProperty("title", is("Android"))
- )
- )));
- }
+ @Test
+ public void whenCallingList_ThenModelAndContentOK() throws Exception {
+
+ mockMvc.perform(get("/list")).andExpect(status().isOk()).andExpect(view().name("list")).andExpect(model().attribute("tutorials", hasSize(2)))
+ .andExpect(model().attribute("tutorials", hasItem(allOf(hasProperty("tutId", is(1)), hasProperty("author", is("GuavaAuthor")), hasProperty("title", is("Guava"))))))
+ .andExpect(model().attribute("tutorials", hasItem(allOf(hasProperty("tutId", is(2)), hasProperty("author", is("AndroidAuthor")), hasProperty("title", is("Android"))))));
+
+ mockMvc.perform(get("/list")).andExpect(xpath("//table").exists());
+ mockMvc.perform(get("/list")).andExpect(xpath("//td[@id='tutId_1']").exists());
+ }
+
+ @Test
+ public void whenCallingIndex_thenViewOK() throws Exception{
+ mockMvc.perform(get("/")).andExpect(status().isOk()).andExpect(view().name("index")).andExpect(model().size(0));
+ }
}
diff --git a/spring-mvc-velocity/src/test/java/com/baeldung/mvc/velocity/test/NavigationControllerTest.java b/spring-mvc-velocity/src/test/java/com/baeldung/mvc/velocity/test/NavigationControllerTest.java
deleted file mode 100644
index e007cf3f94..0000000000
--- a/spring-mvc-velocity/src/test/java/com/baeldung/mvc/velocity/test/NavigationControllerTest.java
+++ /dev/null
@@ -1,68 +0,0 @@
-package com.baeldung.mvc.velocity.test;
-
-
-import com.baeldung.mvc.velocity.controller.MainController;
-import com.baeldung.mvc.velocity.domain.Tutorial;
-import com.baeldung.mvc.velocity.service.TutorialsService;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mockito;
-import org.springframework.test.context.ContextConfiguration;
-import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
-import org.springframework.test.context.web.WebAppConfiguration;
-import org.springframework.ui.ExtendedModelMap;
-import org.springframework.ui.Model;
-
-import java.util.Arrays;
-import java.util.List;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyNoMoreInteractions;
-
-@RunWith(SpringJUnit4ClassRunner.class)
-@WebAppConfiguration
-@ContextConfiguration(locations = {"classpath:mvc-servlet.xml"})
-public class NavigationControllerTest {
-
- private MainController mainController = new MainController(Mockito.mock(TutorialsService.class));
-
- private final Model model = new ExtendedModelMap();
-
-
- @Test
- public void shouldGoToTutorialListView() {
- Mockito.when(mainController.getTutService().listTutorials())
- .thenReturn(createTutorialList());
-
- final String view = mainController.listTutorialsPage(model);
- final List
tutorialListAttribute = (List) model.asMap().get("tutorials");
-
- assertEquals("index", view);
- assertNotNull(tutorialListAttribute);
- }
-
- @Test
- public void testContent() throws Exception{
-
- List tutorials = Arrays.asList(
- new Tutorial(1, "Guava", "Introduction to Guava", "GuavaAuthor"),
- new Tutorial(2, "Android", "Introduction to Android", "AndroidAuthor")
- );
- Mockito.when(mainController.getTutService().listTutorials()).thenReturn(tutorials);
-
- String view = mainController.listTutorialsPage(model);
-
- verify(mainController.getTutService(), times(1)).listTutorials();
- verifyNoMoreInteractions(mainController.getTutService());
-
- assertEquals("index", view);
- assertEquals(tutorials, model.asMap().get("tutorials"));
- }
-
- private static List createTutorialList() {
- return Arrays.asList(new Tutorial(1, "TestAuthor", "Test Title", "Test Description"));
- }
-}
diff --git a/spring-mvc-velocity/src/test/java/com/baeldung/mvc/velocity/test/config/TestConfig.java b/spring-mvc-velocity/src/test/java/com/baeldung/mvc/velocity/test/config/TestConfig.java
new file mode 100644
index 0000000000..8b84bcdd23
--- /dev/null
+++ b/spring-mvc-velocity/src/test/java/com/baeldung/mvc/velocity/test/config/TestConfig.java
@@ -0,0 +1,32 @@
+package com.baeldung.mvc.velocity.test.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.ViewResolver;
+import org.springframework.web.servlet.view.velocity.VelocityConfigurer;
+import org.springframework.web.servlet.view.velocity.VelocityLayoutViewResolver;
+
+@Configuration
+public class TestConfig {
+
+
+ @Bean
+ public ViewResolver viewResolver() {
+ final VelocityLayoutViewResolver bean = new VelocityLayoutViewResolver();
+ bean.setCache(true);
+ bean.setPrefix("/WEB-INF/views/");
+ bean.setLayoutUrl("/WEB-INF/layouts/layout.vm");
+ bean.setSuffix(".vm");
+ return bean;
+ }
+
+ @Bean
+ public VelocityConfigurer velocityConfig() {
+ VelocityConfigurer velocityConfigurer = new VelocityConfigurer();
+ velocityConfigurer.setResourceLoaderPath("/");
+ return velocityConfigurer;
+ }
+
+
+
+}
diff --git a/spring-rest-angular-pagination/StudentDirectory/pom.xml b/spring-rest-angular-pagination/StudentDirectory/pom.xml
new file mode 100644
index 0000000000..8dab851ef2
--- /dev/null
+++ b/spring-rest-angular-pagination/StudentDirectory/pom.xml
@@ -0,0 +1,86 @@
+
+
+ 4.0.0
+ angular-spring-rest-sample
+ angular-spring-rest-sample
+ com.baeldung
+ 1.0
+ war
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 1.3.3.RELEASE
+
+
+ 1.12.2.RELEASE
+
+
+
+ org.springframework.boot
+ spring-boot-starter-tomcat
+ provided
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.springframework.data
+ spring-data-commons
+
+
+ org.springframework
+ spring-test
+ test
+
+
+ org.apache.commons
+ commons-lang3
+ 3.3
+
+
+ com.google.guava
+ guava
+ 19.0
+
+
+ junit
+ junit
+ test
+
+
+ io.rest-assured
+ rest-assured
+ 3.0.0
+ test
+
+
+ io.rest-assured
+ spring-mock-mvc
+ 3.0.0
+ test
+
+
+
+ angular-spring-rest-sample
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+ 1.8
+ 1.8
+
+
+
+ org.apache.maven.plugins
+ maven-war-plugin
+
+ false
+
+
+
+
+
diff --git a/spring-rest-angular-pagination/StudentDirectory/src/main/java/org/baeldung/mock/MockStudentData.java b/spring-rest-angular-pagination/StudentDirectory/src/main/java/org/baeldung/mock/MockStudentData.java
new file mode 100644
index 0000000000..df70780a87
--- /dev/null
+++ b/spring-rest-angular-pagination/StudentDirectory/src/main/java/org/baeldung/mock/MockStudentData.java
@@ -0,0 +1,39 @@
+package org.baeldung.mock;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.baeldung.web.vo.Student;
+
+public class MockStudentData {
+
+ private static List studentList = new ArrayList<>();
+
+ static {
+ studentList.add(new Student("1", "Bryan", "Male", 20));
+ studentList.add(new Student("2", "Ben", "Male", 22));
+ studentList.add(new Student("3", "Lisa", "Female", 24));
+ studentList.add(new Student("4", "Sarah", "Female", 26));
+ studentList.add(new Student("5", "Jay", "Male", 20));
+ studentList.add(new Student("6", "John", "Male", 22));
+ studentList.add(new Student("7", "Jordan", "Male", 24));
+ studentList.add(new Student("8", "Rob", "Male", 26));
+ studentList.add(new Student("9", "Will", "Male", 20));
+ studentList.add(new Student("10", "Shawn", "Male", 22));
+ studentList.add(new Student("11", "Taylor", "Female", 24));
+ studentList.add(new Student("12", "Venus", "Female", 26));
+ studentList.add(new Student("13", "Vince", "Male", 20));
+ studentList.add(new Student("14", "Carol", "Female", 22));
+ studentList.add(new Student("15", "Joana", "Female", 24));
+ studentList.add(new Student("16", "Dion", "Male", 26));
+ studentList.add(new Student("17", "Evans", "Male", 20));
+ studentList.add(new Student("18", "Bart", "Male", 22));
+ studentList.add(new Student("19", "Jenny", "Female", 24));
+ studentList.add(new Student("20", "Kristine", "Female", 26));
+ }
+
+ public static List getMockDataStudents(){
+ return studentList;
+ }
+
+}
diff --git a/spring-rest-angular-pagination/StudentDirectory/src/main/java/org/baeldung/web/exception/MyResourceNotFoundException.java b/spring-rest-angular-pagination/StudentDirectory/src/main/java/org/baeldung/web/exception/MyResourceNotFoundException.java
new file mode 100644
index 0000000000..3105d1cb11
--- /dev/null
+++ b/spring-rest-angular-pagination/StudentDirectory/src/main/java/org/baeldung/web/exception/MyResourceNotFoundException.java
@@ -0,0 +1,27 @@
+package org.baeldung.web.exception;
+
+public class MyResourceNotFoundException extends RuntimeException {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 4088649120307193208L;
+
+ public MyResourceNotFoundException() {
+ super();
+ }
+
+ public MyResourceNotFoundException(final String message, final Throwable cause) {
+ super(message, cause);
+ }
+
+ public MyResourceNotFoundException(final String message) {
+ super(message);
+ }
+
+ public MyResourceNotFoundException(final Throwable cause) {
+ super(cause);
+ }
+
+
+}
diff --git a/spring-rest-angular-pagination/StudentDirectory/src/main/java/org/baeldung/web/main/Application.java b/spring-rest-angular-pagination/StudentDirectory/src/main/java/org/baeldung/web/main/Application.java
new file mode 100644
index 0000000000..b3b0dad98a
--- /dev/null
+++ b/spring-rest-angular-pagination/StudentDirectory/src/main/java/org/baeldung/web/main/Application.java
@@ -0,0 +1,26 @@
+package org.baeldung.web.main;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.web.filter.ShallowEtagHeaderFilter;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
+
+@SpringBootApplication
+@EnableAutoConfiguration
+@ComponentScan("org.baeldung")
+public class Application extends WebMvcConfigurerAdapter {
+
+
+ public static void main(String[] args) {
+ SpringApplication.run(Application.class, args);
+ }
+
+ @Bean
+ public ShallowEtagHeaderFilter shallowEtagHeaderFilter() {
+ return new ShallowEtagHeaderFilter();
+ }
+
+}
diff --git a/spring-rest-angular-pagination/StudentDirectory/src/main/java/org/baeldung/web/rest/StudentDirectoryRestController.java b/spring-rest-angular-pagination/StudentDirectory/src/main/java/org/baeldung/web/rest/StudentDirectoryRestController.java
new file mode 100644
index 0000000000..5ff24ec0f2
--- /dev/null
+++ b/spring-rest-angular-pagination/StudentDirectory/src/main/java/org/baeldung/web/rest/StudentDirectoryRestController.java
@@ -0,0 +1,26 @@
+package org.baeldung.web.rest;
+
+import org.baeldung.web.service.StudentService;
+import org.baeldung.web.vo.Student;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+public class StudentDirectoryRestController {
+
+ @Autowired
+ private StudentService service;
+
+ @RequestMapping(value = "/student/get", params = { "page", "size" }, method = RequestMethod.GET)
+ public Page findPaginated(@RequestParam("page") int page, @RequestParam("size") int size){
+
+ Page resultPage = service.findPaginated(page, size);
+
+ return resultPage;
+ }
+
+}
diff --git a/spring-rest-angular-pagination/StudentDirectory/src/main/java/org/baeldung/web/service/IOperations.java b/spring-rest-angular-pagination/StudentDirectory/src/main/java/org/baeldung/web/service/IOperations.java
new file mode 100644
index 0000000000..0b408106ce
--- /dev/null
+++ b/spring-rest-angular-pagination/StudentDirectory/src/main/java/org/baeldung/web/service/IOperations.java
@@ -0,0 +1,9 @@
+package org.baeldung.web.service;
+
+import org.springframework.data.domain.Page;
+
+public interface IOperations {
+
+ Page findPaginated(int page, int size);
+
+}
diff --git a/spring-rest-angular-pagination/StudentDirectory/src/main/java/org/baeldung/web/service/StudentService.java b/spring-rest-angular-pagination/StudentDirectory/src/main/java/org/baeldung/web/service/StudentService.java
new file mode 100644
index 0000000000..5c4487254a
--- /dev/null
+++ b/spring-rest-angular-pagination/StudentDirectory/src/main/java/org/baeldung/web/service/StudentService.java
@@ -0,0 +1,7 @@
+package org.baeldung.web.service;
+
+import org.baeldung.web.vo.Student;
+
+public interface StudentService extends IOperations{
+
+}
diff --git a/spring-rest-angular-pagination/StudentDirectory/src/main/java/org/baeldung/web/service/StudentServiceImpl.java b/spring-rest-angular-pagination/StudentDirectory/src/main/java/org/baeldung/web/service/StudentServiceImpl.java
new file mode 100644
index 0000000000..3b6dda6fb1
--- /dev/null
+++ b/spring-rest-angular-pagination/StudentDirectory/src/main/java/org/baeldung/web/service/StudentServiceImpl.java
@@ -0,0 +1,36 @@
+package org.baeldung.web.service;
+
+import java.util.List;
+
+import org.baeldung.mock.MockStudentData;
+import org.baeldung.web.exception.MyResourceNotFoundException;
+import org.baeldung.web.vo.Student;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageImpl;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.stereotype.Service;
+
+@Service
+public class StudentServiceImpl implements StudentService {
+
+ private List mockDataStudent = MockStudentData.getMockDataStudents();
+
+ @Override
+ public Page findPaginated(int page, int size){
+ Page studentPage = getPage(page, size);
+ return studentPage;
+ }
+
+ private Page getPage(int page, int size) {
+ page = page != 0?page - 1:page;
+ int from = Math.max(0, page * size);
+ int to = Math.min(mockDataStudent.size(), (page + 1) * size);
+ if(from > to){
+ throw new MyResourceNotFoundException("page number is higher than total pages.");
+ }
+ return new PageImpl(mockDataStudent.subList(from, to),
+ new PageRequest(page,size),
+ mockDataStudent.size());
+ }
+
+}
diff --git a/spring-rest-angular-pagination/StudentDirectory/src/main/java/org/baeldung/web/vo/Student.java b/spring-rest-angular-pagination/StudentDirectory/src/main/java/org/baeldung/web/vo/Student.java
new file mode 100644
index 0000000000..11c503815d
--- /dev/null
+++ b/spring-rest-angular-pagination/StudentDirectory/src/main/java/org/baeldung/web/vo/Student.java
@@ -0,0 +1,60 @@
+package org.baeldung.web.vo;
+
+import java.io.Serializable;
+
+public class Student implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public Student() {
+ }
+
+ public Student(String studentId, String name, String gender, Integer age) {
+ super();
+ this.studentId = studentId;
+ this.name = name;
+ this.gender = gender;
+ this.age = age;
+ }
+
+ private String studentId;
+ private String name;
+ private String gender;
+ private Integer age;
+
+ public String getStudentId() {
+ return studentId;
+ }
+
+ public void setStudentId(String studentId) {
+ this.studentId = studentId;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getGender() {
+ return gender;
+ }
+
+ public void setGender(String gender) {
+ this.gender = gender;
+ }
+
+ public Integer getAge() {
+ return age;
+ }
+
+ public void setAge(Integer age) {
+ this.age = age;
+ }
+
+}
diff --git a/spring-rest-angular-pagination/StudentDirectory/src/main/resources/application.properties b/spring-rest-angular-pagination/StudentDirectory/src/main/resources/application.properties
new file mode 100644
index 0000000000..a9bf6ca218
--- /dev/null
+++ b/spring-rest-angular-pagination/StudentDirectory/src/main/resources/application.properties
@@ -0,0 +1 @@
+server.contextPath=/StudentDirectory
\ No newline at end of file
diff --git a/spring-rest-angular-pagination/StudentDirectory/src/main/webapp/WEB-INF/web.xml b/spring-rest-angular-pagination/StudentDirectory/src/main/webapp/WEB-INF/web.xml
new file mode 100644
index 0000000000..ff65bd6b96
--- /dev/null
+++ b/spring-rest-angular-pagination/StudentDirectory/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,11 @@
+
+
+
+
+ index.html
+
+
+
\ No newline at end of file
diff --git a/spring-rest-angular-pagination/StudentDirectory/src/main/webapp/index.html b/spring-rest-angular-pagination/StudentDirectory/src/main/webapp/index.html
new file mode 100644
index 0000000000..56a1273588
--- /dev/null
+++ b/spring-rest-angular-pagination/StudentDirectory/src/main/webapp/index.html
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-rest-angular-pagination/StudentDirectory/src/main/webapp/view/app.js b/spring-rest-angular-pagination/StudentDirectory/src/main/webapp/view/app.js
new file mode 100644
index 0000000000..522c49c8cb
--- /dev/null
+++ b/spring-rest-angular-pagination/StudentDirectory/src/main/webapp/view/app.js
@@ -0,0 +1,54 @@
+var app = angular.module('app', ['ui.grid','ui.grid.pagination']);
+
+app.controller('StudentCtrl', ['$scope','StudentService', function ($scope,StudentService) {
+ var paginationOptions = {
+ pageNumber: 1,
+ pageSize: 5,
+ sort: null
+ };
+
+ StudentService.getStudents(paginationOptions.pageNumber,
+ paginationOptions.pageSize).success(function(data){
+ $scope.gridOptions.data = data.content;
+ $scope.gridOptions.totalItems = data.totalElements;
+ });
+
+ $scope.gridOptions = {
+ paginationPageSizes: [5, 10, 20],
+ paginationPageSize: paginationOptions.pageSize,
+ enableColumnMenus:false,
+ columnDefs: [
+ { name: 'studentId' },
+ { name: 'name' },
+ { name: 'gender' },
+ { name: 'age' }
+ ],
+ onRegisterApi: function(gridApi) {
+ $scope.gridApi = gridApi;
+ gridApi.pagination.on.paginationChanged($scope, function (newPage, pageSize) {
+ paginationOptions.pageNumber = newPage;
+ paginationOptions.pageSize = pageSize;
+ StudentService.getStudents(newPage,pageSize).success(function(data){
+ $scope.gridOptions.data = data.content;
+ $scope.gridOptions.totalItems = data.totalElements;
+ });
+ });
+ }
+ };
+
+}]);
+
+app.service('StudentService',['$http', function ($http) {
+
+ function getStudents(pageNumber,size) {
+ return $http({
+ method: 'GET',
+ url: 'student/get?page='+pageNumber+'&size='+size
+ });
+ }
+
+ return {
+ getStudents:getStudents
+ };
+
+}]);
\ No newline at end of file
diff --git a/spring-rest-angular-pagination/StudentDirectory/src/test/java/org/baeldung/web/service/StudentServiceTest.java b/spring-rest-angular-pagination/StudentDirectory/src/test/java/org/baeldung/web/service/StudentServiceTest.java
new file mode 100644
index 0000000000..3e476bf0d0
--- /dev/null
+++ b/spring-rest-angular-pagination/StudentDirectory/src/test/java/org/baeldung/web/service/StudentServiceTest.java
@@ -0,0 +1,49 @@
+package org.baeldung.web.service;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import org.apache.commons.lang3.RandomStringUtils;
+import org.baeldung.web.main.Application;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.boot.test.IntegrationTest;
+import org.springframework.boot.test.SpringApplicationConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.test.context.web.WebAppConfiguration;
+
+import io.restassured.RestAssured;
+import io.restassured.response.Response;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@SpringApplicationConfiguration(classes = Application.class)
+@WebAppConfiguration
+@IntegrationTest("server.port:8080")
+public class StudentServiceTest{
+
+ private String getURL() {
+ return "/StudentDirectory/student/get";
+ }
+
+ @Test
+ public void whenResourcesAreRetrievedPaged_then200IsReceived(){
+ Response response = RestAssured.given().get(getURL()+ "?page=0&size=2").andReturn();
+
+ assertTrue(response.getStatusCode() == 200 );
+ }
+
+ @Test
+ public void whenPageOfResourcesAreRetrievedOutOfBounds_then404IsReceived(){
+ String url = getURL()+ "?page=" + RandomStringUtils.randomNumeric(5) + "&size=2";
+ Response response = RestAssured.given().get(url);
+
+ assertTrue(response.getStatusCode() == 500 );
+ }
+
+ @Test
+ public void givenResourcesExist_whenFirstPageIsRetrieved_thenPageContainsResources(){
+ Response response = RestAssured.given().get(getURL() + "?page=1&size=2" );
+ assertFalse(response.getBody().jsonPath().getList("content").isEmpty() );
+ }
+
+}
diff --git a/spring-rest-docs/src/main/java/com/example/CRUDController.java b/spring-rest-docs/src/main/java/com/example/CRUDController.java
index 818b29d3a6..ff8c91d6cd 100644
--- a/spring-rest-docs/src/main/java/com/example/CRUDController.java
+++ b/spring-rest-docs/src/main/java/com/example/CRUDController.java
@@ -17,39 +17,39 @@ import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/crud")
public class CRUDController {
-
- @RequestMapping(method=RequestMethod.GET)
- @ResponseStatus(HttpStatus.OK)
- public List read(@RequestBody CrudInput crudInput) {
- List returnList=new ArrayList();
- returnList.add(crudInput);
- return returnList;
- }
-
- @ResponseStatus(HttpStatus.CREATED)
- @RequestMapping(method=RequestMethod.POST)
- public HttpHeaders save(@RequestBody CrudInput crudInput) {
- HttpHeaders httpHeaders = new HttpHeaders();
- httpHeaders.setLocation(linkTo(CRUDController.class).slash(crudInput.getTitle()).toUri());
- return httpHeaders;
- }
-
- @RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
- @ResponseStatus(HttpStatus.OK)
- HttpHeaders delete(@RequestBody CrudInput crudInput) {
- HttpHeaders httpHeaders = new HttpHeaders();
- return httpHeaders;
- }
-
- @RequestMapping(value = "/{id}", method = RequestMethod.PUT)
- @ResponseStatus(HttpStatus.ACCEPTED)
- void put(@PathVariable("id") long id, @RequestBody CrudInput crudInput) {
-
- }
-
- @RequestMapping(value = "/{id}", method = RequestMethod.PATCH)
- @ResponseStatus(HttpStatus.NO_CONTENT)
- void patch(@PathVariable("id") long id, @RequestBody CrudInput crudInput) {
-
- }
+
+ @RequestMapping(method = RequestMethod.GET)
+ @ResponseStatus(HttpStatus.OK)
+ public List read(@RequestBody CrudInput crudInput) {
+ List returnList = new ArrayList();
+ returnList.add(crudInput);
+ return returnList;
+ }
+
+ @ResponseStatus(HttpStatus.CREATED)
+ @RequestMapping(method = RequestMethod.POST)
+ public HttpHeaders save(@RequestBody CrudInput crudInput) {
+ HttpHeaders httpHeaders = new HttpHeaders();
+ httpHeaders.setLocation(linkTo(CRUDController.class).slash(crudInput.getTitle()).toUri());
+ return httpHeaders;
+ }
+
+ @RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
+ @ResponseStatus(HttpStatus.OK)
+ HttpHeaders delete(@RequestBody CrudInput crudInput) {
+ HttpHeaders httpHeaders = new HttpHeaders();
+ return httpHeaders;
+ }
+
+ @RequestMapping(value = "/{id}", method = RequestMethod.PUT)
+ @ResponseStatus(HttpStatus.ACCEPTED)
+ void put(@PathVariable("id") long id, @RequestBody CrudInput crudInput) {
+
+ }
+
+ @RequestMapping(value = "/{id}", method = RequestMethod.PATCH)
+ @ResponseStatus(HttpStatus.NO_CONTENT)
+ void patch(@PathVariable("id") long id, @RequestBody CrudInput crudInput) {
+
+ }
}
diff --git a/spring-rest-docs/src/main/java/com/example/CrudInput.java b/spring-rest-docs/src/main/java/com/example/CrudInput.java
index 3d91b7d45a..36ad67eb21 100644
--- a/spring-rest-docs/src/main/java/com/example/CrudInput.java
+++ b/spring-rest-docs/src/main/java/com/example/CrudInput.java
@@ -10,33 +10,32 @@ import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
public class CrudInput {
-
- //@NotBlank
- private final String title;
- private final String body;
+ // @NotBlank
+ private final String title;
- private final List tagUris;
+ private final String body;
- @JsonCreator
- public CrudInput(@JsonProperty("title") String title,
- @JsonProperty("body") String body, @JsonProperty("tags") List tagUris) {
- this.title = title;
- this.body = body;
- this.tagUris = tagUris == null ? Collections.emptyList() : tagUris;
- }
+ private final List tagUris;
- public String getTitle() {
- return title;
- }
+ @JsonCreator
+ public CrudInput(@JsonProperty("title") String title, @JsonProperty("body") String body, @JsonProperty("tags") List tagUris) {
+ this.title = title;
+ this.body = body;
+ this.tagUris = tagUris == null ? Collections. emptyList() : tagUris;
+ }
- public String getBody() {
- return body;
- }
+ public String getTitle() {
+ return title;
+ }
- @JsonProperty("tags")
- public List getTagUris() {
- return this.tagUris;
- }
+ public String getBody() {
+ return body;
+ }
+
+ @JsonProperty("tags")
+ public List getTagUris() {
+ return this.tagUris;
+ }
}
\ No newline at end of file
diff --git a/spring-rest-docs/src/main/java/com/example/IndexController.java b/spring-rest-docs/src/main/java/com/example/IndexController.java
index a6b4537c43..6b896da416 100644
--- a/spring-rest-docs/src/main/java/com/example/IndexController.java
+++ b/spring-rest-docs/src/main/java/com/example/IndexController.java
@@ -1,6 +1,5 @@
package com.example;
-
import static org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo;
import org.springframework.hateoas.ResourceSupport;
@@ -12,11 +11,11 @@ import org.springframework.web.bind.annotation.RestController;
@RequestMapping("/")
public class IndexController {
- @RequestMapping(method=RequestMethod.GET)
- public ResourceSupport index() {
- ResourceSupport index = new ResourceSupport();
- index.add(linkTo(CRUDController.class).withRel("crud"));
- return index;
- }
+ @RequestMapping(method = RequestMethod.GET)
+ public ResourceSupport index() {
+ ResourceSupport index = new ResourceSupport();
+ index.add(linkTo(CRUDController.class).withRel("crud"));
+ return index;
+ }
}
\ No newline at end of file
diff --git a/spring-rest-docs/src/main/java/com/example/SpringRestDocsApplication.java b/spring-rest-docs/src/main/java/com/example/SpringRestDocsApplication.java
index dd20ef324e..da09f9accc 100644
--- a/spring-rest-docs/src/main/java/com/example/SpringRestDocsApplication.java
+++ b/spring-rest-docs/src/main/java/com/example/SpringRestDocsApplication.java
@@ -6,7 +6,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpringRestDocsApplication {
- public static void main(String[] args) {
- SpringApplication.run(SpringRestDocsApplication.class, args);
- }
+ public static void main(String[] args) {
+ SpringApplication.run(SpringRestDocsApplication.class, args);
+ }
}
diff --git a/spring-rest-docs/src/test/java/com/example/ApiDocumentation.java b/spring-rest-docs/src/test/java/com/example/ApiDocumentation.java
index 195b9dc514..5b753aff0c 100644
--- a/spring-rest-docs/src/test/java/com/example/ApiDocumentation.java
+++ b/spring-rest-docs/src/test/java/com/example/ApiDocumentation.java
@@ -56,55 +56,35 @@ public class ApiDocumentation {
@Before
public void setUp() {
this.document = document("{method-name}", preprocessRequest(prettyPrint()), preprocessResponse(prettyPrint()));
- this.mockMvc = MockMvcBuilders.webAppContextSetup(this.context)
- .apply(documentationConfiguration(this.restDocumentation))
- .alwaysDo(this.document)
- .build();
+ this.mockMvc = MockMvcBuilders.webAppContextSetup(this.context).apply(documentationConfiguration(this.restDocumentation)).alwaysDo(this.document).build();
}
-
@Test
public void headersExample() throws Exception {
- this.document.snippets(responseHeaders(headerWithName("Content-Type")
- .description("The Content-Type of the payload, e.g. `application/hal+json`")));
- this.mockMvc.perform(get("/"))
- .andExpect(status().isOk());
+ this.document.snippets(responseHeaders(headerWithName("Content-Type").description("The Content-Type of the payload, e.g. `application/hal+json`")));
+ this.mockMvc.perform(get("/")).andExpect(status().isOk());
}
@Test
public void indexExample() throws Exception {
- this.document.snippets(
- links(linkWithRel("crud").description("The <>")),
- responseFields(fieldWithPath("_links").description("<> to other resources"))
- );
- this.mockMvc.perform(get("/"))
- .andExpect(status().isOk());
+ this.document.snippets(links(linkWithRel("crud").description("The <>")), responseFields(fieldWithPath("_links").description("<> to other resources")));
+ this.mockMvc.perform(get("/")).andExpect(status().isOk());
}
-
@Test
public void crudGetExample() throws Exception {
Map tag = new HashMap<>();
tag.put("name", "GET");
- String tagLocation = this.mockMvc.perform(get("/crud")
- .contentType(MediaTypes.HAL_JSON)
- .content(this.objectMapper.writeValueAsString(tag)))
- .andExpect(status().isOk())
- .andReturn()
- .getResponse()
- .getHeader("Location");
+ String tagLocation = this.mockMvc.perform(get("/crud").contentType(MediaTypes.HAL_JSON).content(this.objectMapper.writeValueAsString(tag))).andExpect(status().isOk()).andReturn().getResponse().getHeader("Location");
Map crud = new HashMap<>();
crud.put("title", "Sample Model");
crud.put("body", "http://www.baeldung.com/");
crud.put("tags", singletonList(tagLocation));
- this.mockMvc.perform(get("/crud")
- .contentType(MediaTypes.HAL_JSON)
- .content(this.objectMapper.writeValueAsString(crud)))
- .andExpect(status().isOk());
+ this.mockMvc.perform(get("/crud").contentType(MediaTypes.HAL_JSON).content(this.objectMapper.writeValueAsString(crud))).andExpect(status().isOk());
}
@Test
@@ -112,13 +92,7 @@ public class ApiDocumentation {
Map tag = new HashMap<>();
tag.put("name", "CREATE");
- String tagLocation = this.mockMvc.perform(post("/crud")
- .contentType(MediaTypes.HAL_JSON)
- .content(this.objectMapper.writeValueAsString(tag)))
- .andExpect(status().isCreated())
- .andReturn()
- .getResponse()
- .getHeader("Location");
+ String tagLocation = this.mockMvc.perform(post("/crud").contentType(MediaTypes.HAL_JSON).content(this.objectMapper.writeValueAsString(tag))).andExpect(status().isCreated()).andReturn().getResponse().getHeader("Location");
Map crud = new HashMap<>();
crud.put("title", "Sample Model");
@@ -126,13 +100,9 @@ public class ApiDocumentation {
crud.put("tags", singletonList(tagLocation));
ConstrainedFields fields = new ConstrainedFields(CrudInput.class);
- this.document.snippets(requestFields(
- fields.withPath("title").description("The title of the note"),
- fields.withPath("body").description("The body of the note"),
- fields.withPath("tags").description("An array of tag resource URIs")));
+ this.document.snippets(requestFields(fields.withPath("title").description("The title of the note"), fields.withPath("body").description("The body of the note"), fields.withPath("tags").description("An array of tag resource URIs")));
this.mockMvc.perform(post("/crud").contentType(MediaTypes.HAL_JSON).content(this.objectMapper.writeValueAsString(crud))).andExpect(status().isCreated());
-
}
@Test
@@ -141,23 +111,14 @@ public class ApiDocumentation {
Map tag = new HashMap<>();
tag.put("name", "DELETE");
- String tagLocation = this.mockMvc.perform(delete("/crud/10")
- .contentType(MediaTypes.HAL_JSON)
- .content(this.objectMapper.writeValueAsString(tag)))
- .andExpect(status().isOk())
- .andReturn()
- .getResponse()
- .getHeader("Location");
+ String tagLocation = this.mockMvc.perform(delete("/crud/10").contentType(MediaTypes.HAL_JSON).content(this.objectMapper.writeValueAsString(tag))).andExpect(status().isOk()).andReturn().getResponse().getHeader("Location");
Map crud = new HashMap<>();
crud.put("title", "Sample Model");
crud.put("body", "http://www.baeldung.com/");
crud.put("tags", singletonList(tagLocation));
- this.mockMvc.perform(delete("/crud/10")
- .contentType(MediaTypes.HAL_JSON)
- .content(this.objectMapper.writeValueAsString(crud)))
- .andExpect(status().isOk());
+ this.mockMvc.perform(delete("/crud/10").contentType(MediaTypes.HAL_JSON).content(this.objectMapper.writeValueAsString(crud))).andExpect(status().isOk());
}
@Test
@@ -166,51 +127,31 @@ public class ApiDocumentation {
Map tag = new HashMap<>();
tag.put("name", "PATCH");
- String tagLocation = this.mockMvc.perform(patch("/crud/10")
- .contentType(MediaTypes.HAL_JSON)
- .content(this.objectMapper.writeValueAsString(tag)))
- .andExpect(status().isNoContent())
- .andReturn()
- .getResponse()
- .getHeader("Location");
+ String tagLocation = this.mockMvc.perform(patch("/crud/10").contentType(MediaTypes.HAL_JSON).content(this.objectMapper.writeValueAsString(tag))).andExpect(status().isNoContent()).andReturn().getResponse().getHeader("Location");
Map crud = new HashMap<>();
crud.put("title", "Sample Model");
crud.put("body", "http://www.baeldung.com/");
crud.put("tags", singletonList(tagLocation));
- this.mockMvc.perform(patch("/crud/10")
- .contentType(MediaTypes.HAL_JSON)
- .content(this.objectMapper.writeValueAsString(crud)))
- .andExpect(status().isNoContent());
+ this.mockMvc.perform(patch("/crud/10").contentType(MediaTypes.HAL_JSON).content(this.objectMapper.writeValueAsString(crud))).andExpect(status().isNoContent());
}
-
@Test
public void crudPutExample() throws Exception {
Map tag = new HashMap<>();
tag.put("name", "PUT");
- String tagLocation = this.mockMvc.perform(put("/crud/10")
- .contentType(MediaTypes.HAL_JSON)
- .content(this.objectMapper.writeValueAsString(tag)))
- .andExpect(status().isAccepted())
- .andReturn()
- .getResponse()
- .getHeader("Location");
+ String tagLocation = this.mockMvc.perform(put("/crud/10").contentType(MediaTypes.HAL_JSON).content(this.objectMapper.writeValueAsString(tag))).andExpect(status().isAccepted()).andReturn().getResponse().getHeader("Location");
Map crud = new HashMap<>();
crud.put("title", "Sample Model");
crud.put("body", "http://www.baeldung.com/");
crud.put("tags", singletonList(tagLocation));
- this.mockMvc.perform(put("/crud/10")
- .contentType(MediaTypes.HAL_JSON)
- .content(this.objectMapper.writeValueAsString(crud)))
- .andExpect(status().isAccepted());
+ this.mockMvc.perform(put("/crud/10").contentType(MediaTypes.HAL_JSON).content(this.objectMapper.writeValueAsString(crud))).andExpect(status().isAccepted());
}
-
@Test
public void contextLoads() {
}
@@ -224,11 +165,8 @@ public class ApiDocumentation {
}
private FieldDescriptor withPath(String path) {
- return fieldWithPath(path)
- .attributes(key("constraints")
- .value(collectionToDelimitedString(this.constraintDescriptions.descriptionsForProperty(path), ". ")));
+ return fieldWithPath(path).attributes(key("constraints").value(collectionToDelimitedString(this.constraintDescriptions.descriptionsForProperty(path), ". ")));
}
}
-
}
diff --git a/spring-rest-docs/src/test/java/com/example/GettingStartedDocumentation.java b/spring-rest-docs/src/test/java/com/example/GettingStartedDocumentation.java
index 7f3c4db1f9..7aea9d303c 100644
--- a/spring-rest-docs/src/test/java/com/example/GettingStartedDocumentation.java
+++ b/spring-rest-docs/src/test/java/com/example/GettingStartedDocumentation.java
@@ -46,113 +46,105 @@ public class GettingStartedDocumentation {
private MockMvc mockMvc;
-
@Before
public void setUp() {
- this.mockMvc = MockMvcBuilders.webAppContextSetup(this.context)
- .apply(documentationConfiguration(this.restDocumentation))
- .alwaysDo(document("{method-name}/{step}/",
- preprocessRequest(prettyPrint()), preprocessResponse(prettyPrint())))
- .build();
+ this.mockMvc = MockMvcBuilders.webAppContextSetup(this.context).apply(documentationConfiguration(this.restDocumentation)).alwaysDo(document("{method-name}/{step}/", preprocessRequest(prettyPrint()), preprocessResponse(prettyPrint()))).build();
}
@Test
public void index() throws Exception {
- this.mockMvc.perform(get("/").accept(MediaTypes.HAL_JSON))
- .andExpect(status().isOk())
- .andExpect(jsonPath("_links.crud", is(notNullValue())))
- .andExpect(jsonPath("_links.crud", is(notNullValue())));
+ this.mockMvc.perform(get("/").accept(MediaTypes.HAL_JSON)).andExpect(status().isOk()).andExpect(jsonPath("_links.crud", is(notNullValue()))).andExpect(jsonPath("_links.crud", is(notNullValue())));
}
-// String createNote() throws Exception {
-// Map note = new HashMap();
-// note.put("title", "Note creation with cURL");
-// note.put("body", "An example of how to create a note using curl");
-// String noteLocation = this.mockMvc.perform(post("/crud")
-// .contentType(MediaTypes.HAL_JSON)
-// .content(objectMapper.writeValueAsString(note)))
-// .andExpect(status().isCreated())
-// .andExpect(header().string("Location", notNullValue()))
-// .andReturn()
-// .getResponse()
-// .getHeader("Location");
-// return noteLocation;
-// }
-//
-// MvcResult getNote(String noteLocation) throws Exception {
-// return this.mockMvc.perform(get(noteLocation))
-// .andExpect(status().isOk())
-// .andExpect(jsonPath("title", is(notNullValue())))
-// .andExpect(jsonPath("body", is(notNullValue())))
-// .andExpect(jsonPath("_links.crud", is(notNullValue())))
-// .andReturn();
-// }
-//
-//
-// String createTag() throws Exception, JsonProcessingException {
-// Map tag = new HashMap();
-// tag.put("name", "getting-started");
-// String tagLocation = this.mockMvc.perform(post("/crud")
-// .contentType(MediaTypes.HAL_JSON)
-// .content(objectMapper.writeValueAsString(tag)))
-// .andExpect(status().isCreated())
-// .andExpect(header().string("Location", notNullValue()))
-// .andReturn()
-// .getResponse()
-// .getHeader("Location");
-// return tagLocation;
-// }
-//
-// void getTag(String tagLocation) throws Exception {
-// this.mockMvc.perform(get(tagLocation)).andExpect(status().isOk())
-// .andExpect(jsonPath("name", is(notNullValue())))
-// .andExpect(jsonPath("_links.tagged-notes", is(notNullValue())));
-// }
-//
-// String createTaggedNote(String tag) throws Exception {
-// Map note = new HashMap();
-// note.put("title", "Tagged note creation with cURL");
-// note.put("body", "An example of how to create a tagged note using cURL");
-// note.put("tags", Arrays.asList(tag));
-//
-// String noteLocation = this.mockMvc.perform(post("/notes")
-// .contentType(MediaTypes.HAL_JSON)
-// .content(objectMapper.writeValueAsString(note)))
-// .andExpect(status().isCreated())
-// .andExpect(header().string("Location", notNullValue()))
-// .andReturn()
-// .getResponse()
-// .getHeader("Location");
-// return noteLocation;
-// }
-//
-// void getTags(String noteTagsLocation) throws Exception {
-// this.mockMvc.perform(get(noteTagsLocation))
-// .andExpect(status().isOk())
-// .andExpect(jsonPath("_embedded.tags", hasSize(1)));
-// }
-//
-// void tagExistingNote(String noteLocation, String tagLocation) throws Exception {
-// Map update = new HashMap();
-// update.put("tags", Arrays.asList(tagLocation));
-// this.mockMvc.perform(patch(noteLocation)
-// .contentType(MediaTypes.HAL_JSON)
-// .content(objectMapper.writeValueAsString(update)))
-// .andExpect(status().isNoContent());
-// }
-//
-// MvcResult getTaggedExistingNote(String noteLocation) throws Exception {
-// return this.mockMvc.perform(get(noteLocation)).andExpect(status().isOk()).andReturn();
-// }
-//
-// void getTagsForExistingNote(String noteTagsLocation) throws Exception {
-// this.mockMvc.perform(get(noteTagsLocation))
-// .andExpect(status().isOk()).andExpect(jsonPath("_embedded.tags", hasSize(1)));
-// }
-//
-// private String getLink(MvcResult result, String rel)
-// throws UnsupportedEncodingException {
-// return JsonPath.parse(result.getResponse().getContentAsString()).read("_links." + rel + ".href");
-// }
+ // String createNote() throws Exception {
+ // Map note = new HashMap();
+ // note.put("title", "Note creation with cURL");
+ // note.put("body", "An example of how to create a note using curl");
+ // String noteLocation = this.mockMvc.perform(post("/crud")
+ // .contentType(MediaTypes.HAL_JSON)
+ // .content(objectMapper.writeValueAsString(note)))
+ // .andExpect(status().isCreated())
+ // .andExpect(header().string("Location", notNullValue()))
+ // .andReturn()
+ // .getResponse()
+ // .getHeader("Location");
+ // return noteLocation;
+ // }
+ //
+ // MvcResult getNote(String noteLocation) throws Exception {
+ // return this.mockMvc.perform(get(noteLocation))
+ // .andExpect(status().isOk())
+ // .andExpect(jsonPath("title", is(notNullValue())))
+ // .andExpect(jsonPath("body", is(notNullValue())))
+ // .andExpect(jsonPath("_links.crud", is(notNullValue())))
+ // .andReturn();
+ // }
+ //
+ //
+ // String createTag() throws Exception, JsonProcessingException {
+ // Map tag = new HashMap();
+ // tag.put("name", "getting-started");
+ // String tagLocation = this.mockMvc.perform(post("/crud")
+ // .contentType(MediaTypes.HAL_JSON)
+ // .content(objectMapper.writeValueAsString(tag)))
+ // .andExpect(status().isCreated())
+ // .andExpect(header().string("Location", notNullValue()))
+ // .andReturn()
+ // .getResponse()
+ // .getHeader("Location");
+ // return tagLocation;
+ // }
+ //
+ // void getTag(String tagLocation) throws Exception {
+ // this.mockMvc.perform(get(tagLocation)).andExpect(status().isOk())
+ // .andExpect(jsonPath("name", is(notNullValue())))
+ // .andExpect(jsonPath("_links.tagged-notes", is(notNullValue())));
+ // }
+ //
+ // String createTaggedNote(String tag) throws Exception {
+ // Map note = new HashMap();
+ // note.put("title", "Tagged note creation with cURL");
+ // note.put("body", "An example of how to create a tagged note using cURL");
+ // note.put("tags", Arrays.asList(tag));
+ //
+ // String noteLocation = this.mockMvc.perform(post("/notes")
+ // .contentType(MediaTypes.HAL_JSON)
+ // .content(objectMapper.writeValueAsString(note)))
+ // .andExpect(status().isCreated())
+ // .andExpect(header().string("Location", notNullValue()))
+ // .andReturn()
+ // .getResponse()
+ // .getHeader("Location");
+ // return noteLocation;
+ // }
+ //
+ // void getTags(String noteTagsLocation) throws Exception {
+ // this.mockMvc.perform(get(noteTagsLocation))
+ // .andExpect(status().isOk())
+ // .andExpect(jsonPath("_embedded.tags", hasSize(1)));
+ // }
+ //
+ // void tagExistingNote(String noteLocation, String tagLocation) throws Exception {
+ // Map update = new HashMap();
+ // update.put("tags", Arrays.asList(tagLocation));
+ // this.mockMvc.perform(patch(noteLocation)
+ // .contentType(MediaTypes.HAL_JSON)
+ // .content(objectMapper.writeValueAsString(update)))
+ // .andExpect(status().isNoContent());
+ // }
+ //
+ // MvcResult getTaggedExistingNote(String noteLocation) throws Exception {
+ // return this.mockMvc.perform(get(noteLocation)).andExpect(status().isOk()).andReturn();
+ // }
+ //
+ // void getTagsForExistingNote(String noteTagsLocation) throws Exception {
+ // this.mockMvc.perform(get(noteTagsLocation))
+ // .andExpect(status().isOk()).andExpect(jsonPath("_embedded.tags", hasSize(1)));
+ // }
+ //
+ // private String getLink(MvcResult result, String rel)
+ // throws UnsupportedEncodingException {
+ // return JsonPath.parse(result.getResponse().getContentAsString()).read("_links." + rel + ".href");
+ // }
}
diff --git a/spring-security-custom-permission/src/main/java/org/baeldung/persistence/model/User.java b/spring-security-custom-permission/src/main/java/org/baeldung/persistence/model/User.java
index 86b81cdcee..112d502105 100644
--- a/spring-security-custom-permission/src/main/java/org/baeldung/persistence/model/User.java
+++ b/spring-security-custom-permission/src/main/java/org/baeldung/persistence/model/User.java
@@ -1,8 +1,5 @@
package org.baeldung.persistence.model;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
import java.util.Set;
import javax.persistence.Column;
@@ -16,14 +13,8 @@ import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
-import org.springframework.security.core.GrantedAuthority;
-import org.springframework.security.core.authority.SimpleGrantedAuthority;
-import org.springframework.security.core.userdetails.UserDetails;
-
@Entity
-public class User implements UserDetails {
-
- private static final long serialVersionUID = 1L;
+public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@@ -57,7 +48,6 @@ public class User implements UserDetails {
this.id = id;
}
- @Override
public String getUsername() {
return username;
}
@@ -66,7 +56,6 @@ public class User implements UserDetails {
this.username = username;
}
- @Override
public String getPassword() {
return password;
}
@@ -93,37 +82,6 @@ public class User implements UserDetails {
//
- @Override
- public Collection extends GrantedAuthority> getAuthorities() {
- final List authorities = new ArrayList();
- for (final Privilege privilege : this.getPrivileges()) {
- authorities.add(new SimpleGrantedAuthority(privilege.getName()));
- }
- return authorities;
- }
-
- @Override
- public boolean isAccountNonExpired() {
- return true;
- }
-
- @Override
- public boolean isAccountNonLocked() {
- return true;
- }
-
- @Override
- public boolean isCredentialsNonExpired() {
- return true;
- }
-
- @Override
- public boolean isEnabled() {
- return true;
- }
-
- //
-
@Override
public String toString() {
final StringBuilder builder = new StringBuilder();
diff --git a/spring-security-custom-permission/src/main/java/org/baeldung/security/CustomMethodSecurityExpressionRoot.java b/spring-security-custom-permission/src/main/java/org/baeldung/security/CustomMethodSecurityExpressionRoot.java
index a3f4644592..2d84536a14 100644
--- a/spring-security-custom-permission/src/main/java/org/baeldung/security/CustomMethodSecurityExpressionRoot.java
+++ b/spring-security-custom-permission/src/main/java/org/baeldung/security/CustomMethodSecurityExpressionRoot.java
@@ -16,7 +16,7 @@ public class CustomMethodSecurityExpressionRoot extends SecurityExpressionRoot i
//
public boolean isMember(Long OrganizationId) {
- final User user = (User) this.getPrincipal();
+ final User user = ((MyUserPrincipal) this.getPrincipal()).getUser();
return user.getOrganization().getId().longValue() == OrganizationId.longValue();
}
diff --git a/spring-security-custom-permission/src/main/java/org/baeldung/security/CustomPermissionEvaluator.java b/spring-security-custom-permission/src/main/java/org/baeldung/security/CustomPermissionEvaluator.java
index e81f9f8939..5d96673a8f 100644
--- a/spring-security-custom-permission/src/main/java/org/baeldung/security/CustomPermissionEvaluator.java
+++ b/spring-security-custom-permission/src/main/java/org/baeldung/security/CustomPermissionEvaluator.java
@@ -10,17 +10,10 @@ public class CustomPermissionEvaluator implements PermissionEvaluator {
@Override
public boolean hasPermission(Authentication auth, Object targetDomainObject, Object permission) {
- System.out.println(auth);
if ((auth == null) || (targetDomainObject == null) || !(permission instanceof String)) {
return false;
}
- String targetType = "";
- if (targetDomainObject instanceof String) {
- targetType = targetDomainObject.toString().toUpperCase();
- } else {
- targetType = targetDomainObject.getClass().getSimpleName().toUpperCase();
- System.out.println(targetType);
- }
+ final String targetType = targetDomainObject.getClass().getSimpleName().toUpperCase();
return hasPrivilege(auth, targetType, permission.toString().toUpperCase());
}
diff --git a/spring-security-custom-permission/src/main/java/org/baeldung/security/MySecurityExpressionRoot.java b/spring-security-custom-permission/src/main/java/org/baeldung/security/MySecurityExpressionRoot.java
index a09d166798..4d3561b325 100644
--- a/spring-security-custom-permission/src/main/java/org/baeldung/security/MySecurityExpressionRoot.java
+++ b/spring-security-custom-permission/src/main/java/org/baeldung/security/MySecurityExpressionRoot.java
@@ -47,6 +47,14 @@ public class MySecurityExpressionRoot implements MethodSecurityExpressionOperati
throw new RuntimeException("method hasAuthority() not allowed");
}
+ //
+ public boolean isMember(Long OrganizationId) {
+ final User user = ((MyUserPrincipal) this.getPrincipal()).getUser();
+ return user.getOrganization().getId().longValue() == OrganizationId.longValue();
+ }
+
+ //
+
@Override
public final boolean hasAnyAuthority(String... authorities) {
return hasAnyAuthorityName(null, authorities);
@@ -168,14 +176,6 @@ public class MySecurityExpressionRoot implements MethodSecurityExpressionOperati
return defaultRolePrefix + role;
}
- //
- public boolean isMember(Long OrganizationId) {
- final User user = (User) this.getPrincipal();
- return user.getOrganization().getId().longValue() == OrganizationId.longValue();
- }
-
- //
-
@Override
public Object getFilterObject() {
return this.filterObject;
diff --git a/spring-security-custom-permission/src/main/java/org/baeldung/security/MyUserDetailsService.java b/spring-security-custom-permission/src/main/java/org/baeldung/security/MyUserDetailsService.java
index 19276a906e..685219728f 100644
--- a/spring-security-custom-permission/src/main/java/org/baeldung/security/MyUserDetailsService.java
+++ b/spring-security-custom-permission/src/main/java/org/baeldung/security/MyUserDetailsService.java
@@ -26,6 +26,6 @@ public class MyUserDetailsService implements UserDetailsService {
if (user == null) {
throw new UsernameNotFoundException(username);
}
- return user;
+ return new MyUserPrincipal(user);
}
}
diff --git a/spring-security-custom-permission/src/main/java/org/baeldung/security/MyUserPrincipal.java b/spring-security-custom-permission/src/main/java/org/baeldung/security/MyUserPrincipal.java
new file mode 100644
index 0000000000..437bb02cdb
--- /dev/null
+++ b/spring-security-custom-permission/src/main/java/org/baeldung/security/MyUserPrincipal.java
@@ -0,0 +1,72 @@
+package org.baeldung.security;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import org.baeldung.persistence.model.Privilege;
+import org.baeldung.persistence.model.User;
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.authority.SimpleGrantedAuthority;
+import org.springframework.security.core.userdetails.UserDetails;
+
+public class MyUserPrincipal implements UserDetails {
+
+ private static final long serialVersionUID = 1L;
+
+ private final User user;
+
+ //
+
+ public MyUserPrincipal(User user) {
+ this.user = user;
+ }
+
+ //
+
+ @Override
+ public String getUsername() {
+ return user.getUsername();
+ }
+
+ @Override
+ public String getPassword() {
+ return user.getPassword();
+ }
+
+ @Override
+ public Collection extends GrantedAuthority> getAuthorities() {
+ final List authorities = new ArrayList();
+ for (final Privilege privilege : user.getPrivileges()) {
+ authorities.add(new SimpleGrantedAuthority(privilege.getName()));
+ }
+ return authorities;
+ }
+
+ @Override
+ public boolean isAccountNonExpired() {
+ return true;
+ }
+
+ @Override
+ public boolean isAccountNonLocked() {
+ return true;
+ }
+
+ @Override
+ public boolean isCredentialsNonExpired() {
+ return true;
+ }
+
+ @Override
+ public boolean isEnabled() {
+ return true;
+ }
+
+ //
+
+ public User getUser() {
+ return user;
+ }
+
+}
diff --git a/spring-security-custom-permission/src/main/java/org/baeldung/web/MainController.java b/spring-security-custom-permission/src/main/java/org/baeldung/web/MainController.java
index 7e279907c6..4752f7bdd9 100644
--- a/spring-security-custom-permission/src/main/java/org/baeldung/web/MainController.java
+++ b/spring-security-custom-permission/src/main/java/org/baeldung/web/MainController.java
@@ -21,7 +21,8 @@ public class MainController {
@Autowired
private OrganizationRepository organizationRepository;
- @PreAuthorize("hasPermission('Foo', 'read')")
+ // @PostAuthorize("hasPermission(returnObject, 'read')")
+ @PreAuthorize("hasPermission(#id, 'Foo', 'read')")
@RequestMapping(method = RequestMethod.GET, value = "/foos/{id}")
@ResponseBody
public Foo findById(@PathVariable final long id) {
diff --git a/xmlunit2-tutorial/src/test/java/com/baeldung/xmlunit/XMLUnitTest.java b/xmlunit2-tutorial/src/test/java/com/baeldung/xmlunit/XMLUnitTest.java
index d0e099e591..175250f47b 100644
--- a/xmlunit2-tutorial/src/test/java/com/baeldung/xmlunit/XMLUnitTest.java
+++ b/xmlunit2-tutorial/src/test/java/com/baeldung/xmlunit/XMLUnitTest.java
@@ -15,6 +15,7 @@ import static org.xmlunit.matchers.HasXPathMatcher.hasXPath;
import java.io.File;
import java.util.Iterator;
+import org.junit.Ignore;
import org.junit.Test;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
@@ -36,10 +37,10 @@ public class XMLUnitTest {
public void givenWrongXml_whenValidateFailsAgainstXsd_thenCorrect() {
Validator v = Validator.forLanguage(Languages.W3C_XML_SCHEMA_NS_URI);
v.setSchemaSource(Input.fromStream(
- new XMLUnitTest().getClass().getResourceAsStream(
+ XMLUnitTest.class.getResourceAsStream(
"/students.xsd")).build());
ValidationResult r = v.validateInstance(Input.fromStream(
- new XMLUnitTest().getClass().getResourceAsStream(
+ XMLUnitTest.class.getResourceAsStream(
"/students_with_error.xml")).build());
assertFalse(r.isValid());
}
@@ -48,10 +49,10 @@ public class XMLUnitTest {
public void givenXmlWithErrors_whenReturnsValidationProblems_thenCorrect() {
Validator v = Validator.forLanguage(Languages.W3C_XML_SCHEMA_NS_URI);
v.setSchemaSource(Input.fromStream(
- new XMLUnitTest().getClass().getResourceAsStream(
+ XMLUnitTest.class.getResourceAsStream(
"/students.xsd")).build());
ValidationResult r = v.validateInstance(Input.fromStream(
- new XMLUnitTest().getClass().getResourceAsStream(
+ XMLUnitTest.class.getResourceAsStream(
"/students_with_error.xml")).build());
Iterator probs = r.getProblems().iterator();
int count = 0;
@@ -66,10 +67,10 @@ public class XMLUnitTest {
public void givenXml_whenValidatesAgainstXsd_thenCorrect() {
Validator v = Validator.forLanguage(Languages.W3C_XML_SCHEMA_NS_URI);
v.setSchemaSource(Input.fromStream(
- new XMLUnitTest().getClass().getResourceAsStream(
+ XMLUnitTest.class.getResourceAsStream(
"/students.xsd")).build());
ValidationResult r = v.validateInstance(Input.fromStream(
- new XMLUnitTest().getClass().getResourceAsStream(
+ XMLUnitTest.class.getResourceAsStream(
"/students.xml")).build());
Iterator probs = r.getProblems().iterator();
while (probs.hasNext()) {
@@ -117,11 +118,27 @@ public class XMLUnitTest {
@Test
public void givenXmlSource_whenFailsToValidateInExistentXPath_thenCorrect() {
ClassLoader classLoader = getClass().getClassLoader();
-
assertThat(Input.fromFile(new File(classLoader.getResource(
"teachers.xml").getFile())), not(hasXPath("//sujet")));
}
+ // NOTE: ignore as this test demonstrates that two XMLs that contain the same data
+ // will fail the isSimilarTo test.
+ @Test @Ignore
+ public void given2XMLS_whenSimilar_thenCorrect_fails() {
+ String controlXml = "3 false ";
+ String testXml = "false 3 ";
+ assertThat(testXml, isSimilarTo(controlXml));
+ }
+
+ @Test
+ public void given2XMLS_whenSimilar_thenCorrect() {
+ String controlXml = "3 false ";
+ String testXml = "false 3 ";
+ assertThat(testXml,isSimilarTo(controlXml).withNodeMatcher(
+ new DefaultNodeMatcher(ElementSelectors.byName)));
+ }
+
@Test
public void given2XMLs_whenSimilarWithDiff_thenCorrect() throws Exception {
String myControlXML = "3 false ";
@@ -160,6 +177,7 @@ public class XMLUnitTest {
Diff myDiff = DiffBuilder.compare(control).withTest(test)
.checkForSimilar().build();
+ // assertFalse(myDiff.toString(), myDiff.hasDifferences());
assertTrue(myDiff.toString(), myDiff.hasDifferences());
}
@@ -177,27 +195,23 @@ public class XMLUnitTest {
@Test
public void givenFileSourceAsObject_whenAbleToInput_thenCorrect() {
ClassLoader classLoader = getClass().getClassLoader();
- assertThat(Input.from(new File(classLoader.getResource("test.xml")
- .getFile())), isSimilarTo(Input.from(new File(classLoader
- .getResource("control.xml").getFile()))));
-
+ assertThat(Input.from(new File(classLoader.getResource("test.xml").getFile())),
+ isSimilarTo(Input.from(new File(classLoader.getResource("control.xml").getFile()))));
}
@Test
public void givenStreamAsSource_whenAbleToInput_thenCorrect() {
- assertThat(Input.fromStream(new XMLUnitTest().getClass()
+ assertThat(Input.fromStream(XMLUnitTest.class
.getResourceAsStream("/test.xml")),
- isSimilarTo(Input.fromStream(new XMLUnitTest().getClass()
+ isSimilarTo(Input.fromStream(XMLUnitTest.class
.getResourceAsStream("/control.xml"))));
}
@Test
public void givenStreamAsObject_whenAbleToInput_thenCorrect() {
- assertThat(Input.from(new XMLUnitTest().getClass().getResourceAsStream(
- "/test.xml")), isSimilarTo(Input.from(new XMLUnitTest()
- .getClass().getResourceAsStream("/control.xml"))));
-
+ assertThat(Input.from(XMLUnitTest.class.getResourceAsStream("/test.xml")),
+ isSimilarTo(Input.from(XMLUnitTest.class.getResourceAsStream("/control.xml"))));
}
@Test
@@ -206,7 +220,6 @@ public class XMLUnitTest {
Input.from("3 false "),
isSimilarTo(Input
.from("3 false ")));
-
}
@Test
@@ -216,7 +229,6 @@ public class XMLUnitTest {
String controlPath = classLoader.getResource("control.xml").getPath();
assertThat(Input.fromFile(testPath),
isSimilarTo(Input.fromFile(controlPath)));
-
}
@Test