From 9be2974d140d26c6faed5f75c2ae617ee1c52fa2 Mon Sep 17 00:00:00 2001 From: Exiled Rain Date: Sun, 4 Aug 2019 00:01:39 +0300 Subject: [PATCH 01/18] Character feature --- .../io/khasang/gahelp/config/AppConfig.java | 8 ++ .../controller/CharacterController.java | 48 +++++++ .../java/io/khasang/gahelp/dao/BasicDao.java | 10 +- .../io/khasang/gahelp/dao/CharacterDao.java | 6 + .../khasang/gahelp/dao/impl/BasicDaoImpl.java | 6 + .../gahelp/dao/impl/CharacterDaoImpl.java | 10 ++ .../io/khasang/gahelp/entity/Character.java | 56 ++++++++ .../gahelp/service/CharacterService.java | 47 +++++++ .../service/impl/CharacterServiceImpl.java | 43 ++++++ .../CharacterControllerIntegrationTest.java | 127 ++++++++++++++++++ 10 files changed, 359 insertions(+), 2 deletions(-) create mode 100644 src/main/java/io/khasang/gahelp/controller/CharacterController.java create mode 100644 src/main/java/io/khasang/gahelp/dao/CharacterDao.java create mode 100644 src/main/java/io/khasang/gahelp/dao/impl/CharacterDaoImpl.java create mode 100644 src/main/java/io/khasang/gahelp/entity/Character.java create mode 100644 src/main/java/io/khasang/gahelp/service/CharacterService.java create mode 100644 src/main/java/io/khasang/gahelp/service/impl/CharacterServiceImpl.java create mode 100644 src/test/java/io/khasang/gahelp/controller/CharacterControllerIntegrationTest.java diff --git a/src/main/java/io/khasang/gahelp/config/AppConfig.java b/src/main/java/io/khasang/gahelp/config/AppConfig.java index 86cb5ff..b37741a 100644 --- a/src/main/java/io/khasang/gahelp/config/AppConfig.java +++ b/src/main/java/io/khasang/gahelp/config/AppConfig.java @@ -1,7 +1,10 @@ package io.khasang.gahelp.config; +import io.khasang.gahelp.dao.CharacterDao; import io.khasang.gahelp.dao.HorseDao; +import io.khasang.gahelp.dao.impl.CharacterDaoImpl; import io.khasang.gahelp.dao.impl.HorseDaoImpl; +import io.khasang.gahelp.entity.Character; import io.khasang.gahelp.entity.Horse; import io.khasang.gahelp.model.Cat; import org.springframework.context.annotation.Bean; @@ -20,4 +23,9 @@ public Cat cat(){ public HorseDao horseDao() { return new HorseDaoImpl(Horse.class); } + + @Bean + public CharacterDao characterDao() { + return new CharacterDaoImpl(Character.class); + } } diff --git a/src/main/java/io/khasang/gahelp/controller/CharacterController.java b/src/main/java/io/khasang/gahelp/controller/CharacterController.java new file mode 100644 index 0000000..ee9ad96 --- /dev/null +++ b/src/main/java/io/khasang/gahelp/controller/CharacterController.java @@ -0,0 +1,48 @@ +package io.khasang.gahelp.controller; + +import io.khasang.gahelp.entity.Character; +import io.khasang.gahelp.service.CharacterService; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@Controller +@RequestMapping("/character") +public class CharacterController { + private CharacterService characterService; + + public CharacterController(CharacterService characterService) { + this.characterService = characterService; + } + + @RequestMapping(value = "/add", method = RequestMethod.POST, produces = "application/json;charset=utf-8") + @ResponseBody + public Character addCharacter(@RequestBody Character character) { + return characterService.add(character); + } + + @RequestMapping(value = "/delete/{id}", method = RequestMethod.DELETE) + @ResponseBody + public Character deleteById(@PathVariable("id") long id) { + return characterService.deleteById(id); + } + + @RequestMapping(value = "/get/{id}", method = RequestMethod.GET) + @ResponseBody + public Character getById(@PathVariable("id") long id) { + return characterService.getById(id); + } + + @RequestMapping(value = "/update/{id}", method = RequestMethod.PUT) + @ResponseBody + public Character updateById(@PathVariable("id") long id, @RequestBody Character character) { + return characterService.updateById(character, id); + } + + @RequestMapping(value = "/all", method = RequestMethod.GET) + @ResponseBody + public List getAll() { + return characterService.getAll(); + } +} diff --git a/src/main/java/io/khasang/gahelp/dao/BasicDao.java b/src/main/java/io/khasang/gahelp/dao/BasicDao.java index 680132d..de166f5 100644 --- a/src/main/java/io/khasang/gahelp/dao/BasicDao.java +++ b/src/main/java/io/khasang/gahelp/dao/BasicDao.java @@ -1,7 +1,5 @@ package io.khasang.gahelp.dao; -import io.khasang.gahelp.entity.Horse; - import java.util.List; public interface BasicDao { @@ -35,4 +33,12 @@ public interface BasicDao { * @return deleted entity */ T delete(T entity); + + /** + * Service to update entity + * + * @param entity - update entity data + * @return updated entity + */ + T update(T entity); } diff --git a/src/main/java/io/khasang/gahelp/dao/CharacterDao.java b/src/main/java/io/khasang/gahelp/dao/CharacterDao.java new file mode 100644 index 0000000..e86b387 --- /dev/null +++ b/src/main/java/io/khasang/gahelp/dao/CharacterDao.java @@ -0,0 +1,6 @@ +package io.khasang.gahelp.dao; + +import io.khasang.gahelp.entity.Character; + +public interface CharacterDao extends BasicDao { +} diff --git a/src/main/java/io/khasang/gahelp/dao/impl/BasicDaoImpl.java b/src/main/java/io/khasang/gahelp/dao/impl/BasicDaoImpl.java index 2849c15..7c1a628 100644 --- a/src/main/java/io/khasang/gahelp/dao/impl/BasicDaoImpl.java +++ b/src/main/java/io/khasang/gahelp/dao/impl/BasicDaoImpl.java @@ -48,6 +48,12 @@ public List getAll() { return getSession().createQuery(criteriaQuery).list(); } + @Override + public T update(T entity) { + getSession().update(entity); + return entity; + } + private Session getSession() { return sessionFactory.getCurrentSession(); } diff --git a/src/main/java/io/khasang/gahelp/dao/impl/CharacterDaoImpl.java b/src/main/java/io/khasang/gahelp/dao/impl/CharacterDaoImpl.java new file mode 100644 index 0000000..4cc561c --- /dev/null +++ b/src/main/java/io/khasang/gahelp/dao/impl/CharacterDaoImpl.java @@ -0,0 +1,10 @@ +package io.khasang.gahelp.dao.impl; + +import io.khasang.gahelp.dao.CharacterDao; +import io.khasang.gahelp.entity.Character; + +public class CharacterDaoImpl extends BasicDaoImpl implements CharacterDao { + public CharacterDaoImpl(Class entityClass) { + super(entityClass); + } +} diff --git a/src/main/java/io/khasang/gahelp/entity/Character.java b/src/main/java/io/khasang/gahelp/entity/Character.java new file mode 100644 index 0000000..50aac59 --- /dev/null +++ b/src/main/java/io/khasang/gahelp/entity/Character.java @@ -0,0 +1,56 @@ +package io.khasang.gahelp.entity; + +import javax.persistence.*; + +@Entity +@Table(name = "character") +public class Character { + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private long id; + + private String name; + private String alias; + private String description; + private Integer stat; + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getAlias() { + return alias; + } + + public void setAlias(String alias) { + this.alias = alias; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public Integer getStat() { + return stat; + } + + public void setStat(Integer stat) { + this.stat = stat; + } +} diff --git a/src/main/java/io/khasang/gahelp/service/CharacterService.java b/src/main/java/io/khasang/gahelp/service/CharacterService.java new file mode 100644 index 0000000..89b0f72 --- /dev/null +++ b/src/main/java/io/khasang/gahelp/service/CharacterService.java @@ -0,0 +1,47 @@ +package io.khasang.gahelp.service; + +import io.khasang.gahelp.entity.Character; + +import java.util.List; + +public interface CharacterService { + /** + * Service to add character + * + * @param character - character to add + * @return character that been added + */ + Character add(Character character); + + /** + * Service to get character by id + * + * @param id - id of character to get + * @return specific character by id + */ + Character getById(long id); + + /** + * Service to delete character + * + * @param id - id of character to be deleted + * @return deleted character + */ + Character deleteById(long id); + + /** + * Service to update character + * + * @param id - id of character to be updated + * @param character - data to update in character + * @return updated character + */ + Character updateById(Character character, long id); + + /** + * Service to get all characters + * + * @return List of all characters + */ + List getAll(); +} diff --git a/src/main/java/io/khasang/gahelp/service/impl/CharacterServiceImpl.java b/src/main/java/io/khasang/gahelp/service/impl/CharacterServiceImpl.java new file mode 100644 index 0000000..b1d3778 --- /dev/null +++ b/src/main/java/io/khasang/gahelp/service/impl/CharacterServiceImpl.java @@ -0,0 +1,43 @@ +package io.khasang.gahelp.service.impl; + +import io.khasang.gahelp.dao.CharacterDao; +import io.khasang.gahelp.entity.Character; +import io.khasang.gahelp.service.CharacterService; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service("characterService") +public class CharacterServiceImpl implements CharacterService { + private CharacterDao characterDao; + + public CharacterServiceImpl(CharacterDao characterDao) { + this.characterDao = characterDao; + } + + @Override + public Character add(Character character) { + return characterDao.add(character); + } + + @Override + public Character getById(long id) { + return characterDao.getById(id); + } + + @Override + public Character deleteById(long id) { + return characterDao.delete(getById(id)); + } + + @Override + public Character updateById(Character character, long id) { + character.setId(id); + return characterDao.update(character); + } + + @Override + public List getAll() { + return characterDao.getAll(); + } +} diff --git a/src/test/java/io/khasang/gahelp/controller/CharacterControllerIntegrationTest.java b/src/test/java/io/khasang/gahelp/controller/CharacterControllerIntegrationTest.java new file mode 100644 index 0000000..55006f3 --- /dev/null +++ b/src/test/java/io/khasang/gahelp/controller/CharacterControllerIntegrationTest.java @@ -0,0 +1,127 @@ +package io.khasang.gahelp.controller; + +import io.khasang.gahelp.entity.Character; +import org.junit.Test; +import org.springframework.core.ParameterizedTypeReference; +import org.springframework.http.*; +import org.springframework.web.client.RestTemplate; + +import java.util.List; + +import static org.junit.Assert.*; + +public class CharacterControllerIntegrationTest { + private static final String ROOT = "http://localhost:8080/character"; + private static final String ADD = "/add"; + private static final String GET = "/get"; + private static final String DELETE = "/delete"; + private static final String ALL = "/all"; + private static final String UPDATE = "/update"; + + @Test + public void checkCharacterAdd() { + Character str = createCharacter(); + + RestTemplate template = new RestTemplate(); + ResponseEntity responseEntity = template.exchange( + ROOT + GET + "/{id}", + HttpMethod.GET, + null, + Character.class, + str.getId() + ); + assertEquals(HttpStatus.OK, responseEntity.getStatusCode()); + Character receivedCharacter = responseEntity.getBody(); + assertNotNull(receivedCharacter); + } + + @Test + public void checkAllCharacters() { + createCharacter(); + + RestTemplate restTemplate = new RestTemplate(); + ResponseEntity> responseEntity = restTemplate.exchange( + ROOT + ALL, + HttpMethod.GET, + null, + new ParameterizedTypeReference>() { + } + ); + List characters = responseEntity.getBody(); + assertNotNull(characters); + assertNotEquals(characters.size(), 0); + } + + @Test + public void checkUpdateCharacter() { + // Select ID of an object to update + int updateID = 1; + + Character character = updateCharacter(); + HttpEntity entity = new HttpEntity<>(character, null); + + RestTemplate restTemplate = new RestTemplate(); + ResponseEntity responseEntity = restTemplate.exchange( + ROOT + UPDATE + "/{id}", + HttpMethod.PUT, + entity, + Character.class, + updateID + ); + assertNotNull(responseEntity.getBody()); + assertEquals(HttpStatus.OK, responseEntity.getStatusCode()); + assertEquals(responseEntity.getBody().getName(), character.getName()); + } + + @Test + public void checkDeleteCharacter() { + Character character = createCharacter(); + long deleteID = character.getId(); + RestTemplate restTemplate = new RestTemplate(); + ResponseEntity responseEntity = restTemplate.exchange( + ROOT + DELETE + "/{id}", + HttpMethod.DELETE, + null, + Character.class, + deleteID + ); + assertEquals(HttpStatus.OK, responseEntity.getStatusCode()); + } + + private Character createCharacter() { + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON_UTF8); + + Character character = preFillCharacter(); + + HttpEntity entity = new HttpEntity<>(character, headers); + RestTemplate restTemplate = new RestTemplate(); + Character createdCharacter = restTemplate.exchange( + ROOT + ADD, + HttpMethod.POST, + entity, + Character.class) + .getBody(); + assertNotNull(createdCharacter); + assertEquals("Strength", createdCharacter.getName()); + return createdCharacter; + } + + private Character preFillCharacter() { + Character character = new Character(); + character.setName("Strength"); + character.setAlias("STR"); + character.setDescription("This is just a fake param for testing purposes"); + character.setStat(10); + return character; + } + + private Character updateCharacter() { + Character character = new Character(); + character.setName("Agility"); + character.setAlias("AGI"); + character.setDescription("THis most OP parameter to have in MMO game"); + character.setStat(5); + return character; + } +} From 530b168cd3f4f06383d80462cb65a16fa060175c Mon Sep 17 00:00:00 2001 From: Exiled Rain Date: Sun, 4 Aug 2019 10:12:23 +0300 Subject: [PATCH 02/18] Role feature --- .../io/khasang/gahelp/config/AppConfig.java | 8 ++ .../gahelp/controller/RoleController.java | 48 +++++++ .../java/io/khasang/gahelp/dao/BasicDao.java | 10 +- .../java/io/khasang/gahelp/dao/RoleDao.java | 6 + .../khasang/gahelp/dao/impl/BasicDaoImpl.java | 6 + .../khasang/gahelp/dao/impl/RoleDaoImpl.java | 10 ++ .../java/io/khasang/gahelp/entity/Role.java | 48 +++++++ .../khasang/gahelp/service/RoleService.java | 48 +++++++ .../gahelp/service/impl/RoleServiceImpl.java | 43 ++++++ .../RoleControllerIntegrationTest.java | 123 ++++++++++++++++++ 10 files changed, 348 insertions(+), 2 deletions(-) create mode 100644 src/main/java/io/khasang/gahelp/controller/RoleController.java create mode 100644 src/main/java/io/khasang/gahelp/dao/RoleDao.java create mode 100644 src/main/java/io/khasang/gahelp/dao/impl/RoleDaoImpl.java create mode 100644 src/main/java/io/khasang/gahelp/entity/Role.java create mode 100644 src/main/java/io/khasang/gahelp/service/RoleService.java create mode 100644 src/main/java/io/khasang/gahelp/service/impl/RoleServiceImpl.java create mode 100644 src/test/java/io/khasang/gahelp/controller/RoleControllerIntegrationTest.java diff --git a/src/main/java/io/khasang/gahelp/config/AppConfig.java b/src/main/java/io/khasang/gahelp/config/AppConfig.java index 86cb5ff..9181046 100644 --- a/src/main/java/io/khasang/gahelp/config/AppConfig.java +++ b/src/main/java/io/khasang/gahelp/config/AppConfig.java @@ -1,8 +1,11 @@ package io.khasang.gahelp.config; import io.khasang.gahelp.dao.HorseDao; +import io.khasang.gahelp.dao.RoleDao; import io.khasang.gahelp.dao.impl.HorseDaoImpl; +import io.khasang.gahelp.dao.impl.RoleDaoImpl; import io.khasang.gahelp.entity.Horse; +import io.khasang.gahelp.entity.Role; import io.khasang.gahelp.model.Cat; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -20,4 +23,9 @@ public Cat cat(){ public HorseDao horseDao() { return new HorseDaoImpl(Horse.class); } + + @Bean + public RoleDao roleDao() { + return new RoleDaoImpl(Role.class); + } } diff --git a/src/main/java/io/khasang/gahelp/controller/RoleController.java b/src/main/java/io/khasang/gahelp/controller/RoleController.java new file mode 100644 index 0000000..c25aa5f --- /dev/null +++ b/src/main/java/io/khasang/gahelp/controller/RoleController.java @@ -0,0 +1,48 @@ +package io.khasang.gahelp.controller; + +import io.khasang.gahelp.entity.Role; +import io.khasang.gahelp.service.RoleService; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@Controller +@RequestMapping(value = "/role") +public class RoleController { + private RoleService roleService; + + public RoleController(RoleService roleService) { + this.roleService = roleService; + } + + @RequestMapping(value = "/add", method = RequestMethod.POST, produces = "application/json;charset=utf-8") + @ResponseBody + public Role addRole(@RequestBody Role role) { + return roleService.addRole(role); + } + + @RequestMapping(value = "/get/{id}", method = RequestMethod.GET) + @ResponseBody + public Role getRoleById(@PathVariable("id") long id) { + return roleService.getRoleById(id); + } + + @RequestMapping(value = "/delete/{id}", method = RequestMethod.DELETE) + @ResponseBody + public Role deleteRoleById(@PathVariable("id") long id) { + return roleService.deleteRole(id); + } + + @RequestMapping(value = "/all", method = RequestMethod.GET) + @ResponseBody + public List getAll() { + return roleService.getAll(); + } + + @RequestMapping(value = "/update/{id}", method = RequestMethod.PUT) + @ResponseBody + public Role updateRoleById(@PathVariable("id") long id, @RequestBody Role role) { + return roleService.updateRoleById(role, id); + } +} diff --git a/src/main/java/io/khasang/gahelp/dao/BasicDao.java b/src/main/java/io/khasang/gahelp/dao/BasicDao.java index 680132d..d375cef 100644 --- a/src/main/java/io/khasang/gahelp/dao/BasicDao.java +++ b/src/main/java/io/khasang/gahelp/dao/BasicDao.java @@ -1,7 +1,5 @@ package io.khasang.gahelp.dao; -import io.khasang.gahelp.entity.Horse; - import java.util.List; public interface BasicDao { @@ -35,4 +33,12 @@ public interface BasicDao { * @return deleted entity */ T delete(T entity); + + /** + * Service to update entity + * + * @param entity - entity to update + * @return updated entity + */ + T update(T entity); } diff --git a/src/main/java/io/khasang/gahelp/dao/RoleDao.java b/src/main/java/io/khasang/gahelp/dao/RoleDao.java new file mode 100644 index 0000000..562637f --- /dev/null +++ b/src/main/java/io/khasang/gahelp/dao/RoleDao.java @@ -0,0 +1,6 @@ +package io.khasang.gahelp.dao; + +import io.khasang.gahelp.entity.Role; + +public interface RoleDao extends BasicDao { +} diff --git a/src/main/java/io/khasang/gahelp/dao/impl/BasicDaoImpl.java b/src/main/java/io/khasang/gahelp/dao/impl/BasicDaoImpl.java index 2849c15..f3a1a5c 100644 --- a/src/main/java/io/khasang/gahelp/dao/impl/BasicDaoImpl.java +++ b/src/main/java/io/khasang/gahelp/dao/impl/BasicDaoImpl.java @@ -37,6 +37,12 @@ public T delete(T entity) { return entity; } + @Override + public T update(T entity) { + getSession().update(entity); + return entity; + } + @Override public List getAll() { // select * from horses; diff --git a/src/main/java/io/khasang/gahelp/dao/impl/RoleDaoImpl.java b/src/main/java/io/khasang/gahelp/dao/impl/RoleDaoImpl.java new file mode 100644 index 0000000..227f151 --- /dev/null +++ b/src/main/java/io/khasang/gahelp/dao/impl/RoleDaoImpl.java @@ -0,0 +1,10 @@ +package io.khasang.gahelp.dao.impl; + +import io.khasang.gahelp.dao.RoleDao; +import io.khasang.gahelp.entity.Role; + +public class RoleDaoImpl extends BasicDaoImpl implements RoleDao { + public RoleDaoImpl(Class entityClass) { + super(entityClass); + } +} diff --git a/src/main/java/io/khasang/gahelp/entity/Role.java b/src/main/java/io/khasang/gahelp/entity/Role.java new file mode 100644 index 0000000..979d57a --- /dev/null +++ b/src/main/java/io/khasang/gahelp/entity/Role.java @@ -0,0 +1,48 @@ +package io.khasang.gahelp.entity; + +import javax.persistence.*; + +@Entity +@Table(name = "role") +public class Role { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private long id; + + private String name; + private String type; + private String description; + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } +} diff --git a/src/main/java/io/khasang/gahelp/service/RoleService.java b/src/main/java/io/khasang/gahelp/service/RoleService.java new file mode 100644 index 0000000..0b322c3 --- /dev/null +++ b/src/main/java/io/khasang/gahelp/service/RoleService.java @@ -0,0 +1,48 @@ +package io.khasang.gahelp.service; + +import io.khasang.gahelp.entity.Role; + +import java.util.List; + +public interface RoleService { + + /** + * Service for adding role + * + * @param role - for adding + * @return added role + */ + Role addRole(Role role); + + /** + * Service to getting role by id + * + * @param id - role id + * @return specific role by id + */ + Role getRoleById(long id); + + /** + * Service for getting all roles + * + * @return all roles + */ + List getAll(); + + /** + * Service to delete specific role + * + * @param id - role id to delete + * @return deleted role + */ + Role deleteRole(long id); + + /** + * Service to update role + * + * @param id - id of role to update + * @param role - update data for role + * @return updated role + */ + Role updateRoleById(Role role, long id); +} diff --git a/src/main/java/io/khasang/gahelp/service/impl/RoleServiceImpl.java b/src/main/java/io/khasang/gahelp/service/impl/RoleServiceImpl.java new file mode 100644 index 0000000..fee29ef --- /dev/null +++ b/src/main/java/io/khasang/gahelp/service/impl/RoleServiceImpl.java @@ -0,0 +1,43 @@ +package io.khasang.gahelp.service.impl; + +import io.khasang.gahelp.dao.RoleDao; +import io.khasang.gahelp.entity.Role; +import io.khasang.gahelp.service.RoleService; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service("roleService") +public class RoleServiceImpl implements RoleService { + private RoleDao roleDao; + + public RoleServiceImpl(RoleDao roleDao) { + this.roleDao = roleDao; + } + + @Override + public Role addRole(Role role) { + return roleDao.add(role); + } + + @Override + public Role getRoleById(long id) { + return roleDao.getById(id); + } + + @Override + public List getAll() { + return roleDao.getAll(); + } + + @Override + public Role deleteRole(long id) { + return roleDao.getById(id); + } + + @Override + public Role updateRoleById(Role role, long id) { + role.setId(id); + return roleDao.update(role); + } +} diff --git a/src/test/java/io/khasang/gahelp/controller/RoleControllerIntegrationTest.java b/src/test/java/io/khasang/gahelp/controller/RoleControllerIntegrationTest.java new file mode 100644 index 0000000..d6c5602 --- /dev/null +++ b/src/test/java/io/khasang/gahelp/controller/RoleControllerIntegrationTest.java @@ -0,0 +1,123 @@ +package io.khasang.gahelp.controller; + +import io.khasang.gahelp.entity.Role; +import org.junit.Test; +import org.springframework.core.ParameterizedTypeReference; +import org.springframework.http.*; +import org.springframework.web.client.RestTemplate; + +import java.util.List; + +import static org.junit.Assert.*; + +public class RoleControllerIntegrationTest { + private static final String ROOT = "http://localhost:8080/role"; + private static final String ADD = "/add"; + private static final String ALL = "/all"; + private static final String GET = "/get"; + private static final String DELETE = "/delete"; + private static final String UPDATE = "/update"; + + @Test + public void checkRoleAdd() { + Role role = createRole(); + + RestTemplate restTemplate = new RestTemplate(); + ResponseEntity entity = restTemplate.exchange( + ROOT + GET + "/{id}", + HttpMethod.GET, + null, + Role.class, + role.getId() + ); + assertEquals(HttpStatus.OK, entity.getStatusCode()); + Role receivedRole = entity.getBody(); + assertNotNull(receivedRole); + } + + @Test + public void checkAllRoles() { + createRole(); + + RestTemplate template = new RestTemplate(); + ResponseEntity> entity = template.exchange( + ROOT + ALL, + HttpMethod.GET, + null, + new ParameterizedTypeReference>() { + } + ); + List roles = entity.getBody(); + assertNotNull(roles); + assertNotEquals(roles.size(), 0); + } + + @Test + public void checkUpdateRole() { + int updateId = 2; + + Role updatedRole = updatedRole(); + HttpEntity entity = new HttpEntity<>(updatedRole, null); + + RestTemplate template = new RestTemplate(); + ResponseEntity responseEntity = template.exchange( + ROOT + UPDATE + "/{id}", + HttpMethod.PUT, + entity, + Role.class, + updateId + ); + assertEquals(HttpStatus.OK, responseEntity.getStatusCode()); + } + + @Test + public void checkDeleteRole() { + Role newRole = createRole(); + long deleteID = newRole.getId(); + + RestTemplate template = new RestTemplate(); + ResponseEntity responseEntity = template.exchange( + ROOT + DELETE + "/{id}", + HttpMethod.DELETE, + null, + Role.class, + deleteID + ); + assertEquals(HttpStatus.OK, responseEntity.getStatusCode()); + } + + private Role createRole() { + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON_UTF8); + + Role role = preFillRole(); + + HttpEntity entity = new HttpEntity<>(role, headers); + RestTemplate restTemplate = new RestTemplate(); + Role createdRole = restTemplate.exchange( + ROOT + ADD, + HttpMethod.POST, + entity, + Role.class).getBody(); + assertNotNull(createdRole); + assertEquals("Admin", createdRole.getName()); + return createdRole; + } + + + private Role preFillRole() { + Role role = new Role(); + role.setName("Admin"); + role.setType("Administration"); + role.setDescription("Role for setting all other roles in"); + return role; + } + + private Role updatedRole() { + Role role = new Role(); + role.setName("User"); + role.setType("Casual"); + role.setDescription("Role for having fun"); + return role; + } +} From 610d88c23dd95d95733cc32aa28fd195193c9b80 Mon Sep 17 00:00:00 2001 From: Exiled Rain Date: Sun, 4 Aug 2019 10:26:54 +0300 Subject: [PATCH 03/18] Role feature --- .../gahelp/controller/RoleControllerIntegrationTest.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/test/java/io/khasang/gahelp/controller/RoleControllerIntegrationTest.java b/src/test/java/io/khasang/gahelp/controller/RoleControllerIntegrationTest.java index d6c5602..02e2636 100644 --- a/src/test/java/io/khasang/gahelp/controller/RoleControllerIntegrationTest.java +++ b/src/test/java/io/khasang/gahelp/controller/RoleControllerIntegrationTest.java @@ -38,6 +38,7 @@ public void checkRoleAdd() { @Test public void checkAllRoles() { createRole(); + createRole(); RestTemplate template = new RestTemplate(); ResponseEntity> entity = template.exchange( @@ -54,7 +55,7 @@ public void checkAllRoles() { @Test public void checkUpdateRole() { - int updateId = 2; + int updateId = 27; Role updatedRole = updatedRole(); HttpEntity entity = new HttpEntity<>(updatedRole, null); @@ -67,7 +68,9 @@ public void checkUpdateRole() { Role.class, updateId ); + assertNotNull(responseEntity.getBody()); assertEquals(HttpStatus.OK, responseEntity.getStatusCode()); + assertEquals(responseEntity.getBody().getName(), updatedRole.getName()); } @Test From 5cae6521d3cb1305765d8699afeada22de52e70c Mon Sep 17 00:00:00 2001 From: Exiled Rain Date: Sun, 4 Aug 2019 11:04:15 +0300 Subject: [PATCH 04/18] Role feature rework --- .../io/khasang/gahelp/entity/Character.java | 102 +++++++++++++++--- .../CharacterControllerIntegrationTest.java | 36 +++++-- 2 files changed, 113 insertions(+), 25 deletions(-) diff --git a/src/main/java/io/khasang/gahelp/entity/Character.java b/src/main/java/io/khasang/gahelp/entity/Character.java index 50aac59..aee8a90 100644 --- a/src/main/java/io/khasang/gahelp/entity/Character.java +++ b/src/main/java/io/khasang/gahelp/entity/Character.java @@ -10,9 +10,17 @@ public class Character { private long id; private String name; - private String alias; - private String description; - private Integer stat; + private String race; + private String gender; + private String speciality; + private String pet; + private int age; + private int strength; + private int constitution; + private int dexterity; + private int intelligence; + private int wisdom; + private int charisma; public long getId() { return id; @@ -30,27 +38,91 @@ public void setName(String name) { this.name = name; } - public String getAlias() { - return alias; + public String getRace() { + return race; } - public void setAlias(String alias) { - this.alias = alias; + public void setRace(String race) { + this.race = race; } - public String getDescription() { - return description; + public String getGender() { + return gender; } - public void setDescription(String description) { - this.description = description; + public void setGender(String gender) { + this.gender = gender; } - public Integer getStat() { - return stat; + public String getSpeciality() { + return speciality; } - public void setStat(Integer stat) { - this.stat = stat; + public void setSpeciality(String speciality) { + this.speciality = speciality; + } + + public String getPet() { + return pet; + } + + public void setPet(String pet) { + this.pet = pet; + } + + public int getAge() { + return age; + } + + public void setAge(int age) { + this.age = age; + } + + public int getStrength() { + return strength; + } + + public void setStrength(int strength) { + this.strength = strength; + } + + public int getConstitution() { + return constitution; + } + + public void setConstitution(int constitution) { + this.constitution = constitution; + } + + public int getDexterity() { + return dexterity; + } + + public void setDexterity(int dexterity) { + this.dexterity = dexterity; + } + + public int getIntelligence() { + return intelligence; + } + + public void setIntelligence(int intelligence) { + this.intelligence = intelligence; + } + + public int getWisdom() { + return wisdom; + } + + public void setWisdom(int wisdom) { + this.wisdom = wisdom; + } + + public int getCharisma() { + return charisma; + } + + public void setCharisma(int charisma) { + this.charisma = charisma; } } diff --git a/src/test/java/io/khasang/gahelp/controller/CharacterControllerIntegrationTest.java b/src/test/java/io/khasang/gahelp/controller/CharacterControllerIntegrationTest.java index 55006f3..f9f17fb 100644 --- a/src/test/java/io/khasang/gahelp/controller/CharacterControllerIntegrationTest.java +++ b/src/test/java/io/khasang/gahelp/controller/CharacterControllerIntegrationTest.java @@ -55,7 +55,7 @@ public void checkAllCharacters() { @Test public void checkUpdateCharacter() { // Select ID of an object to update - int updateID = 1; + int updateID = 40; Character character = updateCharacter(); HttpEntity entity = new HttpEntity<>(character, null); @@ -103,25 +103,41 @@ private Character createCharacter() { Character.class) .getBody(); assertNotNull(createdCharacter); - assertEquals("Strength", createdCharacter.getName()); + assertEquals("Lightning", createdCharacter.getName()); return createdCharacter; } private Character preFillCharacter() { Character character = new Character(); - character.setName("Strength"); - character.setAlias("STR"); - character.setDescription("This is just a fake param for testing purposes"); - character.setStat(10); + character.setName("Lightning"); + character.setGender("Female"); + character.setAge(25); + character.setPet("Nona"); + character.setRace("Elf"); + character.setSpeciality("Assassin"); + character.setCharisma(11); + character.setConstitution(3); + character.setStrength(15); + character.setDexterity(16); + character.setIntelligence(9); + character.setWisdom(14); return character; } private Character updateCharacter() { Character character = new Character(); - character.setName("Agility"); - character.setAlias("AGI"); - character.setDescription("THis most OP parameter to have in MMO game"); - character.setStat(5); + character.setName("Riven"); + character.setGender("Female"); + character.setAge(28); + character.setPet("Exiled"); + character.setRace("Human"); + character.setSpeciality("Assassin"); + character.setCharisma(12); + character.setConstitution(4); + character.setStrength(16); + character.setDexterity(17); + character.setIntelligence(10); + character.setWisdom(15); return character; } } From f8201d6063cdb9147e452e429c940fe7a6685f63 Mon Sep 17 00:00:00 2001 From: nickopol80 Date: Sat, 10 Aug 2019 13:23:15 +0300 Subject: [PATCH 05/18] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D0=BB=20update=20(=D1=83=D0=B1=D1=80=D0=B0=D0=BB=20id)?= =?UTF-8?q?=20+=20=D0=B2=D0=B5=D1=80=D0=BD=D1=83=D0=BB=20update(T=20byId)?= =?UTF-8?q?=20=D0=B2=20BasicDao?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gahelp/controller/MonsterControllerIntegrationTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/io/khasang/gahelp/controller/MonsterControllerIntegrationTest.java b/src/test/java/io/khasang/gahelp/controller/MonsterControllerIntegrationTest.java index 47ba144..e5a0d3a 100644 --- a/src/test/java/io/khasang/gahelp/controller/MonsterControllerIntegrationTest.java +++ b/src/test/java/io/khasang/gahelp/controller/MonsterControllerIntegrationTest.java @@ -82,7 +82,7 @@ public void checkUpdateMonster() { headers.setContentType(MediaType.APPLICATION_JSON_UTF8); Monster monster = createMonster(); - System.out.println("Monster with id =" + monster.getId() + " has OLD hp: --> "+monster.getHealthPoint()); + System.out.println("Monster with id =" + monster.getId() + " has OLD hp: --> " + monster.getHealthPoint()); int newMonsterHealthPoint = monster.getHealthPoint() + getRandomIntForHpAdd(); System.out.println("Monster with id =" + monster.getId() + " has HEW hp: --> " + newMonsterHealthPoint); monster.setHealthPoint(newMonsterHealthPoint); From 5e4d3b9904053b9e47f32a7181502f14c672bdf3 Mon Sep 17 00:00:00 2001 From: Exiled Rain Date: Sat, 10 Aug 2019 23:41:59 +0300 Subject: [PATCH 06/18] Role update method removed ID field --- .../io/khasang/gahelp/controller/RoleController.java | 6 +++--- .../java/io/khasang/gahelp/service/RoleService.java | 3 +-- .../khasang/gahelp/service/impl/RoleServiceImpl.java | 3 +-- .../controller/RoleControllerIntegrationTest.java | 12 ++++++------ 4 files changed, 11 insertions(+), 13 deletions(-) diff --git a/src/main/java/io/khasang/gahelp/controller/RoleController.java b/src/main/java/io/khasang/gahelp/controller/RoleController.java index c25aa5f..281abd9 100644 --- a/src/main/java/io/khasang/gahelp/controller/RoleController.java +++ b/src/main/java/io/khasang/gahelp/controller/RoleController.java @@ -40,9 +40,9 @@ public List getAll() { return roleService.getAll(); } - @RequestMapping(value = "/update/{id}", method = RequestMethod.PUT) + @RequestMapping(value = "/update", method = RequestMethod.PUT) @ResponseBody - public Role updateRoleById(@PathVariable("id") long id, @RequestBody Role role) { - return roleService.updateRoleById(role, id); + public Role updateRole(@RequestBody Role role) { + return roleService.updateRole(role); } } diff --git a/src/main/java/io/khasang/gahelp/service/RoleService.java b/src/main/java/io/khasang/gahelp/service/RoleService.java index 0b322c3..6d2f54c 100644 --- a/src/main/java/io/khasang/gahelp/service/RoleService.java +++ b/src/main/java/io/khasang/gahelp/service/RoleService.java @@ -40,9 +40,8 @@ public interface RoleService { /** * Service to update role * - * @param id - id of role to update * @param role - update data for role * @return updated role */ - Role updateRoleById(Role role, long id); + Role updateRole(Role role); } diff --git a/src/main/java/io/khasang/gahelp/service/impl/RoleServiceImpl.java b/src/main/java/io/khasang/gahelp/service/impl/RoleServiceImpl.java index fee29ef..6077d90 100644 --- a/src/main/java/io/khasang/gahelp/service/impl/RoleServiceImpl.java +++ b/src/main/java/io/khasang/gahelp/service/impl/RoleServiceImpl.java @@ -36,8 +36,7 @@ public Role deleteRole(long id) { } @Override - public Role updateRoleById(Role role, long id) { - role.setId(id); + public Role updateRole(Role role) { return roleDao.update(role); } } diff --git a/src/test/java/io/khasang/gahelp/controller/RoleControllerIntegrationTest.java b/src/test/java/io/khasang/gahelp/controller/RoleControllerIntegrationTest.java index 02e2636..d906bd5 100644 --- a/src/test/java/io/khasang/gahelp/controller/RoleControllerIntegrationTest.java +++ b/src/test/java/io/khasang/gahelp/controller/RoleControllerIntegrationTest.java @@ -55,18 +55,17 @@ public void checkAllRoles() { @Test public void checkUpdateRole() { - int updateId = 27; - Role updatedRole = updatedRole(); - HttpEntity entity = new HttpEntity<>(updatedRole, null); + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON_UTF8); + HttpEntity entity = new HttpEntity<>(updatedRole, headers); RestTemplate template = new RestTemplate(); ResponseEntity responseEntity = template.exchange( - ROOT + UPDATE + "/{id}", + ROOT + UPDATE, HttpMethod.PUT, entity, - Role.class, - updateId + Role.class ); assertNotNull(responseEntity.getBody()); assertEquals(HttpStatus.OK, responseEntity.getStatusCode()); @@ -118,6 +117,7 @@ private Role preFillRole() { private Role updatedRole() { Role role = new Role(); + role.setId(25); role.setName("User"); role.setType("Casual"); role.setDescription("Role for having fun"); From 54de3b02d5a394e12623570be3c46468b46e96d4 Mon Sep 17 00:00:00 2001 From: Exiled Rain Date: Sun, 11 Aug 2019 10:29:18 +0300 Subject: [PATCH 07/18] Character update method removed ID field and changed names to Characters --- .../io/khasang/gahelp/config/AppConfig.java | 10 +- .../controller/CharacterController.java | 48 ------ .../controller/CharactersController.java | 48 ++++++ .../io/khasang/gahelp/dao/CharacterDao.java | 6 - .../io/khasang/gahelp/dao/CharactersDao.java | 6 + .../gahelp/dao/impl/CharacterDaoImpl.java | 10 -- .../gahelp/dao/impl/CharactersDaoImpl.java | 10 ++ .../{Character.java => Characters.java} | 2 +- ...terService.java => CharactersService.java} | 19 ++- .../service/impl/CharacterServiceImpl.java | 43 ------ .../service/impl/CharactersServiceImpl.java | 42 +++++ .../CharacterControllerIntegrationTest.java | 143 ------------------ .../CharactersControllerIntegrationTest.java | 142 +++++++++++++++++ 13 files changed, 263 insertions(+), 266 deletions(-) delete mode 100644 src/main/java/io/khasang/gahelp/controller/CharacterController.java create mode 100644 src/main/java/io/khasang/gahelp/controller/CharactersController.java delete mode 100644 src/main/java/io/khasang/gahelp/dao/CharacterDao.java create mode 100644 src/main/java/io/khasang/gahelp/dao/CharactersDao.java delete mode 100644 src/main/java/io/khasang/gahelp/dao/impl/CharacterDaoImpl.java create mode 100644 src/main/java/io/khasang/gahelp/dao/impl/CharactersDaoImpl.java rename src/main/java/io/khasang/gahelp/entity/{Character.java => Characters.java} (98%) rename src/main/java/io/khasang/gahelp/service/{CharacterService.java => CharactersService.java} (59%) delete mode 100644 src/main/java/io/khasang/gahelp/service/impl/CharacterServiceImpl.java create mode 100644 src/main/java/io/khasang/gahelp/service/impl/CharactersServiceImpl.java delete mode 100644 src/test/java/io/khasang/gahelp/controller/CharacterControllerIntegrationTest.java create mode 100644 src/test/java/io/khasang/gahelp/controller/CharactersControllerIntegrationTest.java diff --git a/src/main/java/io/khasang/gahelp/config/AppConfig.java b/src/main/java/io/khasang/gahelp/config/AppConfig.java index b37741a..e9b51f9 100644 --- a/src/main/java/io/khasang/gahelp/config/AppConfig.java +++ b/src/main/java/io/khasang/gahelp/config/AppConfig.java @@ -1,10 +1,10 @@ package io.khasang.gahelp.config; -import io.khasang.gahelp.dao.CharacterDao; +import io.khasang.gahelp.dao.CharactersDao; import io.khasang.gahelp.dao.HorseDao; -import io.khasang.gahelp.dao.impl.CharacterDaoImpl; +import io.khasang.gahelp.dao.impl.CharactersDaoImpl; import io.khasang.gahelp.dao.impl.HorseDaoImpl; -import io.khasang.gahelp.entity.Character; +import io.khasang.gahelp.entity.Characters; import io.khasang.gahelp.entity.Horse; import io.khasang.gahelp.model.Cat; import org.springframework.context.annotation.Bean; @@ -25,7 +25,7 @@ public HorseDao horseDao() { } @Bean - public CharacterDao characterDao() { - return new CharacterDaoImpl(Character.class); + public CharactersDao characterDao() { + return new CharactersDaoImpl(Characters.class); } } diff --git a/src/main/java/io/khasang/gahelp/controller/CharacterController.java b/src/main/java/io/khasang/gahelp/controller/CharacterController.java deleted file mode 100644 index ee9ad96..0000000 --- a/src/main/java/io/khasang/gahelp/controller/CharacterController.java +++ /dev/null @@ -1,48 +0,0 @@ -package io.khasang.gahelp.controller; - -import io.khasang.gahelp.entity.Character; -import io.khasang.gahelp.service.CharacterService; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -@Controller -@RequestMapping("/character") -public class CharacterController { - private CharacterService characterService; - - public CharacterController(CharacterService characterService) { - this.characterService = characterService; - } - - @RequestMapping(value = "/add", method = RequestMethod.POST, produces = "application/json;charset=utf-8") - @ResponseBody - public Character addCharacter(@RequestBody Character character) { - return characterService.add(character); - } - - @RequestMapping(value = "/delete/{id}", method = RequestMethod.DELETE) - @ResponseBody - public Character deleteById(@PathVariable("id") long id) { - return characterService.deleteById(id); - } - - @RequestMapping(value = "/get/{id}", method = RequestMethod.GET) - @ResponseBody - public Character getById(@PathVariable("id") long id) { - return characterService.getById(id); - } - - @RequestMapping(value = "/update/{id}", method = RequestMethod.PUT) - @ResponseBody - public Character updateById(@PathVariable("id") long id, @RequestBody Character character) { - return characterService.updateById(character, id); - } - - @RequestMapping(value = "/all", method = RequestMethod.GET) - @ResponseBody - public List getAll() { - return characterService.getAll(); - } -} diff --git a/src/main/java/io/khasang/gahelp/controller/CharactersController.java b/src/main/java/io/khasang/gahelp/controller/CharactersController.java new file mode 100644 index 0000000..4914197 --- /dev/null +++ b/src/main/java/io/khasang/gahelp/controller/CharactersController.java @@ -0,0 +1,48 @@ +package io.khasang.gahelp.controller; + +import io.khasang.gahelp.entity.Characters; +import io.khasang.gahelp.service.CharactersService; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@Controller +@RequestMapping("/characters") +public class CharactersController { + private CharactersService charactersService; + + public CharactersController(CharactersService charactersService) { + this.charactersService = charactersService; + } + + @RequestMapping(value = "/add", method = RequestMethod.POST, produces = "application/json;charset=utf-8") + @ResponseBody + public Characters addCharacters(@RequestBody Characters characters) { + return charactersService.add(characters); + } + + @RequestMapping(value = "/delete/{id}", method = RequestMethod.DELETE) + @ResponseBody + public Characters deleteById(@PathVariable("id") long id) { + return charactersService.deleteById(id); + } + + @RequestMapping(value = "/get/{id}", method = RequestMethod.GET) + @ResponseBody + public Characters getById(@PathVariable("id") long id) { + return charactersService.getById(id); + } + + @RequestMapping(value = "/update", method = RequestMethod.PUT) + @ResponseBody + public Characters update(@RequestBody Characters characters) { + return charactersService.update(characters); + } + + @RequestMapping(value = "/all", method = RequestMethod.GET) + @ResponseBody + public List getAll() { + return charactersService.getAll(); + } +} diff --git a/src/main/java/io/khasang/gahelp/dao/CharacterDao.java b/src/main/java/io/khasang/gahelp/dao/CharacterDao.java deleted file mode 100644 index e86b387..0000000 --- a/src/main/java/io/khasang/gahelp/dao/CharacterDao.java +++ /dev/null @@ -1,6 +0,0 @@ -package io.khasang.gahelp.dao; - -import io.khasang.gahelp.entity.Character; - -public interface CharacterDao extends BasicDao { -} diff --git a/src/main/java/io/khasang/gahelp/dao/CharactersDao.java b/src/main/java/io/khasang/gahelp/dao/CharactersDao.java new file mode 100644 index 0000000..641a334 --- /dev/null +++ b/src/main/java/io/khasang/gahelp/dao/CharactersDao.java @@ -0,0 +1,6 @@ +package io.khasang.gahelp.dao; + +import io.khasang.gahelp.entity.Characters; + +public interface CharactersDao extends BasicDao { +} diff --git a/src/main/java/io/khasang/gahelp/dao/impl/CharacterDaoImpl.java b/src/main/java/io/khasang/gahelp/dao/impl/CharacterDaoImpl.java deleted file mode 100644 index 4cc561c..0000000 --- a/src/main/java/io/khasang/gahelp/dao/impl/CharacterDaoImpl.java +++ /dev/null @@ -1,10 +0,0 @@ -package io.khasang.gahelp.dao.impl; - -import io.khasang.gahelp.dao.CharacterDao; -import io.khasang.gahelp.entity.Character; - -public class CharacterDaoImpl extends BasicDaoImpl implements CharacterDao { - public CharacterDaoImpl(Class entityClass) { - super(entityClass); - } -} diff --git a/src/main/java/io/khasang/gahelp/dao/impl/CharactersDaoImpl.java b/src/main/java/io/khasang/gahelp/dao/impl/CharactersDaoImpl.java new file mode 100644 index 0000000..5c7e54d --- /dev/null +++ b/src/main/java/io/khasang/gahelp/dao/impl/CharactersDaoImpl.java @@ -0,0 +1,10 @@ +package io.khasang.gahelp.dao.impl; + +import io.khasang.gahelp.dao.CharactersDao; +import io.khasang.gahelp.entity.Characters; + +public class CharactersDaoImpl extends BasicDaoImpl implements CharactersDao { + public CharactersDaoImpl(Class entityClass) { + super(entityClass); + } +} diff --git a/src/main/java/io/khasang/gahelp/entity/Character.java b/src/main/java/io/khasang/gahelp/entity/Characters.java similarity index 98% rename from src/main/java/io/khasang/gahelp/entity/Character.java rename to src/main/java/io/khasang/gahelp/entity/Characters.java index aee8a90..99e8e9f 100644 --- a/src/main/java/io/khasang/gahelp/entity/Character.java +++ b/src/main/java/io/khasang/gahelp/entity/Characters.java @@ -4,7 +4,7 @@ @Entity @Table(name = "character") -public class Character { +public class Characters { @Id @GeneratedValue(strategy = GenerationType.AUTO) private long id; diff --git a/src/main/java/io/khasang/gahelp/service/CharacterService.java b/src/main/java/io/khasang/gahelp/service/CharactersService.java similarity index 59% rename from src/main/java/io/khasang/gahelp/service/CharacterService.java rename to src/main/java/io/khasang/gahelp/service/CharactersService.java index 89b0f72..e17f149 100644 --- a/src/main/java/io/khasang/gahelp/service/CharacterService.java +++ b/src/main/java/io/khasang/gahelp/service/CharactersService.java @@ -1,17 +1,17 @@ package io.khasang.gahelp.service; -import io.khasang.gahelp.entity.Character; +import io.khasang.gahelp.entity.Characters; import java.util.List; -public interface CharacterService { +public interface CharactersService { /** * Service to add character * - * @param character - character to add + * @param characters - character to add * @return character that been added */ - Character add(Character character); + Characters add(Characters characters); /** * Service to get character by id @@ -19,7 +19,7 @@ public interface CharacterService { * @param id - id of character to get * @return specific character by id */ - Character getById(long id); + Characters getById(long id); /** * Service to delete character @@ -27,21 +27,20 @@ public interface CharacterService { * @param id - id of character to be deleted * @return deleted character */ - Character deleteById(long id); + Characters deleteById(long id); /** * Service to update character * - * @param id - id of character to be updated - * @param character - data to update in character + * @param characters - data to update in character * @return updated character */ - Character updateById(Character character, long id); + Characters update(Characters characters); /** * Service to get all characters * * @return List of all characters */ - List getAll(); + List getAll(); } diff --git a/src/main/java/io/khasang/gahelp/service/impl/CharacterServiceImpl.java b/src/main/java/io/khasang/gahelp/service/impl/CharacterServiceImpl.java deleted file mode 100644 index b1d3778..0000000 --- a/src/main/java/io/khasang/gahelp/service/impl/CharacterServiceImpl.java +++ /dev/null @@ -1,43 +0,0 @@ -package io.khasang.gahelp.service.impl; - -import io.khasang.gahelp.dao.CharacterDao; -import io.khasang.gahelp.entity.Character; -import io.khasang.gahelp.service.CharacterService; -import org.springframework.stereotype.Service; - -import java.util.List; - -@Service("characterService") -public class CharacterServiceImpl implements CharacterService { - private CharacterDao characterDao; - - public CharacterServiceImpl(CharacterDao characterDao) { - this.characterDao = characterDao; - } - - @Override - public Character add(Character character) { - return characterDao.add(character); - } - - @Override - public Character getById(long id) { - return characterDao.getById(id); - } - - @Override - public Character deleteById(long id) { - return characterDao.delete(getById(id)); - } - - @Override - public Character updateById(Character character, long id) { - character.setId(id); - return characterDao.update(character); - } - - @Override - public List getAll() { - return characterDao.getAll(); - } -} diff --git a/src/main/java/io/khasang/gahelp/service/impl/CharactersServiceImpl.java b/src/main/java/io/khasang/gahelp/service/impl/CharactersServiceImpl.java new file mode 100644 index 0000000..57a6950 --- /dev/null +++ b/src/main/java/io/khasang/gahelp/service/impl/CharactersServiceImpl.java @@ -0,0 +1,42 @@ +package io.khasang.gahelp.service.impl; + +import io.khasang.gahelp.dao.CharactersDao; +import io.khasang.gahelp.entity.Characters; +import io.khasang.gahelp.service.CharactersService; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service("characterService") +public class CharactersServiceImpl implements CharactersService { + private CharactersDao charactersDao; + + public CharactersServiceImpl(CharactersDao charactersDao) { + this.charactersDao = charactersDao; + } + + @Override + public Characters add(Characters characters) { + return charactersDao.add(characters); + } + + @Override + public Characters getById(long id) { + return charactersDao.getById(id); + } + + @Override + public Characters deleteById(long id) { + return charactersDao.delete(getById(id)); + } + + @Override + public Characters update(Characters characters) { + return charactersDao.update(characters); + } + + @Override + public List getAll() { + return charactersDao.getAll(); + } +} diff --git a/src/test/java/io/khasang/gahelp/controller/CharacterControllerIntegrationTest.java b/src/test/java/io/khasang/gahelp/controller/CharacterControllerIntegrationTest.java deleted file mode 100644 index f9f17fb..0000000 --- a/src/test/java/io/khasang/gahelp/controller/CharacterControllerIntegrationTest.java +++ /dev/null @@ -1,143 +0,0 @@ -package io.khasang.gahelp.controller; - -import io.khasang.gahelp.entity.Character; -import org.junit.Test; -import org.springframework.core.ParameterizedTypeReference; -import org.springframework.http.*; -import org.springframework.web.client.RestTemplate; - -import java.util.List; - -import static org.junit.Assert.*; - -public class CharacterControllerIntegrationTest { - private static final String ROOT = "http://localhost:8080/character"; - private static final String ADD = "/add"; - private static final String GET = "/get"; - private static final String DELETE = "/delete"; - private static final String ALL = "/all"; - private static final String UPDATE = "/update"; - - @Test - public void checkCharacterAdd() { - Character str = createCharacter(); - - RestTemplate template = new RestTemplate(); - ResponseEntity responseEntity = template.exchange( - ROOT + GET + "/{id}", - HttpMethod.GET, - null, - Character.class, - str.getId() - ); - assertEquals(HttpStatus.OK, responseEntity.getStatusCode()); - Character receivedCharacter = responseEntity.getBody(); - assertNotNull(receivedCharacter); - } - - @Test - public void checkAllCharacters() { - createCharacter(); - - RestTemplate restTemplate = new RestTemplate(); - ResponseEntity> responseEntity = restTemplate.exchange( - ROOT + ALL, - HttpMethod.GET, - null, - new ParameterizedTypeReference>() { - } - ); - List characters = responseEntity.getBody(); - assertNotNull(characters); - assertNotEquals(characters.size(), 0); - } - - @Test - public void checkUpdateCharacter() { - // Select ID of an object to update - int updateID = 40; - - Character character = updateCharacter(); - HttpEntity entity = new HttpEntity<>(character, null); - - RestTemplate restTemplate = new RestTemplate(); - ResponseEntity responseEntity = restTemplate.exchange( - ROOT + UPDATE + "/{id}", - HttpMethod.PUT, - entity, - Character.class, - updateID - ); - assertNotNull(responseEntity.getBody()); - assertEquals(HttpStatus.OK, responseEntity.getStatusCode()); - assertEquals(responseEntity.getBody().getName(), character.getName()); - } - - @Test - public void checkDeleteCharacter() { - Character character = createCharacter(); - long deleteID = character.getId(); - RestTemplate restTemplate = new RestTemplate(); - ResponseEntity responseEntity = restTemplate.exchange( - ROOT + DELETE + "/{id}", - HttpMethod.DELETE, - null, - Character.class, - deleteID - ); - assertEquals(HttpStatus.OK, responseEntity.getStatusCode()); - } - - private Character createCharacter() { - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_JSON_UTF8); - - Character character = preFillCharacter(); - - HttpEntity entity = new HttpEntity<>(character, headers); - RestTemplate restTemplate = new RestTemplate(); - Character createdCharacter = restTemplate.exchange( - ROOT + ADD, - HttpMethod.POST, - entity, - Character.class) - .getBody(); - assertNotNull(createdCharacter); - assertEquals("Lightning", createdCharacter.getName()); - return createdCharacter; - } - - private Character preFillCharacter() { - Character character = new Character(); - character.setName("Lightning"); - character.setGender("Female"); - character.setAge(25); - character.setPet("Nona"); - character.setRace("Elf"); - character.setSpeciality("Assassin"); - character.setCharisma(11); - character.setConstitution(3); - character.setStrength(15); - character.setDexterity(16); - character.setIntelligence(9); - character.setWisdom(14); - return character; - } - - private Character updateCharacter() { - Character character = new Character(); - character.setName("Riven"); - character.setGender("Female"); - character.setAge(28); - character.setPet("Exiled"); - character.setRace("Human"); - character.setSpeciality("Assassin"); - character.setCharisma(12); - character.setConstitution(4); - character.setStrength(16); - character.setDexterity(17); - character.setIntelligence(10); - character.setWisdom(15); - return character; - } -} diff --git a/src/test/java/io/khasang/gahelp/controller/CharactersControllerIntegrationTest.java b/src/test/java/io/khasang/gahelp/controller/CharactersControllerIntegrationTest.java new file mode 100644 index 0000000..d8d2962 --- /dev/null +++ b/src/test/java/io/khasang/gahelp/controller/CharactersControllerIntegrationTest.java @@ -0,0 +1,142 @@ +package io.khasang.gahelp.controller; + +import io.khasang.gahelp.entity.Characters; +import org.junit.Test; +import org.springframework.core.ParameterizedTypeReference; +import org.springframework.http.*; +import org.springframework.web.client.RestTemplate; + +import java.util.List; + +import static org.junit.Assert.*; + +public class CharactersControllerIntegrationTest { + private static final String ROOT = "http://localhost:8080/character"; + private static final String ADD = "/add"; + private static final String GET = "/get"; + private static final String DELETE = "/delete"; + private static final String ALL = "/all"; + private static final String UPDATE = "/update"; + + @Test + public void checkCharactersAdd() { + Characters str = createCharacter(); + + RestTemplate template = new RestTemplate(); + ResponseEntity responseEntity = template.exchange( + ROOT + GET + "/{id}", + HttpMethod.GET, + null, + Characters.class, + str.getId() + ); + assertEquals(HttpStatus.OK, responseEntity.getStatusCode()); + Characters receivedCharacters = responseEntity.getBody(); + assertNotNull(receivedCharacters); + } + + @Test + public void checkAllCharacters() { + createCharacter(); + + RestTemplate restTemplate = new RestTemplate(); + ResponseEntity> responseEntity = restTemplate.exchange( + ROOT + ALL, + HttpMethod.GET, + null, + new ParameterizedTypeReference>() { + } + ); + List characters = responseEntity.getBody(); + assertNotNull(characters); + assertNotEquals(characters.size(), 0); + } + + @Test + public void checkUpdateCharacter() { + Characters characters = updateCharacter(); + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON_UTF8); + HttpEntity entity = new HttpEntity<>(characters, headers); + + RestTemplate restTemplate = new RestTemplate(); + ResponseEntity responseEntity = restTemplate.exchange( + ROOT + UPDATE, + HttpMethod.PUT, + entity, + Characters.class + ); + assertNotNull(responseEntity.getBody()); + assertEquals(HttpStatus.OK, responseEntity.getStatusCode()); + assertEquals(responseEntity.getBody().getName(), characters.getName()); + } + + @Test + public void checkDeleteCharacter() { + Characters characters = createCharacter(); + long deleteID = characters.getId(); + RestTemplate restTemplate = new RestTemplate(); + ResponseEntity responseEntity = restTemplate.exchange( + ROOT + DELETE + "/{id}", + HttpMethod.DELETE, + null, + Characters.class, + deleteID + ); + assertEquals(HttpStatus.OK, responseEntity.getStatusCode()); + } + + private Characters createCharacter() { + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON_UTF8); + + Characters characters = preFillCharacter(); + + HttpEntity entity = new HttpEntity<>(characters, headers); + RestTemplate restTemplate = new RestTemplate(); + Characters createdCharacters = restTemplate.exchange( + ROOT + ADD, + HttpMethod.POST, + entity, + Characters.class) + .getBody(); + assertNotNull(createdCharacters); + assertEquals("Lightning", createdCharacters.getName()); + return createdCharacters; + } + + private Characters preFillCharacter() { + Characters characters = new Characters(); + characters.setName("Lightning"); + characters.setGender("Female"); + characters.setAge(25); + characters.setPet("Nona"); + characters.setRace("Elf"); + characters.setSpeciality("Assassin"); + characters.setCharisma(11); + characters.setConstitution(3); + characters.setStrength(15); + characters.setDexterity(16); + characters.setIntelligence(9); + characters.setWisdom(14); + return characters; + } + + private Characters updateCharacter() { + Characters characters = new Characters(); + characters.setName("Riven"); + characters.setId(44); + characters.setGender("Female"); + characters.setAge(28); + characters.setPet("Exiled"); + characters.setRace("Human"); + characters.setSpeciality("Assassin"); + characters.setCharisma(12); + characters.setConstitution(4); + characters.setStrength(16); + characters.setDexterity(17); + characters.setIntelligence(10); + characters.setWisdom(15); + return characters; + } +} From 549aeb52ad9cc2340d3c15f77239ff9eb4a81aa6 Mon Sep 17 00:00:00 2001 From: Exiled Rain Date: Thu, 24 Oct 2019 19:12:57 +0300 Subject: [PATCH 08/18] Role class --- .../java/io/khasang/gahelp/dto/RoleDto.java | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 src/main/java/io/khasang/gahelp/dto/RoleDto.java diff --git a/src/main/java/io/khasang/gahelp/dto/RoleDto.java b/src/main/java/io/khasang/gahelp/dto/RoleDto.java new file mode 100644 index 0000000..a65a2b5 --- /dev/null +++ b/src/main/java/io/khasang/gahelp/dto/RoleDto.java @@ -0,0 +1,52 @@ +package io.khasang.gahelp.dto; + +import io.khasang.gahelp.entity.Role; +import org.springframework.stereotype.Component; + +@Component +public class RoleDto { + private long id; + private String name; + private String type; + private String description; + + public RoleDto getRoleDto(Role role) { + RoleDto roleDto = new RoleDto(); + roleDto.setName(role.getName()); + roleDto.setDescription(role.getDescription()); + roleDto.setType(role.getType()); + return roleDto; + } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } +} From 4454eb25c75462301f5b13c3be4bd0c3980075da Mon Sep 17 00:00:00 2001 From: Exiled Rain Date: Sun, 4 Aug 2019 10:12:23 +0300 Subject: [PATCH 09/18] Role feature --- .../gahelp/controller/RoleController.java | 48 +++++++ .../java/io/khasang/gahelp/dao/RoleDao.java | 6 + .../khasang/gahelp/dao/impl/BasicDaoImpl.java | 6 + .../khasang/gahelp/dao/impl/RoleDaoImpl.java | 10 ++ .../java/io/khasang/gahelp/entity/Role.java | 48 +++++++ .../khasang/gahelp/service/RoleService.java | 48 +++++++ .../gahelp/service/impl/RoleServiceImpl.java | 43 ++++++ .../RoleControllerIntegrationTest.java | 123 ++++++++++++++++++ 8 files changed, 332 insertions(+) create mode 100644 src/main/java/io/khasang/gahelp/controller/RoleController.java create mode 100644 src/main/java/io/khasang/gahelp/dao/RoleDao.java create mode 100644 src/main/java/io/khasang/gahelp/dao/impl/RoleDaoImpl.java create mode 100644 src/main/java/io/khasang/gahelp/entity/Role.java create mode 100644 src/main/java/io/khasang/gahelp/service/RoleService.java create mode 100644 src/main/java/io/khasang/gahelp/service/impl/RoleServiceImpl.java create mode 100644 src/test/java/io/khasang/gahelp/controller/RoleControllerIntegrationTest.java diff --git a/src/main/java/io/khasang/gahelp/controller/RoleController.java b/src/main/java/io/khasang/gahelp/controller/RoleController.java new file mode 100644 index 0000000..c25aa5f --- /dev/null +++ b/src/main/java/io/khasang/gahelp/controller/RoleController.java @@ -0,0 +1,48 @@ +package io.khasang.gahelp.controller; + +import io.khasang.gahelp.entity.Role; +import io.khasang.gahelp.service.RoleService; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@Controller +@RequestMapping(value = "/role") +public class RoleController { + private RoleService roleService; + + public RoleController(RoleService roleService) { + this.roleService = roleService; + } + + @RequestMapping(value = "/add", method = RequestMethod.POST, produces = "application/json;charset=utf-8") + @ResponseBody + public Role addRole(@RequestBody Role role) { + return roleService.addRole(role); + } + + @RequestMapping(value = "/get/{id}", method = RequestMethod.GET) + @ResponseBody + public Role getRoleById(@PathVariable("id") long id) { + return roleService.getRoleById(id); + } + + @RequestMapping(value = "/delete/{id}", method = RequestMethod.DELETE) + @ResponseBody + public Role deleteRoleById(@PathVariable("id") long id) { + return roleService.deleteRole(id); + } + + @RequestMapping(value = "/all", method = RequestMethod.GET) + @ResponseBody + public List getAll() { + return roleService.getAll(); + } + + @RequestMapping(value = "/update/{id}", method = RequestMethod.PUT) + @ResponseBody + public Role updateRoleById(@PathVariable("id") long id, @RequestBody Role role) { + return roleService.updateRoleById(role, id); + } +} diff --git a/src/main/java/io/khasang/gahelp/dao/RoleDao.java b/src/main/java/io/khasang/gahelp/dao/RoleDao.java new file mode 100644 index 0000000..562637f --- /dev/null +++ b/src/main/java/io/khasang/gahelp/dao/RoleDao.java @@ -0,0 +1,6 @@ +package io.khasang.gahelp.dao; + +import io.khasang.gahelp.entity.Role; + +public interface RoleDao extends BasicDao { +} diff --git a/src/main/java/io/khasang/gahelp/dao/impl/BasicDaoImpl.java b/src/main/java/io/khasang/gahelp/dao/impl/BasicDaoImpl.java index 9875bee..624e312 100644 --- a/src/main/java/io/khasang/gahelp/dao/impl/BasicDaoImpl.java +++ b/src/main/java/io/khasang/gahelp/dao/impl/BasicDaoImpl.java @@ -43,6 +43,12 @@ public T delete(T entity) { return entity; } + @Override + public T update(T entity) { + getSession().update(entity); + return entity; + } + @Override public List getAll() { // select * from horses; diff --git a/src/main/java/io/khasang/gahelp/dao/impl/RoleDaoImpl.java b/src/main/java/io/khasang/gahelp/dao/impl/RoleDaoImpl.java new file mode 100644 index 0000000..227f151 --- /dev/null +++ b/src/main/java/io/khasang/gahelp/dao/impl/RoleDaoImpl.java @@ -0,0 +1,10 @@ +package io.khasang.gahelp.dao.impl; + +import io.khasang.gahelp.dao.RoleDao; +import io.khasang.gahelp.entity.Role; + +public class RoleDaoImpl extends BasicDaoImpl implements RoleDao { + public RoleDaoImpl(Class entityClass) { + super(entityClass); + } +} diff --git a/src/main/java/io/khasang/gahelp/entity/Role.java b/src/main/java/io/khasang/gahelp/entity/Role.java new file mode 100644 index 0000000..979d57a --- /dev/null +++ b/src/main/java/io/khasang/gahelp/entity/Role.java @@ -0,0 +1,48 @@ +package io.khasang.gahelp.entity; + +import javax.persistence.*; + +@Entity +@Table(name = "role") +public class Role { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private long id; + + private String name; + private String type; + private String description; + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } +} diff --git a/src/main/java/io/khasang/gahelp/service/RoleService.java b/src/main/java/io/khasang/gahelp/service/RoleService.java new file mode 100644 index 0000000..0b322c3 --- /dev/null +++ b/src/main/java/io/khasang/gahelp/service/RoleService.java @@ -0,0 +1,48 @@ +package io.khasang.gahelp.service; + +import io.khasang.gahelp.entity.Role; + +import java.util.List; + +public interface RoleService { + + /** + * Service for adding role + * + * @param role - for adding + * @return added role + */ + Role addRole(Role role); + + /** + * Service to getting role by id + * + * @param id - role id + * @return specific role by id + */ + Role getRoleById(long id); + + /** + * Service for getting all roles + * + * @return all roles + */ + List getAll(); + + /** + * Service to delete specific role + * + * @param id - role id to delete + * @return deleted role + */ + Role deleteRole(long id); + + /** + * Service to update role + * + * @param id - id of role to update + * @param role - update data for role + * @return updated role + */ + Role updateRoleById(Role role, long id); +} diff --git a/src/main/java/io/khasang/gahelp/service/impl/RoleServiceImpl.java b/src/main/java/io/khasang/gahelp/service/impl/RoleServiceImpl.java new file mode 100644 index 0000000..fee29ef --- /dev/null +++ b/src/main/java/io/khasang/gahelp/service/impl/RoleServiceImpl.java @@ -0,0 +1,43 @@ +package io.khasang.gahelp.service.impl; + +import io.khasang.gahelp.dao.RoleDao; +import io.khasang.gahelp.entity.Role; +import io.khasang.gahelp.service.RoleService; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service("roleService") +public class RoleServiceImpl implements RoleService { + private RoleDao roleDao; + + public RoleServiceImpl(RoleDao roleDao) { + this.roleDao = roleDao; + } + + @Override + public Role addRole(Role role) { + return roleDao.add(role); + } + + @Override + public Role getRoleById(long id) { + return roleDao.getById(id); + } + + @Override + public List getAll() { + return roleDao.getAll(); + } + + @Override + public Role deleteRole(long id) { + return roleDao.getById(id); + } + + @Override + public Role updateRoleById(Role role, long id) { + role.setId(id); + return roleDao.update(role); + } +} diff --git a/src/test/java/io/khasang/gahelp/controller/RoleControllerIntegrationTest.java b/src/test/java/io/khasang/gahelp/controller/RoleControllerIntegrationTest.java new file mode 100644 index 0000000..d6c5602 --- /dev/null +++ b/src/test/java/io/khasang/gahelp/controller/RoleControllerIntegrationTest.java @@ -0,0 +1,123 @@ +package io.khasang.gahelp.controller; + +import io.khasang.gahelp.entity.Role; +import org.junit.Test; +import org.springframework.core.ParameterizedTypeReference; +import org.springframework.http.*; +import org.springframework.web.client.RestTemplate; + +import java.util.List; + +import static org.junit.Assert.*; + +public class RoleControllerIntegrationTest { + private static final String ROOT = "http://localhost:8080/role"; + private static final String ADD = "/add"; + private static final String ALL = "/all"; + private static final String GET = "/get"; + private static final String DELETE = "/delete"; + private static final String UPDATE = "/update"; + + @Test + public void checkRoleAdd() { + Role role = createRole(); + + RestTemplate restTemplate = new RestTemplate(); + ResponseEntity entity = restTemplate.exchange( + ROOT + GET + "/{id}", + HttpMethod.GET, + null, + Role.class, + role.getId() + ); + assertEquals(HttpStatus.OK, entity.getStatusCode()); + Role receivedRole = entity.getBody(); + assertNotNull(receivedRole); + } + + @Test + public void checkAllRoles() { + createRole(); + + RestTemplate template = new RestTemplate(); + ResponseEntity> entity = template.exchange( + ROOT + ALL, + HttpMethod.GET, + null, + new ParameterizedTypeReference>() { + } + ); + List roles = entity.getBody(); + assertNotNull(roles); + assertNotEquals(roles.size(), 0); + } + + @Test + public void checkUpdateRole() { + int updateId = 2; + + Role updatedRole = updatedRole(); + HttpEntity entity = new HttpEntity<>(updatedRole, null); + + RestTemplate template = new RestTemplate(); + ResponseEntity responseEntity = template.exchange( + ROOT + UPDATE + "/{id}", + HttpMethod.PUT, + entity, + Role.class, + updateId + ); + assertEquals(HttpStatus.OK, responseEntity.getStatusCode()); + } + + @Test + public void checkDeleteRole() { + Role newRole = createRole(); + long deleteID = newRole.getId(); + + RestTemplate template = new RestTemplate(); + ResponseEntity responseEntity = template.exchange( + ROOT + DELETE + "/{id}", + HttpMethod.DELETE, + null, + Role.class, + deleteID + ); + assertEquals(HttpStatus.OK, responseEntity.getStatusCode()); + } + + private Role createRole() { + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON_UTF8); + + Role role = preFillRole(); + + HttpEntity entity = new HttpEntity<>(role, headers); + RestTemplate restTemplate = new RestTemplate(); + Role createdRole = restTemplate.exchange( + ROOT + ADD, + HttpMethod.POST, + entity, + Role.class).getBody(); + assertNotNull(createdRole); + assertEquals("Admin", createdRole.getName()); + return createdRole; + } + + + private Role preFillRole() { + Role role = new Role(); + role.setName("Admin"); + role.setType("Administration"); + role.setDescription("Role for setting all other roles in"); + return role; + } + + private Role updatedRole() { + Role role = new Role(); + role.setName("User"); + role.setType("Casual"); + role.setDescription("Role for having fun"); + return role; + } +} From f128111f84b8ace342c02c560c63f0fd83a38caf Mon Sep 17 00:00:00 2001 From: Exiled Rain Date: Sun, 4 Aug 2019 10:26:54 +0300 Subject: [PATCH 10/18] Role feature --- .../gahelp/controller/RoleControllerIntegrationTest.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/test/java/io/khasang/gahelp/controller/RoleControllerIntegrationTest.java b/src/test/java/io/khasang/gahelp/controller/RoleControllerIntegrationTest.java index d6c5602..02e2636 100644 --- a/src/test/java/io/khasang/gahelp/controller/RoleControllerIntegrationTest.java +++ b/src/test/java/io/khasang/gahelp/controller/RoleControllerIntegrationTest.java @@ -38,6 +38,7 @@ public void checkRoleAdd() { @Test public void checkAllRoles() { createRole(); + createRole(); RestTemplate template = new RestTemplate(); ResponseEntity> entity = template.exchange( @@ -54,7 +55,7 @@ public void checkAllRoles() { @Test public void checkUpdateRole() { - int updateId = 2; + int updateId = 27; Role updatedRole = updatedRole(); HttpEntity entity = new HttpEntity<>(updatedRole, null); @@ -67,7 +68,9 @@ public void checkUpdateRole() { Role.class, updateId ); + assertNotNull(responseEntity.getBody()); assertEquals(HttpStatus.OK, responseEntity.getStatusCode()); + assertEquals(responseEntity.getBody().getName(), updatedRole.getName()); } @Test From aa3992d0b35380d0ca98de61bcab4693097b68ab Mon Sep 17 00:00:00 2001 From: Exiled Rain Date: Sat, 10 Aug 2019 23:41:59 +0300 Subject: [PATCH 11/18] Role update method removed ID field --- .../io/khasang/gahelp/controller/RoleController.java | 6 +++--- .../java/io/khasang/gahelp/service/RoleService.java | 3 +-- .../khasang/gahelp/service/impl/RoleServiceImpl.java | 3 +-- .../controller/RoleControllerIntegrationTest.java | 12 ++++++------ 4 files changed, 11 insertions(+), 13 deletions(-) diff --git a/src/main/java/io/khasang/gahelp/controller/RoleController.java b/src/main/java/io/khasang/gahelp/controller/RoleController.java index c25aa5f..281abd9 100644 --- a/src/main/java/io/khasang/gahelp/controller/RoleController.java +++ b/src/main/java/io/khasang/gahelp/controller/RoleController.java @@ -40,9 +40,9 @@ public List getAll() { return roleService.getAll(); } - @RequestMapping(value = "/update/{id}", method = RequestMethod.PUT) + @RequestMapping(value = "/update", method = RequestMethod.PUT) @ResponseBody - public Role updateRoleById(@PathVariable("id") long id, @RequestBody Role role) { - return roleService.updateRoleById(role, id); + public Role updateRole(@RequestBody Role role) { + return roleService.updateRole(role); } } diff --git a/src/main/java/io/khasang/gahelp/service/RoleService.java b/src/main/java/io/khasang/gahelp/service/RoleService.java index 0b322c3..6d2f54c 100644 --- a/src/main/java/io/khasang/gahelp/service/RoleService.java +++ b/src/main/java/io/khasang/gahelp/service/RoleService.java @@ -40,9 +40,8 @@ public interface RoleService { /** * Service to update role * - * @param id - id of role to update * @param role - update data for role * @return updated role */ - Role updateRoleById(Role role, long id); + Role updateRole(Role role); } diff --git a/src/main/java/io/khasang/gahelp/service/impl/RoleServiceImpl.java b/src/main/java/io/khasang/gahelp/service/impl/RoleServiceImpl.java index fee29ef..6077d90 100644 --- a/src/main/java/io/khasang/gahelp/service/impl/RoleServiceImpl.java +++ b/src/main/java/io/khasang/gahelp/service/impl/RoleServiceImpl.java @@ -36,8 +36,7 @@ public Role deleteRole(long id) { } @Override - public Role updateRoleById(Role role, long id) { - role.setId(id); + public Role updateRole(Role role) { return roleDao.update(role); } } diff --git a/src/test/java/io/khasang/gahelp/controller/RoleControllerIntegrationTest.java b/src/test/java/io/khasang/gahelp/controller/RoleControllerIntegrationTest.java index 02e2636..d906bd5 100644 --- a/src/test/java/io/khasang/gahelp/controller/RoleControllerIntegrationTest.java +++ b/src/test/java/io/khasang/gahelp/controller/RoleControllerIntegrationTest.java @@ -55,18 +55,17 @@ public void checkAllRoles() { @Test public void checkUpdateRole() { - int updateId = 27; - Role updatedRole = updatedRole(); - HttpEntity entity = new HttpEntity<>(updatedRole, null); + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON_UTF8); + HttpEntity entity = new HttpEntity<>(updatedRole, headers); RestTemplate template = new RestTemplate(); ResponseEntity responseEntity = template.exchange( - ROOT + UPDATE + "/{id}", + ROOT + UPDATE, HttpMethod.PUT, entity, - Role.class, - updateId + Role.class ); assertNotNull(responseEntity.getBody()); assertEquals(HttpStatus.OK, responseEntity.getStatusCode()); @@ -118,6 +117,7 @@ private Role preFillRole() { private Role updatedRole() { Role role = new Role(); + role.setId(25); role.setName("User"); role.setType("Casual"); role.setDescription("Role for having fun"); From 58e33ae31002c00fe953eb289d5b0a11e842ba2e Mon Sep 17 00:00:00 2001 From: Exiled Rain Date: Thu, 24 Oct 2019 19:12:57 +0300 Subject: [PATCH 12/18] Role class --- .../java/io/khasang/gahelp/dto/RoleDto.java | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 src/main/java/io/khasang/gahelp/dto/RoleDto.java diff --git a/src/main/java/io/khasang/gahelp/dto/RoleDto.java b/src/main/java/io/khasang/gahelp/dto/RoleDto.java new file mode 100644 index 0000000..a65a2b5 --- /dev/null +++ b/src/main/java/io/khasang/gahelp/dto/RoleDto.java @@ -0,0 +1,52 @@ +package io.khasang.gahelp.dto; + +import io.khasang.gahelp.entity.Role; +import org.springframework.stereotype.Component; + +@Component +public class RoleDto { + private long id; + private String name; + private String type; + private String description; + + public RoleDto getRoleDto(Role role) { + RoleDto roleDto = new RoleDto(); + roleDto.setName(role.getName()); + roleDto.setDescription(role.getDescription()); + roleDto.setType(role.getType()); + return roleDto; + } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } +} From d8538527315bdfcb3a89153cc4821c49586f97d2 Mon Sep 17 00:00:00 2001 From: Exiled Rain Date: Mon, 4 Nov 2019 00:56:48 +0200 Subject: [PATCH 13/18] Minor typo's fix --- .../java/io/khasang/gahelp/config/AppConfig.java | 14 ++++++++------ src/main/java/io/khasang/gahelp/dao/BasicDao.java | 2 +- .../io/khasang/gahelp/dao/impl/BasicDaoImpl.java | 12 ------------ .../gahelp/service/PhysicalSkillService.java | 2 +- .../io/khasang/gahelp/service/UserService.java | 4 ++++ 5 files changed, 14 insertions(+), 20 deletions(-) diff --git a/src/main/java/io/khasang/gahelp/config/AppConfig.java b/src/main/java/io/khasang/gahelp/config/AppConfig.java index 8c9ff40..883d43f 100644 --- a/src/main/java/io/khasang/gahelp/config/AppConfig.java +++ b/src/main/java/io/khasang/gahelp/config/AppConfig.java @@ -30,7 +30,7 @@ @EnableAspectJAutoProxy public class AppConfig { @Bean - public Cat cat(){ + public Cat cat() { return new Cat("Yukki"); } @@ -42,21 +42,23 @@ public HorseDao horseDao() { @Bean public RoleDao roleDao() { return new RoleDaoImpl(Role.class); - + } + @Bean - public UserDao userDao(){ + public UserDao userDao() { return new UserDaoImpl(User.class); } @Bean - public PhysicalSkillDao physicalSkillDao(){ + public PhysicalSkillDao physicalSkillDao() { return new PhysicalSkillDaoImpl(PhysicalSkill.class); } @Bean public LogSheetDao logSheetDao() { return new LogSheetDaoImpl(LogSheet.class); - + } + @Bean public MonsterDao monsterDao() { return new MonsterDaoImpl(Monster.class); @@ -66,4 +68,4 @@ public MonsterDao monsterDao() { public EmployeeDao employeeDao() { return new EmployeeDaoImpl(Employee.class); } -} +} \ No newline at end of file diff --git a/src/main/java/io/khasang/gahelp/dao/BasicDao.java b/src/main/java/io/khasang/gahelp/dao/BasicDao.java index 01867eb..6338d3f 100644 --- a/src/main/java/io/khasang/gahelp/dao/BasicDao.java +++ b/src/main/java/io/khasang/gahelp/dao/BasicDao.java @@ -42,7 +42,7 @@ public interface BasicDao { */ T delete(T entity); - * service for getting a list entities with a field value + /** service for getting a list entities with a field value * @param fieldName - field name in entity * @param value - value of the entity's field to find * @param - type of the field diff --git a/src/main/java/io/khasang/gahelp/dao/impl/BasicDaoImpl.java b/src/main/java/io/khasang/gahelp/dao/impl/BasicDaoImpl.java index 27a72a1..322c8c2 100644 --- a/src/main/java/io/khasang/gahelp/dao/impl/BasicDaoImpl.java +++ b/src/main/java/io/khasang/gahelp/dao/impl/BasicDaoImpl.java @@ -43,12 +43,6 @@ public T delete(T entity) { return entity; } - @Override - public T update(T entity) { - getSession().update(entity); - return entity; - } - @Override public List getAll() { // select * from horses; @@ -60,12 +54,6 @@ public List getAll() { return getSession().createQuery(criteriaQuery).list(); } - @Override - public T update(T entity) { - getSession().update(entity); - return entity; - } - @Override public List getAllByField(String fieldName, V value) { // Select * from entityClass where fieldName = value diff --git a/src/main/java/io/khasang/gahelp/service/PhysicalSkillService.java b/src/main/java/io/khasang/gahelp/service/PhysicalSkillService.java index f487dc7..b300581 100644 --- a/src/main/java/io/khasang/gahelp/service/PhysicalSkillService.java +++ b/src/main/java/io/khasang/gahelp/service/PhysicalSkillService.java @@ -39,7 +39,7 @@ public interface PhysicalSkillService { /** * service for updating physicalSkill * - * @param id - physicalSkill's id for update + * @param id - physicalSkill's id for update * @param physicalSkill - new skill's data for update * @return updated physicalSkill */ diff --git a/src/main/java/io/khasang/gahelp/service/UserService.java b/src/main/java/io/khasang/gahelp/service/UserService.java index 80ef40b..2142cd4 100644 --- a/src/main/java/io/khasang/gahelp/service/UserService.java +++ b/src/main/java/io/khasang/gahelp/service/UserService.java @@ -39,6 +39,7 @@ public interface UserService { /** * service for getting blocked user + * * @return list of blocked users */ List getBlocked(); @@ -60,6 +61,7 @@ public interface UserService { /** * service for deletting user by id + * * @param id - user's id for delete * @return - deleted user */ @@ -67,6 +69,7 @@ public interface UserService { /** * ervice for updating user by login + * * @param user - new user for updating in database * @returnc - updating user */ @@ -74,6 +77,7 @@ public interface UserService { /** * service for getting users with specific role + * * @param id - specific role id * @return list of users with specific role */ From a7de685701986147ea353462c5c04b5d7657b26d Mon Sep 17 00:00:00 2001 From: Exiled Rain Date: Mon, 4 Nov 2019 11:41:13 +0200 Subject: [PATCH 14/18] Minor typo's fix --- .../io/khasang/gahelp/config/AppConfig.java | 2 ++ .../khasang/gahelp/dao/impl/BasicDaoImpl.java | 17 +---------------- 2 files changed, 3 insertions(+), 16 deletions(-) diff --git a/src/main/java/io/khasang/gahelp/config/AppConfig.java b/src/main/java/io/khasang/gahelp/config/AppConfig.java index 6cbcfea..ed987a3 100644 --- a/src/main/java/io/khasang/gahelp/config/AppConfig.java +++ b/src/main/java/io/khasang/gahelp/config/AppConfig.java @@ -45,7 +45,9 @@ public HorseDao horseDao() { @Bean public CharactersDao characterDao() { return new CharactersDaoImpl(Characters.class); + } + @Bean public RoleDao roleDao() { return new RoleDaoImpl(Role.class); } diff --git a/src/main/java/io/khasang/gahelp/dao/impl/BasicDaoImpl.java b/src/main/java/io/khasang/gahelp/dao/impl/BasicDaoImpl.java index 14f38c7..8fd0bf3 100644 --- a/src/main/java/io/khasang/gahelp/dao/impl/BasicDaoImpl.java +++ b/src/main/java/io/khasang/gahelp/dao/impl/BasicDaoImpl.java @@ -43,34 +43,19 @@ public T delete(T entity) { return entity; } - @Override - public T update(T entity) { - getSession().update(entity); - return entity; - } - @Override public List getAll() { // select * from horses; CriteriaBuilder builder = sessionFactory.getCriteriaBuilder(); CriteriaQuery criteriaQuery = builder.createQuery(entityClass); Root root = criteriaQuery.from(entityClass); - criteriaQuery.select(root); return getSession().createQuery(criteriaQuery).list(); } - @Override - public T update(T entity) { - getSession().update(entity); - return entity; - } - - - private Session getSession() { @Override public List getAllByField(String fieldName, V value) { - // Select * from entityClass where fieldName = value +// Select * from entityClass where fieldName = value CriteriaBuilder builder = sessionFactory.getCriteriaBuilder(); CriteriaQuery criteriaQuery = builder.createQuery(entityClass); Root root = criteriaQuery.from(entityClass); From 6e1d1157f9cddf2692ea917c5d9eac4d59772f0e Mon Sep 17 00:00:00 2001 From: Exiled Rain Date: Sun, 8 Dec 2019 17:52:27 +0200 Subject: [PATCH 15/18] Added Freemarker dependency. --- build.gradle | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/build.gradle b/build.gradle index 1151e9b..9fc3d2b 100644 --- a/build.gradle +++ b/build.gradle @@ -33,6 +33,10 @@ dependencies { compile group: 'org.springframework', name: 'spring-orm', version: '5.1.8.RELEASE' compile group: 'org.springframework', name: 'spring-test', version: '5.1.8.RELEASE' + // https://mvnrepository.com/artifact/org.freemarker/freemarker + compile group: 'org.freemarker', name: 'freemarker', version: '2.3.29' + + compile group: 'org.apache.tomcat.embed', name: 'tomcat-embed-jasper', version: '9.0.16' compile group: 'javax.servlet.jsp.jstl', name: 'jstl', version: '1.2' compile group: 'org.glassfish.jaxb', name: 'jaxb-runtime', version: '2.3.1' From e753d9f3c62802818912c95472584805a435ef50 Mon Sep 17 00:00:00 2001 From: Exiled Rain Date: Sun, 8 Dec 2019 18:31:02 +0200 Subject: [PATCH 16/18] Removed IOC xml config --- .../java/io/khasang/gahelp/controller/AppController.java | 1 - src/main/resources/ioc.xml | 9 --------- 2 files changed, 10 deletions(-) delete mode 100644 src/main/resources/ioc.xml diff --git a/src/main/java/io/khasang/gahelp/controller/AppController.java b/src/main/java/io/khasang/gahelp/controller/AppController.java index b2853e8..8bce7b5 100644 --- a/src/main/java/io/khasang/gahelp/controller/AppController.java +++ b/src/main/java/io/khasang/gahelp/controller/AppController.java @@ -14,7 +14,6 @@ import org.springframework.web.bind.annotation.RequestMapping; @Controller -//@ImportResource(value = "classpath:ioc.xml") public class AppController { private Cat cat; private Dog dog; diff --git a/src/main/resources/ioc.xml b/src/main/resources/ioc.xml deleted file mode 100644 index e45b8d4..0000000 --- a/src/main/resources/ioc.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - \ No newline at end of file From 7cde6b85323247106bb0f769e87509769ec41634 Mon Sep 17 00:00:00 2001 From: Exiled Rain Date: Sun, 8 Dec 2019 18:32:30 +0200 Subject: [PATCH 17/18] Removed soap service example --- .../gahelp/controller/AppController.java | 13 -- .../io/khasang/gahelp/util/CheckText.java | 42 ---- .../spellservice/ArrayOfSpellResult.java | 69 ------- .../spellservice/CheckTextRequest.java | 154 -------------- .../spellservice/CheckTextResponse.java | 64 ------ .../spellservice/CheckTextsRequest.java | 159 --------------- .../spellservice/CheckTextsResponse.java | 64 ------ .../services/spellservice/ObjectFactory.java | 88 -------- .../services/spellservice/SpellError.java | 192 ------------------ .../services/spellservice/SpellResult.java | 67 ------ .../services/spellservice/SpellService.java | 94 --------- .../spellservice/SpellServiceSoap.java | 50 ----- .../services/spellservice/package-info.java | 2 - 13 files changed, 1058 deletions(-) delete mode 100644 src/main/java/io/khasang/gahelp/util/CheckText.java delete mode 100644 src/main/java/net/yandex/speller/services/spellservice/ArrayOfSpellResult.java delete mode 100644 src/main/java/net/yandex/speller/services/spellservice/CheckTextRequest.java delete mode 100644 src/main/java/net/yandex/speller/services/spellservice/CheckTextResponse.java delete mode 100644 src/main/java/net/yandex/speller/services/spellservice/CheckTextsRequest.java delete mode 100644 src/main/java/net/yandex/speller/services/spellservice/CheckTextsResponse.java delete mode 100644 src/main/java/net/yandex/speller/services/spellservice/ObjectFactory.java delete mode 100644 src/main/java/net/yandex/speller/services/spellservice/SpellError.java delete mode 100644 src/main/java/net/yandex/speller/services/spellservice/SpellResult.java delete mode 100644 src/main/java/net/yandex/speller/services/spellservice/SpellService.java delete mode 100644 src/main/java/net/yandex/speller/services/spellservice/SpellServiceSoap.java delete mode 100644 src/main/java/net/yandex/speller/services/spellservice/package-info.java diff --git a/src/main/java/io/khasang/gahelp/controller/AppController.java b/src/main/java/io/khasang/gahelp/controller/AppController.java index 8bce7b5..2643dca 100644 --- a/src/main/java/io/khasang/gahelp/controller/AppController.java +++ b/src/main/java/io/khasang/gahelp/controller/AppController.java @@ -4,7 +4,6 @@ import io.khasang.gahelp.model.CreateTable; import io.khasang.gahelp.model.Dog; import io.khasang.gahelp.service.KnightService; -import io.khasang.gahelp.util.CheckText; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.annotation.Secured; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; @@ -19,19 +18,12 @@ public class AppController { private Dog dog; private KnightService knightService; private CreateTable createTable; - private CheckText checkText; @RequestMapping("/") public String getStatus() { return "status"; } - @RequestMapping("/check/{text}") - public String getCheckResult(@PathVariable("text") String text, Model model) { - model.addAttribute("result", checkText.checkText(text)); - return "check"; - } - @RequestMapping("/horsemenu") public String getHorseMenu() { return "horse"; @@ -106,9 +98,4 @@ public void setKnightService(KnightService knightService) { public void setCreateTable(CreateTable createTable) { this.createTable = createTable; } - - @Autowired - public void setCheckText(CheckText checkText) { - this.checkText = checkText; - } } diff --git a/src/main/java/io/khasang/gahelp/util/CheckText.java b/src/main/java/io/khasang/gahelp/util/CheckText.java deleted file mode 100644 index 6dc234b..0000000 --- a/src/main/java/io/khasang/gahelp/util/CheckText.java +++ /dev/null @@ -1,42 +0,0 @@ -package io.khasang.gahelp.util; - -import net.yandex.speller.services.spellservice.CheckTextRequest; -import net.yandex.speller.services.spellservice.SpellServiceSoap; -import org.springframework.stereotype.Component; - -import javax.xml.namespace.QName; -import javax.xml.ws.Service; -import java.net.MalformedURLException; -import java.net.URL; - -@Component -public class CheckText { - private final static String ADDRESS = "http://speller.yandex.net/services/spellservice?WSDL"; - - public String checkText(String text) { - URL url = null; - - try { - url = new URL(ADDRESS); - } catch (MalformedURLException e) { - e.printStackTrace(); - } - - QName qName = new QName("http://speller.yandex.net/services/spellservice", "SpellService"); - Service service = Service.create(url, qName); - SpellServiceSoap spellService = service.getPort(SpellServiceSoap.class); - - CheckTextRequest request = new CheckTextRequest(); - request.setText(text); - request.setLang("en"); - request.setFormat("plain"); - - if (spellService.checkText(request).getSpellResult().getError().size() != 0) { - return spellService.checkText(request).getSpellResult().getError().get(0).getS().toString(); - } else { - return "word is correct!"; - } - - } - -} diff --git a/src/main/java/net/yandex/speller/services/spellservice/ArrayOfSpellResult.java b/src/main/java/net/yandex/speller/services/spellservice/ArrayOfSpellResult.java deleted file mode 100644 index 410d720..0000000 --- a/src/main/java/net/yandex/speller/services/spellservice/ArrayOfSpellResult.java +++ /dev/null @@ -1,69 +0,0 @@ - -package net.yandex.speller.services.spellservice; - -import java.util.ArrayList; -import java.util.List; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlType; - - -/** - *

Java class for ArrayOfSpellResult complex type. - * - *

The following schema fragment specifies the expected content contained within this class. - * - *

- * <complexType name="ArrayOfSpellResult">
- *   <complexContent>
- *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       <sequence>
- *         <element name="SpellResult" type="{http://speller.yandex.net/services/spellservice}SpellResult" maxOccurs="unbounded" minOccurs="0"/>
- *       </sequence>
- *     </restriction>
- *   </complexContent>
- * </complexType>
- * 
- * - * - */ -@XmlAccessorType(XmlAccessType.FIELD) -@XmlType(name = "ArrayOfSpellResult", propOrder = { - "spellResult" -}) -public class ArrayOfSpellResult { - - @XmlElement(name = "SpellResult") - protected List spellResult; - - /** - * Gets the value of the spellResult property. - * - *

- * This accessor method returns a reference to the live list, - * not a snapshot. Therefore any modification you make to the - * returned list will be present inside the JAXB object. - * This is why there is not a set method for the spellResult property. - * - *

- * For example, to add a new item, do as follows: - *

-     *    getSpellResult().add(newItem);
-     * 
- * - * - *

- * Objects of the following type(s) are allowed in the list - * {@link SpellResult } - * - * - */ - public List getSpellResult() { - if (spellResult == null) { - spellResult = new ArrayList(); - } - return this.spellResult; - } - -} diff --git a/src/main/java/net/yandex/speller/services/spellservice/CheckTextRequest.java b/src/main/java/net/yandex/speller/services/spellservice/CheckTextRequest.java deleted file mode 100644 index bc7c02f..0000000 --- a/src/main/java/net/yandex/speller/services/spellservice/CheckTextRequest.java +++ /dev/null @@ -1,154 +0,0 @@ - -package net.yandex.speller.services.spellservice; - -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlType; - - -/** - *

Java class for anonymous complex type. - * - *

The following schema fragment specifies the expected content contained within this class. - * - *

- * <complexType>
- *   <complexContent>
- *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       <sequence>
- *         <element name="text" type="{http://www.w3.org/2001/XMLSchema}string"/>
- *       </sequence>
- *       <attribute name="lang" type="{http://www.w3.org/2001/XMLSchema}string" />
- *       <attribute name="options" type="{http://www.w3.org/2001/XMLSchema}int" default="0" />
- *       <attribute name="format" type="{http://www.w3.org/2001/XMLSchema}string" default="" />
- *     </restriction>
- *   </complexContent>
- * </complexType>
- * 
- * - * - */ -@XmlAccessorType(XmlAccessType.FIELD) -@XmlType(name = "", propOrder = { - "text" -}) -@XmlRootElement(name = "CheckTextRequest") -public class CheckTextRequest { - - @XmlElement(required = true) - protected String text; - @XmlAttribute(name = "lang") - protected String lang; - @XmlAttribute(name = "options") - protected Integer options; - @XmlAttribute(name = "format") - protected String format; - - /** - * Gets the value of the text property. - * - * @return - * possible object is - * {@link String } - * - */ - public String getText() { - return text; - } - - /** - * Sets the value of the text property. - * - * @param value - * allowed object is - * {@link String } - * - */ - public void setText(String value) { - this.text = value; - } - - /** - * Gets the value of the lang property. - * - * @return - * possible object is - * {@link String } - * - */ - public String getLang() { - return lang; - } - - /** - * Sets the value of the lang property. - * - * @param value - * allowed object is - * {@link String } - * - */ - public void setLang(String value) { - this.lang = value; - } - - /** - * Gets the value of the options property. - * - * @return - * possible object is - * {@link Integer } - * - */ - public int getOptions() { - if (options == null) { - return 0; - } else { - return options; - } - } - - /** - * Sets the value of the options property. - * - * @param value - * allowed object is - * {@link Integer } - * - */ - public void setOptions(Integer value) { - this.options = value; - } - - /** - * Gets the value of the format property. - * - * @return - * possible object is - * {@link String } - * - */ - public String getFormat() { - if (format == null) { - return ""; - } else { - return format; - } - } - - /** - * Sets the value of the format property. - * - * @param value - * allowed object is - * {@link String } - * - */ - public void setFormat(String value) { - this.format = value; - } - -} diff --git a/src/main/java/net/yandex/speller/services/spellservice/CheckTextResponse.java b/src/main/java/net/yandex/speller/services/spellservice/CheckTextResponse.java deleted file mode 100644 index e9893ff..0000000 --- a/src/main/java/net/yandex/speller/services/spellservice/CheckTextResponse.java +++ /dev/null @@ -1,64 +0,0 @@ - -package net.yandex.speller.services.spellservice; - -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlType; - - -/** - *

Java class for anonymous complex type. - * - *

The following schema fragment specifies the expected content contained within this class. - * - *

- * <complexType>
- *   <complexContent>
- *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       <sequence>
- *         <element name="SpellResult" type="{http://speller.yandex.net/services/spellservice}SpellResult"/>
- *       </sequence>
- *     </restriction>
- *   </complexContent>
- * </complexType>
- * 
- * - * - */ -@XmlAccessorType(XmlAccessType.FIELD) -@XmlType(name = "", propOrder = { - "spellResult" -}) -@XmlRootElement(name = "CheckTextResponse") -public class CheckTextResponse { - - @XmlElement(name = "SpellResult", required = true) - protected SpellResult spellResult; - - /** - * Gets the value of the spellResult property. - * - * @return - * possible object is - * {@link SpellResult } - * - */ - public SpellResult getSpellResult() { - return spellResult; - } - - /** - * Sets the value of the spellResult property. - * - * @param value - * allowed object is - * {@link SpellResult } - * - */ - public void setSpellResult(SpellResult value) { - this.spellResult = value; - } - -} diff --git a/src/main/java/net/yandex/speller/services/spellservice/CheckTextsRequest.java b/src/main/java/net/yandex/speller/services/spellservice/CheckTextsRequest.java deleted file mode 100644 index 8547d6e..0000000 --- a/src/main/java/net/yandex/speller/services/spellservice/CheckTextsRequest.java +++ /dev/null @@ -1,159 +0,0 @@ - -package net.yandex.speller.services.spellservice; - -import java.util.ArrayList; -import java.util.List; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlType; - - -/** - *

Java class for anonymous complex type. - * - *

The following schema fragment specifies the expected content contained within this class. - * - *

- * <complexType>
- *   <complexContent>
- *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       <sequence>
- *         <element name="text" type="{http://www.w3.org/2001/XMLSchema}string" maxOccurs="unbounded" minOccurs="0"/>
- *       </sequence>
- *       <attribute name="lang" type="{http://www.w3.org/2001/XMLSchema}string" />
- *       <attribute name="options" type="{http://www.w3.org/2001/XMLSchema}int" default="0" />
- *       <attribute name="format" type="{http://www.w3.org/2001/XMLSchema}string" default="" />
- *     </restriction>
- *   </complexContent>
- * </complexType>
- * 
- * - * - */ -@XmlAccessorType(XmlAccessType.FIELD) -@XmlType(name = "", propOrder = { - "text" -}) -@XmlRootElement(name = "CheckTextsRequest") -public class CheckTextsRequest { - - protected List text; - @XmlAttribute(name = "lang") - protected String lang; - @XmlAttribute(name = "options") - protected Integer options; - @XmlAttribute(name = "format") - protected String format; - - /** - * Gets the value of the text property. - * - *

- * This accessor method returns a reference to the live list, - * not a snapshot. Therefore any modification you make to the - * returned list will be present inside the JAXB object. - * This is why there is not a set method for the text property. - * - *

- * For example, to add a new item, do as follows: - *

-     *    getText().add(newItem);
-     * 
- * - * - *

- * Objects of the following type(s) are allowed in the list - * {@link String } - * - * - */ - public List getText() { - if (text == null) { - text = new ArrayList(); - } - return this.text; - } - - /** - * Gets the value of the lang property. - * - * @return - * possible object is - * {@link String } - * - */ - public String getLang() { - return lang; - } - - /** - * Sets the value of the lang property. - * - * @param value - * allowed object is - * {@link String } - * - */ - public void setLang(String value) { - this.lang = value; - } - - /** - * Gets the value of the options property. - * - * @return - * possible object is - * {@link Integer } - * - */ - public int getOptions() { - if (options == null) { - return 0; - } else { - return options; - } - } - - /** - * Sets the value of the options property. - * - * @param value - * allowed object is - * {@link Integer } - * - */ - public void setOptions(Integer value) { - this.options = value; - } - - /** - * Gets the value of the format property. - * - * @return - * possible object is - * {@link String } - * - */ - public String getFormat() { - if (format == null) { - return ""; - } else { - return format; - } - } - - /** - * Sets the value of the format property. - * - * @param value - * allowed object is - * {@link String } - * - */ - public void setFormat(String value) { - this.format = value; - } - -} diff --git a/src/main/java/net/yandex/speller/services/spellservice/CheckTextsResponse.java b/src/main/java/net/yandex/speller/services/spellservice/CheckTextsResponse.java deleted file mode 100644 index 8946f39..0000000 --- a/src/main/java/net/yandex/speller/services/spellservice/CheckTextsResponse.java +++ /dev/null @@ -1,64 +0,0 @@ - -package net.yandex.speller.services.spellservice; - -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlType; - - -/** - *

Java class for anonymous complex type. - * - *

The following schema fragment specifies the expected content contained within this class. - * - *

- * <complexType>
- *   <complexContent>
- *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       <sequence>
- *         <element name="ArrayOfSpellResult" type="{http://speller.yandex.net/services/spellservice}ArrayOfSpellResult"/>
- *       </sequence>
- *     </restriction>
- *   </complexContent>
- * </complexType>
- * 
- * - * - */ -@XmlAccessorType(XmlAccessType.FIELD) -@XmlType(name = "", propOrder = { - "arrayOfSpellResult" -}) -@XmlRootElement(name = "CheckTextsResponse") -public class CheckTextsResponse { - - @XmlElement(name = "ArrayOfSpellResult", required = true) - protected ArrayOfSpellResult arrayOfSpellResult; - - /** - * Gets the value of the arrayOfSpellResult property. - * - * @return - * possible object is - * {@link ArrayOfSpellResult } - * - */ - public ArrayOfSpellResult getArrayOfSpellResult() { - return arrayOfSpellResult; - } - - /** - * Sets the value of the arrayOfSpellResult property. - * - * @param value - * allowed object is - * {@link ArrayOfSpellResult } - * - */ - public void setArrayOfSpellResult(ArrayOfSpellResult value) { - this.arrayOfSpellResult = value; - } - -} diff --git a/src/main/java/net/yandex/speller/services/spellservice/ObjectFactory.java b/src/main/java/net/yandex/speller/services/spellservice/ObjectFactory.java deleted file mode 100644 index 603b94a..0000000 --- a/src/main/java/net/yandex/speller/services/spellservice/ObjectFactory.java +++ /dev/null @@ -1,88 +0,0 @@ - -package net.yandex.speller.services.spellservice; - -import javax.xml.bind.annotation.XmlRegistry; - - -/** - * This object contains factory methods for each - * Java content interface and Java element interface - * generated in the net.yandex.speller.services.spellservice package. - *

An ObjectFactory allows you to programatically - * construct new instances of the Java representation - * for XML content. The Java representation of XML - * content can consist of schema derived interfaces - * and classes representing the binding of schema - * type definitions, element declarations and model - * groups. Factory methods for each of these are - * provided in this class. - * - */ -@XmlRegistry -public class ObjectFactory { - - - /** - * Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: net.yandex.speller.services.spellservice - * - */ - public ObjectFactory() { - } - - /** - * Create an instance of {@link CheckTextResponse } - * - */ - public CheckTextResponse createCheckTextResponse() { - return new CheckTextResponse(); - } - - /** - * Create an instance of {@link SpellResult } - * - */ - public SpellResult createSpellResult() { - return new SpellResult(); - } - - /** - * Create an instance of {@link CheckTextsRequest } - * - */ - public CheckTextsRequest createCheckTextsRequest() { - return new CheckTextsRequest(); - } - - /** - * Create an instance of {@link CheckTextsResponse } - * - */ - public CheckTextsResponse createCheckTextsResponse() { - return new CheckTextsResponse(); - } - - /** - * Create an instance of {@link ArrayOfSpellResult } - * - */ - public ArrayOfSpellResult createArrayOfSpellResult() { - return new ArrayOfSpellResult(); - } - - /** - * Create an instance of {@link CheckTextRequest } - * - */ - public CheckTextRequest createCheckTextRequest() { - return new CheckTextRequest(); - } - - /** - * Create an instance of {@link SpellError } - * - */ - public SpellError createSpellError() { - return new SpellError(); - } - -} diff --git a/src/main/java/net/yandex/speller/services/spellservice/SpellError.java b/src/main/java/net/yandex/speller/services/spellservice/SpellError.java deleted file mode 100644 index ad6e430..0000000 --- a/src/main/java/net/yandex/speller/services/spellservice/SpellError.java +++ /dev/null @@ -1,192 +0,0 @@ - -package net.yandex.speller.services.spellservice; - -import java.util.ArrayList; -import java.util.List; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlType; - - -/** - *

Java class for SpellError complex type. - * - *

The following schema fragment specifies the expected content contained within this class. - * - *

- * <complexType name="SpellError">
- *   <complexContent>
- *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       <sequence>
- *         <element name="word" type="{http://www.w3.org/2001/XMLSchema}string"/>
- *         <element name="s" type="{http://www.w3.org/2001/XMLSchema}string" maxOccurs="unbounded" minOccurs="0"/>
- *       </sequence>
- *       <attribute name="code" use="required" type="{http://www.w3.org/2001/XMLSchema}int" />
- *       <attribute name="pos" use="required" type="{http://www.w3.org/2001/XMLSchema}int" />
- *       <attribute name="row" use="required" type="{http://www.w3.org/2001/XMLSchema}int" />
- *       <attribute name="col" use="required" type="{http://www.w3.org/2001/XMLSchema}int" />
- *       <attribute name="len" use="required" type="{http://www.w3.org/2001/XMLSchema}int" />
- *     </restriction>
- *   </complexContent>
- * </complexType>
- * 
- * - * - */ -@XmlAccessorType(XmlAccessType.FIELD) -@XmlType(name = "SpellError", propOrder = { - "word", - "s" -}) -public class SpellError { - - @XmlElement(required = true) - protected String word; - protected List s; - @XmlAttribute(name = "code", required = true) - protected int code; - @XmlAttribute(name = "pos", required = true) - protected int pos; - @XmlAttribute(name = "row", required = true) - protected int row; - @XmlAttribute(name = "col", required = true) - protected int col; - @XmlAttribute(name = "len", required = true) - protected int len; - - /** - * Gets the value of the word property. - * - * @return - * possible object is - * {@link String } - * - */ - public String getWord() { - return word; - } - - /** - * Sets the value of the word property. - * - * @param value - * allowed object is - * {@link String } - * - */ - public void setWord(String value) { - this.word = value; - } - - /** - * Gets the value of the s property. - * - *

- * This accessor method returns a reference to the live list, - * not a snapshot. Therefore any modification you make to the - * returned list will be present inside the JAXB object. - * This is why there is not a set method for the s property. - * - *

- * For example, to add a new item, do as follows: - *

-     *    getS().add(newItem);
-     * 
- * - * - *

- * Objects of the following type(s) are allowed in the list - * {@link String } - * - * - */ - public List getS() { - if (s == null) { - s = new ArrayList(); - } - return this.s; - } - - /** - * Gets the value of the code property. - * - */ - public int getCode() { - return code; - } - - /** - * Sets the value of the code property. - * - */ - public void setCode(int value) { - this.code = value; - } - - /** - * Gets the value of the pos property. - * - */ - public int getPos() { - return pos; - } - - /** - * Sets the value of the pos property. - * - */ - public void setPos(int value) { - this.pos = value; - } - - /** - * Gets the value of the row property. - * - */ - public int getRow() { - return row; - } - - /** - * Sets the value of the row property. - * - */ - public void setRow(int value) { - this.row = value; - } - - /** - * Gets the value of the col property. - * - */ - public int getCol() { - return col; - } - - /** - * Sets the value of the col property. - * - */ - public void setCol(int value) { - this.col = value; - } - - /** - * Gets the value of the len property. - * - */ - public int getLen() { - return len; - } - - /** - * Sets the value of the len property. - * - */ - public void setLen(int value) { - this.len = value; - } - -} diff --git a/src/main/java/net/yandex/speller/services/spellservice/SpellResult.java b/src/main/java/net/yandex/speller/services/spellservice/SpellResult.java deleted file mode 100644 index 679cf72..0000000 --- a/src/main/java/net/yandex/speller/services/spellservice/SpellResult.java +++ /dev/null @@ -1,67 +0,0 @@ - -package net.yandex.speller.services.spellservice; - -import java.util.ArrayList; -import java.util.List; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlType; - - -/** - *

Java class for SpellResult complex type. - * - *

The following schema fragment specifies the expected content contained within this class. - * - *

- * <complexType name="SpellResult">
- *   <complexContent>
- *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       <sequence>
- *         <element name="error" type="{http://speller.yandex.net/services/spellservice}SpellError" maxOccurs="unbounded" minOccurs="0"/>
- *       </sequence>
- *     </restriction>
- *   </complexContent>
- * </complexType>
- * 
- * - * - */ -@XmlAccessorType(XmlAccessType.FIELD) -@XmlType(name = "SpellResult", propOrder = { - "error" -}) -public class SpellResult { - - protected List error; - - /** - * Gets the value of the error property. - * - *

- * This accessor method returns a reference to the live list, - * not a snapshot. Therefore any modification you make to the - * returned list will be present inside the JAXB object. - * This is why there is not a set method for the error property. - * - *

- * For example, to add a new item, do as follows: - *

-     *    getError().add(newItem);
-     * 
- * - * - *

- * Objects of the following type(s) are allowed in the list - * {@link SpellError } - * - * - */ - public List getError() { - if (error == null) { - error = new ArrayList(); - } - return this.error; - } - -} diff --git a/src/main/java/net/yandex/speller/services/spellservice/SpellService.java b/src/main/java/net/yandex/speller/services/spellservice/SpellService.java deleted file mode 100644 index b3f1ec8..0000000 --- a/src/main/java/net/yandex/speller/services/spellservice/SpellService.java +++ /dev/null @@ -1,94 +0,0 @@ - -package net.yandex.speller.services.spellservice; - -import java.net.MalformedURLException; -import java.net.URL; -import javax.xml.namespace.QName; -import javax.xml.ws.Service; -import javax.xml.ws.WebEndpoint; -import javax.xml.ws.WebServiceClient; -import javax.xml.ws.WebServiceException; -import javax.xml.ws.WebServiceFeature; - - -/** - * This class was generated by the JAX-WS RI. - * JAX-WS RI 2.2.9-b130926.1035 - * Generated source version: 2.2 - * - */ -@WebServiceClient(name = "SpellService", targetNamespace = "http://speller.yandex.net/services/spellservice", wsdlLocation = "http://speller.yandex.net/services/spellservice?WSDL") -public class SpellService - extends Service -{ - - private final static URL SPELLSERVICE_WSDL_LOCATION; - private final static WebServiceException SPELLSERVICE_EXCEPTION; - private final static QName SPELLSERVICE_QNAME = new QName("http://speller.yandex.net/services/spellservice", "SpellService"); - - static { - URL url = null; - WebServiceException e = null; - try { - url = new URL("http://speller.yandex.net/services/spellservice?WSDL"); - } catch (MalformedURLException ex) { - e = new WebServiceException(ex); - } - SPELLSERVICE_WSDL_LOCATION = url; - SPELLSERVICE_EXCEPTION = e; - } - - public SpellService() { - super(__getWsdlLocation(), SPELLSERVICE_QNAME); - } - - public SpellService(WebServiceFeature... features) { - super(__getWsdlLocation(), SPELLSERVICE_QNAME, features); - } - - public SpellService(URL wsdlLocation) { - super(wsdlLocation, SPELLSERVICE_QNAME); - } - - public SpellService(URL wsdlLocation, WebServiceFeature... features) { - super(wsdlLocation, SPELLSERVICE_QNAME, features); - } - - public SpellService(URL wsdlLocation, QName serviceName) { - super(wsdlLocation, serviceName); - } - - public SpellService(URL wsdlLocation, QName serviceName, WebServiceFeature... features) { - super(wsdlLocation, serviceName, features); - } - - /** - * - * @return - * returns SpellServiceSoap - */ - @WebEndpoint(name = "SpellServiceSoap") - public SpellServiceSoap getSpellServiceSoap() { - return super.getPort(new QName("http://speller.yandex.net/services/spellservice", "SpellServiceSoap"), SpellServiceSoap.class); - } - - /** - * - * @param features - * A list of {@link javax.xml.ws.WebServiceFeature} to configure on the proxy. Supported features not in the features parameter will have their default values. - * @return - * returns SpellServiceSoap - */ - @WebEndpoint(name = "SpellServiceSoap") - public SpellServiceSoap getSpellServiceSoap(WebServiceFeature... features) { - return super.getPort(new QName("http://speller.yandex.net/services/spellservice", "SpellServiceSoap"), SpellServiceSoap.class, features); - } - - private static URL __getWsdlLocation() { - if (SPELLSERVICE_EXCEPTION!= null) { - throw SPELLSERVICE_EXCEPTION; - } - return SPELLSERVICE_WSDL_LOCATION; - } - -} diff --git a/src/main/java/net/yandex/speller/services/spellservice/SpellServiceSoap.java b/src/main/java/net/yandex/speller/services/spellservice/SpellServiceSoap.java deleted file mode 100644 index fd0880c..0000000 --- a/src/main/java/net/yandex/speller/services/spellservice/SpellServiceSoap.java +++ /dev/null @@ -1,50 +0,0 @@ - -package net.yandex.speller.services.spellservice; - -import javax.jws.WebMethod; -import javax.jws.WebParam; -import javax.jws.WebResult; -import javax.jws.WebService; -import javax.jws.soap.SOAPBinding; -import javax.xml.bind.annotation.XmlSeeAlso; - - -/** - * This class was generated by the JAX-WS RI. - * JAX-WS RI 2.2.9-b130926.1035 - * Generated source version: 2.2 - * - */ -@WebService(name = "SpellServiceSoap", targetNamespace = "http://speller.yandex.net/services/spellservice") -@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE) -@XmlSeeAlso({ - ObjectFactory.class -}) -public interface SpellServiceSoap { - - - /** - * - * @param parameters - * @return - * returns net.yandex.speller.services.spellservice.CheckTextResponse - */ - @WebMethod(action = "http://speller.yandex.net/services/spellservice/checkText") - @WebResult(name = "CheckTextResponse", targetNamespace = "http://speller.yandex.net/services/spellservice", partName = "parameters") - public CheckTextResponse checkText( - @WebParam(name = "CheckTextRequest", targetNamespace = "http://speller.yandex.net/services/spellservice", partName = "parameters") - CheckTextRequest parameters); - - /** - * - * @param parameters - * @return - * returns net.yandex.speller.services.spellservice.CheckTextsResponse - */ - @WebMethod(action = "http://speller.yandex.net/services/spellservice/checkTexts") - @WebResult(name = "CheckTextsResponse", targetNamespace = "http://speller.yandex.net/services/spellservice", partName = "parameters") - public CheckTextsResponse checkTexts( - @WebParam(name = "CheckTextsRequest", targetNamespace = "http://speller.yandex.net/services/spellservice", partName = "parameters") - CheckTextsRequest parameters); - -} diff --git a/src/main/java/net/yandex/speller/services/spellservice/package-info.java b/src/main/java/net/yandex/speller/services/spellservice/package-info.java deleted file mode 100644 index b58aade..0000000 --- a/src/main/java/net/yandex/speller/services/spellservice/package-info.java +++ /dev/null @@ -1,2 +0,0 @@ -@javax.xml.bind.annotation.XmlSchema(namespace = "http://speller.yandex.net/services/spellservice", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED) -package net.yandex.speller.services.spellservice; From cf2cd312027479ceb8e700d2010116f740776b02 Mon Sep 17 00:00:00 2001 From: Exiled Rain Date: Thu, 12 Dec 2019 23:57:23 +0200 Subject: [PATCH 18/18] Removed aspect folder Added bg image for view --- .../java/io/khasang/gahelp/aspect/Bard.java | 35 ------------ .../gahelp/controller/AppController.java | 2 +- .../gahelp/controller/MainController.java | 18 ++++++ src/main/resources/hibernate.properties | 4 +- src/main/resources/static/img/gahelp-bg.png | Bin 0 -> 91726 bytes .../resources/static/style/main_style.css | 8 +++ src/main/webapp/WEB-INF/views/admin.jsp | 10 ---- src/main/webapp/WEB-INF/views/cat.jsp | 9 --- src/main/webapp/WEB-INF/views/catinfo.jsp | 9 --- src/main/webapp/WEB-INF/views/check.jsp | 9 --- src/main/webapp/WEB-INF/views/example.html | 2 - src/main/webapp/WEB-INF/views/horse.jsp | 1 + src/main/webapp/WEB-INF/views/info.jsp | 9 --- src/main/webapp/WEB-INF/views/script.js | 0 src/main/webapp/WEB-INF/views/status.jsp | 16 ------ src/main/webapp/WEB-INF/views/style.css | 0 src/main/webapp/WEB-INF/views/wel.jsp | 12 ++++ src/main/webapp/WEB-INF/views/welcome.jsp | 53 ++++++++++++++++++ 18 files changed, 95 insertions(+), 102 deletions(-) delete mode 100644 src/main/java/io/khasang/gahelp/aspect/Bard.java create mode 100644 src/main/java/io/khasang/gahelp/controller/MainController.java create mode 100644 src/main/resources/static/img/gahelp-bg.png create mode 100644 src/main/resources/static/style/main_style.css delete mode 100644 src/main/webapp/WEB-INF/views/admin.jsp delete mode 100644 src/main/webapp/WEB-INF/views/cat.jsp delete mode 100644 src/main/webapp/WEB-INF/views/catinfo.jsp delete mode 100644 src/main/webapp/WEB-INF/views/check.jsp delete mode 100644 src/main/webapp/WEB-INF/views/info.jsp delete mode 100644 src/main/webapp/WEB-INF/views/script.js delete mode 100644 src/main/webapp/WEB-INF/views/status.jsp delete mode 100644 src/main/webapp/WEB-INF/views/style.css create mode 100644 src/main/webapp/WEB-INF/views/wel.jsp create mode 100644 src/main/webapp/WEB-INF/views/welcome.jsp diff --git a/src/main/java/io/khasang/gahelp/aspect/Bard.java b/src/main/java/io/khasang/gahelp/aspect/Bard.java deleted file mode 100644 index ddbe6bb..0000000 --- a/src/main/java/io/khasang/gahelp/aspect/Bard.java +++ /dev/null @@ -1,35 +0,0 @@ -package io.khasang.gahelp.aspect; - -import org.aspectj.lang.JoinPoint; -import org.aspectj.lang.ProceedingJoinPoint; -import org.aspectj.lang.annotation.Around; -import org.aspectj.lang.annotation.Aspect; -import org.aspectj.lang.annotation.Before; -import org.aspectj.lang.annotation.Pointcut; -import org.springframework.stereotype.Component; - -import java.util.concurrent.Executor; - -@Component -@Aspect -public class Bard { - @Pointcut("execution(* io.khasang.gahelp.service.impl.KnightServiceImpl.getAchievement(..))") - public void serviceBefore() { - } - - @Before("execution(* io.khasang.gahelp.service.impl.KnightServiceImpl.getAchievement(..))") - public void getSong(JoinPoint joinPoint) { - System.err.println("LAlalalala!!!"); - } - - @Around("execution(* io.khasang.gahelp.service.impl.KnightServiceImpl.getAchievement(..)) && args(val, ..)") - public Object action(ProceedingJoinPoint joinPoint, String val) throws Throwable { - long timeBefore = System.currentTimeMillis(); - Object obj = joinPoint.proceed(); - long timeAfter = System.currentTimeMillis(); - System.err.println("Lalalalalala..."); - - System.err.println("Knight defeat an enemy - " + val + " with " + (timeAfter - timeBefore) / 1000 + " seconds"); - return obj; - } - } diff --git a/src/main/java/io/khasang/gahelp/controller/AppController.java b/src/main/java/io/khasang/gahelp/controller/AppController.java index 2643dca..da689b8 100644 --- a/src/main/java/io/khasang/gahelp/controller/AppController.java +++ b/src/main/java/io/khasang/gahelp/controller/AppController.java @@ -19,7 +19,7 @@ public class AppController { private KnightService knightService; private CreateTable createTable; - @RequestMapping("/") + @RequestMapping("/status") public String getStatus() { return "status"; } diff --git a/src/main/java/io/khasang/gahelp/controller/MainController.java b/src/main/java/io/khasang/gahelp/controller/MainController.java new file mode 100644 index 0000000..e9d4447 --- /dev/null +++ b/src/main/java/io/khasang/gahelp/controller/MainController.java @@ -0,0 +1,18 @@ +package io.khasang.gahelp.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; + +@Controller +public class MainController { + + @RequestMapping("/") + public String getStat(){ + return "welcome"; + } + + @RequestMapping("/wel") + public String getWel(){ + return "wel"; + } +} diff --git a/src/main/resources/hibernate.properties b/src/main/resources/hibernate.properties index 5e878f8..0d381ae 100644 --- a/src/main/resources/hibernate.properties +++ b/src/main/resources/hibernate.properties @@ -1,4 +1,4 @@ hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect -hibernate.show_sql=true +hibernate.show_sql=false hibernate.format_sql=true -hibernate.hbm2ddl.auto=create \ No newline at end of file +hibernate.hbm2ddl.auto=validate \ No newline at end of file diff --git a/src/main/resources/static/img/gahelp-bg.png b/src/main/resources/static/img/gahelp-bg.png new file mode 100644 index 0000000000000000000000000000000000000000..8946ba9af581452879566fe3b5b90297cf0baf20 GIT binary patch literal 91726 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 a!MD8eHU;=f-rj&<=_T1YP=-oYd9d=*n{jt= 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≤}Axe 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 - - - Title - - -

This is secured admin page

- - diff --git a/src/main/webapp/WEB-INF/views/cat.jsp b/src/main/webapp/WEB-INF/views/cat.jsp deleted file mode 100644 index dfda6fc..0000000 --- a/src/main/webapp/WEB-INF/views/cat.jsp +++ /dev/null @@ -1,9 +0,0 @@ -<%@ page contentType="text/html;charset=UTF-8" language="java" %> - - - Title - - -

${name}

- - diff --git a/src/main/webapp/WEB-INF/views/catinfo.jsp b/src/main/webapp/WEB-INF/views/catinfo.jsp deleted file mode 100644 index 38376e6..0000000 --- a/src/main/webapp/WEB-INF/views/catinfo.jsp +++ /dev/null @@ -1,9 +0,0 @@ -<%@ page contentType="text/html;charset=UTF-8" language="java" %> - - - Title - - -

Cat's count with ${name} is: ${count}

- - diff --git a/src/main/webapp/WEB-INF/views/check.jsp b/src/main/webapp/WEB-INF/views/check.jsp deleted file mode 100644 index 1fee1fa..0000000 --- a/src/main/webapp/WEB-INF/views/check.jsp +++ /dev/null @@ -1,9 +0,0 @@ -<%@ page contentType="text/html;charset=UTF-8" language="java" %> - - - Title - - -

${result}

- - diff --git a/src/main/webapp/WEB-INF/views/example.html b/src/main/webapp/WEB-INF/views/example.html index 869f887..7197505 100644 --- a/src/main/webapp/WEB-INF/views/example.html +++ b/src/main/webapp/WEB-INF/views/example.html @@ -3,8 +3,6 @@ Title - - + + + + + + +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ +
+
+ +