6 Commits
v1.8 ... master

Author SHA1 Message Date
Gaetano_Piazzolla
b3287e16a5 Added spotless plugin 2023-02-26 16:43:54 +01:00
Gaetano_Piazzolla
8a2dcb948e Updated documentation, using new gradle plugin in demo project 2023-02-26 16:36:10 +01:00
Gaetano_Piazzolla
ca5055e225 Minor fixes after testing 2023-02-26 16:26:41 +01:00
Gaetano_Piazzolla
37ace5d851 Fixes after merge PR. Restored find by example, removed comment, changed read in find method. 2023-02-26 16:10:48 +01:00
Mostafa Ramadan
a671902f8c Enhancements (#3)
* Adding option to generate only controllerDto
Adding option to specify dto package name
Adding option to specify mapper package name
Adding option to exclude generation of CrudController interface
Adding option to exclude generation of CrudService interface
Fix reading verb in controller
Remove extra imports from Dto
Remove static project path from setting yaml in testing and update output package

* fix yml setting in testing

* update demo projects and plugin version

* update demo projects

* delete wrong files

* update jakarta demo folder

* update lombok version

* update README.md

* update demo-jakarta files

* update mapstruct version

---------

Co-authored-by: MostafaaRamadan <mostafa.ramadan@pixelogicmedia.com>
2023-02-26 15:53:54 +01:00
Gaetano_Piazzolla
a22468cb75 Updated plugin path for demo 2023-01-23 12:21:01 +01:00
100 changed files with 928 additions and 659 deletions

View File

@@ -3,6 +3,7 @@ Generates the standard SPRING 3 layer CRUD architecture starting from JPA entiti
* * *
![sketch](./doc/3layer-sketch.png)
* * *
## How to run as a standalone application:
1. Download and extract the ZIP/TAR file from [releases](https://github.com/GaetanoPiazzolla/Layer3Gen/releases);
2. Edit the file in /bin directory named _3layer-settings.yml_;
@@ -11,10 +12,17 @@ Generates the standard SPRING 3 layer CRUD architecture starting from JPA entiti
## How to run as gradle plugin:
1. Add the plugin in your build.gradle;
```groovy
plugins {
id "gae.piaz.layer3gen" version "1.9"
}
```
or you can use gradle [legacy plugin](https://docs.gradle.org/current/userguide/plugins.html#sec:old_plugin_application) for older gradle versions:
```groovy
buildscript {
dependencies {
classpath "gradle.plugin.gae.piaz:layer3gen:1.8"
classpath "gae.piaz:layer3gen:1.9"
}
// ....
}
@@ -22,22 +30,23 @@ buildscript {
apply plugin: 'gae.piaz.layer3gen'
```
2. Create a file named _3layer-settings.yml_ in the directory src/main/resources/;
2. Create a file named _3layer-settings.yml_ (you willl find an example below) in the directory src/main/resources/;
3. Run the gradle task.
```shell script
gradlew layer3gen
gradlew clean build layer3gen
```
## 3layer-settings.yml configuration template:
```yml
projectPath: /home/tano/workspace_autogenerate/springboot-3layer-generator/demo
# projectPath: c://workspace_private/springboot-3layer-generator/demo
projectPath: /home/yourproject/demo
# projectPath: c://workspace/demo
classesDirectory: build/classes/java/main
outputDirectory : src/main/java
options:
dtoLayer : true
serviceInterface: true
dtoLayer : true # generates the dto from entities, controller using dto, and mapper layer
serviceInterface: true # whatever to generate CrudService Interface or not
entityControllers: false # whatever to generate controller using jpa entity or not
inputPackages:
jpaEntities : com.example.demo.model
@@ -46,6 +55,8 @@ outputPackages:
repositories : com.example.demo.repository
services: com.example.demo.service
controllers: com.example.demo.controller
dtos: gae.piaz.layer3gen.output.dtos # if this in not specified the dto package will be under the controllers package
mappers: gae.piaz.layer3gen.output.mappers # if this in not specified the mapper package will be under the services package
```
## Examples:
@@ -77,14 +88,14 @@ public class BooksService implements CrudService<Books,java.lang.Integer> {
}
@Override
public Page<Books> read(Books entity, Pageable pageable) {
public Page<Books> find(Books entity, Pageable pageable) {
Example<Books> example = Example.of(entity);
return repository.findAll(example,pageable);
}
@Override
public Books readOne(java.lang.Integer primaryKey) {
return repository.getOne(primaryKey);
public Optional<Book> getOne(java.lang.Integer primaryKey) {
return repository.findById(primaryKey);
}
@Override
@@ -120,20 +131,20 @@ public class BooksControllerDTO implements CrudController<BooksDTO,java.lang.Int
}
@Override
public ResponseEntity<Page<BooksDTO>> read(
public ResponseEntity<Page<BooksDTO>> find(
@RequestBody BooksDTO dto,
@RequestParam("page") Integer page,
@RequestParam("size") Integer size) {
Pageable pageable = PageRequest.of(page,size);
Books entity = mapper.toEntity(dto);
Page<BooksDTO> pages = service.read(entity, pageable).map(mapper::toDto);
Page<BooksDTO> pages = service.find(entity, pageable).map(mapper::toDto);
return ResponseEntity.ok(pages);
}
@Override
public ResponseEntity<BooksDTO> readOne(@PathVariable("id") java.lang.Integer primaryKey) {
Books entity = service.readOne(primaryKey);
return ResponseEntity.ok(mapper.toDto(entity));
public ResponseEntity<BookDTO> getOne(@PathVariable("id") java.lang.Integer primaryKey) {
Optional<Book> entity = service.getOne(primaryKey);
return entity.map(e -> ResponseEntity.ok(mapper.toDto(e))).orElseGet(() -> ResponseEntity.notFound().build());
}
@Override

View File

@@ -4,11 +4,12 @@ plugins {
id 'java-gradle-plugin'
id 'maven-publish'
id 'application'
id "com.diffplug.spotless" version "6.15.0"
id 'com.gradle.plugin-publish' version '0.12.0'
}
group = 'gae.piaz'
version = '1.8'
version = '1.9'
repositories {
mavenCentral()
@@ -28,11 +29,11 @@ dependencies {
implementation 'org.reflections:reflections:0.9.11' // read classes
implementation 'org.freemarker:freemarker:2.3.23'// write classes
compileOnly 'org.projectlombok:lombok:1.18.2' // autogenerate setter getter etc
compileOnly 'org.projectlombok:lombok:1.18.26' // autogenerate setter getter etc
compileOnly gradleApi() // gradle plugin
annotationProcessor "org.mapstruct:mapstruct-processor:1.3.1.Final"
annotationProcessor 'org.projectlombok:lombok:1.18.12'
annotationProcessor 'org.projectlombok:lombok:1.18.26'
testImplementation 'junit:junit:4.12'
}
@@ -74,3 +75,12 @@ installDist {
exclude 'gradle-api-6.6.1.jar'
}
spotless {
java {
importOrder()
removeUnusedImports()
cleanthat()
googleJavaFormat()
formatAnnotations()
}
}

View File

@@ -1,9 +1,10 @@
projectPath: /home/tano/workspace_autogenerate/springboot-3layer-generator/demo
projectPath: /home/workspace/demo
classesDirectory: build/classes/java/main
outputDirectory : src/main/java
options:
dtoLayer : true
serviceInterface: true
entityControllers: true
inputPackages:
jpaEntities : com.example.demo.model

View File

@@ -1,10 +1,5 @@
buildscript {
dependencies {
classpath("gradle.plugin.gae.piaz:layer3gen:1.8")
}
repositories {
mavenLocal()
mavenCentral()
}
}
@@ -12,9 +7,10 @@ buildscript {
plugins {
java
id("org.springframework.boot") version "3.0.0"
id("gae.piaz.layer3gen") version "1.9"
}
apply(plugin = "io.spring.dependency-management")
apply(plugin = "gae.piaz.layer3gen")
repositories {
mavenLocal()
@@ -28,15 +24,13 @@ repositories {
dependencies {
implementation("org.springframework.boot:spring-boot-starter-web")
implementation("org.springframework.boot:spring-boot-starter-data-jpa")
implementation( "org.springframework.boot:spring-boot-starter-web")
implementation ("org.mapstruct:mapstruct:1.3.1.Final")
compileOnly( "org.projectlombok:lombok:1.18.2")
annotationProcessor( "org.mapstruct:mapstruct-processor:1.3.1.Final")
annotationProcessor( "org.projectlombok:lombok:1.18.24")
implementation ("org.mapstruct:mapstruct:1.5.3.Final")
compileOnly( "org.projectlombok:lombok:1.18.26")
runtimeOnly 'com.h2database:h2'
annotationProcessor( "org.projectlombok:lombok:1.18.26")
annotationProcessor( "org.mapstruct:mapstruct-processor:1.5.3.Final")
}
group = "com.example"

View File

@@ -9,9 +9,10 @@ import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.Optional;
/**
* Generated by Springboot-3layer-Generator at Jan 23, 2023, 11:09:45 AM
* Generated by Springboot-3layer-Generator at Feb 26, 2023, 4:26:01 PM
*/
@RestController
@RequestMapping("/book/")
@@ -31,17 +32,17 @@ public class BookController implements CrudController<Book,java.lang.Integer>{
}
@Override
public ResponseEntity<Page<Book>> read(
public ResponseEntity<Page<Book>> find(
@RequestBody Book entity,
@RequestParam("page") Integer page,
@RequestParam("size") Integer size) {
Pageable pageable = PageRequest.of(page,size);
return ResponseEntity.ok(service.read(entity,pageable));
return ResponseEntity.ok(service.find(entity,pageable));
}
@Override
public ResponseEntity<Book> readOne(@PathVariable("id") java.lang.Integer primaryKey) {
return ResponseEntity.ok(service.readOne(primaryKey));
public ResponseEntity<Book> getOne(@PathVariable("id") java.lang.Integer primaryKey) {
return service.getOne(primaryKey).map(ResponseEntity::ok).orElseGet(() -> ResponseEntity.notFound().build());
}
@Override

View File

@@ -11,9 +11,10 @@ import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.Optional;
/**
* Generated by Springboot-3layer-Generator at Jan 23, 2023, 11:09:45 AM
* Generated by Springboot-3layer-Generator at Feb 26, 2023, 4:26:01 PM
*/
@RestController
@RequestMapping("/book-dto/")
@@ -40,20 +41,20 @@ public class BookControllerDTO implements CrudController<BookDTO,java.lang.Integ
}
@Override
public ResponseEntity<Page<BookDTO>> read(
public ResponseEntity<Page<BookDTO>> find(
@RequestBody BookDTO dto,
@RequestParam("page") Integer page,
@RequestParam("size") Integer size) {
Pageable pageable = PageRequest.of(page,size);
Book entity = mapper.toEntity(dto);
Page<BookDTO> pages = service.read(entity, pageable).map(mapper::toDto);
Page<BookDTO> pages = service.find(entity, pageable).map(mapper::toDto);
return ResponseEntity.ok(pages);
}
@Override
public ResponseEntity<BookDTO> readOne(@PathVariable("id") java.lang.Integer primaryKey) {
Book entity = service.readOne(primaryKey);
return ResponseEntity.ok(mapper.toDto(entity));
public ResponseEntity<BookDTO> getOne(@PathVariable("id") java.lang.Integer primaryKey) {
Optional<Book> entity = service.getOne(primaryKey);
return entity.map(e -> ResponseEntity.ok(mapper.toDto(e))).orElseGet(() -> ResponseEntity.notFound().build());
}
@Override

View File

@@ -8,7 +8,7 @@ import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
/**
* Generated by Springboot-3layer-Generator at Jan 23, 2023, 11:09:45 AM
* Generated by Springboot-3layer-Generator at Feb 26, 2023, 4:26:01 PM
*/
public interface CrudController<O,P>{
@@ -19,9 +19,10 @@ public interface CrudController<O,P>{
ResponseEntity<O> update(O object);
@PostMapping("find")
ResponseEntity<Page<O>> read(O object, Integer page, Integer size);
ResponseEntity<Page<O>> find(O object, Integer page, Integer size);
@GetMapping("{id}")
ResponseEntity<O> readOne(P primaryKey);
ResponseEntity<O> getOne(P primaryKey);
@DeleteMapping
void delete(P primaryKey);

View File

@@ -9,9 +9,10 @@ import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.Optional;
/**
* Generated by Springboot-3layer-Generator at Jan 23, 2023, 11:09:45 AM
* Generated by Springboot-3layer-Generator at Feb 26, 2023, 4:26:01 PM
*/
@RestController
@RequestMapping("/order/")
@@ -31,17 +32,17 @@ public class OrderController implements CrudController<Order,java.lang.Integer>{
}
@Override
public ResponseEntity<Page<Order>> read(
public ResponseEntity<Page<Order>> find(
@RequestBody Order entity,
@RequestParam("page") Integer page,
@RequestParam("size") Integer size) {
Pageable pageable = PageRequest.of(page,size);
return ResponseEntity.ok(service.read(entity,pageable));
return ResponseEntity.ok(service.find(entity,pageable));
}
@Override
public ResponseEntity<Order> readOne(@PathVariable("id") java.lang.Integer primaryKey) {
return ResponseEntity.ok(service.readOne(primaryKey));
public ResponseEntity<Order> getOne(@PathVariable("id") java.lang.Integer primaryKey) {
return service.getOne(primaryKey).map(ResponseEntity::ok).orElseGet(() -> ResponseEntity.notFound().build());
}
@Override

View File

@@ -11,9 +11,10 @@ import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.Optional;
/**
* Generated by Springboot-3layer-Generator at Jan 23, 2023, 11:09:45 AM
* Generated by Springboot-3layer-Generator at Feb 26, 2023, 4:26:01 PM
*/
@RestController
@RequestMapping("/order-dto/")
@@ -40,20 +41,20 @@ public class OrderControllerDTO implements CrudController<OrderDTO,java.lang.Int
}
@Override
public ResponseEntity<Page<OrderDTO>> read(
public ResponseEntity<Page<OrderDTO>> find(
@RequestBody OrderDTO dto,
@RequestParam("page") Integer page,
@RequestParam("size") Integer size) {
Pageable pageable = PageRequest.of(page,size);
Order entity = mapper.toEntity(dto);
Page<OrderDTO> pages = service.read(entity, pageable).map(mapper::toDto);
Page<OrderDTO> pages = service.find(entity, pageable).map(mapper::toDto);
return ResponseEntity.ok(pages);
}
@Override
public ResponseEntity<OrderDTO> readOne(@PathVariable("id") java.lang.Integer primaryKey) {
Order entity = service.readOne(primaryKey);
return ResponseEntity.ok(mapper.toDto(entity));
public ResponseEntity<OrderDTO> getOne(@PathVariable("id") java.lang.Integer primaryKey) {
Optional<Order> entity = service.getOne(primaryKey);
return entity.map(e -> ResponseEntity.ok(mapper.toDto(e))).orElseGet(() -> ResponseEntity.notFound().build());
}
@Override

View File

@@ -9,9 +9,10 @@ import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.Optional;
/**
* Generated by Springboot-3layer-Generator at Jan 23, 2023, 11:09:45 AM
* Generated by Springboot-3layer-Generator at Feb 26, 2023, 4:26:01 PM
*/
@RestController
@RequestMapping("/user/")
@@ -31,17 +32,17 @@ public class UserController implements CrudController<User,java.lang.Integer>{
}
@Override
public ResponseEntity<Page<User>> read(
public ResponseEntity<Page<User>> find(
@RequestBody User entity,
@RequestParam("page") Integer page,
@RequestParam("size") Integer size) {
Pageable pageable = PageRequest.of(page,size);
return ResponseEntity.ok(service.read(entity,pageable));
return ResponseEntity.ok(service.find(entity,pageable));
}
@Override
public ResponseEntity<User> readOne(@PathVariable("id") java.lang.Integer primaryKey) {
return ResponseEntity.ok(service.readOne(primaryKey));
public ResponseEntity<User> getOne(@PathVariable("id") java.lang.Integer primaryKey) {
return service.getOne(primaryKey).map(ResponseEntity::ok).orElseGet(() -> ResponseEntity.notFound().build());
}
@Override

View File

@@ -11,9 +11,10 @@ import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.Optional;
/**
* Generated by Springboot-3layer-Generator at Jan 23, 2023, 11:09:45 AM
* Generated by Springboot-3layer-Generator at Feb 26, 2023, 4:26:01 PM
*/
@RestController
@RequestMapping("/user-dto/")
@@ -40,20 +41,20 @@ public class UserControllerDTO implements CrudController<UserDTO,java.lang.Integ
}
@Override
public ResponseEntity<Page<UserDTO>> read(
public ResponseEntity<Page<UserDTO>> find(
@RequestBody UserDTO dto,
@RequestParam("page") Integer page,
@RequestParam("size") Integer size) {
Pageable pageable = PageRequest.of(page,size);
User entity = mapper.toEntity(dto);
Page<UserDTO> pages = service.read(entity, pageable).map(mapper::toDto);
Page<UserDTO> pages = service.find(entity, pageable).map(mapper::toDto);
return ResponseEntity.ok(pages);
}
@Override
public ResponseEntity<UserDTO> readOne(@PathVariable("id") java.lang.Integer primaryKey) {
User entity = service.readOne(primaryKey);
return ResponseEntity.ok(mapper.toDto(entity));
public ResponseEntity<UserDTO> getOne(@PathVariable("id") java.lang.Integer primaryKey) {
Optional<User> entity = service.getOne(primaryKey);
return entity.map(e -> ResponseEntity.ok(mapper.toDto(e))).orElseGet(() -> ResponseEntity.notFound().build());
}
@Override

View File

@@ -2,11 +2,8 @@ package com.example.demo.controller.dto;
import lombok.Data;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
/**
* Generated by Springboot-3layer-Generator at Jan 23, 2023, 11:09:45 AM
* Generated by Springboot-3layer-Generator at Feb 26, 2023, 4:26:01 PM
*/
@Data
public class BookDTO {

View File

@@ -2,11 +2,8 @@ package com.example.demo.controller.dto;
import lombok.Data;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
/**
* Generated by Springboot-3layer-Generator at Jan 23, 2023, 11:09:45 AM
* Generated by Springboot-3layer-Generator at Feb 26, 2023, 4:26:01 PM
*/
@Data
public class OrderDTO {

View File

@@ -2,11 +2,8 @@ package com.example.demo.controller.dto;
import lombok.Data;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
/**
* Generated by Springboot-3layer-Generator at Jan 23, 2023, 11:09:45 AM
* Generated by Springboot-3layer-Generator at Feb 26, 2023, 4:26:01 PM
*/
@Data
public class UserDTO {

View File

@@ -6,7 +6,7 @@ import java.util.List;
/**
* The persistent class for the books database table.
*
*
*/
@Entity
@Table(name="books")

View File

@@ -16,7 +16,7 @@ import java.io.Serializable;
/**
* The persistent class for the orders database table.
*
*
*/
@Entity
@Table(name="orders")

View File

@@ -6,7 +6,7 @@ import java.util.List;
/**
* The persistent class for the users database table.
*
*
*/
@Entity
@Table(name="users")

View File

@@ -5,7 +5,7 @@ import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
/**
* Generated by Springboot-3layer-Generator at Jan 23, 2023, 11:09:45 AM
* Generated by Springboot-3layer-Generator at Feb 26, 2023, 4:26:01 PM
*/
@Repository
public interface BookRepository extends JpaRepository<Book, java.lang.Integer> {

View File

@@ -5,7 +5,7 @@ import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
/**
* Generated by Springboot-3layer-Generator at Jan 23, 2023, 11:09:45 AM
* Generated by Springboot-3layer-Generator at Feb 26, 2023, 4:26:01 PM
*/
@Repository
public interface OrderRepository extends JpaRepository<Order, java.lang.Integer> {

View File

@@ -5,7 +5,7 @@ import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
/**
* Generated by Springboot-3layer-Generator at Jan 23, 2023, 11:09:45 AM
* Generated by Springboot-3layer-Generator at Feb 26, 2023, 4:26:01 PM
*/
@Repository
public interface UserRepository extends JpaRepository<User, java.lang.Integer> {

View File

@@ -3,7 +3,7 @@ package com.example.demo.service;
import com.example.demo.model.Book;
/**
* Generated by Springboot-3layer-Generator at Jan 23, 2023, 11:09:45 AM
* Generated by Springboot-3layer-Generator at Feb 26, 2023, 4:26:01 PM
*/
public interface BookService extends CrudService<Book,java.lang.Integer> {

View File

@@ -2,18 +2,20 @@ package com.example.demo.service;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import java.util.Optional;
/**
* Generated by Springboot-3layer-Generator at Jan 23, 2023, 11:09:45 AM
* Generated by Springboot-3layer-Generator at Feb 26, 2023, 4:26:01 PM
*/
public interface CrudService<E,P> {
public interface CrudService<E, P> {
E create(E entity);
E update(E entity);
Page<E> read(E entity, Pageable pageable);
E readOne(P primaryKey);
Page<E> find(E entity, Pageable pageable);
Optional<E> getOne(P primaryKey);
void delete(P primaryKey);

View File

@@ -3,7 +3,7 @@ package com.example.demo.service;
import com.example.demo.model.Order;
/**
* Generated by Springboot-3layer-Generator at Jan 23, 2023, 11:09:45 AM
* Generated by Springboot-3layer-Generator at Feb 26, 2023, 4:26:01 PM
*/
public interface OrderService extends CrudService<Order,java.lang.Integer> {

View File

@@ -3,7 +3,7 @@ package com.example.demo.service;
import com.example.demo.model.User;
/**
* Generated by Springboot-3layer-Generator at Jan 23, 2023, 11:09:45 AM
* Generated by Springboot-3layer-Generator at Feb 26, 2023, 4:26:01 PM
*/
public interface UserService extends CrudService<User,java.lang.Integer> {

View File

@@ -9,9 +9,10 @@ import org.springframework.data.domain.Example;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import java.util.Optional;
/**
* Generated by Springboot-3layer-Generator at Jan 23, 2023, 11:09:45 AM
* Generated by Springboot-3layer-Generator at Feb 26, 2023, 4:26:01 PM
*/
@Service
public class BookServiceBean implements BookService {
@@ -30,14 +31,14 @@ public class BookServiceBean implements BookService {
}
@Override
public Page<Book> read(Book entity, Pageable pageable) {
public Page<Book> find(Book entity, Pageable pageable) {
Example<Book> example = Example.of(entity);
return repository.findAll(example,pageable);
}
@Override
public Book readOne(java.lang.Integer primaryKey) {
return repository.getOne(primaryKey);
public Optional<Book> getOne(java.lang.Integer primaryKey) {
return repository.findById(primaryKey);
}
@Override

View File

@@ -9,9 +9,10 @@ import org.springframework.data.domain.Example;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import java.util.Optional;
/**
* Generated by Springboot-3layer-Generator at Jan 23, 2023, 11:09:45 AM
* Generated by Springboot-3layer-Generator at Feb 26, 2023, 4:26:01 PM
*/
@Service
public class OrderServiceBean implements OrderService {
@@ -30,14 +31,14 @@ public class OrderServiceBean implements OrderService {
}
@Override
public Page<Order> read(Order entity, Pageable pageable) {
public Page<Order> find(Order entity, Pageable pageable) {
Example<Order> example = Example.of(entity);
return repository.findAll(example,pageable);
}
@Override
public Order readOne(java.lang.Integer primaryKey) {
return repository.getOne(primaryKey);
public Optional<Order> getOne(java.lang.Integer primaryKey) {
return repository.findById(primaryKey);
}
@Override

View File

@@ -9,9 +9,10 @@ import org.springframework.data.domain.Example;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import java.util.Optional;
/**
* Generated by Springboot-3layer-Generator at Jan 23, 2023, 11:09:45 AM
* Generated by Springboot-3layer-Generator at Feb 26, 2023, 4:26:01 PM
*/
@Service
public class UserServiceBean implements UserService {
@@ -30,14 +31,14 @@ public class UserServiceBean implements UserService {
}
@Override
public Page<User> read(User entity, Pageable pageable) {
public Page<User> find(User entity, Pageable pageable) {
Example<User> example = Example.of(entity);
return repository.findAll(example,pageable);
}
@Override
public User readOne(java.lang.Integer primaryKey) {
return repository.getOne(primaryKey);
public Optional<User> getOne(java.lang.Integer primaryKey) {
return repository.findById(primaryKey);
}
@Override

View File

@@ -5,7 +5,7 @@ import com.example.demo.controller.dto.BookDTO;
import org.mapstruct.Mapper;
/**
* Generated by Springboot-3layer-Generator at Jan 23, 2023, 11:09:45 AM
* Generated by Springboot-3layer-Generator at Feb 26, 2023, 4:26:01 PM
*/
@Mapper(componentModel = "spring")
public interface BookMapper {

View File

@@ -5,7 +5,7 @@ import com.example.demo.controller.dto.OrderDTO;
import org.mapstruct.Mapper;
/**
* Generated by Springboot-3layer-Generator at Jan 23, 2023, 11:09:45 AM
* Generated by Springboot-3layer-Generator at Feb 26, 2023, 4:26:01 PM
*/
@Mapper(componentModel = "spring")
public interface OrderMapper {

View File

@@ -5,7 +5,7 @@ import com.example.demo.controller.dto.UserDTO;
import org.mapstruct.Mapper;
/**
* Generated by Springboot-3layer-Generator at Jan 23, 2023, 11:09:45 AM
* Generated by Springboot-3layer-Generator at Feb 26, 2023, 4:26:01 PM
*/
@Mapper(componentModel = "spring")
public interface UserMapper {

View File

@@ -0,0 +1,10 @@
package com.example.demo.serviceInterface;
import com.example.demo.model.Book;
/**
* Generated by Springboot-3layer-Generator at Feb 26, 2023, 4:11:11 PM
*/
public interface BookService extends CrudService<Book,java.lang.Integer> {
}

View File

@@ -2,18 +2,20 @@ package com.example.demo.serviceInterface;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import java.util.Optional;
/**
* Generated by Springboot-3layer-Generator at Jan 23, 2023, 10:45:37 AM
* Generated by Springboot-3layer-Generator at Feb 26, 2023, 4:20:30 PM
*/
public interface CrudService<E,P> {
public interface CrudService<E, P> {
E create(E entity);
E update(E entity);
Page<E> read(E entity, Pageable pageable);
E readOne(P primaryKey);
Page<E> find(E entity, Pageable pageable);
Optional<E> getOne(P primaryKey);
void delete(P primaryKey);

View File

@@ -0,0 +1,10 @@
package com.example.demo.serviceInterface;
import com.example.demo.model.Order;
/**
* Generated by Springboot-3layer-Generator at Feb 26, 2023, 4:11:11 PM
*/
public interface OrderService extends CrudService<Order,java.lang.Integer> {
}

View File

@@ -0,0 +1,10 @@
package com.example.demo.serviceInterface;
import com.example.demo.model.User;
/**
* Generated by Springboot-3layer-Generator at Feb 26, 2023, 4:11:11 PM
*/
public interface UserService extends CrudService<User,java.lang.Integer> {
}

View File

@@ -0,0 +1,48 @@
package com.example.demo.serviceInterface.impl;
import com.example.demo.model.Book;
import com.example.demo.repository.BookRepository;
import com.example.demo.serviceInterface.BookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Example;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import java.util.Optional;
/**
* Generated by Springboot-3layer-Generator at Feb 26, 2023, 4:11:11 PM
*/
@Service
public class BookServiceBean implements BookService {
@Autowired
private BookRepository repository;
@Override
public Book create(Book entity) {
return repository.save(entity);
}
@Override
public Book update(Book entity) {
return repository.save(entity);
}
@Override
public Page<Book> find(Book entity, Pageable pageable) {
Example<Book> example = Example.of(entity);
return repository.findAll(example,pageable);
}
@Override
public Optional<Book> getOne(java.lang.Integer primaryKey) {
return repository.findById(primaryKey);
}
@Override
public void delete(java.lang.Integer primaryKey) {
repository.deleteById(primaryKey);
}
}

View File

@@ -0,0 +1,48 @@
package com.example.demo.serviceInterface.impl;
import com.example.demo.model.Order;
import com.example.demo.repository.OrderRepository;
import com.example.demo.serviceInterface.OrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Example;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import java.util.Optional;
/**
* Generated by Springboot-3layer-Generator at Feb 26, 2023, 4:11:11 PM
*/
@Service
public class OrderServiceBean implements OrderService {
@Autowired
private OrderRepository repository;
@Override
public Order create(Order entity) {
return repository.save(entity);
}
@Override
public Order update(Order entity) {
return repository.save(entity);
}
@Override
public Page<Order> find(Order entity, Pageable pageable) {
Example<Order> example = Example.of(entity);
return repository.findAll(example,pageable);
}
@Override
public Optional<Order> getOne(java.lang.Integer primaryKey) {
return repository.findById(primaryKey);
}
@Override
public void delete(java.lang.Integer primaryKey) {
repository.deleteById(primaryKey);
}
}

View File

@@ -0,0 +1,48 @@
package com.example.demo.serviceInterface.impl;
import com.example.demo.model.User;
import com.example.demo.repository.UserRepository;
import com.example.demo.serviceInterface.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Example;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import java.util.Optional;
/**
* Generated by Springboot-3layer-Generator at Feb 26, 2023, 4:11:11 PM
*/
@Service
public class UserServiceBean implements UserService {
@Autowired
private UserRepository repository;
@Override
public User create(User entity) {
return repository.save(entity);
}
@Override
public User update(User entity) {
return repository.save(entity);
}
@Override
public Page<User> find(User entity, Pageable pageable) {
Example<User> example = Example.of(entity);
return repository.findAll(example,pageable);
}
@Override
public Optional<User> getOne(java.lang.Integer primaryKey) {
return repository.findById(primaryKey);
}
@Override
public void delete(java.lang.Integer primaryKey) {
repository.deleteById(primaryKey);
}
}

View File

@@ -0,0 +1,17 @@
package com.example.demo.serviceInterface.mapper;
import com.example.demo.model.Book;
import com.example.demo.controller.dto.BookDTO;
import org.mapstruct.Mapper;
/**
* Generated by Springboot-3layer-Generator at Feb 26, 2023, 4:11:11 PM
*/
@Mapper(componentModel = "spring")
public interface BookMapper {
Book toEntity(BookDTO dto);
BookDTO toDto(Book entity);
}

View File

@@ -0,0 +1,17 @@
package com.example.demo.serviceInterface.mapper;
import com.example.demo.model.Order;
import com.example.demo.controller.dto.OrderDTO;
import org.mapstruct.Mapper;
/**
* Generated by Springboot-3layer-Generator at Feb 26, 2023, 4:11:11 PM
*/
@Mapper(componentModel = "spring")
public interface OrderMapper {
Order toEntity(OrderDTO dto);
OrderDTO toDto(Order entity);
}

View File

@@ -0,0 +1,17 @@
package com.example.demo.serviceInterface.mapper;
import com.example.demo.model.User;
import com.example.demo.controller.dto.UserDTO;
import org.mapstruct.Mapper;
/**
* Generated by Springboot-3layer-Generator at Feb 26, 2023, 4:11:11 PM
*/
@Mapper(componentModel = "spring")
public interface UserMapper {
User toEntity(UserDTO dto);
UserDTO toDto(User entity);
}

View File

@@ -1,8 +1,9 @@
projectPath: /Users/Gaetano_Piazzolla/Workspaces/workspace_private/Layer3Gen/demo-jakarta
projectPath: ./
outputDirectory : src/main/java
options:
dtoLayer : true
serviceInterface: true
entityControllers: true
inputPackages:
jpaEntities : com.example.demo.model

View File

@@ -1,8 +1,5 @@
buildscript {
dependencies {
classpath "gradle.plugin.gae.piaz:layer3gen:1.8"
}
repositories {
mavenCentral()
}
@@ -11,6 +8,7 @@ plugins {
id 'org.springframework.boot' version '2.3.4.RELEASE'
id 'io.spring.dependency-management' version '1.0.10.RELEASE'
id 'java'
id "gae.piaz.layer3gen" version "1.9"
}
repositories {
@@ -21,27 +19,19 @@ group = 'com.example'
version = '0.0.1-SNAPSHOT'
dependencies {
implementation 'org.springframework.boot:spring-boot-starter'
// needed dependency also for generated classes
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.mapstruct:mapstruct:1.3.1.Final'
compileOnly 'org.projectlombok:lombok:1.18.2'
annotationProcessor "org.mapstruct:mapstruct-processor:1.3.1.Final"
annotationProcessor 'org.projectlombok:lombok:1.18.12'
implementation 'org.mapstruct:mapstruct:1.5.3.Final'
compileOnly 'org.projectlombok:lombok:1.18.26'
runtimeOnly 'com.h2database:h2'
annotationProcessor 'org.projectlombok:lombok:1.18.26'
annotationProcessor "org.mapstruct:mapstruct-processor:1.5.3.Final"
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}
}
test {
useJUnitPlatform()
}
apply plugin: 'gae.piaz.layer3gen'

View File

@@ -1,7 +1,7 @@
package com.example.demo.controller;
import com.example.demo.model.Book;
import com.example.demo.serviceInterface.BookService;
import com.example.demo.service.BookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
@@ -9,9 +9,10 @@ import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.Optional;
/**
* Generated by Springboot-3layer-Generator at Jan 23, 2023, 10:35:30 AM
* Generated by Springboot-3layer-Generator at Feb 26, 2023, 4:26:01 PM
*/
@RestController
@RequestMapping("/book/")
@@ -31,17 +32,17 @@ public class BookController implements CrudController<Book,java.lang.Integer>{
}
@Override
public ResponseEntity<Page<Book>> read(
public ResponseEntity<Page<Book>> find(
@RequestBody Book entity,
@RequestParam("page") Integer page,
@RequestParam("size") Integer size) {
Pageable pageable = PageRequest.of(page,size);
return ResponseEntity.ok(service.read(entity,pageable));
return ResponseEntity.ok(service.find(entity,pageable));
}
@Override
public ResponseEntity<Book> readOne(@PathVariable("id") java.lang.Integer primaryKey) {
return ResponseEntity.ok(service.readOne(primaryKey));
public ResponseEntity<Book> getOne(@PathVariable("id") java.lang.Integer primaryKey) {
return service.getOne(primaryKey).map(ResponseEntity::ok).orElseGet(() -> ResponseEntity.notFound().build());
}
@Override

View File

@@ -2,8 +2,8 @@ package com.example.demo.controller;
import com.example.demo.model.Book;
import com.example.demo.controller.dto.BookDTO;
import com.example.demo.serviceInterface.BookService;
import com.example.demo.serviceInterface.mapper.BookMapper;
import com.example.demo.service.BookService;
import com.example.demo.service.mapper.BookMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
@@ -11,9 +11,10 @@ import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.Optional;
/**
* Generated by Springboot-3layer-Generator at Jan 23, 2023, 10:35:30 AM
* Generated by Springboot-3layer-Generator at Feb 26, 2023, 4:26:01 PM
*/
@RestController
@RequestMapping("/book-dto/")
@@ -40,20 +41,20 @@ public class BookControllerDTO implements CrudController<BookDTO,java.lang.Integ
}
@Override
public ResponseEntity<Page<BookDTO>> read(
public ResponseEntity<Page<BookDTO>> find(
@RequestBody BookDTO dto,
@RequestParam("page") Integer page,
@RequestParam("size") Integer size) {
Pageable pageable = PageRequest.of(page,size);
Book entity = mapper.toEntity(dto);
Page<BookDTO> pages = service.read(entity, pageable).map(mapper::toDto);
Page<BookDTO> pages = service.find(entity, pageable).map(mapper::toDto);
return ResponseEntity.ok(pages);
}
@Override
public ResponseEntity<BookDTO> readOne(@PathVariable("id") java.lang.Integer primaryKey) {
Book entity = service.readOne(primaryKey);
return ResponseEntity.ok(mapper.toDto(entity));
public ResponseEntity<BookDTO> getOne(@PathVariable("id") java.lang.Integer primaryKey) {
Optional<Book> entity = service.getOne(primaryKey);
return entity.map(e -> ResponseEntity.ok(mapper.toDto(e))).orElseGet(() -> ResponseEntity.notFound().build());
}
@Override

View File

@@ -8,7 +8,7 @@ import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
/**
* Generated by Springboot-3layer-Generator at Jan 23, 2023, 10:35:29 AM
* Generated by Springboot-3layer-Generator at Feb 26, 2023, 4:26:01 PM
*/
public interface CrudController<O,P>{
@@ -19,9 +19,10 @@ public interface CrudController<O,P>{
ResponseEntity<O> update(O object);
@PostMapping("find")
ResponseEntity<Page<O>> read(O object, Integer page, Integer size);
ResponseEntity<Page<O>> find(O object, Integer page, Integer size);
@GetMapping("{id}")
ResponseEntity<O> readOne(P primaryKey);
ResponseEntity<O> getOne(P primaryKey);
@DeleteMapping
void delete(P primaryKey);

View File

@@ -1,7 +1,7 @@
package com.example.demo.controller;
import com.example.demo.model.Order;
import com.example.demo.serviceInterface.OrderService;
import com.example.demo.service.OrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
@@ -9,9 +9,10 @@ import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.Optional;
/**
* Generated by Springboot-3layer-Generator at Jan 23, 2023, 10:35:29 AM
* Generated by Springboot-3layer-Generator at Feb 26, 2023, 4:26:01 PM
*/
@RestController
@RequestMapping("/order/")
@@ -31,17 +32,17 @@ public class OrderController implements CrudController<Order,java.lang.Integer>{
}
@Override
public ResponseEntity<Page<Order>> read(
public ResponseEntity<Page<Order>> find(
@RequestBody Order entity,
@RequestParam("page") Integer page,
@RequestParam("size") Integer size) {
Pageable pageable = PageRequest.of(page,size);
return ResponseEntity.ok(service.read(entity,pageable));
return ResponseEntity.ok(service.find(entity,pageable));
}
@Override
public ResponseEntity<Order> readOne(@PathVariable("id") java.lang.Integer primaryKey) {
return ResponseEntity.ok(service.readOne(primaryKey));
public ResponseEntity<Order> getOne(@PathVariable("id") java.lang.Integer primaryKey) {
return service.getOne(primaryKey).map(ResponseEntity::ok).orElseGet(() -> ResponseEntity.notFound().build());
}
@Override

View File

@@ -2,8 +2,8 @@ package com.example.demo.controller;
import com.example.demo.model.Order;
import com.example.demo.controller.dto.OrderDTO;
import com.example.demo.serviceInterface.OrderService;
import com.example.demo.serviceInterface.mapper.OrderMapper;
import com.example.demo.service.OrderService;
import com.example.demo.service.mapper.OrderMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
@@ -11,9 +11,10 @@ import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.Optional;
/**
* Generated by Springboot-3layer-Generator at Jan 23, 2023, 10:35:30 AM
* Generated by Springboot-3layer-Generator at Feb 26, 2023, 4:26:01 PM
*/
@RestController
@RequestMapping("/order-dto/")
@@ -40,20 +41,20 @@ public class OrderControllerDTO implements CrudController<OrderDTO,java.lang.Int
}
@Override
public ResponseEntity<Page<OrderDTO>> read(
public ResponseEntity<Page<OrderDTO>> find(
@RequestBody OrderDTO dto,
@RequestParam("page") Integer page,
@RequestParam("size") Integer size) {
Pageable pageable = PageRequest.of(page,size);
Order entity = mapper.toEntity(dto);
Page<OrderDTO> pages = service.read(entity, pageable).map(mapper::toDto);
Page<OrderDTO> pages = service.find(entity, pageable).map(mapper::toDto);
return ResponseEntity.ok(pages);
}
@Override
public ResponseEntity<OrderDTO> readOne(@PathVariable("id") java.lang.Integer primaryKey) {
Order entity = service.readOne(primaryKey);
return ResponseEntity.ok(mapper.toDto(entity));
public ResponseEntity<OrderDTO> getOne(@PathVariable("id") java.lang.Integer primaryKey) {
Optional<Order> entity = service.getOne(primaryKey);
return entity.map(e -> ResponseEntity.ok(mapper.toDto(e))).orElseGet(() -> ResponseEntity.notFound().build());
}
@Override

View File

@@ -1,7 +1,7 @@
package com.example.demo.controller;
import com.example.demo.model.User;
import com.example.demo.serviceInterface.UserService;
import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
@@ -9,9 +9,10 @@ import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.Optional;
/**
* Generated by Springboot-3layer-Generator at Jan 23, 2023, 10:35:30 AM
* Generated by Springboot-3layer-Generator at Feb 26, 2023, 4:26:01 PM
*/
@RestController
@RequestMapping("/user/")
@@ -31,17 +32,17 @@ public class UserController implements CrudController<User,java.lang.Integer>{
}
@Override
public ResponseEntity<Page<User>> read(
public ResponseEntity<Page<User>> find(
@RequestBody User entity,
@RequestParam("page") Integer page,
@RequestParam("size") Integer size) {
Pageable pageable = PageRequest.of(page,size);
return ResponseEntity.ok(service.read(entity,pageable));
return ResponseEntity.ok(service.find(entity,pageable));
}
@Override
public ResponseEntity<User> readOne(@PathVariable("id") java.lang.Integer primaryKey) {
return ResponseEntity.ok(service.readOne(primaryKey));
public ResponseEntity<User> getOne(@PathVariable("id") java.lang.Integer primaryKey) {
return service.getOne(primaryKey).map(ResponseEntity::ok).orElseGet(() -> ResponseEntity.notFound().build());
}
@Override

View File

@@ -2,8 +2,8 @@ package com.example.demo.controller;
import com.example.demo.model.User;
import com.example.demo.controller.dto.UserDTO;
import com.example.demo.serviceInterface.UserService;
import com.example.demo.serviceInterface.mapper.UserMapper;
import com.example.demo.service.UserService;
import com.example.demo.service.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
@@ -11,9 +11,10 @@ import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.Optional;
/**
* Generated by Springboot-3layer-Generator at Jan 23, 2023, 10:35:30 AM
* Generated by Springboot-3layer-Generator at Feb 26, 2023, 4:26:01 PM
*/
@RestController
@RequestMapping("/user-dto/")
@@ -40,20 +41,20 @@ public class UserControllerDTO implements CrudController<UserDTO,java.lang.Integ
}
@Override
public ResponseEntity<Page<UserDTO>> read(
public ResponseEntity<Page<UserDTO>> find(
@RequestBody UserDTO dto,
@RequestParam("page") Integer page,
@RequestParam("size") Integer size) {
Pageable pageable = PageRequest.of(page,size);
User entity = mapper.toEntity(dto);
Page<UserDTO> pages = service.read(entity, pageable).map(mapper::toDto);
Page<UserDTO> pages = service.find(entity, pageable).map(mapper::toDto);
return ResponseEntity.ok(pages);
}
@Override
public ResponseEntity<UserDTO> readOne(@PathVariable("id") java.lang.Integer primaryKey) {
User entity = service.readOne(primaryKey);
return ResponseEntity.ok(mapper.toDto(entity));
public ResponseEntity<UserDTO> getOne(@PathVariable("id") java.lang.Integer primaryKey) {
Optional<User> entity = service.getOne(primaryKey);
return entity.map(e -> ResponseEntity.ok(mapper.toDto(e))).orElseGet(() -> ResponseEntity.notFound().build());
}
@Override

View File

@@ -2,11 +2,8 @@ package com.example.demo.controller.dto;
import lombok.Data;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
/**
* Generated by Springboot-3layer-Generator at Jan 23, 2023, 10:35:30 AM
* Generated by Springboot-3layer-Generator at Feb 26, 2023, 4:26:01 PM
*/
@Data
public class BookDTO {

View File

@@ -2,11 +2,8 @@ package com.example.demo.controller.dto;
import lombok.Data;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
/**
* Generated by Springboot-3layer-Generator at Jan 23, 2023, 10:35:30 AM
* Generated by Springboot-3layer-Generator at Feb 26, 2023, 4:26:01 PM
*/
@Data
public class OrderDTO {

View File

@@ -2,11 +2,8 @@ package com.example.demo.controller.dto;
import lombok.Data;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
/**
* Generated by Springboot-3layer-Generator at Jan 23, 2023, 10:35:30 AM
* Generated by Springboot-3layer-Generator at Feb 26, 2023, 4:26:01 PM
*/
@Data
public class UserDTO {

View File

@@ -5,7 +5,7 @@ import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
/**
* Generated by Springboot-3layer-Generator at Jan 23, 2023, 10:35:30 AM
* Generated by Springboot-3layer-Generator at Feb 26, 2023, 4:26:01 PM
*/
@Repository
public interface BookRepository extends JpaRepository<Book, java.lang.Integer> {

View File

@@ -5,7 +5,7 @@ import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
/**
* Generated by Springboot-3layer-Generator at Jan 23, 2023, 10:35:29 AM
* Generated by Springboot-3layer-Generator at Feb 26, 2023, 4:26:01 PM
*/
@Repository
public interface OrderRepository extends JpaRepository<Order, java.lang.Integer> {

View File

@@ -5,7 +5,7 @@ import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
/**
* Generated by Springboot-3layer-Generator at Jan 23, 2023, 10:35:30 AM
* Generated by Springboot-3layer-Generator at Feb 26, 2023, 4:26:01 PM
*/
@Repository
public interface UserRepository extends JpaRepository<User, java.lang.Integer> {

View File

@@ -3,7 +3,7 @@ package com.example.demo.service;
import com.example.demo.model.Book;
/**
* Generated by Springboot-3layer-Generator at Jan 23, 2023, 10:03:25 AM
* Generated by Springboot-3layer-Generator at Feb 26, 2023, 4:26:01 PM
*/
public interface BookService extends CrudService<Book,java.lang.Integer> {

View File

@@ -2,18 +2,20 @@ package com.example.demo.service;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import java.util.Optional;
/**
* Generated by Springboot-3layer-Generator at Jan 23, 2023, 10:03:25 AM
* Generated by Springboot-3layer-Generator at Feb 26, 2023, 4:26:01 PM
*/
public interface CrudService<E,P> {
public interface CrudService<E, P> {
E create(E entity);
E update(E entity);
Page<E> read(E entity, Pageable pageable);
E readOne(P primaryKey);
Page<E> find(E entity, Pageable pageable);
Optional<E> getOne(P primaryKey);
void delete(P primaryKey);

View File

@@ -3,7 +3,7 @@ package com.example.demo.service;
import com.example.demo.model.Order;
/**
* Generated by Springboot-3layer-Generator at Jan 23, 2023, 10:03:25 AM
* Generated by Springboot-3layer-Generator at Feb 26, 2023, 4:26:01 PM
*/
public interface OrderService extends CrudService<Order,java.lang.Integer> {

View File

@@ -3,7 +3,7 @@ package com.example.demo.service;
import com.example.demo.model.User;
/**
* Generated by Springboot-3layer-Generator at Jan 23, 2023, 10:03:25 AM
* Generated by Springboot-3layer-Generator at Feb 26, 2023, 4:26:01 PM
*/
public interface UserService extends CrudService<User,java.lang.Integer> {

View File

@@ -9,9 +9,10 @@ import org.springframework.data.domain.Example;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import java.util.Optional;
/**
* Generated by Springboot-3layer-Generator at Jan 23, 2023, 10:03:25 AM
* Generated by Springboot-3layer-Generator at Feb 26, 2023, 4:26:01 PM
*/
@Service
public class BookServiceBean implements BookService {
@@ -30,14 +31,14 @@ public class BookServiceBean implements BookService {
}
@Override
public Page<Book> read(Book entity, Pageable pageable) {
public Page<Book> find(Book entity, Pageable pageable) {
Example<Book> example = Example.of(entity);
return repository.findAll(example,pageable);
}
@Override
public Book readOne(java.lang.Integer primaryKey) {
return repository.getOne(primaryKey);
public Optional<Book> getOne(java.lang.Integer primaryKey) {
return repository.findById(primaryKey);
}
@Override

View File

@@ -9,9 +9,10 @@ import org.springframework.data.domain.Example;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import java.util.Optional;
/**
* Generated by Springboot-3layer-Generator at Jan 23, 2023, 10:03:25 AM
* Generated by Springboot-3layer-Generator at Feb 26, 2023, 4:26:01 PM
*/
@Service
public class OrderServiceBean implements OrderService {
@@ -30,14 +31,14 @@ public class OrderServiceBean implements OrderService {
}
@Override
public Page<Order> read(Order entity, Pageable pageable) {
public Page<Order> find(Order entity, Pageable pageable) {
Example<Order> example = Example.of(entity);
return repository.findAll(example,pageable);
}
@Override
public Order readOne(java.lang.Integer primaryKey) {
return repository.getOne(primaryKey);
public Optional<Order> getOne(java.lang.Integer primaryKey) {
return repository.findById(primaryKey);
}
@Override

View File

@@ -9,9 +9,10 @@ import org.springframework.data.domain.Example;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import java.util.Optional;
/**
* Generated by Springboot-3layer-Generator at Jan 23, 2023, 10:03:25 AM
* Generated by Springboot-3layer-Generator at Feb 26, 2023, 4:26:01 PM
*/
@Service
public class UserServiceBean implements UserService {
@@ -30,14 +31,14 @@ public class UserServiceBean implements UserService {
}
@Override
public Page<User> read(User entity, Pageable pageable) {
public Page<User> find(User entity, Pageable pageable) {
Example<User> example = Example.of(entity);
return repository.findAll(example,pageable);
}
@Override
public User readOne(java.lang.Integer primaryKey) {
return repository.getOne(primaryKey);
public Optional<User> getOne(java.lang.Integer primaryKey) {
return repository.findById(primaryKey);
}
@Override

View File

@@ -5,7 +5,7 @@ import com.example.demo.controller.dto.BookDTO;
import org.mapstruct.Mapper;
/**
* Generated by Springboot-3layer-Generator at Jan 23, 2023, 10:03:25 AM
* Generated by Springboot-3layer-Generator at Feb 26, 2023, 4:26:01 PM
*/
@Mapper(componentModel = "spring")
public interface BookMapper {

View File

@@ -5,7 +5,7 @@ import com.example.demo.controller.dto.OrderDTO;
import org.mapstruct.Mapper;
/**
* Generated by Springboot-3layer-Generator at Jan 23, 2023, 10:03:25 AM
* Generated by Springboot-3layer-Generator at Feb 26, 2023, 4:26:01 PM
*/
@Mapper(componentModel = "spring")
public interface OrderMapper {

View File

@@ -5,7 +5,7 @@ import com.example.demo.controller.dto.UserDTO;
import org.mapstruct.Mapper;
/**
* Generated by Springboot-3layer-Generator at Jan 23, 2023, 10:03:25 AM
* Generated by Springboot-3layer-Generator at Feb 26, 2023, 4:26:01 PM
*/
@Mapper(componentModel = "spring")
public interface UserMapper {

View File

@@ -3,7 +3,7 @@ package com.example.demo.serviceInterface;
import com.example.demo.model.Book;
/**
* Generated by Springboot-3layer-Generator at Jan 23, 2023, 10:35:30 AM
* Generated by Springboot-3layer-Generator at Feb 26, 2023, 4:20:30 PM
*/
public interface BookService extends CrudService<Book,java.lang.Integer> {

View File

@@ -2,18 +2,20 @@ package com.example.demo.serviceInterface;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import java.util.Optional;
/**
* Generated by Springboot-3layer-Generator at Jan 23, 2023, 10:35:29 AM
* Generated by Springboot-3layer-Generator at Feb 26, 2023, 4:20:29 PM
*/
public interface CrudService<E,P> {
public interface CrudService<E, P> {
E create(E entity);
E update(E entity);
Page<E> read(E entity, Pageable pageable);
E readOne(P primaryKey);
Page<E> find(E entity, Pageable pageable);
Optional<E> getOne(P primaryKey);
void delete(P primaryKey);

View File

@@ -3,7 +3,7 @@ package com.example.demo.serviceInterface;
import com.example.demo.model.Order;
/**
* Generated by Springboot-3layer-Generator at Jan 23, 2023, 10:35:29 AM
* Generated by Springboot-3layer-Generator at Feb 26, 2023, 4:20:30 PM
*/
public interface OrderService extends CrudService<Order,java.lang.Integer> {

View File

@@ -3,7 +3,7 @@ package com.example.demo.serviceInterface;
import com.example.demo.model.User;
/**
* Generated by Springboot-3layer-Generator at Jan 23, 2023, 10:35:30 AM
* Generated by Springboot-3layer-Generator at Feb 26, 2023, 4:20:30 PM
*/
public interface UserService extends CrudService<User,java.lang.Integer> {

View File

@@ -9,9 +9,10 @@ import org.springframework.data.domain.Example;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import java.util.Optional;
/**
* Generated by Springboot-3layer-Generator at Jan 23, 2023, 10:35:30 AM
* Generated by Springboot-3layer-Generator at Feb 26, 2023, 4:20:30 PM
*/
@Service
public class BookServiceBean implements BookService {
@@ -30,14 +31,14 @@ public class BookServiceBean implements BookService {
}
@Override
public Page<Book> read(Book entity, Pageable pageable) {
public Page<Book> find(Book entity, Pageable pageable) {
Example<Book> example = Example.of(entity);
return repository.findAll(example,pageable);
}
@Override
public Book readOne(java.lang.Integer primaryKey) {
return repository.getOne(primaryKey);
public Optional<Book> getOne(java.lang.Integer primaryKey) {
return repository.findById(primaryKey);
}
@Override

View File

@@ -9,9 +9,10 @@ import org.springframework.data.domain.Example;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import java.util.Optional;
/**
* Generated by Springboot-3layer-Generator at Jan 23, 2023, 10:35:29 AM
* Generated by Springboot-3layer-Generator at Feb 26, 2023, 4:20:30 PM
*/
@Service
public class OrderServiceBean implements OrderService {
@@ -30,14 +31,14 @@ public class OrderServiceBean implements OrderService {
}
@Override
public Page<Order> read(Order entity, Pageable pageable) {
public Page<Order> find(Order entity, Pageable pageable) {
Example<Order> example = Example.of(entity);
return repository.findAll(example,pageable);
}
@Override
public Order readOne(java.lang.Integer primaryKey) {
return repository.getOne(primaryKey);
public Optional<Order> getOne(java.lang.Integer primaryKey) {
return repository.findById(primaryKey);
}
@Override

View File

@@ -9,9 +9,10 @@ import org.springframework.data.domain.Example;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import java.util.Optional;
/**
* Generated by Springboot-3layer-Generator at Jan 23, 2023, 10:35:30 AM
* Generated by Springboot-3layer-Generator at Feb 26, 2023, 4:20:30 PM
*/
@Service
public class UserServiceBean implements UserService {
@@ -30,14 +31,14 @@ public class UserServiceBean implements UserService {
}
@Override
public Page<User> read(User entity, Pageable pageable) {
public Page<User> find(User entity, Pageable pageable) {
Example<User> example = Example.of(entity);
return repository.findAll(example,pageable);
}
@Override
public User readOne(java.lang.Integer primaryKey) {
return repository.getOne(primaryKey);
public Optional<User> getOne(java.lang.Integer primaryKey) {
return repository.findById(primaryKey);
}
@Override

View File

@@ -5,7 +5,7 @@ import com.example.demo.controller.dto.BookDTO;
import org.mapstruct.Mapper;
/**
* Generated by Springboot-3layer-Generator at Jan 23, 2023, 10:35:30 AM
* Generated by Springboot-3layer-Generator at Feb 26, 2023, 4:20:30 PM
*/
@Mapper(componentModel = "spring")
public interface BookMapper {

View File

@@ -5,7 +5,7 @@ import com.example.demo.controller.dto.OrderDTO;
import org.mapstruct.Mapper;
/**
* Generated by Springboot-3layer-Generator at Jan 23, 2023, 10:35:30 AM
* Generated by Springboot-3layer-Generator at Feb 26, 2023, 4:20:30 PM
*/
@Mapper(componentModel = "spring")
public interface OrderMapper {

View File

@@ -5,7 +5,7 @@ import com.example.demo.controller.dto.UserDTO;
import org.mapstruct.Mapper;
/**
* Generated by Springboot-3layer-Generator at Jan 23, 2023, 10:35:30 AM
* Generated by Springboot-3layer-Generator at Feb 26, 2023, 4:20:30 PM
*/
@Mapper(componentModel = "spring")
public interface UserMapper {

View File

@@ -1,8 +1,9 @@
projectPath: /Users/Gaetano_Piazzolla/Workspaces/workspace_private/Layer3Gen/demo
projectPath: ./
outputDirectory : src/main/java
options:
dtoLayer : true
serviceInterface: true
entityControllers: true
inputPackages:
jpaEntities : com.example.demo.model

View File

@@ -2,10 +2,6 @@ package gae.piaz.layer3gen;
import freemarker.template.TemplateException;
import gae.piaz.layer3gen.config.CodeGeneratorConfig;
import lombok.extern.slf4j.Slf4j;
import org.reflections.Reflections;
import org.reflections.scanners.FieldAnnotationsScanner;
import java.io.IOException;
import java.lang.reflect.Field;
import java.net.URLClassLoader;
@@ -14,240 +10,291 @@ import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.Set;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.reflections.Reflections;
import org.reflections.scanners.FieldAnnotationsScanner;
@Slf4j
public class CodeGenerator {
private static CodeGeneratorConfig config;
private CodeGenerator() {}
private static URLClassLoader classLoader;
private static CodeGeneratorConfig config;
public static void run(CodeGeneratorConfig arg, URLClassLoader classLoader) throws IOException, TemplateException {
private static URLClassLoader classLoader;
CodeGenerator.config = arg;
CodeGenerator.classLoader = classLoader;
log.debug("configuration: {}", config);
log.debug("ClassLoader: {}", classLoader);
public static void run(CodeGeneratorConfig arg, URLClassLoader classLoader)
throws IOException, TemplateException {
Set<Class<?>> entities = getEntityClasses();
log.debug("found {} entities", entities.size());
generateCode(entities);
CodeGenerator.config = arg;
CodeGenerator.classLoader = classLoader;
log.debug("configuration: {}", config);
log.debug("ClassLoader: {}", classLoader);
Set<Class<?>> entities = getEntityClasses();
log.debug("found {} entities", entities.size());
generateCode(entities);
}
private static void generateCode(Set<Class<?>> entities) throws IOException, TemplateException {
createCrudInterfaces();
for (Class<?> entity : entities) {
createRepository(entity);
if (Boolean.TRUE.equals(config.getOptions().getServiceInterface())) {
createServiceBean(entity);
createServiceInterface(entity);
} else {
createService(entity);
}
if (Boolean.TRUE.equals(config.getOptions().getEntityControllers())) {
createController(entity);
}
if (Boolean.TRUE.equals(config.getOptions().getDtoLayer())) {
createDto(entity);
createMapper(entity);
createControllerDTO(entity);
}
}
}
private static Set<Class<?>> getEntityClasses() {
Reflections reflections =
new Reflections(config.getInputPackages().getJpaEntities(), classLoader);
Set<Class<?>> classes = reflections.getTypesAnnotatedWith(javax.persistence.Entity.class);
classes.addAll(reflections.getTypesAnnotatedWith(jakarta.persistence.Entity.class));
return classes;
}
private static void createControllerDTO(Class<?> entity) throws IOException, TemplateException {
CodeRenderer.RenderingData data = new CodeRenderer.RenderingData();
data.setConfig(config);
data.setEntityClass(entity.getSimpleName());
data.setPrimaryKeyClass(getPrimaryKeyClass(entity));
data.setEntityPackage(entity.getPackageName());
String code = CodeRenderer.render("controllerdto.ftl", data);
String filepath =
Paths.get(
config.getProjectPath(),
config.getOutputDirectory(),
config.getOutputPackages().getControllers().replaceAll("\\.", "/"),
entity.getSimpleName() + "ControllerDTO.java")
.toString();
writeFile(code, filepath);
}
private static void createMapper(Class<?> entity) throws IOException, TemplateException {
if (StringUtils.isBlank(config.getOutputPackages().getMappers())) {
config.getOutputPackages().setMappers(config.getOutputPackages().getServices() + ".mapper");
}
private static void generateCode(Set<Class<?>> entities) throws IOException, TemplateException {
CodeRenderer.RenderingData data = new CodeRenderer.RenderingData();
data.setConfig(config);
data.setEntityClass(entity.getSimpleName());
data.setEntityPackage(entity.getPackageName());
createCrudInterfaces();
String code = CodeRenderer.render("mapper.ftl", data);
String filepath =
Paths.get(
config.getProjectPath(),
config.getOutputDirectory(),
config.getOutputPackages().getMappers().replaceAll("\\.", "/"),
entity.getSimpleName() + "Mapper.java")
.toString();
for (Class<?> entity : entities) {
writeFile(code, filepath);
}
createRepository(entity);
if (config.getOptions().getServiceInterface()) {
createServiceBean(entity);
createServiceInterface(entity);
} else {
createService(entity);
}
createController(entity);
if (config.getOptions().getDtoLayer()) {
createDto(entity);
createMapper(entity);
createControllerDTO(entity);
}
}
private static void createDto(Class<?> entity) throws IOException, TemplateException {
if (StringUtils.isBlank(config.getOutputPackages().getDtos())) {
config.getOutputPackages().setDtos(config.getOutputPackages().getControllers() + ".dto");
}
private static Set<Class<?>> getEntityClasses() {
Reflections reflections = new Reflections(config.getInputPackages().getJpaEntities(), classLoader);
Set<Class<?>> classes = reflections.getTypesAnnotatedWith(javax.persistence.Entity.class);
classes.addAll(reflections.getTypesAnnotatedWith(jakarta.persistence.Entity.class));
return classes;
CodeRenderer.RenderingData data = new CodeRenderer.RenderingData();
data.setConfig(config);
data.setEntityClass(entity.getSimpleName());
data.setEntityFields(Arrays.asList(entity.getDeclaredFields()));
String code = CodeRenderer.render("dto.ftl", data);
String filepath =
Paths.get(
config.getProjectPath(),
config.getOutputDirectory(),
config.getOutputPackages().getDtos().replaceAll("\\.", "/"),
entity.getSimpleName() + "DTO.java")
.toString();
writeFile(code, filepath);
}
private static void createController(Class<?> entity) throws IOException, TemplateException {
CodeRenderer.RenderingData data = new CodeRenderer.RenderingData();
data.setConfig(config);
data.setEntityClass(entity.getSimpleName());
data.setPrimaryKeyClass(getPrimaryKeyClass(entity));
data.setEntityPackage(entity.getPackageName());
String code = CodeRenderer.render("controller.ftl", data);
String filepath =
Paths.get(
config.getProjectPath(),
config.getOutputDirectory(),
config.getOutputPackages().getControllers().replaceAll("\\.", "/"),
entity.getSimpleName() + "Controller.java")
.toString();
writeFile(code, filepath);
}
private static void createService(Class<?> entity) throws IOException, TemplateException {
CodeRenderer.RenderingData data = new CodeRenderer.RenderingData();
data.setConfig(config);
data.setEntityClass(entity.getSimpleName());
data.setPrimaryKeyClass(getPrimaryKeyClass(entity));
data.setEntityPackage(entity.getPackageName());
String code = CodeRenderer.render("service.ftl", data);
String filepath =
Paths.get(
config.getProjectPath(),
config.getOutputDirectory(),
config.getOutputPackages().getServices().replaceAll("\\.", "/"),
entity.getSimpleName() + "Service.java")
.toString();
writeFile(code, filepath);
}
private static void createServiceInterface(Class<?> entity)
throws IOException, TemplateException {
CodeRenderer.RenderingData data = new CodeRenderer.RenderingData();
data.setConfig(config);
data.setEntityClass(entity.getSimpleName());
data.setPrimaryKeyClass(getPrimaryKeyClass(entity));
data.setEntityPackage(entity.getPackageName());
String code = CodeRenderer.render("serviceInterface.ftl", data);
String filepath =
Paths.get(
config.getProjectPath(),
config.getOutputDirectory(),
config.getOutputPackages().getServices().replaceAll("\\.", "/"),
entity.getSimpleName() + "Service.java")
.toString();
writeFile(code, filepath);
}
private static void createServiceBean(Class<?> entity) throws IOException, TemplateException {
CodeRenderer.RenderingData data = new CodeRenderer.RenderingData();
data.setConfig(config);
data.setEntityClass(entity.getSimpleName());
data.setPrimaryKeyClass(getPrimaryKeyClass(entity));
data.setEntityPackage(entity.getPackageName());
String code = CodeRenderer.render("serviceBean.ftl", data);
String filepath =
Paths.get(
config.getProjectPath(),
config.getOutputDirectory(),
config.getOutputPackages().getServices().replaceAll("\\.", "/"),
"impl",
entity.getSimpleName() + "ServiceBean.java")
.toString();
writeFile(code, filepath);
}
private static void createCrudInterfaces() throws IOException, TemplateException {
CodeRenderer.RenderingData data = new CodeRenderer.RenderingData();
data.setConfig(config);
String code = CodeRenderer.render("crudservice.ftl", data);
String filepath =
Paths.get(
config.getProjectPath(),
config.getOutputDirectory(),
config.getOutputPackages().getServices().replaceAll("\\.", "/"),
"CrudService.java")
.toString();
writeFile(code, filepath);
code = CodeRenderer.render("crudcontroller.ftl", data);
filepath =
Paths.get(
config.getProjectPath(),
config.getOutputDirectory(),
config.getOutputPackages().getControllers().replaceAll("\\.", "/"),
"CrudController.java")
.toString();
writeFile(code, filepath);
}
private static void createRepository(Class<?> entity) throws IOException, TemplateException {
CodeRenderer.RenderingData data = new CodeRenderer.RenderingData();
data.setConfig(config);
data.setEntityClass(entity.getSimpleName());
data.setPrimaryKeyClass(getPrimaryKeyClass(entity));
String code = CodeRenderer.render("repository.ftl", data);
String filepath =
Paths.get(
config.getProjectPath(),
config.getOutputDirectory(),
config.getOutputPackages().getRepositories().replaceAll("\\.", "/"),
entity.getSimpleName() + "Repository.java")
.toString();
writeFile(code, filepath);
}
private static void writeFile(String code, String filepath) throws IOException {
Path path = Paths.get(filepath);
if (!Files.exists(path)) {
Files.createDirectories(path.getParent());
}
Files.write(path, code.getBytes());
log.debug("path: {}, code: {}", path, code);
}
private static String getPrimaryKeyClass(Class<?> entity) {
Reflections reflections = new Reflections(entity, classLoader, new FieldAnnotationsScanner());
Set<Field> ids = reflections.getFieldsAnnotatedWith(javax.persistence.Id.class);
ids.addAll(reflections.getFieldsAnnotatedWith(jakarta.persistence.Id.class));
if (ids.isEmpty()) {
ids = reflections.getFieldsAnnotatedWith(javax.persistence.EmbeddedId.class);
ids.addAll(reflections.getFieldsAnnotatedWith(javax.persistence.EmbeddedId.class));
if (ids.isEmpty()) {
log.warn("No @Id found for " + entity + " using generic object \"Object\" ");
return "Object";
}
}
private static void createControllerDTO(Class<?> entity) throws IOException, TemplateException {
CodeRenderer.RenderingData data = new CodeRenderer.RenderingData();
data.setConfig(config);
data.setEntityClass(entity.getSimpleName());
data.setPrimaryKeyClass(getPrimaryKeyClass(entity));
data.setEntityPackage(entity.getPackageName());
String code = CodeRenderer.render("controllerdto.ftl", data);
String filepath = config.getProjectPath() + "/" + config.getOutputDirectory() + "/" +
config.getOutputPackages().getControllers().replaceAll("\\.", "/") + "/" + entity.getSimpleName() + "ControllerDTO.java";
writeFile(code, filepath);
}
private static void createMapper(Class<?> entity) throws IOException, TemplateException {
CodeRenderer.RenderingData data = new CodeRenderer.RenderingData();
data.setConfig(config);
data.setEntityClass(entity.getSimpleName());
data.setEntityPackage(entity.getPackageName());
String code = CodeRenderer.render("mapper.ftl", data);
String filepath = config.getProjectPath() + "/" + config.getOutputDirectory() + "/" +
config.getOutputPackages().getServices().replaceAll("\\.", "/") + "/mapper/" + entity.getSimpleName() + "Mapper.java";
writeFile(code, filepath);
}
private static void createDto(Class<?> entity) throws IOException, TemplateException {
CodeRenderer.RenderingData data = new CodeRenderer.RenderingData();
data.setConfig(config);
data.setEntityClass(entity.getSimpleName());
data.setEntityFields(Arrays.asList(entity.getDeclaredFields()));
String code = CodeRenderer.render("dto.ftl", data);
String filepath = config.getProjectPath() + "/" + config.getOutputDirectory() + "/" +
config.getOutputPackages().getControllers().replaceAll("\\.", "/") + "/dto/" + entity.getSimpleName() + "DTO.java";
writeFile(code, filepath);
}
private static void createController(Class<?> entity) throws IOException, TemplateException {
CodeRenderer.RenderingData data = new CodeRenderer.RenderingData();
data.setConfig(config);
data.setEntityClass(entity.getSimpleName());
data.setPrimaryKeyClass(getPrimaryKeyClass(entity));
data.setEntityPackage(entity.getPackageName());
String code = CodeRenderer.render("controller.ftl", data);
String filepath = config.getProjectPath() + "/" + config.getOutputDirectory() + "/" +
config.getOutputPackages().getControllers().replaceAll("\\.", "/") + "/" + entity.getSimpleName() + "Controller.java";
writeFile(code, filepath);
}
private static void createService(Class<?> entity) throws IOException, TemplateException {
CodeRenderer.RenderingData data = new CodeRenderer.RenderingData();
data.setConfig(config);
data.setEntityClass(entity.getSimpleName());
data.setPrimaryKeyClass(getPrimaryKeyClass(entity));
data.setEntityPackage(entity.getPackageName());
String code = CodeRenderer.render("service.ftl", data);
String filepath = config.getProjectPath() + "/" + config.getOutputDirectory() + "/" +
config.getOutputPackages().getServices().replaceAll("\\.", "/") + "/" + entity.getSimpleName() + "Service.java";
writeFile(code, filepath);
}
private static void createServiceInterface(Class<?> entity) throws IOException, TemplateException {
CodeRenderer.RenderingData data = new CodeRenderer.RenderingData();
data.setConfig(config);
data.setEntityClass(entity.getSimpleName());
data.setPrimaryKeyClass(getPrimaryKeyClass(entity));
data.setEntityPackage(entity.getPackageName());
String code = CodeRenderer.render("serviceInterface.ftl", data);
String filepath = config.getProjectPath() + "/" + config.getOutputDirectory() + "/" +
config.getOutputPackages().getServices().replaceAll("\\.", "/") + "/" + entity.getSimpleName() + "Service.java";
writeFile(code, filepath);
}
private static void createServiceBean(Class<?> entity) throws IOException, TemplateException {
CodeRenderer.RenderingData data = new CodeRenderer.RenderingData();
data.setConfig(config);
data.setEntityClass(entity.getSimpleName());
data.setPrimaryKeyClass(getPrimaryKeyClass(entity));
data.setEntityPackage(entity.getPackageName());
String code = CodeRenderer.render("serviceBean.ftl", data);
String filepath = config.getProjectPath() + "/" + config.getOutputDirectory() + "/" +
config.getOutputPackages().getServices().replaceAll("\\.", "/")
+ "/impl/" + entity.getSimpleName() + "ServiceBean.java";
writeFile(code, filepath);
}
private static void createCrudInterfaces() throws IOException, TemplateException {
CodeRenderer.RenderingData data = new CodeRenderer.RenderingData();
data.setConfig(config);
String code = CodeRenderer.render("crudservice.ftl", data);
String filepath = config.getProjectPath() + "/" + config.getOutputDirectory() + "/" +
config.getOutputPackages().getServices().replaceAll("\\.", "/") + "/" + "CrudService.java";
writeFile(code, filepath);
code = CodeRenderer.render("crudcontroller.ftl", data);
filepath = config.getProjectPath() + "/" + config.getOutputDirectory() + "/" +
config.getOutputPackages().getControllers().replaceAll("\\.", "/") + "/" + "CrudController.java";
writeFile(code, filepath);
}
private static void createRepository(Class<?> entity) throws IOException, TemplateException {
CodeRenderer.RenderingData data = new CodeRenderer.RenderingData();
data.setConfig(config);
data.setEntityClass(entity.getSimpleName());
data.setPrimaryKeyClass(getPrimaryKeyClass(entity));
String code = CodeRenderer.render("repository.ftl", data);
String filepath = config.getProjectPath() + "/" + config.getOutputDirectory() + "/" +
config.getOutputPackages().getRepositories().replaceAll("\\.", "/") + "/" + entity.getSimpleName() + "Repository.java";
writeFile(code, filepath);
}
private static void writeFile(String code, String filepath) throws IOException {
Path path = Paths.get(filepath);
if (!Files.exists(path)) {
Files.createDirectories(path.getParent());
}
Files.write(path, code.getBytes());
log.debug("path: {}, code: {}", path, code);
}
private static String getPrimaryKeyClass(Class<?> entity) {
Reflections reflections = new Reflections(entity, classLoader, new FieldAnnotationsScanner());
Set<Field> ids = reflections.getFieldsAnnotatedWith(javax.persistence.Id.class);
ids.addAll(reflections.getFieldsAnnotatedWith(jakarta.persistence.Id.class));
if (ids.isEmpty()) {
ids = reflections.getFieldsAnnotatedWith(javax.persistence.EmbeddedId.class);
ids.addAll(reflections.getFieldsAnnotatedWith(javax.persistence.EmbeddedId.class));
if (ids.isEmpty()) {
log.warn("No @Id found for " + entity + " using generic object \"Object\" ");
return "Object";
}
}
return ids.stream().findFirst().get().getType().getName();
}
return ids.stream().findFirst().get().getType().getName();
}
}

View File

@@ -7,59 +7,51 @@ import freemarker.template.Template;
import freemarker.template.TemplateException;
import freemarker.template.TemplateExceptionHandler;
import gae.piaz.layer3gen.config.CodeGeneratorConfig;
import lombok.Data;
import java.io.*;
import java.lang.reflect.Field;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
import lombok.Data;
/**
* Code renderer.
*/
/** Code renderer. */
public class CodeRenderer {
/**
* Renders source code by using Freemarker template engine.
*/
public static String render(String templatePath, RenderingData data) throws IOException, TemplateException {
Configuration config = new Configuration(Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS);
StringTemplateLoader templateLoader = new StringTemplateLoader();
String source;
try (InputStream is = ResourceReader.getResourceAsStream(templatePath);
BufferedReader buffer = new BufferedReader(new InputStreamReader(is))) {
source = buffer.lines().collect(Collectors.joining("\n"));
}
templateLoader.putTemplate("template", source);
config.setTemplateLoader(templateLoader);
config.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
config.setObjectWrapper(new BeansWrapper(Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS));
config.setWhitespaceStripping(true);
try (Writer writer = new StringWriter()) {
Template template = config.getTemplate("template");
template.process(data, writer);
return writer.toString();
}
/** Renders source code by using Freemarker template engine. */
public static String render(String templatePath, RenderingData data)
throws IOException, TemplateException {
Configuration config = new Configuration(Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS);
StringTemplateLoader templateLoader = new StringTemplateLoader();
String source;
try (InputStream is = ResourceReader.getResourceAsStream(templatePath);
BufferedReader buffer = new BufferedReader(new InputStreamReader(is))) {
source = buffer.lines().collect(Collectors.joining("\n"));
}
templateLoader.putTemplate("template", source);
config.setTemplateLoader(templateLoader);
config.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
config.setObjectWrapper(new BeansWrapper(Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS));
config.setWhitespaceStripping(true);
/**
* Data used when rendering source code.
*/
@Data
public static class RenderingData {
private String entityClass;
private String entityPackage;
private String primaryKeyClass;
private CodeGeneratorConfig config;
private List<Field> entityFields;
private Date dateGen = new Date();
try (Writer writer = new StringWriter()) {
Template template = config.getTemplate("template");
template.process(data, writer);
return writer.toString();
}
}
/** Data used when rendering source code. */
@Data
public static class RenderingData {
private String entityClass;
private String entityPackage;
private String primaryKeyClass;
private CodeGeneratorConfig config;
private List<Field> entityFields;
private Date dateGen = new Date();
}
}

View File

@@ -5,21 +5,17 @@ import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
/**
* Utility to reader classpath resources.
*/
/** Utility to reader classpath resources. */
public class ResourceReader {
private ResourceReader() {
}
private ResourceReader() {}
public static InputStream getResourceAsStream(String path) throws IOException {
InputStream classPathResource = ResourceReader.class.getClassLoader().getResourceAsStream(path);
if (classPathResource != null) {
return classPathResource;
}
InputStream fileResource = new FileInputStream(new File(path));
return fileResource;
public static InputStream getResourceAsStream(String path) throws IOException {
InputStream classPathResource = ResourceReader.class.getClassLoader().getResourceAsStream(path);
if (classPathResource != null) {
return classPathResource;
}
InputStream fileResource = new FileInputStream(new File(path));
return fileResource;
}
}

View File

@@ -1,52 +1,46 @@
package gae.piaz.layer3gen.config;
import gae.piaz.layer3gen.ResourceReader;
import java.io.*;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.yaml.snakeyaml.Yaml;
import java.io.*;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
@Data
@Slf4j
public class CodeGeneratorConfig implements Serializable {
private String projectPath;
private String classesDirectory;
private String outputDirectory;
private Options options;
private InputPackages inputPackages;
private OutputPackages outputPackages;
private String projectPath;
private String classesDirectory;
private String outputDirectory;
private Options options;
private InputPackages inputPackages;
private OutputPackages outputPackages;
private static final Yaml YAML = new Yaml();
private static final Yaml YAML = new Yaml();
public static CodeGeneratorConfig load(String path, boolean fromClassPath) throws IOException {
if(StringUtils.isBlank(path)){
path = "3layer-settings.yml";
}
InputStream is;
if(!fromClassPath) {
Path a = Paths.get(path);
log.info("Configuration path: {}",a.toString());
is = Files.newInputStream(a);
}
else{
is = ResourceReader.getResourceAsStream(path);
}
try (Reader reader = new InputStreamReader(is)) {
return YAML.loadAs(reader, CodeGeneratorConfig.class);
}
public static CodeGeneratorConfig load(String path, boolean fromClassPath) throws IOException {
if (StringUtils.isBlank(path)) {
path = "3layer-settings.yml";
}
InputStream is;
if (!fromClassPath) {
Path a = Paths.get(path);
log.info("Configuration path: {}", a.toString());
is = Files.newInputStream(a);
} else {
is = ResourceReader.getResourceAsStream(path);
}
try (Reader reader = new InputStreamReader(is)) {
return YAML.loadAs(reader, CodeGeneratorConfig.class);
}
}
}

View File

@@ -4,5 +4,5 @@ import lombok.Data;
@Data
public class InputPackages {
private String jpaEntities;
private String jpaEntities;
}

View File

@@ -4,6 +4,7 @@ import lombok.Data;
@Data
public class Options {
private Boolean dtoLayer;
private Boolean serviceInterface;
private Boolean dtoLayer;
private Boolean serviceInterface;
private Boolean entityControllers;
}

View File

@@ -4,7 +4,9 @@ import lombok.Data;
@Data
public class OutputPackages {
private String repositories;
private String services;
private String controllers;
private String repositories;
private String services;
private String controllers;
private String dtos;
private String mappers;
}

View File

@@ -1,32 +1,28 @@
package gae.piaz.layer3gen.gradle;
import gae.piaz.layer3gen.config.CodeGeneratorConfig;
import org.gradle.api.Project;
import org.gradle.api.file.FileCollection;
import org.gradle.api.invocation.Gradle;
import org.gradle.api.plugins.JavaPluginConvention;
import org.gradle.api.tasks.SourceSetContainer;
import org.gradle.tooling.model.GradleProject;
import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.List;
import org.gradle.api.Project;
import org.gradle.api.file.FileCollection;
import org.gradle.api.plugins.JavaPluginConvention;
import org.gradle.api.tasks.SourceSetContainer;
public final class ClassLoaderBuilderGradle {
private ClassLoaderBuilderGradle(){
}
private ClassLoaderBuilderGradle() {}
public static URLClassLoader getClassLoader(Project project) throws MalformedURLException {
List<URL> listOfURL = new ArrayList<>();
SourceSetContainer ssc = project.getConvention().getPlugin(JavaPluginConvention.class).getSourceSets();
FileCollection classesDir = ssc.getByName("main").getOutput().getClassesDirs();
for (File file : classesDir) {
listOfURL.add(file.toURI().toURL());
}
return new java.net.URLClassLoader(listOfURL.toArray(new URL[0]));
public static URLClassLoader getClassLoader(Project project) throws MalformedURLException {
List<URL> listOfURL = new ArrayList<>();
SourceSetContainer ssc =
project.getConvention().getPlugin(JavaPluginConvention.class).getSourceSets();
FileCollection classesDir = ssc.getByName("main").getOutput().getClassesDirs();
for (File file : classesDir) {
listOfURL.add(file.toURI().toURL());
}
return new java.net.URLClassLoader(listOfURL.toArray(new URL[0]));
}
}

View File

@@ -5,6 +5,5 @@ import lombok.Data;
@Data
public class Layer3GenExtension {
private String configPath = "src/main/resources/3layer-settings.yml";
private String configPath = "src/main/resources/3layer-settings.yml";
}

View File

@@ -1,24 +1,20 @@
package gae.piaz.layer3gen.gradle;
import gae.piaz.layer3gen.CodeGenerator;
import org.gradle.api.Plugin;
import org.gradle.api.Project;
import org.gradle.api.Task;
/**
* entityGen Gradle plugin.
*/
/** entityGen Gradle plugin. */
public class Layer3GenPlugin implements Plugin<Project> {
@Override
public void apply(Project project) {
@Override
public void apply(Project project) {
project.getExtensions().create("layer3gen", Layer3GenExtension.class);
project.getTasks().create("layer3gen", Layer3GenTask.class);
project.getExtensions().create("layer3gen", Layer3GenExtension.class);
project.getTasks().create("layer3gen", Layer3GenTask.class);
/*project.getExtensions().create("layer3gen", Layer3GenExtension.class);
Task task = project.getTasks().create("layer3gen", Layer3GenTask.class);
org.gradle.api.Task javaCompile = project.getTasks().getByName("compileJava");
task.dependsOn(javaCompile);*/
}
/*project.getExtensions().create("layer3gen", Layer3GenExtension.class);
Task task = project.getTasks().create("layer3gen", Layer3GenTask.class);
org.gradle.api.Task javaCompile = project.getTasks().getByName("compileJava");
task.dependsOn(javaCompile);*/
}
}

View File

@@ -5,19 +5,17 @@ import gae.piaz.layer3gen.config.CodeGeneratorConfig;
import org.gradle.api.DefaultTask;
import org.gradle.api.tasks.TaskAction;
/**
* entityGen Gradle task.
*/
/** entityGen Gradle task. */
public class Layer3GenTask extends DefaultTask {
@TaskAction
public void generateAll() throws Exception {
@TaskAction
public void generateAll() throws Exception {
Layer3GenExtension ext = getProject().getExtensions().getByType(Layer3GenExtension.class);
if (ext == null) {
ext = new Layer3GenExtension();
}
CodeGeneratorConfig config = CodeGeneratorConfig.load(ext.getConfigPath(),true);
CodeGenerator.run(config,ClassLoaderBuilderGradle.getClassLoader(getProject()));
Layer3GenExtension ext = getProject().getExtensions().getByType(Layer3GenExtension.class);
if (ext == null) {
ext = new Layer3GenExtension();
}
CodeGeneratorConfig config = CodeGeneratorConfig.load(ext.getConfigPath(), true);
CodeGenerator.run(config, ClassLoaderBuilderGradle.getClassLoader(getProject()));
}
}

View File

@@ -1,7 +1,6 @@
package gae.piaz.layer3gen.main;
import gae.piaz.layer3gen.config.CodeGeneratorConfig;
import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
@@ -11,12 +10,13 @@ import java.util.List;
public final class ClassLoaderBuilderMain {
private ClassLoaderBuilderMain() {}
public static URLClassLoader getClassLoader(CodeGeneratorConfig config) throws MalformedURLException {
final File classes = new File(Paths.get(config.getProjectPath(), config.getClassesDirectory()).toString());
List<URL> listOfURL = List.of(classes.toURI().toURL());
return new URLClassLoader(listOfURL.toArray(new URL[0]));
}
private ClassLoaderBuilderMain() {}
public static URLClassLoader getClassLoader(CodeGeneratorConfig config)
throws MalformedURLException {
final File classes =
new File(Paths.get(config.getProjectPath(), config.getClassesDirectory()).toString());
List<URL> listOfURL = List.of(classes.toURI().toURL());
return new URLClassLoader(listOfURL.toArray(new URL[0]));
}
}

View File

@@ -6,13 +6,12 @@ import org.apache.commons.lang3.ArrayUtils;
public class Layer3GenMain {
public static void main(String[] args) throws Exception {
String configFile = "";
if(!ArrayUtils.isEmpty(args)){
configFile = args[0];
}
CodeGeneratorConfig config = CodeGeneratorConfig.load(configFile,false);
CodeGenerator.run(config,ClassLoaderBuilderMain.getClassLoader(config));
public static void main(String[] args) throws Exception {
String configFile = "";
if (!ArrayUtils.isEmpty(args)) {
configFile = args[0];
}
}
CodeGeneratorConfig config = CodeGeneratorConfig.load(configFile, false);
CodeGenerator.run(config, ClassLoaderBuilderMain.getClassLoader(config));
}
}

View File

@@ -9,6 +9,7 @@ import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.Optional;
/**
* Generated by Springboot-3layer-Generator at ${dateGen?datetime}
@@ -31,17 +32,17 @@ public class ${entityClass}Controller implements CrudController<${entityClass},$
}
@Override
public ResponseEntity<Page<${entityClass}>> read(
public ResponseEntity<Page<${entityClass}>> find(
@RequestBody ${entityClass} entity,
@RequestParam("page") Integer page,
@RequestParam("size") Integer size) {
Pageable pageable = PageRequest.of(page,size);
return ResponseEntity.ok(service.read(entity,pageable));
return ResponseEntity.ok(service.find(entity,pageable));
}
@Override
public ResponseEntity<${entityClass}> readOne(@PathVariable("id") ${primaryKeyClass} primaryKey) {
return ResponseEntity.ok(service.readOne(primaryKey));
public ResponseEntity<${entityClass}> getOne(@PathVariable("id") ${primaryKeyClass} primaryKey) {
return service.getOne(primaryKey).map(ResponseEntity::ok).orElseGet(() -> ResponseEntity.notFound().build());
}
@Override

View File

@@ -1,9 +1,9 @@
package ${config.outputPackages.controllers};
import ${entityPackage}.${entityClass};
import ${config.outputPackages.controllers}.dto.${entityClass}DTO;
import ${config.outputPackages.dtos}.${entityClass}DTO;
import ${config.outputPackages.services}.${entityClass}Service;
import ${config.outputPackages.services}.mapper.${entityClass}Mapper;
import ${config.outputPackages.mappers}.${entityClass}Mapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
@@ -11,6 +11,7 @@ import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.Optional;
/**
* Generated by Springboot-3layer-Generator at ${dateGen?datetime}
@@ -40,20 +41,20 @@ public class ${entityClass}ControllerDTO implements CrudController<${entityClass
}
@Override
public ResponseEntity<Page<${entityClass}DTO>> read(
public ResponseEntity<Page<${entityClass}DTO>> find(
@RequestBody ${entityClass}DTO dto,
@RequestParam("page") Integer page,
@RequestParam("size") Integer size) {
Pageable pageable = PageRequest.of(page,size);
${entityClass} entity = mapper.toEntity(dto);
Page<${entityClass}DTO> pages = service.read(entity, pageable).map(mapper::toDto);
Page<${entityClass}DTO> pages = service.find(entity, pageable).map(mapper::toDto);
return ResponseEntity.ok(pages);
}
@Override
public ResponseEntity<${entityClass}DTO> readOne(@PathVariable("id") ${primaryKeyClass} primaryKey) {
${entityClass} entity = service.readOne(primaryKey);
return ResponseEntity.ok(mapper.toDto(entity));
public ResponseEntity<${entityClass}DTO> getOne(@PathVariable("id") ${primaryKeyClass} primaryKey) {
Optional<${entityClass}> entity = service.getOne(primaryKey);
return entity.map(e -> ResponseEntity.ok(mapper.toDto(e))).orElseGet(() -> ResponseEntity.notFound().build());
}
@Override

View File

@@ -19,9 +19,10 @@ public interface CrudController<O,P>{
ResponseEntity<O> update(O object);
@PostMapping("find")
ResponseEntity<Page<O>> read(O object, Integer page, Integer size);
ResponseEntity<Page<O>> find(O object, Integer page, Integer size);
@GetMapping("{id}")
ResponseEntity<O> readOne(P primaryKey);
ResponseEntity<O> getOne(P primaryKey);
@DeleteMapping
void delete(P primaryKey);

View File

@@ -2,18 +2,20 @@ package ${config.outputPackages.services};
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import java.util.Optional;
/**
* Generated by Springboot-3layer-Generator at ${dateGen?datetime}
*/
public interface CrudService<E,P> {
public interface CrudService<E, P> {
E create(E entity);
E update(E entity);
Page<E> read(E entity, Pageable pageable);
E readOne(P primaryKey);
Page<E> find(E entity, Pageable pageable);
Optional<E> getOne(P primaryKey);
void delete(P primaryKey);

View File

@@ -1,10 +1,7 @@
package ${config.outputPackages.controllers}.dto;
package ${config.outputPackages.dtos};
import lombok.Data;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
/**
* Generated by Springboot-3layer-Generator at ${dateGen?datetime}
*/

View File

@@ -1,7 +1,7 @@
package ${config.outputPackages.services}.mapper;
package ${config.outputPackages.mappers};
import ${entityPackage}.${entityClass};
import ${config.outputPackages.controllers}.dto.${entityClass}DTO;
import ${config.outputPackages.dtos}.${entityClass}DTO;
import org.mapstruct.Mapper;
/**

View File

@@ -8,6 +8,7 @@ import org.springframework.data.domain.Example;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import java.util.Optional;
/**
* Generated by Springboot-3layer-Generator at ${dateGen?datetime}
@@ -29,14 +30,14 @@ public class ${entityClass}Service implements CrudService<${entityClass},${prima
}
@Override
public Page<${entityClass}> read(${entityClass} entity, Pageable pageable) {
public Page<${entityClass}> find(${entityClass} entity, Pageable pageable) {
Example<${entityClass}> example = Example.of(entity);
return repository.findAll(example,pageable);
}
@Override
public ${entityClass} readOne(${primaryKeyClass} primaryKey) {
return repository.getOne(primaryKey);
public Optional<${entityClass}> getOne(${primaryKeyClass} primaryKey) {
return repository.findById(primaryKey);
}
@Override

View File

@@ -9,6 +9,7 @@ import org.springframework.data.domain.Example;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import java.util.Optional;
/**
* Generated by Springboot-3layer-Generator at ${dateGen?datetime}
@@ -30,14 +31,14 @@ public class ${entityClass}ServiceBean implements ${entityClass}Service {
}
@Override
public Page<${entityClass}> read(${entityClass} entity, Pageable pageable) {
public Page<${entityClass}> find(${entityClass} entity, Pageable pageable) {
Example<${entityClass}> example = Example.of(entity);
return repository.findAll(example,pageable);
}
@Override
public ${entityClass} readOne(${primaryKeyClass} primaryKey) {
return repository.getOne(primaryKey);
public Optional<${entityClass}> getOne(${primaryKeyClass} primaryKey) {
return repository.findById(primaryKey);
}
@Override

View File

@@ -1,26 +1,23 @@
package gae.piaz.layer3gen.test;
import freemarker.template.TemplateException;
import gae.piaz.layer3gen.CodeGenerator;
import gae.piaz.layer3gen.config.CodeGeneratorConfig;
import gae.piaz.layer3gen.main.ClassLoaderBuilderMain;
import org.junit.Test;
import java.io.IOException;
import org.junit.Test;
public class TestMainGenerator {
@Test
public void testGeneration() throws IOException, TemplateException {
CodeGeneratorConfig config = CodeGeneratorConfig.load("3layer-settings.yml",true);
CodeGenerator.run(config,ClassLoaderBuilderMain.getClassLoader(config));
}
@Test
public void testJakartaGeneration() throws IOException, TemplateException {
CodeGeneratorConfig config = CodeGeneratorConfig.load("3layer-settings-jakarta.yml",true);
CodeGenerator.run(config,ClassLoaderBuilderMain.getClassLoader(config));
}
@Test
public void testGeneration() throws IOException, TemplateException {
CodeGeneratorConfig config = CodeGeneratorConfig.load("3layer-settings.yml", true);
CodeGenerator.run(config, ClassLoaderBuilderMain.getClassLoader(config));
}
@Test
public void testJakartaGeneration() throws IOException, TemplateException {
CodeGeneratorConfig config = CodeGeneratorConfig.load("3layer-settings-jakarta.yml", true);
CodeGenerator.run(config, ClassLoaderBuilderMain.getClassLoader(config));
}
}

View File

@@ -1,14 +1,15 @@
projectPath: /Users/Gaetano_Piazzolla/Workspaces/workspace_private/Layer3Gen/demo-jakarta
projectPath: demo-jakarta
classesDirectory: build/classes/java/main
outputDirectory : src/main/java
options:
dtoLayer: true
serviceInterface: true
entityControllers: true
inputPackages:
jpaEntities: com.example.demo.model
outputPackages:
repositories: com.example.demo.repository
services: com.example.demo.serviceInterface
services: com.example.demo.service
controllers: com.example.demo.controller

View File

@@ -1,14 +1,15 @@
projectPath: /Users/Gaetano_Piazzolla/Workspaces/workspace_private/Layer3Gen/demo
projectPath: demo
classesDirectory: build/classes/java/main
outputDirectory : src/main/java
options:
dtoLayer : true
serviceInterface: true
entityControllers: true
inputPackages:
jpaEntities : com.example.demo.model
outputPackages:
repositories : com.example.demo.repository
services: com.example.demo.serviceInterface
services: com.example.demo.service
controllers: com.example.demo.controller