From 9e00c1cdffbac166ecfd5d5be80d098117e09805 Mon Sep 17 00:00:00 2001 From: iaforek Date: Mon, 13 Mar 2017 19:27:14 +0000 Subject: [PATCH 01/54] Code for Dependency Injection Article. --- .../baeldung/constructordi/SpringRunner.java | 62 +++++++++---------- .../baeldung/constructordi/domain/Car.java | 42 ++++++------- 2 files changed, 52 insertions(+), 52 deletions(-) diff --git a/spring-core/src/main/java/com/baeldung/constructordi/SpringRunner.java b/spring-core/src/main/java/com/baeldung/constructordi/SpringRunner.java index 623739f036..bffd35ec59 100644 --- a/spring-core/src/main/java/com/baeldung/constructordi/SpringRunner.java +++ b/spring-core/src/main/java/com/baeldung/constructordi/SpringRunner.java @@ -1,31 +1,31 @@ -package com.baeldung.constructordi; - -import org.springframework.context.ApplicationContext; -import org.springframework.context.annotation.AnnotationConfigApplicationContext; -import org.springframework.context.support.ClassPathXmlApplicationContext; - -import com.baeldung.constructordi.domain.Car; - -public class SpringRunner { - public static void main(String[] args) { - Car toyota = getCarFromXml(); - - System.out.println(toyota); - - toyota = getCarFromJavaConfig(); - - System.out.println(toyota); - } - - private static Car getCarFromJavaConfig() { - ApplicationContext context = new AnnotationConfigApplicationContext(Config.class); - - return context.getBean(Car.class); - } - - private static Car getCarFromXml() { - ApplicationContext context = new ClassPathXmlApplicationContext("baeldung.xml"); - - return context.getBean(Car.class); - } -} +package com.baeldung.constructordi; + +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import org.springframework.context.support.ClassPathXmlApplicationContext; + +import com.baeldung.constructordi.domain.Car; + +public class SpringRunner { + public static void main(String[] args) { + Car toyota = getCarFromXml(); + + System.out.println(toyota); + + toyota = getCarFromJavaConfig(); + + System.out.println(toyota); + } + + private static Car getCarFromJavaConfig() { + ApplicationContext context = new AnnotationConfigApplicationContext(Config.class); + + return context.getBean(Car.class); + } + + private static Car getCarFromXml() { + ApplicationContext context = new ClassPathXmlApplicationContext("constructordi.xml"); + + return context.getBean(Car.class); + } +} diff --git a/spring-core/src/main/java/com/baeldung/constructordi/domain/Car.java b/spring-core/src/main/java/com/baeldung/constructordi/domain/Car.java index 9f68ba5cd9..5c9467fdf4 100644 --- a/spring-core/src/main/java/com/baeldung/constructordi/domain/Car.java +++ b/spring-core/src/main/java/com/baeldung/constructordi/domain/Car.java @@ -1,21 +1,21 @@ -package com.baeldung.constructordi.domain; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -@Component -public class Car { - private Engine engine; - private Transmission transmission; - - @Autowired - public Car(Engine engine, Transmission transmission) { - this.engine = engine; - this.transmission = transmission; - } - - @Override - public String toString() { - return String.format("Engine: %s Transmission: %s", engine, transmission); - } -} +package com.baeldung.constructordi.domain; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class Car { + private Engine engine; + private Transmission transmission; + + @Autowired + public Car(Engine engine, Transmission transmission) { + this.engine = engine; + this.transmission = transmission; + } + + @Override + public String toString() { + return String.format("Engine: %s Transmission: %s", engine, transmission); + } +} From 112fa1290f2cf7570f183d64d39788d034c7614c Mon Sep 17 00:00:00 2001 From: iaforek Date: Tue, 14 Mar 2017 16:00:38 +0000 Subject: [PATCH 02/54] Added Java based configuration. Downloaded formatter.xml and reformatted all changed files. Manually changed tab into 4 spaces in XML configuration files. --- .../java/com/baeldung/setterdi/Config.java | 35 +++++++++++++++++++ .../com/baeldung/setterdi/SpringRunner.java | 33 +++++++++++++++++ .../com/baeldung/setterdi/domain/Car.java | 34 ++++++++++++++++++ .../com/baeldung/setterdi/domain/Engine.java | 22 ++++++++++++ .../com/baeldung/setterdi/domain/Trailer.java | 11 ++++++ .../setterdi/domain/Transmission.java | 17 +++++++++ .../src/main/resources/constructordi.xml | 20 +++++++++++ spring-core/src/main/resources/setterdi.xml | 24 +++++++++++++ 8 files changed, 196 insertions(+) create mode 100644 spring-core/src/main/java/com/baeldung/setterdi/Config.java create mode 100644 spring-core/src/main/java/com/baeldung/setterdi/SpringRunner.java create mode 100644 spring-core/src/main/java/com/baeldung/setterdi/domain/Car.java create mode 100644 spring-core/src/main/java/com/baeldung/setterdi/domain/Engine.java create mode 100644 spring-core/src/main/java/com/baeldung/setterdi/domain/Trailer.java create mode 100644 spring-core/src/main/java/com/baeldung/setterdi/domain/Transmission.java create mode 100644 spring-core/src/main/resources/constructordi.xml create mode 100644 spring-core/src/main/resources/setterdi.xml diff --git a/spring-core/src/main/java/com/baeldung/setterdi/Config.java b/spring-core/src/main/java/com/baeldung/setterdi/Config.java new file mode 100644 index 0000000000..68c1ae12a2 --- /dev/null +++ b/spring-core/src/main/java/com/baeldung/setterdi/Config.java @@ -0,0 +1,35 @@ +package com.baeldung.setterdi; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; + +import com.baeldung.setterdi.domain.Engine; +import com.baeldung.setterdi.domain.Trailer; +import com.baeldung.setterdi.domain.Transmission; + +@Configuration +@ComponentScan("com.baeldung.setterdi") +public class Config { + + @Bean + public Engine engine() { + Engine engine = new Engine(); + engine.setType("v8"); + engine.setVolume(5); + return engine; + } + + @Bean + public Transmission transmission() { + Transmission transmission = new Transmission(); + transmission.setType("sliding"); + return transmission; + } + + @Bean + public Trailer trailer() { + Trailer trailer = new Trailer(); + return trailer; + } +} \ No newline at end of file diff --git a/spring-core/src/main/java/com/baeldung/setterdi/SpringRunner.java b/spring-core/src/main/java/com/baeldung/setterdi/SpringRunner.java new file mode 100644 index 0000000000..bc92b79e8a --- /dev/null +++ b/spring-core/src/main/java/com/baeldung/setterdi/SpringRunner.java @@ -0,0 +1,33 @@ +package com.baeldung.setterdi; + +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import org.springframework.context.support.ClassPathXmlApplicationContext; + +import com.baeldung.setterdi.Config; +import com.baeldung.setterdi.domain.Car; + +public class SpringRunner { + public static void main(String[] args) { + Car toyota = getCarFromXml(); + + System.out.println(toyota); + + toyota = getCarFromJavaConfig(); + + System.out.println(toyota); + + } + + private static Car getCarFromJavaConfig() { + ApplicationContext context = new AnnotationConfigApplicationContext(Config.class); + + return context.getBean(Car.class); + } + + private static Car getCarFromXml() { + ApplicationContext context = new ClassPathXmlApplicationContext("setterdi.xml"); + + return context.getBean(Car.class); + } +} \ No newline at end of file diff --git a/spring-core/src/main/java/com/baeldung/setterdi/domain/Car.java b/spring-core/src/main/java/com/baeldung/setterdi/domain/Car.java new file mode 100644 index 0000000000..749ff3984a --- /dev/null +++ b/spring-core/src/main/java/com/baeldung/setterdi/domain/Car.java @@ -0,0 +1,34 @@ +package com.baeldung.setterdi.domain; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class Car { + private Engine engine; + private Transmission transmission; + private Trailer trailer; + + public Car() { + } + + @Autowired + public void setEngine(Engine engine) { + this.engine = engine; + } + + @Autowired + public void setTransmission(Transmission transmission) { + this.transmission = transmission; + } + + @Autowired + public void setTrailer(Trailer trailer) { + this.trailer = trailer; + } + + @Override + public String toString() { + return String.format("Engine: %s Transmission: %s Trailer: %s", engine, transmission, trailer); + } +} diff --git a/spring-core/src/main/java/com/baeldung/setterdi/domain/Engine.java b/spring-core/src/main/java/com/baeldung/setterdi/domain/Engine.java new file mode 100644 index 0000000000..50c247cacf --- /dev/null +++ b/spring-core/src/main/java/com/baeldung/setterdi/domain/Engine.java @@ -0,0 +1,22 @@ +package com.baeldung.setterdi.domain; + +public class Engine { + private String type; + private int volume; + + public Engine() { + } + + public void setType(String type) { + this.type = type; + } + + public void setVolume(int volume) { + this.volume = volume; + } + + @Override + public String toString() { + return String.format("%s %d", type, volume); + } +} \ No newline at end of file diff --git a/spring-core/src/main/java/com/baeldung/setterdi/domain/Trailer.java b/spring-core/src/main/java/com/baeldung/setterdi/domain/Trailer.java new file mode 100644 index 0000000000..616732309e --- /dev/null +++ b/spring-core/src/main/java/com/baeldung/setterdi/domain/Trailer.java @@ -0,0 +1,11 @@ +package com.baeldung.setterdi.domain; + +public class Trailer { + public Trailer() { + } + + @Override + public String toString() { + return "Trailer"; + } +} diff --git a/spring-core/src/main/java/com/baeldung/setterdi/domain/Transmission.java b/spring-core/src/main/java/com/baeldung/setterdi/domain/Transmission.java new file mode 100644 index 0000000000..18b62afdc1 --- /dev/null +++ b/spring-core/src/main/java/com/baeldung/setterdi/domain/Transmission.java @@ -0,0 +1,17 @@ +package com.baeldung.setterdi.domain; + +public class Transmission { + private String type; + + public Transmission() { + } + + public void setType(String type) { + this.type = type; + } + + @Override + public String toString() { + return String.format("%s", type); + } +} diff --git a/spring-core/src/main/resources/constructordi.xml b/spring-core/src/main/resources/constructordi.xml new file mode 100644 index 0000000000..231e72adcb --- /dev/null +++ b/spring-core/src/main/resources/constructordi.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + diff --git a/spring-core/src/main/resources/setterdi.xml b/spring-core/src/main/resources/setterdi.xml new file mode 100644 index 0000000000..8b7f0d41e7 --- /dev/null +++ b/spring-core/src/main/resources/setterdi.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + From 57551f33a0d408957fd905ded0fae86e91592f6a Mon Sep 17 00:00:00 2001 From: iaforek Date: Tue, 4 Apr 2017 15:10:36 +0100 Subject: [PATCH 03/54] BAEL-434 - Spring Roo project files generated by Spring Roo. No formatting applied. Added POM, java and resources folders. --- roo/pom.xml | 644 ++ .../java/com/baeldung/RooApplication.java | 23 + ...aJpaDetachableRepositoryConfiguration.java | 11 + ...ration_Roo_Jpa_Repository_Configuration.aj | 18 + .../baeldung/config/WebMvcConfiguration.java | 13 + ...figuration_Roo_ThymeleafUIConfiguration.aj | 110 + ...vcConfiguration_Roo_WebMvcConfiguration.aj | 72 + .../config/jackson/DomainModelModule.java | 11 + ...DomainModelModule_Roo_DomainModelModule.aj | 28 + .../main/java/com/baeldung/domain/Book.java | 58 + .../com/baeldung/domain/Book_Roo_Equals.aj | 41 + .../com/baeldung/domain/Book_Roo_JavaBean.aj | 100 + .../baeldung/domain/Book_Roo_Jpa_Entity.aj | 28 + .../com/baeldung/domain/Book_Roo_ToString.aj | 26 + .../baeldung/repository/BookRepository.java | 12 + .../repository/BookRepositoryCustom.java | 12 + ...ositoryCustom_Roo_Jpa_Repository_Custom.aj | 23 + .../repository/BookRepositoryImpl.java | 22 + ...kRepositoryImpl_Roo_Jpa_Repository_Impl.aj | 69 + .../BookRepository_Roo_Jpa_Repository.aj | 20 + .../com/baeldung/service/api/BookService.java | 12 + .../service/api/BookService_Roo_Service.aj | 95 + .../service/impl/BookServiceImpl.java | 12 + .../impl/BookServiceImpl_Roo_Service_Impl.aj | 177 + .../com/baeldung/web/BookDeserializer.java | 41 + ...BookDeserializer_Roo_EntityDeserializer.aj | 78 + .../java/com/baeldung/web/BookJsonMixin.java | 12 + .../BooksCollectionThymeleafController.java | 15 + ...ctionThymeleafController_Roo_Controller.aj | 35 + ...ectionThymeleafController_Roo_Thymeleaf.aj | 470 ++ .../BooksCollectionThymeleafLinkFactory.java | 11 + ...ionThymeleafLinkFactory_Roo_LinkFactory.aj | 122 + .../web/BooksItemThymeleafController.java | 15 + ...sItemThymeleafController_Roo_Controller.aj | 35 + ...ksItemThymeleafController_Roo_Thymeleaf.aj | 251 + .../web/BooksItemThymeleafLinkFactory.java | 11 + ...temThymeleafLinkFactory_Roo_LinkFactory.aj | 86 + .../java/com/baeldung/web/MainController.java | 11 + ...Controller_Roo_Thymeleaf_MainController.aj | 59 + .../web/reports/ExportingErrorException.java | 19 + .../web/reports/JasperReportsCsvExporter.java | 71 + .../web/reports/JasperReportsExporter.java | 41 + .../web/reports/JasperReportsPdfExporter.java | 71 + .../web/reports/JasperReportsXlsExporter.java | 77 + .../main/resources/application-dev.properties | 13 + roo/src/main/resources/application.properties | 8 + roo/src/main/resources/banner.txt | 9 + roo/src/main/resources/messages.properties | 146 + .../resources/static/public/css/springroo.css | 475 ++ .../resources/static/public/css/theme.css | 6914 +++++++++++++++++ .../public/fonts/fontawesome-webfont.eot | Bin 0 -> 75220 bytes .../public/fonts/fontawesome-webfont.svg | 685 ++ .../public/fonts/fontawesome-webfont.ttf | Bin 0 -> 150920 bytes .../public/fonts/fontawesome-webfont.woff | Bin 0 -> 89076 bytes .../public/fonts/fontawesome-webfont.woff2 | Bin 0 -> 70728 bytes .../fonts/glyphicons-halflings-regular.eot | Bin 0 -> 20127 bytes .../fonts/glyphicons-halflings-regular.svg | 288 + .../fonts/glyphicons-halflings-regular.ttf | Bin 0 -> 45404 bytes .../fonts/glyphicons-halflings-regular.woff | Bin 0 -> 23424 bytes .../fonts/glyphicons-halflings-regular.woff2 | Bin 0 -> 18028 bytes .../static/public/img/apple-touch-icon.png | Bin 0 -> 4723 bytes .../main/resources/static/public/img/en.png | Bin 0 -> 599 bytes .../main/resources/static/public/img/es.png | Bin 0 -> 469 bytes .../resources/static/public/img/favicon.ico | Bin 0 -> 26918 bytes .../main/resources/static/public/img/geo.png | Bin 0 -> 142350 bytes .../main/resources/static/public/img/logo.png | Bin 0 -> 1761 bytes .../static/public/img/owasp_logo.png | Bin 0 -> 4271 bytes .../static/public/img/springroo-logo.png | Bin 0 -> 25823 bytes .../static/public/js/dataTables.advanced.js | 1334 ++++ .../static/public/js/datatables-defaults.js | 29 + .../public/js/datetimepicker-defaults.js | 107 + .../static/public/js/inputmask-defaults.js | 30 + .../main/resources/static/public/js/main.js | 70 + .../static/public/js/moment-defaults.js | 88 + .../static/public/js/moment-locale-es.js | 73 + .../static/public/js/select2-defaults.js | 49 + .../static/public/js/validation-defaults.js | 233 + .../resources/templates/accessibility.html | 61 + .../resources/templates/books/create.html | 153 + .../main/resources/templates/books/edit.html | 171 + .../main/resources/templates/books/list.html | 98 + .../main/resources/templates/books/show.html | 86 + .../resources/templates/books/showInline.html | 67 + roo/src/main/resources/templates/error.html | 40 + .../resources/templates/fragments/footer.html | 51 + .../resources/templates/fragments/header.html | 21 + .../fragments/js/datatables-locale.js | 67 + .../templates/fragments/js/datatables.html | 78 + .../templates/fragments/js/select2.html | 16 + .../templates/fragments/languages.html | 33 + .../resources/templates/fragments/menu.html | 107 + .../fragments/modal-confirm-delete-batch.html | 34 + .../fragments/modal-confirm-delete.html | 35 + .../templates/fragments/modal-confirm.html | 32 + .../fragments/modal-export-empty-error.html | 20 + .../resources/templates/fragments/modal.html | 27 + .../templates/fragments/session-links.html | 46 + roo/src/main/resources/templates/index.html | 150 + .../layouts/default-layout-no-menu.html | 103 + .../templates/layouts/default-layout.html | 110 + .../layouts/default-list-layout.html | 121 + .../templates/layouts/home-layout.html | 104 + roo/src/main/resources/templates/login.html | 108 + .../templates/reports/export_default.jrxml | 59 + 104 files changed, 15717 insertions(+) create mode 100644 roo/pom.xml create mode 100644 roo/src/main/java/com/baeldung/RooApplication.java create mode 100644 roo/src/main/java/com/baeldung/config/SpringDataJpaDetachableRepositoryConfiguration.java create mode 100644 roo/src/main/java/com/baeldung/config/SpringDataJpaDetachableRepositoryConfiguration_Roo_Jpa_Repository_Configuration.aj create mode 100644 roo/src/main/java/com/baeldung/config/WebMvcConfiguration.java create mode 100644 roo/src/main/java/com/baeldung/config/WebMvcConfiguration_Roo_ThymeleafUIConfiguration.aj create mode 100644 roo/src/main/java/com/baeldung/config/WebMvcConfiguration_Roo_WebMvcConfiguration.aj create mode 100644 roo/src/main/java/com/baeldung/config/jackson/DomainModelModule.java create mode 100644 roo/src/main/java/com/baeldung/config/jackson/DomainModelModule_Roo_DomainModelModule.aj create mode 100644 roo/src/main/java/com/baeldung/domain/Book.java create mode 100644 roo/src/main/java/com/baeldung/domain/Book_Roo_Equals.aj create mode 100644 roo/src/main/java/com/baeldung/domain/Book_Roo_JavaBean.aj create mode 100644 roo/src/main/java/com/baeldung/domain/Book_Roo_Jpa_Entity.aj create mode 100644 roo/src/main/java/com/baeldung/domain/Book_Roo_ToString.aj create mode 100644 roo/src/main/java/com/baeldung/repository/BookRepository.java create mode 100644 roo/src/main/java/com/baeldung/repository/BookRepositoryCustom.java create mode 100644 roo/src/main/java/com/baeldung/repository/BookRepositoryCustom_Roo_Jpa_Repository_Custom.aj create mode 100644 roo/src/main/java/com/baeldung/repository/BookRepositoryImpl.java create mode 100644 roo/src/main/java/com/baeldung/repository/BookRepositoryImpl_Roo_Jpa_Repository_Impl.aj create mode 100644 roo/src/main/java/com/baeldung/repository/BookRepository_Roo_Jpa_Repository.aj create mode 100644 roo/src/main/java/com/baeldung/service/api/BookService.java create mode 100644 roo/src/main/java/com/baeldung/service/api/BookService_Roo_Service.aj create mode 100644 roo/src/main/java/com/baeldung/service/impl/BookServiceImpl.java create mode 100644 roo/src/main/java/com/baeldung/service/impl/BookServiceImpl_Roo_Service_Impl.aj create mode 100644 roo/src/main/java/com/baeldung/web/BookDeserializer.java create mode 100644 roo/src/main/java/com/baeldung/web/BookDeserializer_Roo_EntityDeserializer.aj create mode 100644 roo/src/main/java/com/baeldung/web/BookJsonMixin.java create mode 100644 roo/src/main/java/com/baeldung/web/BooksCollectionThymeleafController.java create mode 100644 roo/src/main/java/com/baeldung/web/BooksCollectionThymeleafController_Roo_Controller.aj create mode 100644 roo/src/main/java/com/baeldung/web/BooksCollectionThymeleafController_Roo_Thymeleaf.aj create mode 100644 roo/src/main/java/com/baeldung/web/BooksCollectionThymeleafLinkFactory.java create mode 100644 roo/src/main/java/com/baeldung/web/BooksCollectionThymeleafLinkFactory_Roo_LinkFactory.aj create mode 100644 roo/src/main/java/com/baeldung/web/BooksItemThymeleafController.java create mode 100644 roo/src/main/java/com/baeldung/web/BooksItemThymeleafController_Roo_Controller.aj create mode 100644 roo/src/main/java/com/baeldung/web/BooksItemThymeleafController_Roo_Thymeleaf.aj create mode 100644 roo/src/main/java/com/baeldung/web/BooksItemThymeleafLinkFactory.java create mode 100644 roo/src/main/java/com/baeldung/web/BooksItemThymeleafLinkFactory_Roo_LinkFactory.aj create mode 100644 roo/src/main/java/com/baeldung/web/MainController.java create mode 100644 roo/src/main/java/com/baeldung/web/MainController_Roo_Thymeleaf_MainController.aj create mode 100644 roo/src/main/java/com/baeldung/web/reports/ExportingErrorException.java create mode 100644 roo/src/main/java/com/baeldung/web/reports/JasperReportsCsvExporter.java create mode 100644 roo/src/main/java/com/baeldung/web/reports/JasperReportsExporter.java create mode 100644 roo/src/main/java/com/baeldung/web/reports/JasperReportsPdfExporter.java create mode 100644 roo/src/main/java/com/baeldung/web/reports/JasperReportsXlsExporter.java create mode 100644 roo/src/main/resources/application-dev.properties create mode 100644 roo/src/main/resources/application.properties create mode 100644 roo/src/main/resources/banner.txt create mode 100644 roo/src/main/resources/messages.properties create mode 100644 roo/src/main/resources/static/public/css/springroo.css create mode 100644 roo/src/main/resources/static/public/css/theme.css create mode 100644 roo/src/main/resources/static/public/fonts/fontawesome-webfont.eot create mode 100644 roo/src/main/resources/static/public/fonts/fontawesome-webfont.svg create mode 100644 roo/src/main/resources/static/public/fonts/fontawesome-webfont.ttf create mode 100644 roo/src/main/resources/static/public/fonts/fontawesome-webfont.woff create mode 100644 roo/src/main/resources/static/public/fonts/fontawesome-webfont.woff2 create mode 100644 roo/src/main/resources/static/public/fonts/glyphicons-halflings-regular.eot create mode 100644 roo/src/main/resources/static/public/fonts/glyphicons-halflings-regular.svg create mode 100644 roo/src/main/resources/static/public/fonts/glyphicons-halflings-regular.ttf create mode 100644 roo/src/main/resources/static/public/fonts/glyphicons-halflings-regular.woff create mode 100644 roo/src/main/resources/static/public/fonts/glyphicons-halflings-regular.woff2 create mode 100644 roo/src/main/resources/static/public/img/apple-touch-icon.png create mode 100644 roo/src/main/resources/static/public/img/en.png create mode 100644 roo/src/main/resources/static/public/img/es.png create mode 100644 roo/src/main/resources/static/public/img/favicon.ico create mode 100644 roo/src/main/resources/static/public/img/geo.png create mode 100644 roo/src/main/resources/static/public/img/logo.png create mode 100644 roo/src/main/resources/static/public/img/owasp_logo.png create mode 100644 roo/src/main/resources/static/public/img/springroo-logo.png create mode 100644 roo/src/main/resources/static/public/js/dataTables.advanced.js create mode 100644 roo/src/main/resources/static/public/js/datatables-defaults.js create mode 100644 roo/src/main/resources/static/public/js/datetimepicker-defaults.js create mode 100644 roo/src/main/resources/static/public/js/inputmask-defaults.js create mode 100644 roo/src/main/resources/static/public/js/main.js create mode 100644 roo/src/main/resources/static/public/js/moment-defaults.js create mode 100644 roo/src/main/resources/static/public/js/moment-locale-es.js create mode 100644 roo/src/main/resources/static/public/js/select2-defaults.js create mode 100644 roo/src/main/resources/static/public/js/validation-defaults.js create mode 100644 roo/src/main/resources/templates/accessibility.html create mode 100644 roo/src/main/resources/templates/books/create.html create mode 100644 roo/src/main/resources/templates/books/edit.html create mode 100644 roo/src/main/resources/templates/books/list.html create mode 100644 roo/src/main/resources/templates/books/show.html create mode 100644 roo/src/main/resources/templates/books/showInline.html create mode 100644 roo/src/main/resources/templates/error.html create mode 100644 roo/src/main/resources/templates/fragments/footer.html create mode 100644 roo/src/main/resources/templates/fragments/header.html create mode 100644 roo/src/main/resources/templates/fragments/js/datatables-locale.js create mode 100644 roo/src/main/resources/templates/fragments/js/datatables.html create mode 100644 roo/src/main/resources/templates/fragments/js/select2.html create mode 100644 roo/src/main/resources/templates/fragments/languages.html create mode 100644 roo/src/main/resources/templates/fragments/menu.html create mode 100644 roo/src/main/resources/templates/fragments/modal-confirm-delete-batch.html create mode 100644 roo/src/main/resources/templates/fragments/modal-confirm-delete.html create mode 100644 roo/src/main/resources/templates/fragments/modal-confirm.html create mode 100644 roo/src/main/resources/templates/fragments/modal-export-empty-error.html create mode 100644 roo/src/main/resources/templates/fragments/modal.html create mode 100644 roo/src/main/resources/templates/fragments/session-links.html create mode 100644 roo/src/main/resources/templates/index.html create mode 100644 roo/src/main/resources/templates/layouts/default-layout-no-menu.html create mode 100644 roo/src/main/resources/templates/layouts/default-layout.html create mode 100644 roo/src/main/resources/templates/layouts/default-list-layout.html create mode 100644 roo/src/main/resources/templates/layouts/home-layout.html create mode 100644 roo/src/main/resources/templates/login.html create mode 100644 roo/src/main/resources/templates/reports/export_default.jrxml diff --git a/roo/pom.xml b/roo/pom.xml new file mode 100644 index 0000000000..e1d69a3031 --- /dev/null +++ b/roo/pom.xml @@ -0,0 +1,644 @@ + + + + + io.spring.platform + platform-bom + Athens-RELEASE + + + 4.0.0 + com.baeldung + roo + 1.0.0.BUILD-SNAPSHOT + roo + + jar + + + 2.0.0.RC1 + 8 + UTF-8 + 1.8 + 1.5.4 + 1.4.1.RELEASE + 1.8 + 1.2.0.RC1 + 1.1.2 + 3.0.0.RELEASE + 2.0.0 + 2.0.1 + 5.0.11 + 1.0 + 3.3.6 + 1.10.12 + 1.10.11 + 1.1.2 + 1.1.2 + 2.0.2 + 2.0.2 + 1.1.2 + 1.1.2 + 1.1.2 + 2.0.0 + 2.5.4 + 4.6.2 + 1.12.3 + 3.3.1 + 1.15.0 + 2.13.0 + 4.0.3 + 0.1.0-beta.7 + 1.4.2 + 3.7.3 + 1.0.3 + + + + + + maven-snapshot-repository + Maven Snapshot Repository + https://oss.sonatype.org/content/repositories/snapshots + + false + + + true + + + + + spring-roo-repository + Spring Roo Repository + http://repo.spring.io/spring-roo + + + + + + + + + org.springframework.roo + org.springframework.roo.annotations + ${roo.version} + pom + provided + + + + io.springlets + springlets-data-jpa + ${springlets.version} + + + io.springlets + springlets-data-commons + ${springlets.version} + + + io.springlets + springlets-context + ${springlets.version} + + + org.springframework.roo + org.springframework.roo.querydsl.processor + 2.0.0.RELEASE + + + io.tracee.binding + tracee-springmvc + ${tracee.version} + + + io.springlets + springlets-boot-starter-web + ${springlets.version} + + + com.github.mxab.thymeleaf.extras + thymeleaf-extras-data-attribute + ${thymeleaf-data-dialect.version} + + + ar.com.fdvs + DynamicJasper + ${dynamicjasper.version} + + + ar.com.fdvs + DynamicJasper-core-fonts + ${dynamicjasper-fonts.version} + + + org.webjars.bower + bootstrap + ${bootstrap.version} + + + org.webjars.bower + datatables + ${datatables.version} + + + org.webjars.bower + datatables.net-bs + ${datatables-bs.version} + + + org.webjars.bower + datatables.net-buttons + ${datatables-buttons.version} + + + org.webjars.bower + datatables.net-buttons-bs + ${datatables-buttons-bs.version} + + + org.webjars.bower + datatables.net-responsive + ${datatables-responsive.version} + + + org.webjars.bower + datatables.net-responsive-bs + ${datatables-responsive-bs.version} + + + org.webjars.bower + datatables.net-select + ${datatables-select.version} + + + org.webjars.bower + datatables.net-select-bs + ${datatables-select-bs.version} + + + org.webjars.npm + jquery-datatables-checkboxes + ${datatables-checkboxes.version} + + + org.webjars.npm + jquery + + + org.webjars.npm + datatables.net + + + + + org.webjars.bower + github-com-julmot-datatables-mark-js + ${datatables-mark.version} + + + org.webjars.bower + datetimepicker + ${datetimepicker.version} + + + org.webjars.bower + font-awesome + ${fontawesome.version} + + + org.webjars.bower + jquery + ${jquery.version} + + + org.webjars + jquery.inputmask + ${jquery-inputmask.version} + + + org.webjars + jquery + + + + + org.webjars.bower + jquery-validation + ${jquery-validation.version} + + + org.webjars.bower + momentjs + ${momentjs.version} + + + org.webjars.bower + select2 + ${select2.version} + + + org.webjars.bower + select2-bootstrap-theme + ${select2-bootstrap-theme.version} + + + org.webjars + respond + ${respond.version} + + + org.webjars + html5shiv + ${html5shiv.version} + + + org.webjars.bower + ie10-viewport-bug-workaround + ${bootstrap.ie10-viewport-bug-workaround.version} + + + + + + + + org.springframework.boot + spring-boot-starter + + + org.springframework.boot + spring-boot-starter-test + test + + + + org.springframework.boot + spring-boot-devtools + true + + + + + org.springframework.roo + org.springframework.roo.annotations + pom + + + + + org.aspectj + aspectjrt + + + + + org.apache.commons + commons-lang3 + + + + + org.assertj + assertj-core + + + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.springframework.boot + spring-boot-starter-jdbc + provided + + + org.hsqldb + hsqldb + provided + + + io.springlets + springlets-data-jpa + + + io.springlets + springlets-data-commons + + + io.springlets + springlets-context + + + javax.validation + validation-api + + + com.querydsl + querydsl-jpa + + + org.springframework.roo + org.springframework.roo.querydsl.processor + + + org.springframework.boot + spring-boot-starter-web + + + joda-time + joda-time + + + io.tracee.binding + tracee-springmvc + + + io.springlets + springlets-boot-starter-web + + + org.springframework.boot + spring-boot-starter-thymeleaf + + + nz.net.ultraq.thymeleaf + thymeleaf-layout-dialect + + + com.github.mxab.thymeleaf.extras + thymeleaf-extras-data-attribute + + + ar.com.fdvs + DynamicJasper + + + ar.com.fdvs + DynamicJasper-core-fonts + + + org.apache.poi + poi + + + org.springframework + spring-context-support + + + org.webjars + webjars-locator + + + org.webjars.bower + bootstrap + + + org.webjars.bower + datatables + + + org.webjars.bower + datatables.net-bs + + + org.webjars.bower + datatables.net-buttons + + + org.webjars.bower + datatables.net-buttons-bs + + + org.webjars.bower + datatables.net-responsive + + + org.webjars.bower + datatables.net-responsive-bs + + + org.webjars.bower + datatables.net-select + + + org.webjars.bower + datatables.net-select-bs + + + org.webjars.npm + jquery-datatables-checkboxes + + + org.webjars.bower + github-com-julmot-datatables-mark-js + + + org.webjars.bower + datetimepicker + + + org.webjars.bower + font-awesome + + + org.webjars.bower + jquery + + + org.webjars + jquery.inputmask + + + org.webjars.bower + jquery-validation + + + org.webjars.bower + momentjs + + + org.webjars.bower + select2 + + + org.webjars.bower + select2-bootstrap-theme + + + org.webjars + respond + + + org.webjars + html5shiv + + + org.webjars.bower + ie10-viewport-bug-workaround + + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + ${start-class} + exec + true + + + + + org.apache.maven.plugins + maven-compiler-plugin + + ${java.version} + ${java.version} + ${project.build.sourceEncoding} + false + + + + + org.codehaus.mojo + aspectj-maven-plugin + ${aspectj.plugin.version} + + ${java.version} + ${java.version} + ignore + ${java.version} + UTF-8 + + + + process-sources + + compile + test-compile + + + + + + org.aspectj + aspectjtools + ${aspectj.version} + + + + + + org.apache.maven.plugins + maven-surefire-plugin + + + **/*_Roo_* + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + + + --base-dir ${project.basedir} + --attribute + "projectName=${project.name}" + --attribute + "projectVersion=${project.version}" + --attribute "doctype=book" + + + ${project.groupId}:* + + org.asciidoctor.Asciidoclet + + org.asciidoctor + asciidoclet + ${asciidoclet.version} + + true + true + + http://docs.oracle.com/javase/${java.version}/docs/api/ + http://docs.oracle.com/javaee/${java.product.version}/api/ + http://docs.spring.io/spring-framework/docs/${spring.version}/javadoc-api/ + http://docs.spring.io/spring-boot/docs/${spring-boot.version}/api/ + http://fasterxml.github.io/jackson-core/javadoc/2.8/ + http://fasterxml.github.io/jackson-databind/javadoc/2.8 + http://cxf.apache.org/javadoc/latest-3.1.x/ + + src/main/java/overview.adoc + private + ${java.version} + + + + com.mysema.maven + apt-maven-plugin + 1.1.3 + + + + process + + + target/generated-sources/java + + org.springframework.roo.querydsl.processor.RooAnnotationProcessor + + + + + + + + com.querydsl + querydsl-apt + ${querydsl.version} + + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + org.apache.maven.plugins + maven-compiler-plugin + + + org.codehaus.mojo + aspectj-maven-plugin + + + org.apache.maven.plugins + maven-surefire-plugin + + + org.apache.maven.plugins + maven-javadoc-plugin + + + com.mysema.maven + apt-maven-plugin + + + + + diff --git a/roo/src/main/java/com/baeldung/RooApplication.java b/roo/src/main/java/com/baeldung/RooApplication.java new file mode 100644 index 0000000000..96f5a4ccc2 --- /dev/null +++ b/roo/src/main/java/com/baeldung/RooApplication.java @@ -0,0 +1,23 @@ +package com.baeldung; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * = RooApplication + * + * TODO Auto-generated class documentation + * + */ +@SpringBootApplication +public class RooApplication { + + /** + * TODO Auto-generated method documentation + * + * @param args + */ + public static void main(String[] args) { + SpringApplication.run(RooApplication.class, args); + } +} \ No newline at end of file diff --git a/roo/src/main/java/com/baeldung/config/SpringDataJpaDetachableRepositoryConfiguration.java b/roo/src/main/java/com/baeldung/config/SpringDataJpaDetachableRepositoryConfiguration.java new file mode 100644 index 0000000000..98916a9412 --- /dev/null +++ b/roo/src/main/java/com/baeldung/config/SpringDataJpaDetachableRepositoryConfiguration.java @@ -0,0 +1,11 @@ +package com.baeldung.config; +import org.springframework.roo.addon.layers.repository.jpa.annotations.RooJpaRepositoryConfiguration; + +/** + * = SpringDataJpaDetachableRepositoryConfiguration + TODO Auto-generated class documentation + * + */ +@RooJpaRepositoryConfiguration +public class SpringDataJpaDetachableRepositoryConfiguration { +} diff --git a/roo/src/main/java/com/baeldung/config/SpringDataJpaDetachableRepositoryConfiguration_Roo_Jpa_Repository_Configuration.aj b/roo/src/main/java/com/baeldung/config/SpringDataJpaDetachableRepositoryConfiguration_Roo_Jpa_Repository_Configuration.aj new file mode 100644 index 0000000000..7f54997ddb --- /dev/null +++ b/roo/src/main/java/com/baeldung/config/SpringDataJpaDetachableRepositoryConfiguration_Roo_Jpa_Repository_Configuration.aj @@ -0,0 +1,18 @@ +// WARNING: DO NOT EDIT THIS FILE. THIS FILE IS MANAGED BY SPRING ROO. +// You may push code into the target .java compilation unit if you wish to edit any member(s). + +package com.baeldung.config; + +import com.baeldung.RooApplication; +import com.baeldung.config.SpringDataJpaDetachableRepositoryConfiguration; +import io.springlets.data.jpa.repository.support.DetachableJpaRepositoryImpl; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; + +privileged aspect SpringDataJpaDetachableRepositoryConfiguration_Roo_Jpa_Repository_Configuration { + + declare @type: SpringDataJpaDetachableRepositoryConfiguration: @Configuration; + + declare @type: SpringDataJpaDetachableRepositoryConfiguration: @EnableJpaRepositories(repositoryBaseClass = DetachableJpaRepositoryImpl.class, basePackageClasses = RooApplication.class); + +} diff --git a/roo/src/main/java/com/baeldung/config/WebMvcConfiguration.java b/roo/src/main/java/com/baeldung/config/WebMvcConfiguration.java new file mode 100644 index 0000000000..5276300091 --- /dev/null +++ b/roo/src/main/java/com/baeldung/config/WebMvcConfiguration.java @@ -0,0 +1,13 @@ +package com.baeldung.config; +import org.springframework.roo.addon.web.mvc.controller.annotations.config.RooWebMvcConfiguration; +import org.springframework.roo.addon.web.mvc.thymeleaf.annotations.RooWebMvcThymeleafUIConfiguration; + +/** + * = WebMvcConfiguration + TODO Auto-generated class documentation + * + */ +@RooWebMvcConfiguration(defaultLanguage = "en") +@RooWebMvcThymeleafUIConfiguration +public class WebMvcConfiguration { +} diff --git a/roo/src/main/java/com/baeldung/config/WebMvcConfiguration_Roo_ThymeleafUIConfiguration.aj b/roo/src/main/java/com/baeldung/config/WebMvcConfiguration_Roo_ThymeleafUIConfiguration.aj new file mode 100644 index 0000000000..c21cb6b68c --- /dev/null +++ b/roo/src/main/java/com/baeldung/config/WebMvcConfiguration_Roo_ThymeleafUIConfiguration.aj @@ -0,0 +1,110 @@ +// WARNING: DO NOT EDIT THIS FILE. THIS FILE IS MANAGED BY SPRING ROO. +// You may push code into the target .java compilation unit if you wish to edit any member(s). + +package com.baeldung.config; + +import com.baeldung.config.WebMvcConfiguration; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.thymeleaf.ThymeleafProperties; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.context.annotation.Bean; +import org.thymeleaf.TemplateEngine; +import org.thymeleaf.spring4.templateresolver.SpringResourceTemplateResolver; +import org.thymeleaf.spring4.view.ThymeleafViewResolver; +import org.thymeleaf.templatemode.TemplateMode; + +privileged aspect WebMvcConfiguration_Roo_ThymeleafUIConfiguration { + + declare parents: WebMvcConfiguration implements ApplicationContextAware; + + /** + * TODO Auto-generated attribute documentation + * + */ + @Autowired + private ThymeleafProperties WebMvcConfiguration.thymeleafProperties; + + /** + * TODO Auto-generated attribute documentation + * + */ + @Autowired + private TemplateEngine WebMvcConfiguration.templateEngine; + + /** + * TODO Auto-generated attribute documentation + * + */ + private ApplicationContext WebMvcConfiguration.applicationContext; + + /** + * TODO Auto-generated method documentation + * + * @return ThymeleafProperties + */ + public ThymeleafProperties WebMvcConfiguration.getThymeleafProperties() { + return thymeleafProperties; + } + + /** + * TODO Auto-generated method documentation + * + * @return TemplateEngine + */ + public TemplateEngine WebMvcConfiguration.getTemplateEngine() { + return templateEngine; + } + + /** + * TODO Auto-generated method documentation + * + * @return ApplicationContext + */ + public ApplicationContext WebMvcConfiguration.getApplicationContext() { + return applicationContext; + } + + /** + * TODO Auto-generated method documentation + * + * @param applicationContext + */ + public void WebMvcConfiguration.setApplicationContext(ApplicationContext applicationContext) { + this.applicationContext = applicationContext; + } + + /** + * TODO Auto-generated method documentation + * + * @return ThymeleafViewResolver + */ + @Bean + public ThymeleafViewResolver WebMvcConfiguration.javascriptThymeleafViewResolver() { + ThymeleafViewResolver resolver = new ThymeleafViewResolver(); + resolver.setTemplateEngine(getTemplateEngine()); + resolver.setCharacterEncoding("UTF-8"); + resolver.setContentType("application/javascript"); + resolver.setViewNames(new String[] {"*.js"}); + resolver.setCache(getThymeleafProperties().isCache()); + return resolver; + } + + /** + * TODO Auto-generated method documentation + * + * @return SpringResourceTemplateResolver + */ + @Bean + public SpringResourceTemplateResolver WebMvcConfiguration.javascriptTemplateResolver() { + SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver(); + resolver.setApplicationContext(getApplicationContext()); + resolver.setPrefix("classpath:/templates/fragments/js/"); + resolver.setTemplateMode(TemplateMode.JAVASCRIPT); + resolver.setCharacterEncoding("UTF-8"); + resolver.setCheckExistence(true); + resolver.setCacheable(getThymeleafProperties().isCache()); + return resolver; + } + +} diff --git a/roo/src/main/java/com/baeldung/config/WebMvcConfiguration_Roo_WebMvcConfiguration.aj b/roo/src/main/java/com/baeldung/config/WebMvcConfiguration_Roo_WebMvcConfiguration.aj new file mode 100644 index 0000000000..8031c83ca3 --- /dev/null +++ b/roo/src/main/java/com/baeldung/config/WebMvcConfiguration_Roo_WebMvcConfiguration.aj @@ -0,0 +1,72 @@ +// WARNING: DO NOT EDIT THIS FILE. THIS FILE IS MANAGED BY SPRING ROO. +// You may push code into the target .java compilation unit if you wish to edit any member(s). + +package com.baeldung.config; + +import com.baeldung.config.WebMvcConfiguration; +import io.tracee.binding.springmvc.TraceeInterceptor; +import java.lang.Override; +import java.util.Locale; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean; +import org.springframework.web.servlet.LocaleResolver; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; +import org.springframework.web.servlet.i18n.LocaleChangeInterceptor; +import org.springframework.web.servlet.i18n.SessionLocaleResolver; + +privileged aspect WebMvcConfiguration_Roo_WebMvcConfiguration { + + declare parents: WebMvcConfiguration extends WebMvcConfigurerAdapter; + + declare @type: WebMvcConfiguration: @Configuration; + + /** + * TODO Auto-generated method documentation + * + * @return LocalValidatorFactoryBean + */ + @Primary + @Bean + public LocalValidatorFactoryBean WebMvcConfiguration.validator() { + return new LocalValidatorFactoryBean(); + } + + /** + * TODO Auto-generated method documentation + * + * @return LocaleResolver + */ + @Bean + public LocaleResolver WebMvcConfiguration.localeResolver() { + SessionLocaleResolver localeResolver = new SessionLocaleResolver(); + localeResolver.setDefaultLocale(new Locale("en")); + return localeResolver; + } + + /** + * TODO Auto-generated method documentation + * + * @return LocaleChangeInterceptor + */ + @Bean + public LocaleChangeInterceptor WebMvcConfiguration.localeChangeInterceptor() { + LocaleChangeInterceptor localeChangeInterceptor = new LocaleChangeInterceptor(); + localeChangeInterceptor.setParamName("lang"); + return localeChangeInterceptor; + } + + /** + * TODO Auto-generated method documentation + * + * @param registry + */ + @Override + public void WebMvcConfiguration.addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(localeChangeInterceptor()); + registry.addInterceptor(new TraceeInterceptor()); + } + +} diff --git a/roo/src/main/java/com/baeldung/config/jackson/DomainModelModule.java b/roo/src/main/java/com/baeldung/config/jackson/DomainModelModule.java new file mode 100644 index 0000000000..2a66a48846 --- /dev/null +++ b/roo/src/main/java/com/baeldung/config/jackson/DomainModelModule.java @@ -0,0 +1,11 @@ +package com.baeldung.config.jackson; +import org.springframework.roo.addon.web.mvc.controller.annotations.config.RooDomainModelModule; + +/** + * = DomainModelModule + TODO Auto-generated class documentation + * + */ +@RooDomainModelModule +public class DomainModelModule { +} diff --git a/roo/src/main/java/com/baeldung/config/jackson/DomainModelModule_Roo_DomainModelModule.aj b/roo/src/main/java/com/baeldung/config/jackson/DomainModelModule_Roo_DomainModelModule.aj new file mode 100644 index 0000000000..4683a3fe2d --- /dev/null +++ b/roo/src/main/java/com/baeldung/config/jackson/DomainModelModule_Roo_DomainModelModule.aj @@ -0,0 +1,28 @@ +// WARNING: DO NOT EDIT THIS FILE. THIS FILE IS MANAGED BY SPRING ROO. +// You may push code into the target .java compilation unit if you wish to edit any member(s). + +package com.baeldung.config.jackson; + +import com.baeldung.config.jackson.DomainModelModule; +import com.baeldung.domain.Book; +import com.baeldung.web.BookJsonMixin; +import com.fasterxml.jackson.databind.module.SimpleModule; +import org.springframework.boot.jackson.JsonComponent; + +privileged aspect DomainModelModule_Roo_DomainModelModule { + + declare parents: DomainModelModule extends SimpleModule; + + declare @type: DomainModelModule: @JsonComponent; + + /** + * TODO Auto-generated constructor documentation + * + */ + public DomainModelModule.new() { + // Mixin registration + + setMixInAnnotation(Book.class, BookJsonMixin.class); + } + +} diff --git a/roo/src/main/java/com/baeldung/domain/Book.java b/roo/src/main/java/com/baeldung/domain/Book.java new file mode 100644 index 0000000000..99e7b894e6 --- /dev/null +++ b/roo/src/main/java/com/baeldung/domain/Book.java @@ -0,0 +1,58 @@ +package com.baeldung.domain; +import org.springframework.roo.addon.javabean.annotations.RooEquals; +import org.springframework.roo.addon.javabean.annotations.RooJavaBean; +import org.springframework.roo.addon.javabean.annotations.RooToString; +import org.springframework.roo.addon.jpa.annotations.entity.RooJpaEntity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Version; +import javax.validation.constraints.NotNull; + +/** + * = Book + TODO Auto-generated class documentation + * + */ +@RooJavaBean +@RooToString +@RooJpaEntity +@RooEquals(isJpaEntity = true) +public class Book { + + /** + * TODO Auto-generated attribute documentation + * + */ + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id; + + /** + * TODO Auto-generated attribute documentation + * + */ + @Version + private Integer version; + + /** + * TODO Auto-generated attribute documentation + * + */ + @NotNull + private String title; + + /** + * TODO Auto-generated attribute documentation + * + */ + @NotNull + private String author; + + /** + * TODO Auto-generated attribute documentation + * + */ + @NotNull + private String isbn; +} diff --git a/roo/src/main/java/com/baeldung/domain/Book_Roo_Equals.aj b/roo/src/main/java/com/baeldung/domain/Book_Roo_Equals.aj new file mode 100644 index 0000000000..51d6069eb0 --- /dev/null +++ b/roo/src/main/java/com/baeldung/domain/Book_Roo_Equals.aj @@ -0,0 +1,41 @@ +// WARNING: DO NOT EDIT THIS FILE. THIS FILE IS MANAGED BY SPRING ROO. +// You may push code into the target .java compilation unit if you wish to edit any member(s). + +package com.baeldung.domain; + +import com.baeldung.domain.Book; +import java.util.Objects; + +privileged aspect Book_Roo_Equals { + + /** + * This `equals` implementation is specific for JPA entities and uses + * the entity identifier for it, following the article in + * https://vladmihalcea.com/2016/06/06/how-to-implement-equals-and-hashcode-using-the-jpa-entity-identifier/ + * + * @param obj + * @return Boolean + */ + public boolean Book.equals(Object obj) { + if (this == obj) { + return true; + } + // instanceof is false if the instance is null + if (!(obj instanceof Book)) { + return false; + } + return getId() != null && Objects.equals(getId(), ((Book) obj).getId()); + } + + /** + * This `hashCode` implementation is specific for JPA entities and uses a fixed `int` value to be able + * to identify the entity in collections after a new id is assigned to the entity, following the article in + * https://vladmihalcea.com/2016/06/06/how-to-implement-equals-and-hashcode-using-the-jpa-entity-identifier/ + * + * @return Integer + */ + public int Book.hashCode() { + return 31; + } + +} diff --git a/roo/src/main/java/com/baeldung/domain/Book_Roo_JavaBean.aj b/roo/src/main/java/com/baeldung/domain/Book_Roo_JavaBean.aj new file mode 100644 index 0000000000..3ea375ce12 --- /dev/null +++ b/roo/src/main/java/com/baeldung/domain/Book_Roo_JavaBean.aj @@ -0,0 +1,100 @@ +// WARNING: DO NOT EDIT THIS FILE. THIS FILE IS MANAGED BY SPRING ROO. +// You may push code into the target .java compilation unit if you wish to edit any member(s). + +package com.baeldung.domain; + +import com.baeldung.domain.Book; + +privileged aspect Book_Roo_JavaBean { + + /** + * TODO Auto-generated method documentation + * + * @return Long + */ + public Long Book.getId() { + return this.id; + } + + /** + * TODO Auto-generated method documentation + * + * @param id + */ + public void Book.setId(Long id) { + this.id = id; + } + + /** + * TODO Auto-generated method documentation + * + * @return Integer + */ + public Integer Book.getVersion() { + return this.version; + } + + /** + * TODO Auto-generated method documentation + * + * @param version + */ + public void Book.setVersion(Integer version) { + this.version = version; + } + + /** + * TODO Auto-generated method documentation + * + * @return String + */ + public String Book.getTitle() { + return this.title; + } + + /** + * TODO Auto-generated method documentation + * + * @param title + */ + public void Book.setTitle(String title) { + this.title = title; + } + + /** + * TODO Auto-generated method documentation + * + * @return String + */ + public String Book.getAuthor() { + return this.author; + } + + /** + * TODO Auto-generated method documentation + * + * @param author + */ + public void Book.setAuthor(String author) { + this.author = author; + } + + /** + * TODO Auto-generated method documentation + * + * @return String + */ + public String Book.getIsbn() { + return this.isbn; + } + + /** + * TODO Auto-generated method documentation + * + * @param isbn + */ + public void Book.setIsbn(String isbn) { + this.isbn = isbn; + } + +} diff --git a/roo/src/main/java/com/baeldung/domain/Book_Roo_Jpa_Entity.aj b/roo/src/main/java/com/baeldung/domain/Book_Roo_Jpa_Entity.aj new file mode 100644 index 0000000000..739a00e058 --- /dev/null +++ b/roo/src/main/java/com/baeldung/domain/Book_Roo_Jpa_Entity.aj @@ -0,0 +1,28 @@ +// WARNING: DO NOT EDIT THIS FILE. THIS FILE IS MANAGED BY SPRING ROO. +// You may push code into the target .java compilation unit if you wish to edit any member(s). + +package com.baeldung.domain; + +import com.baeldung.domain.Book; +import io.springlets.format.EntityFormat; +import javax.persistence.Entity; + +privileged aspect Book_Roo_Jpa_Entity { + + declare @type: Book: @Entity; + + declare @type: Book: @EntityFormat; + + /** + * TODO Auto-generated attribute documentation + * + */ + public static final String Book.ITERABLE_TO_ADD_CANT_BE_NULL_MESSAGE = "The given Iterable of items to add can't be null!"; + + /** + * TODO Auto-generated attribute documentation + * + */ + public static final String Book.ITERABLE_TO_REMOVE_CANT_BE_NULL_MESSAGE = "The given Iterable of items to add can't be null!"; + +} diff --git a/roo/src/main/java/com/baeldung/domain/Book_Roo_ToString.aj b/roo/src/main/java/com/baeldung/domain/Book_Roo_ToString.aj new file mode 100644 index 0000000000..69083eaf9e --- /dev/null +++ b/roo/src/main/java/com/baeldung/domain/Book_Roo_ToString.aj @@ -0,0 +1,26 @@ +// WARNING: DO NOT EDIT THIS FILE. THIS FILE IS MANAGED BY SPRING ROO. +// You may push code into the target .java compilation unit if you wish to edit any member(s). + +package com.baeldung.domain; + +import com.baeldung.domain.Book; + +privileged aspect Book_Roo_ToString { + + /** + * TODO Auto-generated method documentation + * + * @return String + */ + public String Book.toString() { + return "Book {" + + "id='" + id + '\'' + + ", version='" + version + '\'' + + ", title='" + title + '\'' + + ", author='" + author + '\'' + + ", isbn='" + isbn + '\'' + + ", ITERABLE_TO_ADD_CANT_BE_NULL_MESSAGE='" + ITERABLE_TO_ADD_CANT_BE_NULL_MESSAGE + '\'' + + ", ITERABLE_TO_REMOVE_CANT_BE_NULL_MESSAGE='" + ITERABLE_TO_REMOVE_CANT_BE_NULL_MESSAGE + '\'' + "}" + super.toString(); + } + +} diff --git a/roo/src/main/java/com/baeldung/repository/BookRepository.java b/roo/src/main/java/com/baeldung/repository/BookRepository.java new file mode 100644 index 0000000000..78567c1c92 --- /dev/null +++ b/roo/src/main/java/com/baeldung/repository/BookRepository.java @@ -0,0 +1,12 @@ +package com.baeldung.repository; +import com.baeldung.domain.Book; +import org.springframework.roo.addon.layers.repository.jpa.annotations.RooJpaRepository; + +/** + * = BookRepository + TODO Auto-generated class documentation + * + */ +@RooJpaRepository(entity = Book.class) +public interface BookRepository { +} diff --git a/roo/src/main/java/com/baeldung/repository/BookRepositoryCustom.java b/roo/src/main/java/com/baeldung/repository/BookRepositoryCustom.java new file mode 100644 index 0000000000..44469e31b6 --- /dev/null +++ b/roo/src/main/java/com/baeldung/repository/BookRepositoryCustom.java @@ -0,0 +1,12 @@ +package com.baeldung.repository; +import com.baeldung.domain.Book; +import org.springframework.roo.addon.layers.repository.jpa.annotations.RooJpaRepositoryCustom; + +/** + * = BookRepositoryCustom + TODO Auto-generated class documentation + * + */ +@RooJpaRepositoryCustom(entity = Book.class) +public interface BookRepositoryCustom { +} diff --git a/roo/src/main/java/com/baeldung/repository/BookRepositoryCustom_Roo_Jpa_Repository_Custom.aj b/roo/src/main/java/com/baeldung/repository/BookRepositoryCustom_Roo_Jpa_Repository_Custom.aj new file mode 100644 index 0000000000..7cb44f84a1 --- /dev/null +++ b/roo/src/main/java/com/baeldung/repository/BookRepositoryCustom_Roo_Jpa_Repository_Custom.aj @@ -0,0 +1,23 @@ +// WARNING: DO NOT EDIT THIS FILE. THIS FILE IS MANAGED BY SPRING ROO. +// You may push code into the target .java compilation unit if you wish to edit any member(s). + +package com.baeldung.repository; + +import com.baeldung.domain.Book; +import com.baeldung.repository.BookRepositoryCustom; +import io.springlets.data.domain.GlobalSearch; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; + +privileged aspect BookRepositoryCustom_Roo_Jpa_Repository_Custom { + + /** + * TODO Auto-generated method documentation + * + * @param globalSearch + * @param pageable + * @return Page + */ + public abstract Page BookRepositoryCustom.findAll(GlobalSearch globalSearch, Pageable pageable); + +} diff --git a/roo/src/main/java/com/baeldung/repository/BookRepositoryImpl.java b/roo/src/main/java/com/baeldung/repository/BookRepositoryImpl.java new file mode 100644 index 0000000000..e59ff8ab0e --- /dev/null +++ b/roo/src/main/java/com/baeldung/repository/BookRepositoryImpl.java @@ -0,0 +1,22 @@ +package com.baeldung.repository; + +import io.springlets.data.jpa.repository.support.QueryDslRepositorySupportExt; +import org.springframework.roo.addon.layers.repository.jpa.annotations.RooJpaRepositoryCustomImpl; +import com.baeldung.domain.Book; + +/** + * = BookRepositoryImpl + * + * TODO Auto-generated class documentation + * + */ +@RooJpaRepositoryCustomImpl(repository = BookRepositoryCustom.class) +public class BookRepositoryImpl extends QueryDslRepositorySupportExt { + + /** + * TODO Auto-generated constructor documentation + */ + BookRepositoryImpl() { + super(Book.class); + } +} \ No newline at end of file diff --git a/roo/src/main/java/com/baeldung/repository/BookRepositoryImpl_Roo_Jpa_Repository_Impl.aj b/roo/src/main/java/com/baeldung/repository/BookRepositoryImpl_Roo_Jpa_Repository_Impl.aj new file mode 100644 index 0000000000..9e3db3e1f4 --- /dev/null +++ b/roo/src/main/java/com/baeldung/repository/BookRepositoryImpl_Roo_Jpa_Repository_Impl.aj @@ -0,0 +1,69 @@ +// WARNING: DO NOT EDIT THIS FILE. THIS FILE IS MANAGED BY SPRING ROO. +// You may push code into the target .java compilation unit if you wish to edit any member(s). + +package com.baeldung.repository; + +import com.baeldung.domain.Book; +import com.baeldung.domain.QBook; +import com.baeldung.repository.BookRepositoryCustom; +import com.baeldung.repository.BookRepositoryImpl; +import com.querydsl.core.types.Path; +import com.querydsl.jpa.JPQLQuery; +import io.springlets.data.domain.GlobalSearch; +import io.springlets.data.jpa.repository.support.QueryDslRepositorySupportExt.AttributeMappingBuilder; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.transaction.annotation.Transactional; + +privileged aspect BookRepositoryImpl_Roo_Jpa_Repository_Impl { + + declare parents: BookRepositoryImpl implements BookRepositoryCustom; + + declare @type: BookRepositoryImpl: @Transactional(readOnly = true); + + /** + * TODO Auto-generated attribute documentation + * + */ + public static final String BookRepositoryImpl.TITLE = "title"; + + /** + * TODO Auto-generated attribute documentation + * + */ + public static final String BookRepositoryImpl.AUTHOR = "author"; + + /** + * TODO Auto-generated attribute documentation + * + */ + public static final String BookRepositoryImpl.ISBN = "isbn"; + + /** + * TODO Auto-generated method documentation + * + * @param globalSearch + * @param pageable + * @return Page + */ + public Page BookRepositoryImpl.findAll(GlobalSearch globalSearch, Pageable pageable) { + + QBook book = QBook.book; + + JPQLQuery query = from(book); + + Path[] paths = new Path[] {book.title,book.author,book.isbn}; + applyGlobalSearch(globalSearch, query, paths); + + AttributeMappingBuilder mapping = buildMapper() + .map(TITLE, book.title) + .map(AUTHOR, book.author) + .map(ISBN, book.isbn); + + applyPagination(pageable, query, mapping); + applyOrderById(query); + + return loadPage(query, pageable, book); + } + +} diff --git a/roo/src/main/java/com/baeldung/repository/BookRepository_Roo_Jpa_Repository.aj b/roo/src/main/java/com/baeldung/repository/BookRepository_Roo_Jpa_Repository.aj new file mode 100644 index 0000000000..2f57062054 --- /dev/null +++ b/roo/src/main/java/com/baeldung/repository/BookRepository_Roo_Jpa_Repository.aj @@ -0,0 +1,20 @@ +// WARNING: DO NOT EDIT THIS FILE. THIS FILE IS MANAGED BY SPRING ROO. +// You may push code into the target .java compilation unit if you wish to edit any member(s). + +package com.baeldung.repository; + +import com.baeldung.domain.Book; +import com.baeldung.repository.BookRepository; +import com.baeldung.repository.BookRepositoryCustom; +import io.springlets.data.jpa.repository.DetachableJpaRepository; +import org.springframework.transaction.annotation.Transactional; + +privileged aspect BookRepository_Roo_Jpa_Repository { + + declare parents: BookRepository extends DetachableJpaRepository; + + declare parents: BookRepository extends BookRepositoryCustom; + + declare @type: BookRepository: @Transactional(readOnly = true); + +} diff --git a/roo/src/main/java/com/baeldung/service/api/BookService.java b/roo/src/main/java/com/baeldung/service/api/BookService.java new file mode 100644 index 0000000000..212ee1cdfc --- /dev/null +++ b/roo/src/main/java/com/baeldung/service/api/BookService.java @@ -0,0 +1,12 @@ +package com.baeldung.service.api; +import com.baeldung.domain.Book; +import org.springframework.roo.addon.layers.service.annotations.RooService; + +/** + * = BookService + TODO Auto-generated class documentation + * + */ +@RooService(entity = Book.class) +public interface BookService { +} diff --git a/roo/src/main/java/com/baeldung/service/api/BookService_Roo_Service.aj b/roo/src/main/java/com/baeldung/service/api/BookService_Roo_Service.aj new file mode 100644 index 0000000000..d5698ffb37 --- /dev/null +++ b/roo/src/main/java/com/baeldung/service/api/BookService_Roo_Service.aj @@ -0,0 +1,95 @@ +// WARNING: DO NOT EDIT THIS FILE. THIS FILE IS MANAGED BY SPRING ROO. +// You may push code into the target .java compilation unit if you wish to edit any member(s). + +package com.baeldung.service.api; + +import com.baeldung.domain.Book; +import com.baeldung.service.api.BookService; +import io.springlets.data.domain.GlobalSearch; +import io.springlets.format.EntityResolver; +import java.util.List; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; + +privileged aspect BookService_Roo_Service { + + declare parents: BookService extends EntityResolver; + + /** + * TODO Auto-generated method documentation + * + * @param id + * @return Book + */ + public abstract Book BookService.findOne(Long id); + + /** + * TODO Auto-generated method documentation + * + * @param book + */ + public abstract void BookService.delete(Book book); + + /** + * TODO Auto-generated method documentation + * + * @param entities + * @return List + */ + public abstract List BookService.save(Iterable entities); + + /** + * TODO Auto-generated method documentation + * + * @param ids + */ + public abstract void BookService.delete(Iterable ids); + + /** + * TODO Auto-generated method documentation + * + * @param entity + * @return Book + */ + public abstract Book BookService.save(Book entity); + + /** + * TODO Auto-generated method documentation + * + * @param id + * @return Book + */ + public abstract Book BookService.findOneForUpdate(Long id); + + /** + * TODO Auto-generated method documentation + * + * @param ids + * @return List + */ + public abstract List BookService.findAll(Iterable ids); + + /** + * TODO Auto-generated method documentation + * + * @return List + */ + public abstract List BookService.findAll(); + + /** + * TODO Auto-generated method documentation + * + * @return Long + */ + public abstract long BookService.count(); + + /** + * TODO Auto-generated method documentation + * + * @param globalSearch + * @param pageable + * @return Page + */ + public abstract Page BookService.findAll(GlobalSearch globalSearch, Pageable pageable); + +} diff --git a/roo/src/main/java/com/baeldung/service/impl/BookServiceImpl.java b/roo/src/main/java/com/baeldung/service/impl/BookServiceImpl.java new file mode 100644 index 0000000000..1b44547629 --- /dev/null +++ b/roo/src/main/java/com/baeldung/service/impl/BookServiceImpl.java @@ -0,0 +1,12 @@ +package com.baeldung.service.impl; +import com.baeldung.service.api.BookService; +import org.springframework.roo.addon.layers.service.annotations.RooServiceImpl; + +/** + * = BookServiceImpl + TODO Auto-generated class documentation + * + */ +@RooServiceImpl(service = BookService.class) +public class BookServiceImpl implements BookService { +} diff --git a/roo/src/main/java/com/baeldung/service/impl/BookServiceImpl_Roo_Service_Impl.aj b/roo/src/main/java/com/baeldung/service/impl/BookServiceImpl_Roo_Service_Impl.aj new file mode 100644 index 0000000000..8f9fb846aa --- /dev/null +++ b/roo/src/main/java/com/baeldung/service/impl/BookServiceImpl_Roo_Service_Impl.aj @@ -0,0 +1,177 @@ +// WARNING: DO NOT EDIT THIS FILE. THIS FILE IS MANAGED BY SPRING ROO. +// You may push code into the target .java compilation unit if you wish to edit any member(s). + +package com.baeldung.service.impl; + +import com.baeldung.domain.Book; +import com.baeldung.repository.BookRepository; +import com.baeldung.service.impl.BookServiceImpl; +import io.springlets.data.domain.GlobalSearch; +import java.util.List; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +privileged aspect BookServiceImpl_Roo_Service_Impl { + + declare @type: BookServiceImpl: @Service; + + declare @type: BookServiceImpl: @Transactional(readOnly = true); + + /** + * TODO Auto-generated attribute documentation + * + */ + private BookRepository BookServiceImpl.bookRepository; + + /** + * TODO Auto-generated constructor documentation + * + * @param bookRepository + */ + @Autowired + public BookServiceImpl.new(BookRepository bookRepository) { + setBookRepository(bookRepository); + } + + /** + * TODO Auto-generated method documentation + * + * @return BookRepository + */ + public BookRepository BookServiceImpl.getBookRepository() { + return bookRepository; + } + + /** + * TODO Auto-generated method documentation + * + * @param bookRepository + */ + public void BookServiceImpl.setBookRepository(BookRepository bookRepository) { + this.bookRepository = bookRepository; + } + + /** + * TODO Auto-generated method documentation + * + * @param book + */ + @Transactional + public void BookServiceImpl.delete(Book book) { + getBookRepository().delete(book); + } + + /** + * TODO Auto-generated method documentation + * + * @param entities + * @return List + */ + @Transactional + public List BookServiceImpl.save(Iterable entities) { + return getBookRepository().save(entities); + } + + /** + * TODO Auto-generated method documentation + * + * @param ids + */ + @Transactional + public void BookServiceImpl.delete(Iterable ids) { + List toDelete = getBookRepository().findAll(ids); + getBookRepository().deleteInBatch(toDelete); + } + + /** + * TODO Auto-generated method documentation + * + * @param entity + * @return Book + */ + @Transactional + public Book BookServiceImpl.save(Book entity) { + return getBookRepository().save(entity); + } + + /** + * TODO Auto-generated method documentation + * + * @param id + * @return Book + */ + public Book BookServiceImpl.findOne(Long id) { + return getBookRepository().findOne(id); + } + + /** + * TODO Auto-generated method documentation + * + * @param id + * @return Book + */ + public Book BookServiceImpl.findOneForUpdate(Long id) { + return getBookRepository().findOneDetached(id); + } + + /** + * TODO Auto-generated method documentation + * + * @param ids + * @return List + */ + public List BookServiceImpl.findAll(Iterable ids) { + return getBookRepository().findAll(ids); + } + + /** + * TODO Auto-generated method documentation + * + * @return List + */ + public List BookServiceImpl.findAll() { + return getBookRepository().findAll(); + } + + /** + * TODO Auto-generated method documentation + * + * @return Long + */ + public long BookServiceImpl.count() { + return getBookRepository().count(); + } + + /** + * TODO Auto-generated method documentation + * + * @param globalSearch + * @param pageable + * @return Page + */ + public Page BookServiceImpl.findAll(GlobalSearch globalSearch, Pageable pageable) { + return getBookRepository().findAll(globalSearch, pageable); + } + + /** + * TODO Auto-generated method documentation + * + * @return Class + */ + public Class BookServiceImpl.getEntityType() { + return Book.class; + } + + /** + * TODO Auto-generated method documentation + * + * @return Class + */ + public Class BookServiceImpl.getIdType() { + return Long.class; + } + +} diff --git a/roo/src/main/java/com/baeldung/web/BookDeserializer.java b/roo/src/main/java/com/baeldung/web/BookDeserializer.java new file mode 100644 index 0000000000..38c447e580 --- /dev/null +++ b/roo/src/main/java/com/baeldung/web/BookDeserializer.java @@ -0,0 +1,41 @@ +package com.baeldung.web; +import com.baeldung.domain.Book; +import com.baeldung.service.api.BookService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.jackson.JsonObjectDeserializer; +import org.springframework.context.annotation.Lazy; +import org.springframework.core.convert.ConversionService; +import org.springframework.roo.addon.web.mvc.controller.annotations.config.RooDeserializer; + +/** + * = BookDeserializer + TODO Auto-generated class documentation + * + */ +@RooDeserializer(entity = Book.class) +public class BookDeserializer extends JsonObjectDeserializer { + + /** + * TODO Auto-generated attribute documentation + * + */ + private BookService bookService; + + /** + * TODO Auto-generated attribute documentation + * + */ + private ConversionService conversionService; + + /** + * TODO Auto-generated constructor documentation + * + * @param bookService + * @param conversionService + */ + @Autowired + public BookDeserializer(@Lazy BookService bookService, ConversionService conversionService) { + this.bookService = bookService; + this.conversionService = conversionService; + } +} diff --git a/roo/src/main/java/com/baeldung/web/BookDeserializer_Roo_EntityDeserializer.aj b/roo/src/main/java/com/baeldung/web/BookDeserializer_Roo_EntityDeserializer.aj new file mode 100644 index 0000000000..5ca42cfb5e --- /dev/null +++ b/roo/src/main/java/com/baeldung/web/BookDeserializer_Roo_EntityDeserializer.aj @@ -0,0 +1,78 @@ +// WARNING: DO NOT EDIT THIS FILE. THIS FILE IS MANAGED BY SPRING ROO. +// You may push code into the target .java compilation unit if you wish to edit any member(s). + +package com.baeldung.web; + +import com.baeldung.domain.Book; +import com.baeldung.service.api.BookService; +import com.baeldung.web.BookDeserializer; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.ObjectCodec; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonNode; +import io.springlets.web.NotFoundException; +import java.io.IOException; +import org.springframework.boot.jackson.JsonComponent; +import org.springframework.core.convert.ConversionService; + +privileged aspect BookDeserializer_Roo_EntityDeserializer { + + declare @type: BookDeserializer: @JsonComponent; + + /** + * TODO Auto-generated method documentation + * + * @return BookService + */ + public BookService BookDeserializer.getBookService() { + return bookService; + } + + /** + * TODO Auto-generated method documentation + * + * @param bookService + */ + public void BookDeserializer.setBookService(BookService bookService) { + this.bookService = bookService; + } + + /** + * TODO Auto-generated method documentation + * + * @return ConversionService + */ + public ConversionService BookDeserializer.getConversionService() { + return conversionService; + } + + /** + * TODO Auto-generated method documentation + * + * @param conversionService + */ + public void BookDeserializer.setConversionService(ConversionService conversionService) { + this.conversionService = conversionService; + } + + /** + * TODO Auto-generated method documentation + * + * @param jsonParser + * @param context + * @param codec + * @param tree + * @return Book + * @throws IOException + */ + public Book BookDeserializer.deserializeObject(JsonParser jsonParser, DeserializationContext context, ObjectCodec codec, JsonNode tree) throws IOException { + String idText = tree.asText(); + Long id = conversionService.convert(idText, Long.class); + Book book = bookService.findOne(id); + if (book == null) { + throw new NotFoundException("Book not found"); + } + return book; + } + +} diff --git a/roo/src/main/java/com/baeldung/web/BookJsonMixin.java b/roo/src/main/java/com/baeldung/web/BookJsonMixin.java new file mode 100644 index 0000000000..1cde8f0e86 --- /dev/null +++ b/roo/src/main/java/com/baeldung/web/BookJsonMixin.java @@ -0,0 +1,12 @@ +package com.baeldung.web; +import com.baeldung.domain.Book; +import org.springframework.roo.addon.web.mvc.controller.annotations.config.RooJsonMixin; + +/** + * = BookJsonMixin + TODO Auto-generated class documentation + * + */ +@RooJsonMixin(entity = Book.class) +public abstract class BookJsonMixin { +} diff --git a/roo/src/main/java/com/baeldung/web/BooksCollectionThymeleafController.java b/roo/src/main/java/com/baeldung/web/BooksCollectionThymeleafController.java new file mode 100644 index 0000000000..9b0179e234 --- /dev/null +++ b/roo/src/main/java/com/baeldung/web/BooksCollectionThymeleafController.java @@ -0,0 +1,15 @@ +package com.baeldung.web; +import com.baeldung.domain.Book; +import org.springframework.roo.addon.web.mvc.controller.annotations.ControllerType; +import org.springframework.roo.addon.web.mvc.controller.annotations.RooController; +import org.springframework.roo.addon.web.mvc.thymeleaf.annotations.RooThymeleaf; + +/** + * = BooksCollectionThymeleafController + TODO Auto-generated class documentation + * + */ +@RooController(entity = Book.class, type = ControllerType.COLLECTION) +@RooThymeleaf +public class BooksCollectionThymeleafController { +} diff --git a/roo/src/main/java/com/baeldung/web/BooksCollectionThymeleafController_Roo_Controller.aj b/roo/src/main/java/com/baeldung/web/BooksCollectionThymeleafController_Roo_Controller.aj new file mode 100644 index 0000000000..a87b76a745 --- /dev/null +++ b/roo/src/main/java/com/baeldung/web/BooksCollectionThymeleafController_Roo_Controller.aj @@ -0,0 +1,35 @@ +// WARNING: DO NOT EDIT THIS FILE. THIS FILE IS MANAGED BY SPRING ROO. +// You may push code into the target .java compilation unit if you wish to edit any member(s). + +package com.baeldung.web; + +import com.baeldung.service.api.BookService; +import com.baeldung.web.BooksCollectionThymeleafController; + +privileged aspect BooksCollectionThymeleafController_Roo_Controller { + + /** + * TODO Auto-generated attribute documentation + * + */ + private BookService BooksCollectionThymeleafController.bookService; + + /** + * TODO Auto-generated method documentation + * + * @return BookService + */ + public BookService BooksCollectionThymeleafController.getBookService() { + return bookService; + } + + /** + * TODO Auto-generated method documentation + * + * @param bookService + */ + public void BooksCollectionThymeleafController.setBookService(BookService bookService) { + this.bookService = bookService; + } + +} diff --git a/roo/src/main/java/com/baeldung/web/BooksCollectionThymeleafController_Roo_Thymeleaf.aj b/roo/src/main/java/com/baeldung/web/BooksCollectionThymeleafController_Roo_Thymeleaf.aj new file mode 100644 index 0000000000..b0831730be --- /dev/null +++ b/roo/src/main/java/com/baeldung/web/BooksCollectionThymeleafController_Roo_Thymeleaf.aj @@ -0,0 +1,470 @@ +// WARNING: DO NOT EDIT THIS FILE. THIS FILE IS MANAGED BY SPRING ROO. +// You may push code into the target .java compilation unit if you wish to edit any member(s). + +package com.baeldung.web; + +import ar.com.fdvs.dj.core.DynamicJasperHelper; +import ar.com.fdvs.dj.core.layout.ClassicLayoutManager; +import ar.com.fdvs.dj.domain.builders.ColumnBuilderException; +import ar.com.fdvs.dj.domain.builders.FastReportBuilder; +import com.baeldung.domain.Book; +import com.baeldung.service.api.BookService; +import com.baeldung.web.BooksCollectionThymeleafController; +import com.baeldung.web.BooksItemThymeleafController; +import com.baeldung.web.BooksItemThymeleafLinkFactory; +import com.baeldung.web.reports.ExportingErrorException; +import com.baeldung.web.reports.JasperReportsCsvExporter; +import com.baeldung.web.reports.JasperReportsExporter; +import com.baeldung.web.reports.JasperReportsPdfExporter; +import com.baeldung.web.reports.JasperReportsXlsExporter; +import io.springlets.data.domain.GlobalSearch; +import io.springlets.data.web.datatables.ConvertedDatatablesData; +import io.springlets.data.web.datatables.Datatables; +import io.springlets.data.web.datatables.DatatablesColumns; +import io.springlets.data.web.datatables.DatatablesPageable; +import io.springlets.data.web.select2.Select2DataSupport; +import io.springlets.data.web.select2.Select2DataWithConversion; +import io.springlets.web.mvc.util.ControllerMethodLinkBuilderFactory; +import io.springlets.web.mvc.util.MethodLinkBuilderFactory; +import java.io.IOException; +import java.util.Collection; +import java.util.Locale; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import net.sf.jasperreports.engine.JRDataSource; +import net.sf.jasperreports.engine.JRException; +import net.sf.jasperreports.engine.JasperPrint; +import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.MessageSource; +import org.springframework.context.i18n.LocaleContextHolder; +import org.springframework.core.convert.ConversionService; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.web.PageableDefault; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.WebDataBinder; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.InitBinder; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.servlet.ModelAndView; +import org.springframework.web.util.UriComponents; + +privileged aspect BooksCollectionThymeleafController_Roo_Thymeleaf { + + declare @type: BooksCollectionThymeleafController: @Controller; + + declare @type: BooksCollectionThymeleafController: @RequestMapping(value = "/books", name = "BooksCollectionThymeleafController", produces = MediaType.TEXT_HTML_VALUE); + + /** + * TODO Auto-generated attribute documentation + * + */ + private MessageSource BooksCollectionThymeleafController.messageSource; + + /** + * TODO Auto-generated attribute documentation + * + */ + private MethodLinkBuilderFactory BooksCollectionThymeleafController.itemLink; + + /** + * TODO Auto-generated attribute documentation + * + */ + private ConversionService BooksCollectionThymeleafController.conversionService; + + /** + * TODO Auto-generated constructor documentation + * + * @param bookService + * @param conversionService + * @param messageSource + * @param linkBuilder + */ + @Autowired + public BooksCollectionThymeleafController.new(BookService bookService, ConversionService conversionService, MessageSource messageSource, ControllerMethodLinkBuilderFactory linkBuilder) { + setBookService(bookService); + setConversionService(conversionService); + setMessageSource(messageSource); + setItemLink(linkBuilder.of(BooksItemThymeleafController.class)); + } + + /** + * TODO Auto-generated method documentation + * + * @return MessageSource + */ + public MessageSource BooksCollectionThymeleafController.getMessageSource() { + return messageSource; + } + + /** + * TODO Auto-generated method documentation + * + * @param messageSource + */ + public void BooksCollectionThymeleafController.setMessageSource(MessageSource messageSource) { + this.messageSource = messageSource; + } + + /** + * TODO Auto-generated method documentation + * + * @return MethodLinkBuilderFactory + */ + public MethodLinkBuilderFactory BooksCollectionThymeleafController.getItemLink() { + return itemLink; + } + + /** + * TODO Auto-generated method documentation + * + * @param itemLink + */ + public void BooksCollectionThymeleafController.setItemLink(MethodLinkBuilderFactory itemLink) { + this.itemLink = itemLink; + } + + /** + * TODO Auto-generated method documentation + * + * @return ConversionService + */ + public ConversionService BooksCollectionThymeleafController.getConversionService() { + return conversionService; + } + + /** + * TODO Auto-generated method documentation + * + * @param conversionService + */ + public void BooksCollectionThymeleafController.setConversionService(ConversionService conversionService) { + this.conversionService = conversionService; + } + + /** + * TODO Auto-generated method documentation + * + * @param model + * @return ModelAndView + */ + @GetMapping(name = "list") + public ModelAndView BooksCollectionThymeleafController.list(Model model) { + return new ModelAndView("/books/list"); + } + + /** + * TODO Auto-generated method documentation + * + * @param datatablesColumns + * @param search + * @param pageable + * @param draw + * @return ResponseEntity + */ + @GetMapping(produces = Datatables.MEDIA_TYPE, name = "datatables", value = "/dt") + @ResponseBody + public ResponseEntity> BooksCollectionThymeleafController.datatables(DatatablesColumns datatablesColumns, GlobalSearch search, DatatablesPageable pageable, @RequestParam("draw") Integer draw) { + Page books = getBookService().findAll(search, pageable); + long totalBooksCount = books.getTotalElements(); + if (search != null && StringUtils.isNotBlank(search.getText())) { + totalBooksCount = getBookService().count(); + } + ConvertedDatatablesData datatablesData = new ConvertedDatatablesData(books, totalBooksCount, draw, getConversionService(), datatablesColumns); + return ResponseEntity.ok(datatablesData); + } + + /** + * TODO Auto-generated method documentation + * + * @param search + * @param pageable + * @param locale + * @return ResponseEntity + */ + @GetMapping(produces = MediaType.APPLICATION_JSON_VALUE, name = "select2", value = "/s2") + @ResponseBody + public ResponseEntity> BooksCollectionThymeleafController.select2(GlobalSearch search, Pageable pageable, Locale locale) { + Page books = getBookService().findAll(search, pageable); + String idExpression = "#{id}"; + Select2DataSupport select2Data = new Select2DataWithConversion(books, idExpression, getConversionService()); + return ResponseEntity.ok(select2Data); + } + + /** + * TODO Auto-generated method documentation + * + * @param dataBinder + */ + @InitBinder("book") + public void BooksCollectionThymeleafController.initBookBinder(WebDataBinder dataBinder) { + dataBinder.setDisallowedFields("id"); + } + + /** + * TODO Auto-generated method documentation + * + * @param model + */ + public void BooksCollectionThymeleafController.populateFormats(Model model) { + model.addAttribute("application_locale", LocaleContextHolder.getLocale().getLanguage()); + } + + /** + * TODO Auto-generated method documentation + * + * @param model + */ + public void BooksCollectionThymeleafController.populateForm(Model model) { + populateFormats(model); + } + + /** + * TODO Auto-generated method documentation + * + * @param book + * @param result + * @param model + * @return ModelAndView + */ + @PostMapping(name = "create") + public ModelAndView BooksCollectionThymeleafController.create(@Valid @ModelAttribute Book book, BindingResult result, Model model) { + if (result.hasErrors()) { + populateForm(model); + + return new ModelAndView("/books/create"); + } + Book newBook = getBookService().save(book); + UriComponents showURI = getItemLink().to(BooksItemThymeleafLinkFactory.SHOW).with("book", newBook.getId()).toUri(); + return new ModelAndView("redirect:" + showURI.toUriString()); + } + + /** + * TODO Auto-generated method documentation + * + * @param model + * @return ModelAndView + */ + @GetMapping(value = "/create-form", name = "createForm") + public ModelAndView BooksCollectionThymeleafController.createForm(Model model) { + populateForm(model); + + model.addAttribute("book", new Book()); + return new ModelAndView("books/create"); + } + + /** + * TODO Auto-generated method documentation + * + * @param ids + * @return ResponseEntity + */ + @DeleteMapping(value = "/batch/{ids}", name = "deleteBatch") + @ResponseBody + public ResponseEntity BooksCollectionThymeleafController.deleteBatch(@PathVariable("ids") Collection ids) { + + getBookService().delete(ids); + + return ResponseEntity.ok().build(); + } + + /** + * Method that obtains the filtered and ordered records using the Datatables information and + * export them to a new report file. (It ignores the current pagination). + * + * To generate the report file it uses the `DynamicJasper` library + * (http://dynamicjasper.com). This library allows developers to generate reports dynamically + * without use an specific template to each entity. + * + * To customize the appearance of ALL generated reports, you could customize the + * "export_default.jrxml" template located in "src/main/resources/templates/reports/". However, + * if you want to customize the appearance of this specific report, you could create a new + * ".jrxml" file and provide it to the library replacing the `builder.setTemplateFile();` + * operation used in this implementation. + * + * @param search GlobalSearch that contains the filter provided by the Datatables component. + * @param pageable Pageable that contains the Sort info provided by the Datatabes component. + * @param datatablesColumns Columns displayed in the Datatables component. + * @param response The HttpServletResponse. + * @param exporter An specific JasperReportsExporter to be used during export process. + * @param fileName The final filename to use. + * @param locale The current Locale in the view context. + */ + public void BooksCollectionThymeleafController.export(GlobalSearch search, @PageableDefault(size = 2147483647) Pageable pageable, String[] datatablesColumns, HttpServletResponse response, JasperReportsExporter exporter, String fileName, Locale locale) { + // Obtain the filtered and ordered elements + Page books = getBookService().findAll(search, pageable); + + // Prevent generation of reports with empty data + if (books == null || books.getContent().isEmpty()) { + return; + } + + // Creates a new ReportBuilder using DynamicJasper library + FastReportBuilder builder = new FastReportBuilder(); + + // IMPORTANT: By default, this application uses "export_default.jrxml" + // to generate all reports. If you want to customize this specific report, + // create a new ".jrxml" template and customize it. (Take in account the + // DynamicJasper restrictions: + // http://dynamicjasper.com/2010/10/06/how-to-use-custom-jrxml-templates/) + builder.setTemplateFile("templates/reports/export_default.jrxml"); + + // The generated report will display the same columns as the Datatables component. + // However, this is not mandatory. You could edit this code if you want to ignore + // the provided datatablesColumns + if (datatablesColumns != null) { + for (String column : datatablesColumns) { + // Delegates in addColumnToReportBuilder to include each datatables column + // to the report builder + addColumnToReportBuilder(column, builder, locale, fileName); + } + } + + // This property resizes the columns to use full width page. + // Set false value if you want to use the specific width of each column. + builder.setUseFullPageWidth(true); + + // Creates a new Jasper Reports Datasource using the obtained elements + JRDataSource ds = new JRBeanCollectionDataSource(books.getContent()); + + // Generates the JasperReport + JasperPrint jp; + try { + jp = DynamicJasperHelper.generateJasperPrint(builder.build(), new ClassicLayoutManager(), ds); + } + catch (JRException e) { + String errorMessage = getMessageSource().getMessage("error_exportingErrorException", + new Object[] {StringUtils.substringAfterLast(fileName, ".").toUpperCase()}, + String.format("Error while exporting data to StringUtils file", StringUtils. + substringAfterLast(fileName, ".").toUpperCase()), locale); + throw new ExportingErrorException(errorMessage); + } + + // Converts the JaspertReport element to a ByteArrayOutputStream and + // write it into the response stream using the provided JasperReportExporter + try { + exporter.export(jp, fileName, response); + } + catch (JRException e) { + String errorMessage = getMessageSource().getMessage("error_exportingErrorException", + new Object[] {StringUtils.substringAfterLast(fileName, ".").toUpperCase()}, + String.format("Error while exporting data to StringUtils file", StringUtils. + substringAfterLast(fileName, ".").toUpperCase()), locale); + throw new ExportingErrorException(errorMessage); + } + catch (IOException e) { + String errorMessage = getMessageSource().getMessage("error_exportingErrorException", + new Object[] {StringUtils.substringAfterLast(fileName, ".").toUpperCase()}, + String.format("Error while exporting data to StringUtils file", StringUtils. + substringAfterLast(fileName, ".").toUpperCase()), locale); + throw new ExportingErrorException(errorMessage); + } + } + + /** + * It delegates in the `export` method providing the necessary information + * to generate a CSV report. + * + * @param search The GlobalSearch that contains the filter provided by the Datatables component + * @param pageable The Pageable that contains the Sort info provided by the Datatabes component + * @param datatablesColumns The Columns displayed in the Datatables component + * @param response The HttpServletResponse + * @return ResponseEntity + */ + @GetMapping(name = "exportCsv", value = "/export/csv") + @ResponseBody + public ResponseEntity BooksCollectionThymeleafController.exportCsv(GlobalSearch search, @PageableDefault(size = 2147483647) Pageable pageable, @RequestParam("datatablesColumns") String[] datatablesColumns, HttpServletResponse response, Locale locale) { + export(search, pageable, datatablesColumns, response, new JasperReportsCsvExporter(), "books_report.csv", locale); + return ResponseEntity.ok().build(); + } + + /** + * It delegates in the `export` method providing the necessary information + * to generate a PDF report. + * + * @param search The GlobalSearch that contains the filter provided by the Datatables component + * @param pageable The Pageable that contains the Sort info provided by the Datatabes component + * @param datatablesColumns The Columns displayed in the Datatables component + * @param response The HttpServletResponse + * @return ResponseEntity + */ + @GetMapping(name = "exportPdf", value = "/export/pdf") + @ResponseBody + public ResponseEntity BooksCollectionThymeleafController.exportPdf(GlobalSearch search, @PageableDefault(size = 2147483647) Pageable pageable, @RequestParam("datatablesColumns") String[] datatablesColumns, HttpServletResponse response, Locale locale) { + export(search, pageable, datatablesColumns, response, new JasperReportsPdfExporter(), "books_report.pdf", locale); + return ResponseEntity.ok().build(); + } + + /** + * It delegates in the `export` method providing the necessary information + * to generate a XLS report. + * + * @param search The GlobalSearch that contains the filter provided by the Datatables component + * @param pageable The Pageable that contains the Sort info provided by the Datatabes component + * @param datatablesColumns The Columns displayed in the Datatables component + * @param response The HttpServletResponse + * @return ResponseEntity + */ + @GetMapping(name = "exportXls", value = "/export/xls") + @ResponseBody + public ResponseEntity BooksCollectionThymeleafController.exportXls(GlobalSearch search, @PageableDefault(size = 2147483647) Pageable pageable, @RequestParam("datatablesColumns") String[] datatablesColumns, HttpServletResponse response, Locale locale) { + export(search, pageable, datatablesColumns, response, new JasperReportsXlsExporter(), "books_report.xls", locale); + return ResponseEntity.ok().build(); + } + + /** + * This method contains all the entity fields that are able to be displayed in a + * report. The developer could add a new column to the report builder providing the + * field name and the builder where the new field will be added as column. + * + * @param columnName the field name to show as column + * @param builder The builder where the new field will be added as column. + */ + public void BooksCollectionThymeleafController.addColumnToReportBuilder(String columnName, FastReportBuilder builder, Locale locale, String fileName) { + try { + if (columnName.equals("id")) { + builder.addColumn(getMessageSource().getMessage("label_book_id", null, "Id", locale), "id", Long.class.getName(), 50); + } + else if (columnName.equals("version")) { + builder.addColumn(getMessageSource().getMessage("label_book_version", null, "Version", locale), "version", Integer.class.getName(), 100); + } + else if (columnName.equals("title")) { + builder.addColumn(getMessageSource().getMessage("label_book_title", null, "Title", locale), "title", String.class.getName(), 100); + } + else if (columnName.equals("author")) { + builder.addColumn(getMessageSource().getMessage("label_book_author", null, "Author", locale), "author", String.class.getName(), 100); + } + else if (columnName.equals("isbn")) { + builder.addColumn(getMessageSource().getMessage("label_book_isbn", null, "Isbn", locale), "isbn", String.class.getName(), 100); + } + } + catch (ColumnBuilderException e) { + String errorMessage = getMessageSource().getMessage("error_exportingErrorException", + new Object[] {StringUtils.substringAfterLast(fileName, ".").toUpperCase()}, + String.format("Error while exporting data to StringUtils file", StringUtils. + substringAfterLast(fileName, ".").toUpperCase()), locale); + throw new ExportingErrorException(errorMessage); + } + catch (ClassNotFoundException e) { + String errorMessage = getMessageSource().getMessage("error_exportingErrorException", + new Object[] {StringUtils.substringAfterLast(fileName, ".").toUpperCase()}, + String.format("Error while exporting data to StringUtils file", StringUtils. + substringAfterLast(fileName, ".").toUpperCase()), locale); + throw new ExportingErrorException(errorMessage); + } + } + +} diff --git a/roo/src/main/java/com/baeldung/web/BooksCollectionThymeleafLinkFactory.java b/roo/src/main/java/com/baeldung/web/BooksCollectionThymeleafLinkFactory.java new file mode 100644 index 0000000000..413a5e64a0 --- /dev/null +++ b/roo/src/main/java/com/baeldung/web/BooksCollectionThymeleafLinkFactory.java @@ -0,0 +1,11 @@ +package com.baeldung.web; +import org.springframework.roo.addon.web.mvc.thymeleaf.annotations.RooLinkFactory; + +/** + * = BooksCollectionThymeleafLinkFactory + TODO Auto-generated class documentation + * + */ +@RooLinkFactory(controller = BooksCollectionThymeleafController.class) +public class BooksCollectionThymeleafLinkFactory { +} diff --git a/roo/src/main/java/com/baeldung/web/BooksCollectionThymeleafLinkFactory_Roo_LinkFactory.aj b/roo/src/main/java/com/baeldung/web/BooksCollectionThymeleafLinkFactory_Roo_LinkFactory.aj new file mode 100644 index 0000000000..e6df3efcb7 --- /dev/null +++ b/roo/src/main/java/com/baeldung/web/BooksCollectionThymeleafLinkFactory_Roo_LinkFactory.aj @@ -0,0 +1,122 @@ +// WARNING: DO NOT EDIT THIS FILE. THIS FILE IS MANAGED BY SPRING ROO. +// You may push code into the target .java compilation unit if you wish to edit any member(s). + +package com.baeldung.web; + +import com.baeldung.web.BooksCollectionThymeleafController; +import com.baeldung.web.BooksCollectionThymeleafLinkFactory; +import io.springlets.web.mvc.util.MethodLinkFactory; +import io.springlets.web.mvc.util.SpringletsMvcUriComponentsBuilder; +import java.util.Map; +import org.springframework.stereotype.Component; +import org.springframework.web.util.UriComponents; + +privileged aspect BooksCollectionThymeleafLinkFactory_Roo_LinkFactory { + + declare parents: BooksCollectionThymeleafLinkFactory implements MethodLinkFactory; + + declare @type: BooksCollectionThymeleafLinkFactory: @Component; + + /** + * TODO Auto-generated attribute documentation + * + */ + public static final String BooksCollectionThymeleafLinkFactory.LIST = "list"; + + /** + * TODO Auto-generated attribute documentation + * + */ + public static final String BooksCollectionThymeleafLinkFactory.DATATABLES = "datatables"; + + /** + * TODO Auto-generated attribute documentation + * + */ + public static final String BooksCollectionThymeleafLinkFactory.SELECT2 = "select2"; + + /** + * TODO Auto-generated attribute documentation + * + */ + public static final String BooksCollectionThymeleafLinkFactory.CREATE = "create"; + + /** + * TODO Auto-generated attribute documentation + * + */ + public static final String BooksCollectionThymeleafLinkFactory.CREATEFORM = "createForm"; + + /** + * TODO Auto-generated attribute documentation + * + */ + public static final String BooksCollectionThymeleafLinkFactory.DELETEBATCH = "deleteBatch"; + + /** + * TODO Auto-generated attribute documentation + * + */ + public static final String BooksCollectionThymeleafLinkFactory.EXPORTCSV = "exportCsv"; + + /** + * TODO Auto-generated attribute documentation + * + */ + public static final String BooksCollectionThymeleafLinkFactory.EXPORTPDF = "exportPdf"; + + /** + * TODO Auto-generated attribute documentation + * + */ + public static final String BooksCollectionThymeleafLinkFactory.EXPORTXLS = "exportXls"; + + /** + * TODO Auto-generated method documentation + * + * @return Class + */ + public Class BooksCollectionThymeleafLinkFactory.getControllerClass() { + return BooksCollectionThymeleafController.class; + } + + /** + * TODO Auto-generated method documentation + * + * @param methodName + * @param parameters + * @param pathVariables + * @return UriComponents + */ + public UriComponents BooksCollectionThymeleafLinkFactory.toUri(String methodName, Object[] parameters, Map pathVariables) { + if (methodName.equals(LIST)) { + return SpringletsMvcUriComponentsBuilder.fromMethodCall(SpringletsMvcUriComponentsBuilder.on(getControllerClass()).list(null)).buildAndExpand(pathVariables); + } + if (methodName.equals(DATATABLES)) { + return SpringletsMvcUriComponentsBuilder.fromMethodCall(SpringletsMvcUriComponentsBuilder.on(getControllerClass()).datatables(null, null, null, null)).buildAndExpand(pathVariables); + } + if (methodName.equals(SELECT2)) { + return SpringletsMvcUriComponentsBuilder.fromMethodCall(SpringletsMvcUriComponentsBuilder.on(getControllerClass()).select2(null, null, null)).buildAndExpand(pathVariables); + } + if (methodName.equals(CREATE)) { + return SpringletsMvcUriComponentsBuilder.fromMethodCall(SpringletsMvcUriComponentsBuilder.on(getControllerClass()).create(null, null, null)).buildAndExpand(pathVariables); + } + if (methodName.equals(CREATEFORM)) { + return SpringletsMvcUriComponentsBuilder.fromMethodCall(SpringletsMvcUriComponentsBuilder.on(getControllerClass()).createForm(null)).buildAndExpand(pathVariables); + } + if (methodName.equals(DELETEBATCH)) { + return SpringletsMvcUriComponentsBuilder.fromMethodCall(SpringletsMvcUriComponentsBuilder.on(getControllerClass()).deleteBatch(null)).buildAndExpand(pathVariables); + } + if (methodName.equals(EXPORTCSV)) { + return SpringletsMvcUriComponentsBuilder.fromMethodCall(SpringletsMvcUriComponentsBuilder.on(getControllerClass()).exportCsv(null, null, null, null, null)).buildAndExpand(pathVariables); + } + if (methodName.equals(EXPORTPDF)) { + return SpringletsMvcUriComponentsBuilder.fromMethodCall(SpringletsMvcUriComponentsBuilder.on(getControllerClass()).exportPdf(null, null, null, null, null)).buildAndExpand(pathVariables); + } + if (methodName.equals(EXPORTXLS)) { + return SpringletsMvcUriComponentsBuilder.fromMethodCall(SpringletsMvcUriComponentsBuilder.on(getControllerClass()).exportXls(null, null, null, null, null)).buildAndExpand(pathVariables); + } + throw new IllegalArgumentException("Invalid method name: " + methodName); + } + +} diff --git a/roo/src/main/java/com/baeldung/web/BooksItemThymeleafController.java b/roo/src/main/java/com/baeldung/web/BooksItemThymeleafController.java new file mode 100644 index 0000000000..f16cb7be2d --- /dev/null +++ b/roo/src/main/java/com/baeldung/web/BooksItemThymeleafController.java @@ -0,0 +1,15 @@ +package com.baeldung.web; +import com.baeldung.domain.Book; +import org.springframework.roo.addon.web.mvc.controller.annotations.ControllerType; +import org.springframework.roo.addon.web.mvc.controller.annotations.RooController; +import org.springframework.roo.addon.web.mvc.thymeleaf.annotations.RooThymeleaf; + +/** + * = BooksItemThymeleafController + TODO Auto-generated class documentation + * + */ +@RooController(entity = Book.class, type = ControllerType.ITEM) +@RooThymeleaf +public class BooksItemThymeleafController { +} diff --git a/roo/src/main/java/com/baeldung/web/BooksItemThymeleafController_Roo_Controller.aj b/roo/src/main/java/com/baeldung/web/BooksItemThymeleafController_Roo_Controller.aj new file mode 100644 index 0000000000..c0a4ed46df --- /dev/null +++ b/roo/src/main/java/com/baeldung/web/BooksItemThymeleafController_Roo_Controller.aj @@ -0,0 +1,35 @@ +// WARNING: DO NOT EDIT THIS FILE. THIS FILE IS MANAGED BY SPRING ROO. +// You may push code into the target .java compilation unit if you wish to edit any member(s). + +package com.baeldung.web; + +import com.baeldung.service.api.BookService; +import com.baeldung.web.BooksItemThymeleafController; + +privileged aspect BooksItemThymeleafController_Roo_Controller { + + /** + * TODO Auto-generated attribute documentation + * + */ + private BookService BooksItemThymeleafController.bookService; + + /** + * TODO Auto-generated method documentation + * + * @return BookService + */ + public BookService BooksItemThymeleafController.getBookService() { + return bookService; + } + + /** + * TODO Auto-generated method documentation + * + * @param bookService + */ + public void BooksItemThymeleafController.setBookService(BookService bookService) { + this.bookService = bookService; + } + +} diff --git a/roo/src/main/java/com/baeldung/web/BooksItemThymeleafController_Roo_Thymeleaf.aj b/roo/src/main/java/com/baeldung/web/BooksItemThymeleafController_Roo_Thymeleaf.aj new file mode 100644 index 0000000000..502c30a81e --- /dev/null +++ b/roo/src/main/java/com/baeldung/web/BooksItemThymeleafController_Roo_Thymeleaf.aj @@ -0,0 +1,251 @@ +// WARNING: DO NOT EDIT THIS FILE. THIS FILE IS MANAGED BY SPRING ROO. +// You may push code into the target .java compilation unit if you wish to edit any member(s). + +package com.baeldung.web; + +import com.baeldung.domain.Book; +import com.baeldung.service.api.BookService; +import com.baeldung.web.BooksItemThymeleafController; +import com.baeldung.web.BooksItemThymeleafLinkFactory; +import io.springlets.web.NotFoundException; +import io.springlets.web.mvc.util.ControllerMethodLinkBuilderFactory; +import io.springlets.web.mvc.util.MethodLinkBuilderFactory; +import java.util.Locale; +import javax.validation.Valid; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.MessageSource; +import org.springframework.context.i18n.LocaleContextHolder; +import org.springframework.http.HttpMethod; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.WebDataBinder; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.InitBinder; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.servlet.ModelAndView; +import org.springframework.web.util.UriComponents; + +privileged aspect BooksItemThymeleafController_Roo_Thymeleaf { + + declare @type: BooksItemThymeleafController: @Controller; + + declare @type: BooksItemThymeleafController: @RequestMapping(value = "/books/{book}", name = "BooksItemThymeleafController", produces = MediaType.TEXT_HTML_VALUE); + + /** + * TODO Auto-generated attribute documentation + * + */ + private MessageSource BooksItemThymeleafController.messageSource; + + /** + * TODO Auto-generated attribute documentation + * + */ + private MethodLinkBuilderFactory BooksItemThymeleafController.itemLink; + + /** + * TODO Auto-generated constructor documentation + * + * @param bookService + * @param messageSource + * @param linkBuilder + */ + @Autowired + public BooksItemThymeleafController.new(BookService bookService, MessageSource messageSource, ControllerMethodLinkBuilderFactory linkBuilder) { + setBookService(bookService); + setMessageSource(messageSource); + setItemLink(linkBuilder.of(BooksItemThymeleafController.class)); + } + + /** + * TODO Auto-generated method documentation + * + * @return MessageSource + */ + public MessageSource BooksItemThymeleafController.getMessageSource() { + return messageSource; + } + + /** + * TODO Auto-generated method documentation + * + * @param messageSource + */ + public void BooksItemThymeleafController.setMessageSource(MessageSource messageSource) { + this.messageSource = messageSource; + } + + /** + * TODO Auto-generated method documentation + * + * @return MethodLinkBuilderFactory + */ + public MethodLinkBuilderFactory BooksItemThymeleafController.getItemLink() { + return itemLink; + } + + /** + * TODO Auto-generated method documentation + * + * @param itemLink + */ + public void BooksItemThymeleafController.setItemLink(MethodLinkBuilderFactory itemLink) { + this.itemLink = itemLink; + } + + /** + * TODO Auto-generated method documentation + * + * @param id + * @param locale + * @param method + * @return Book + */ + @ModelAttribute + public Book BooksItemThymeleafController.getBook(@PathVariable("book") Long id, Locale locale, HttpMethod method) { + Book book = null; + if (HttpMethod.PUT.equals(method)) { + book = bookService.findOneForUpdate(id); + } else { + book = bookService.findOne(id); + } + + if (book == null) { + String message = messageSource.getMessage("error_NotFound", new Object[] {"Book", id}, "The record couldn't be found", locale); + throw new NotFoundException(message); + } + return book; + } + + /** + * TODO Auto-generated method documentation + * + * @param book + * @param model + * @return ModelAndView + */ + @GetMapping(name = "show") + public ModelAndView BooksItemThymeleafController.show(@ModelAttribute Book book, Model model) { + model.addAttribute("book", book); + return new ModelAndView("books/show"); + } + + /** + * TODO Auto-generated method documentation + * + * @param book + * @param model + * @return ModelAndView + */ + @GetMapping(value = "/inline", name = "showInline") + public ModelAndView BooksItemThymeleafController.showInline(@ModelAttribute Book book, Model model) { + model.addAttribute("book", book); + return new ModelAndView("books/showInline :: inline-content"); + } + + /** + * TODO Auto-generated method documentation + * + * @param dataBinder + */ + @InitBinder("book") + public void BooksItemThymeleafController.initBookBinder(WebDataBinder dataBinder) { + dataBinder.setDisallowedFields("id"); + } + + /** + * TODO Auto-generated method documentation + * + * @param model + */ + public void BooksItemThymeleafController.populateFormats(Model model) { + model.addAttribute("application_locale", LocaleContextHolder.getLocale().getLanguage()); + } + + /** + * TODO Auto-generated method documentation + * + * @param model + */ + public void BooksItemThymeleafController.populateForm(Model model) { + populateFormats(model); + } + + /** + * TODO Auto-generated method documentation + * + * @param book + * @param model + * @return ModelAndView + */ + @GetMapping(value = "/edit-form", name = "editForm") + public ModelAndView BooksItemThymeleafController.editForm(@ModelAttribute Book book, Model model) { + populateForm(model); + + model.addAttribute("book", book); + return new ModelAndView("books/edit"); + } + + /** + * TODO Auto-generated method documentation + * + * @param book + * @param version + * @param concurrencyControl + * @param result + * @param model + * @return ModelAndView + */ + @PutMapping(name = "update") + public ModelAndView BooksItemThymeleafController.update(@Valid @ModelAttribute Book book, @RequestParam("version") Integer version, @RequestParam(value = "concurrency", required = false, defaultValue = "") String concurrencyControl, BindingResult result, Model model) { + // Check if provided form contain errors + if (result.hasErrors()) { + populateForm(model); + + return new ModelAndView("books/edit"); + } + // Concurrency control + Book existingBook = getBookService().findOne(book.getId()); + if(book.getVersion() != existingBook.getVersion() && StringUtils.isEmpty(concurrencyControl)){ + populateForm(model); + model.addAttribute("book", book); + model.addAttribute("concurrency", true); + return new ModelAndView("books/edit"); + } else if(book.getVersion() != existingBook.getVersion() && "discard".equals(concurrencyControl)){ + populateForm(model); + model.addAttribute("book", existingBook); + model.addAttribute("concurrency", false); + return new ModelAndView("books/edit"); + } else if(book.getVersion() != existingBook.getVersion() && "apply".equals(concurrencyControl)){ + // Update the version field to be able to override the existing values + book.setVersion(existingBook.getVersion()); + } + Book savedBook = getBookService().save(book); + UriComponents showURI = getItemLink().to(BooksItemThymeleafLinkFactory.SHOW).with("book", savedBook.getId()).toUri(); + return new ModelAndView("redirect:" + showURI.toUriString()); + } + + /** + * TODO Auto-generated method documentation + * + * @param book + * @return ResponseEntity + */ + @ResponseBody + @DeleteMapping(name = "delete") + public ResponseEntity BooksItemThymeleafController.delete(@ModelAttribute Book book) { + getBookService().delete(book); + return ResponseEntity.ok().build(); + } + +} diff --git a/roo/src/main/java/com/baeldung/web/BooksItemThymeleafLinkFactory.java b/roo/src/main/java/com/baeldung/web/BooksItemThymeleafLinkFactory.java new file mode 100644 index 0000000000..5b69306868 --- /dev/null +++ b/roo/src/main/java/com/baeldung/web/BooksItemThymeleafLinkFactory.java @@ -0,0 +1,11 @@ +package com.baeldung.web; +import org.springframework.roo.addon.web.mvc.thymeleaf.annotations.RooLinkFactory; + +/** + * = BooksItemThymeleafLinkFactory + TODO Auto-generated class documentation + * + */ +@RooLinkFactory(controller = BooksItemThymeleafController.class) +public class BooksItemThymeleafLinkFactory { +} diff --git a/roo/src/main/java/com/baeldung/web/BooksItemThymeleafLinkFactory_Roo_LinkFactory.aj b/roo/src/main/java/com/baeldung/web/BooksItemThymeleafLinkFactory_Roo_LinkFactory.aj new file mode 100644 index 0000000000..fd68866587 --- /dev/null +++ b/roo/src/main/java/com/baeldung/web/BooksItemThymeleafLinkFactory_Roo_LinkFactory.aj @@ -0,0 +1,86 @@ +// WARNING: DO NOT EDIT THIS FILE. THIS FILE IS MANAGED BY SPRING ROO. +// You may push code into the target .java compilation unit if you wish to edit any member(s). + +package com.baeldung.web; + +import com.baeldung.web.BooksItemThymeleafController; +import com.baeldung.web.BooksItemThymeleafLinkFactory; +import io.springlets.web.mvc.util.MethodLinkFactory; +import io.springlets.web.mvc.util.SpringletsMvcUriComponentsBuilder; +import java.util.Map; +import org.springframework.stereotype.Component; +import org.springframework.web.util.UriComponents; + +privileged aspect BooksItemThymeleafLinkFactory_Roo_LinkFactory { + + declare parents: BooksItemThymeleafLinkFactory implements MethodLinkFactory; + + declare @type: BooksItemThymeleafLinkFactory: @Component; + + /** + * TODO Auto-generated attribute documentation + * + */ + public static final String BooksItemThymeleafLinkFactory.SHOW = "show"; + + /** + * TODO Auto-generated attribute documentation + * + */ + public static final String BooksItemThymeleafLinkFactory.SHOWINLINE = "showInline"; + + /** + * TODO Auto-generated attribute documentation + * + */ + public static final String BooksItemThymeleafLinkFactory.EDITFORM = "editForm"; + + /** + * TODO Auto-generated attribute documentation + * + */ + public static final String BooksItemThymeleafLinkFactory.UPDATE = "update"; + + /** + * TODO Auto-generated attribute documentation + * + */ + public static final String BooksItemThymeleafLinkFactory.DELETE = "delete"; + + /** + * TODO Auto-generated method documentation + * + * @return Class + */ + public Class BooksItemThymeleafLinkFactory.getControllerClass() { + return BooksItemThymeleafController.class; + } + + /** + * TODO Auto-generated method documentation + * + * @param methodName + * @param parameters + * @param pathVariables + * @return UriComponents + */ + public UriComponents BooksItemThymeleafLinkFactory.toUri(String methodName, Object[] parameters, Map pathVariables) { + if (methodName.equals(SHOW)) { + return SpringletsMvcUriComponentsBuilder.fromMethodCall(SpringletsMvcUriComponentsBuilder.on(getControllerClass()).show(null, null)).buildAndExpand(pathVariables); + } + if (methodName.equals(SHOWINLINE)) { + return SpringletsMvcUriComponentsBuilder.fromMethodCall(SpringletsMvcUriComponentsBuilder.on(getControllerClass()).showInline(null, null)).buildAndExpand(pathVariables); + } + if (methodName.equals(EDITFORM)) { + return SpringletsMvcUriComponentsBuilder.fromMethodCall(SpringletsMvcUriComponentsBuilder.on(getControllerClass()).editForm(null, null)).buildAndExpand(pathVariables); + } + if (methodName.equals(UPDATE)) { + return SpringletsMvcUriComponentsBuilder.fromMethodCall(SpringletsMvcUriComponentsBuilder.on(getControllerClass()).update(null, null, null, null, null)).buildAndExpand(pathVariables); + } + if (methodName.equals(DELETE)) { + return SpringletsMvcUriComponentsBuilder.fromMethodCall(SpringletsMvcUriComponentsBuilder.on(getControllerClass()).delete(null)).buildAndExpand(pathVariables); + } + throw new IllegalArgumentException("Invalid method name: " + methodName); + } + +} diff --git a/roo/src/main/java/com/baeldung/web/MainController.java b/roo/src/main/java/com/baeldung/web/MainController.java new file mode 100644 index 0000000000..bf2038b4a1 --- /dev/null +++ b/roo/src/main/java/com/baeldung/web/MainController.java @@ -0,0 +1,11 @@ +package com.baeldung.web; +import org.springframework.roo.addon.web.mvc.thymeleaf.annotations.RooThymeleafMainController; + +/** + * = MainController + TODO Auto-generated class documentation + * + */ +@RooThymeleafMainController +public class MainController { +} diff --git a/roo/src/main/java/com/baeldung/web/MainController_Roo_Thymeleaf_MainController.aj b/roo/src/main/java/com/baeldung/web/MainController_Roo_Thymeleaf_MainController.aj new file mode 100644 index 0000000000..58f0466ed9 --- /dev/null +++ b/roo/src/main/java/com/baeldung/web/MainController_Roo_Thymeleaf_MainController.aj @@ -0,0 +1,59 @@ +// WARNING: DO NOT EDIT THIS FILE. THIS FILE IS MANAGED BY SPRING ROO. +// You may push code into the target .java compilation unit if you wish to edit any member(s). + +package com.baeldung.web; + +import com.baeldung.web.MainController; +import io.springlets.web.NotFoundException; +import org.springframework.context.i18n.LocaleContextHolder; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.util.StringUtils; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; + +privileged aspect MainController_Roo_Thymeleaf_MainController { + + declare @type: MainController: @Controller; + + /** + * TODO Auto-generated method documentation + * + * @param model + * @return String + */ + @GetMapping("/") + public String MainController.index(Model model) { + model.addAttribute("application_locale", LocaleContextHolder.getLocale().getLanguage()); + return "index"; + } + + /** + * TODO Auto-generated method documentation + * + * @param model + * @return String + */ + @GetMapping("/accessibility") + public String MainController.accessibility(Model model) { + model.addAttribute("application_locale", LocaleContextHolder.getLocale().getLanguage()); + return "accessibility"; + } + + /** + * TODO Auto-generated method documentation + * + * @param template + * @return String + */ + @RequestMapping(value = "/js/{template}.js", method = RequestMethod.GET) + public String MainController.javascriptTemplates(@PathVariable("template") String template) { + if (StringUtils.hasLength(template)) { + return template.concat(".js"); + } + throw new NotFoundException("File not found"); + } + +} diff --git a/roo/src/main/java/com/baeldung/web/reports/ExportingErrorException.java b/roo/src/main/java/com/baeldung/web/reports/ExportingErrorException.java new file mode 100644 index 0000000000..a8c2eca5cc --- /dev/null +++ b/roo/src/main/java/com/baeldung/web/reports/ExportingErrorException.java @@ -0,0 +1,19 @@ +package com.baeldung.web.reports; + +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.ResponseStatus; + +@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) +public class ExportingErrorException extends RuntimeException { + + private static final long serialVersionUID = 4075788919321977605L; + + public ExportingErrorException() { + super("Error while trying to export data to file."); + } + + public ExportingErrorException(String message) { + super(message); + } + +} diff --git a/roo/src/main/java/com/baeldung/web/reports/JasperReportsCsvExporter.java b/roo/src/main/java/com/baeldung/web/reports/JasperReportsCsvExporter.java new file mode 100644 index 0000000000..5ea23e16cc --- /dev/null +++ b/roo/src/main/java/com/baeldung/web/reports/JasperReportsCsvExporter.java @@ -0,0 +1,71 @@ +package com.baeldung.web.reports; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; + +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletResponse; + +import net.sf.jasperreports.engine.JRException; +import net.sf.jasperreports.engine.JRExporterParameter; +import net.sf.jasperreports.engine.JasperPrint; +import net.sf.jasperreports.engine.export.JRCsvExporter; + +/** + * = JasperReportsCsvExporter + * + * A JasperReports exporter to export the report in CSV formats. This class + * implements the interface {@link JasperReportsExporter} + */ +public class JasperReportsCsvExporter implements JasperReportsExporter { + + /** + * Generates a ByteArrayOutputStream from the provided JasperReport using + * the {@link JRCsvExporter}. After that, the generated bytes array is + * written in the {@link HttpServletResponse} + * + * @param jp + * The generated JasperReport. + * @param fileName + * The fileName of the exported JasperReport + * @param response + * The HttpServletResponse where generated report has been + * written + * @throws JRException + * during JasperReport export. + * @throws IOException + * when writes the ByteArrayOutputStream into the + * HttpServletResponse + */ + @Override + public void export(JasperPrint jp, String fileName, HttpServletResponse response) throws JRException, IOException { + + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + + // Create a JRCsvExporter instance + JRCsvExporter exporter = new JRCsvExporter(); + + // Here we assign the parameters jp and baos to the exporter + exporter.setParameter(JRExporterParameter.JASPER_PRINT, jp); + exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, baos); + + // Retrieve the exported report in PDF format + exporter.exportReport(); + + // Specifies the response header + response.setHeader("Content-Disposition", "inline; filename=" + fileName); + + // Make sure to set the correct content type + // Each format has its own content type + response.setContentType("text/csv"); + response.setContentLength(baos.size()); + + // Retrieve the output stream + ServletOutputStream outputStream = response.getOutputStream(); + // Write to the output stream + baos.writeTo(outputStream); + // Flush the stream + outputStream.flush(); + + } +} \ No newline at end of file diff --git a/roo/src/main/java/com/baeldung/web/reports/JasperReportsExporter.java b/roo/src/main/java/com/baeldung/web/reports/JasperReportsExporter.java new file mode 100644 index 0000000000..32892df447 --- /dev/null +++ b/roo/src/main/java/com/baeldung/web/reports/JasperReportsExporter.java @@ -0,0 +1,41 @@ +package com.baeldung.web.reports; + +import java.io.IOException; + +import javax.servlet.http.HttpServletResponse; + +import net.sf.jasperreports.engine.JRException; +import net.sf.jasperreports.engine.JasperPrint; +import net.sf.jasperreports.export.Exporter; + +/** + * = JasperReportsExporter + * + * This interface defines the operations for a JasperReport exporter. + * + * JasperReports library already provides an Exporter interface called + * {@link Exporter}. However, it doesn't provides an operation that writes the + * exported JasperReport into the {@link HttpServletResponse}. + */ +public interface JasperReportsExporter { + + /** + * This operation must be implemented by every JasperReport exporter to be + * able to write a generated report into a the {@link HttpServletResponse}}. + * + * @param jp + * The generated JasperReport. + * @param fileName + * The fileName of the exported JasperReport + * @param response + * The HttpServletResponse where generated report has been + * written + * @throws JRException + * during JasperReport export. + * @throws IOException + * when writes the ByteArrayOutputStream into the + * HttpServletResponse + */ + public void export(JasperPrint jp, String fileName, HttpServletResponse response) throws JRException, IOException; + +} \ No newline at end of file diff --git a/roo/src/main/java/com/baeldung/web/reports/JasperReportsPdfExporter.java b/roo/src/main/java/com/baeldung/web/reports/JasperReportsPdfExporter.java new file mode 100644 index 0000000000..ae1e2d8ee0 --- /dev/null +++ b/roo/src/main/java/com/baeldung/web/reports/JasperReportsPdfExporter.java @@ -0,0 +1,71 @@ +package com.baeldung.web.reports; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; + +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletResponse; + +import net.sf.jasperreports.engine.JRException; +import net.sf.jasperreports.engine.JRExporterParameter; +import net.sf.jasperreports.engine.JasperPrint; +import net.sf.jasperreports.engine.export.JRPdfExporter; + +/** + * = JasperReportsPdfExporter + * + * A JasperReports exporter to export the report in PDF formats. This class + * implements the interface {@link JasperReportsExporter} + */ +public class JasperReportsPdfExporter implements JasperReportsExporter { + + /** + * Generates a ByteArrayOutputStream from the provided JasperReport using + * the {@link JRPdfExporter}. After that, the generated bytes array is + * written in the {@link HttpServletResponse} + * + * @param jp + * The generated JasperReport. + * @param fileName + * The fileName of the exported JasperReport + * @param response + * The HttpServletResponse where generated report has been + * written + * @throws JRException + * during JasperReport export. + * @throws IOException + * when writes the ByteArrayOutputStream into the + * HttpServletResponse + */ + @Override + public void export(JasperPrint jp, String fileName, HttpServletResponse response) throws JRException, IOException { + + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + + // Create a JRPdfExporter instance + JRPdfExporter exporter = new JRPdfExporter(); + + // Here we assign the parameters jp and baos to the exporter + exporter.setParameter(JRExporterParameter.JASPER_PRINT, jp); + exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, baos); + + // Retrieve the exported report in PDF format + exporter.exportReport(); + + // Specifies the response header + response.setHeader("Content-Disposition", "inline; filename=" + fileName); + + // Make sure to set the correct content type + // Each format has its own content type + response.setContentType("application/pdf"); + response.setContentLength(baos.size()); + + // Retrieve the output stream + ServletOutputStream outputStream = response.getOutputStream(); + // Write to the output stream + baos.writeTo(outputStream); + // Flush the stream + outputStream.flush(); + + } +} \ No newline at end of file diff --git a/roo/src/main/java/com/baeldung/web/reports/JasperReportsXlsExporter.java b/roo/src/main/java/com/baeldung/web/reports/JasperReportsXlsExporter.java new file mode 100644 index 0000000000..1855d1c93c --- /dev/null +++ b/roo/src/main/java/com/baeldung/web/reports/JasperReportsXlsExporter.java @@ -0,0 +1,77 @@ +package com.baeldung.web.reports; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; + +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletResponse; + +import net.sf.jasperreports.engine.JRException; +import net.sf.jasperreports.engine.JRExporterParameter; +import net.sf.jasperreports.engine.JasperPrint; +import net.sf.jasperreports.engine.export.JRXlsAbstractExporterParameter; +import net.sf.jasperreports.engine.export.JRXlsExporter; + +/** + * = JasperReportsXlsExporter + * + * A JasperReports exporter to export the report in XLS formats. This class + * implements the interface {@link JasperReportsExporter} + */ +public class JasperReportsXlsExporter implements JasperReportsExporter { + + /** + * Generates a ByteArrayOutputStream from the provided JasperReport using + * the {@link JRXlsExporter}. After that, the generated bytes array is + * written in the {@link HttpServletResponse} + * + * @param jp + * The generated JasperReport. + * @param fileName + * The fileName of the exported JasperReport + * @param response + * The HttpServletResponse where generated report has been + * written + * @throws JRException + * during JasperReport export. + * @throws IOException + * when writes the ByteArrayOutputStream into the + * HttpServletResponse + */ + @Override + public void export(JasperPrint jp, String fileName, HttpServletResponse response) throws JRException, IOException { + + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + + // Create a JRXlsExporter instance + JRXlsExporter exporter = new JRXlsExporter(); + + // Here we assign the parameters jp and baos to the exporter + exporter.setParameter(JRExporterParameter.JASPER_PRINT, jp); + exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, baos); + + // Excel specific parameters + exporter.setParameter(JRXlsAbstractExporterParameter.IS_ONE_PAGE_PER_SHEET, Boolean.FALSE); + exporter.setParameter(JRXlsAbstractExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS, Boolean.TRUE); + exporter.setParameter(JRXlsAbstractExporterParameter.IS_WHITE_PAGE_BACKGROUND, Boolean.FALSE); + + // Retrieve the exported report in PDF format + exporter.exportReport(); + + // Specifies the response header + response.setHeader("Content-Disposition", "inline; filename=" + fileName); + + // Make sure to set the correct content type + // Each format has its own content type + response.setContentType("application/vnd.ms-excel"); + response.setContentLength(baos.size()); + + // Retrieve the output stream + ServletOutputStream outputStream = response.getOutputStream(); + // Write to the output stream + baos.writeTo(outputStream); + // Flush the stream + outputStream.flush(); + + } +} \ No newline at end of file diff --git a/roo/src/main/resources/application-dev.properties b/roo/src/main/resources/application-dev.properties new file mode 100644 index 0000000000..6723cabefa --- /dev/null +++ b/roo/src/main/resources/application-dev.properties @@ -0,0 +1,13 @@ +#Updated at Tue Apr 04 15:03:52 BST 2017 +#Tue Apr 04 15:03:52 BST 2017 +logging.file= +logging.level.com.baeldung=DEBUG +logging.level.com.querydsl.jpa.impl.JPAQuery=DEBUG +logging.level.org.hibernate.stat=DEBUG +logging.pattern.level=%5p - QP\:%X{querydsl.parameters} - +spring.jackson.serialization.indent-output=true +spring.jpa.properties.hibernate.format_sql=true +spring.jpa.properties.hibernate.generate_statistics=true +spring.jpa.show-sql=true +spring.messages.cache-seconds=0 +spring.thymeleaf.mode=html diff --git a/roo/src/main/resources/application.properties b/roo/src/main/resources/application.properties new file mode 100644 index 0000000000..77eaa5f3fc --- /dev/null +++ b/roo/src/main/resources/application.properties @@ -0,0 +1,8 @@ +#Updated at Tue Apr 04 15:03:53 BST 2017 +#Tue Apr 04 15:03:53 BST 2017 +spring.datasource.driver-class-name=org.hsqldb.jdbcDriver +spring.datasource.url=jdbc\:hsqldb\:mem\:roo +spring.jpa.hibernate.naming.strategy=org.hibernate.cfg.ImprovedNamingStrategy +spring.messages.encoding=ISO-8859-1 +spring.messages.fallback-to-system-locale=false +spring.thymeleaf.mode=html diff --git a/roo/src/main/resources/banner.txt b/roo/src/main/resources/banner.txt new file mode 100644 index 0000000000..dd2932f7aa --- /dev/null +++ b/roo/src/main/resources/banner.txt @@ -0,0 +1,9 @@ +${AnsiColor.GREEN} _ + ___ _ __ _ __(_)_ __ __ _ _ __ ___ ___ +/ __| '_ \| '__| | '_ \ / _` | | '__/ _ \ / _ \ +\__ \ |_) | | | | | | | (_| | | | | (_) | (_) | +|___/ .__/|_| |_|_| |_|\__, | |_| \___/ \___/ + |_| |___/ + +${AnsiColor.BRIGHT_RED}Spring application made with Spring Roo 2.0 +Doubts? http://projects.spring.io/spring-roo/${AnsiColor.DEFAULT} diff --git a/roo/src/main/resources/messages.properties b/roo/src/main/resources/messages.properties new file mode 100644 index 0000000000..e61a266500 --- /dev/null +++ b/roo/src/main/resources/messages.properties @@ -0,0 +1,146 @@ +#Updated at Tue Apr 04 15:04:02 BST 2017 +#Tue Apr 04 15:04:02 BST 2017 +error_NotFound={0} with identifier ''{1}'' not found. +error_NotNull=Required. +error_Size=The field must be between {2} and {1} characters long. +error_datatables_loading=An error happened while loading list data +error_deleting_item=Error deleting selected item. +error_deleting_item_with_relationships=To delete the selected item, must delete its related elements before. +error_expired_session=Your session has been expired +error_export_empty=No data available to generate a report +error_invalid_date=Please enter a correct date/time +error_invalid_maskValue=Please enter a valid value +error_login=Invalid user and password +help_login=Enter your login and password +info_author=Spring Roo development team +info_closed_session=Log out correctly +info_delete_batch_confirm=Are you sure want to delete the selected items? +info_delete_item_confirm=Are you sure want to delete this item? +info_deleted_item_problem=Error deleting item +info_deleted_items_batch=Deleted items +info_deleted_items_number=Deleted items {0} +info_description=Spring Roo, a next-generation rapid application development tool for Java developers. With Roo you can easily build full Java applications in minutes. +info_error=An unexpected error has occurred +info_homepage_header=With Roo you can easily build full Java applications in minutes. +info_homepage_paragraph=Spring Roo is a next-generation rapid application development tool for Java developers.\nIt focuses on higher productivity, stock-standard Java APIs, high usability, avoiding engineering trade-offs and \nfacilitating easy Roo removal. +info_homepage_project=Hello, this is your home page. +info_homepage_thanks=Thanks for your interest in Spring Roo\! +info_no_deleted_item=No deleted item. +info_no_exist_item=Item doesn't exist. +info_security_login=You tried to access a restricted area of our application. By default, you can log in with +info_select_an_option=Select an option +info_spring_code=Known, modify and redistribute the source code. +info_spring_documentation=If you are looking for Reference Documentation you can get it here. +info_spring_site=All the info about Spring Roo development. +info_spring_support=If you have any question about the project, \nyou can check it. +info_twitter=As always, you can find us also on +label_accessibility=Accessibility +label_accessibility_alt=Level Double-A conformance, W3C WAI Web Content Accessibility Guidelines 2.0 +label_accessibility_lead=Accessibility policy application +label_accessibility_text=

Spring Roo Application is committed to ensuring the accessibility of its web content to people with disabilities. All of the content on our website will meet W3C WAI's Web Content Accessibility Guidelines 2.0, Level AA conformance. Any issues should be reported to springroo@disid.com.

The technologies that is depended to access the accessible content are HTML, CSS and Javascript.

+label_accessibility_title=Explanation of WCAG 2.0 Level Double-A Conformance +label_actions=Actions +label_add_entity=Add {0} +label_back=Back +label_book=Book +label_book_author=Author +label_book_id=Id +label_book_isbn=Isbn +label_book_iterable_to_add_cant_be_null_message=I T E R A B L E_ T O_ A D D_ C A N T_ B E_ N U L L_ M E S S A G E +label_book_iterable_to_remove_cant_be_null_message=I T E R A B L E_ T O_ R E M O V E_ C A N T_ B E_ N U L L_ M E S S A G E +label_book_plural=Books +label_book_title=Title +label_book_version=Version +label_change_password=Change password +label_close=Close +label_code=Code +label_concurrency_apply=Apply my changes anyway +label_concurrency_apply_info=(discard all the changes applied by the other users). +label_concurrency_discard=Discard all my changes and reload this record. +label_concurrency_title=Warning\! This record has been updated by another user. +label_contact=Contact +label_create=Create +label_create_entity=Create {0} +label_data_entity={0} data +label_datatables_add=Add +label_datatables_columns=Columns +label_datatables_decimal=. +label_datatables_delete=Delete +label_datatables_emptyTable=No data available in table +label_datatables_first=First +label_datatables_info=Showing _START_ to _END_ of _TOTAL_ entries +label_datatables_infoEmpty=Showing 0 to 0 of 0 entries +label_datatables_infoFiltered=(filtered from _MAX_ total entries) +label_datatables_infoPostFix= +label_datatables_last=Last +label_datatables_lengthMenu=Show _MENU_ entries +label_datatables_loadingRecords=Loading... +label_datatables_loading_error=An error happened while loading list data +label_datatables_next=Next +label_datatables_previous=Previous +label_datatables_processing=Processing... +label_datatables_search=Search\: +label_datatables_selectedRow=1 selected row +label_datatables_selectedRows=%d selected rows +label_datatables_showRows=Show %d rows +label_datatables_sortAscending=\: activate to sort column ascending +label_datatables_sortDescending=\: activate to sort column descending +label_datatables_thousands= +label_datatables_zeroRecords=No matching records found +label_delete=Delete +label_delete_entity=Delete {0} +label_documentation=Doc +label_edit=Edit +label_edit_entity=Edit {0} +label_edit_search=Edit search +label_entities_found={0} found +label_error=Error +label_errorpage=Error page +label_errorpage_header=\u00C2\u00A1Error\! +label_exit=Exit +label_export_empty_error=Empty report +label_filtered_by=Filtered By +label_goBack=Go Back +label_goEdit=Go to the editing page +label_goHome=Go to homepage +label_gotoGithub=Go to Spring Roo page in GitHub +label_gotoLanguage=Display website in +label_gotowebsite=Go to Spring Roo website +label_help=Help +label_inputmask_groupSeparator=, +label_inputmask_prefix=$ +label_inputmask_radixPoint=. +label_inputmask_suffix= +label_last_access=Last Access {0} +label_list_entity=List {0} +label_list_of_entity=List of {0} +label_login=Login +label_login_password=Password +label_login_username=User +label_logout=Log out +label_menu_entry={0} +label_message=Message +label_not_filtered=Not Filtered +label_owasp_alt=Application developed and tested with OWASP +label_owasp_title=Application developed and tested with OWASP - Web Application Security Project +label_profile=Admin Profile +label_projectpage=Project Page +label_requiredfield=Required field +label_reset=Cancel +label_save=Save +label_search=Search +label_search_entity={0} searcher +label_show=Show +label_show_entity={0} card +label_spring_documentation=Spring Roo reference documentation +label_spring_site=Spring Roo project site +label_spring_sourcecode=Spring Roo source code +label_spring_support=Spring Roo Stackoverflow support +label_submit=Accept +label_support=Support +label_tools=Tools +label_user=User +language_label=Languages +language_label_en=English +language_label_es=Spanish +welcome_label=Welcome diff --git a/roo/src/main/resources/static/public/css/springroo.css b/roo/src/main/resources/static/public/css/springroo.css new file mode 100644 index 0000000000..2db8914ff1 --- /dev/null +++ b/roo/src/main/resources/static/public/css/springroo.css @@ -0,0 +1,475 @@ +/* CSS Theme Roo */ + +body { + background-color: #f1f1f1; + color: rgba(13,13,13,.65); + line-height: 1.8; + letter-spacing: .01em; +} +img {border: 0; max-width: 100%; outline: none;} +a{ + color: #6db33f; + transition: color 150ms ease; + } +a:focus, a:hover{ + outline: none; + color: #3f6824; + } +.content a:hover {text-decoration: underline} +.content a.btn-action:hover, +.content .paginate_button a:hover, +.content a.btn:hover {text-decoration: none;} + +.clearfix {clear: both;} + +/*--NAVBAR-------------*/ + +.navbar-header .organization-logo {vertical-align: middle; padding: 0.2em 1em;} +.navbar-header .application-name { color: #34302d;} +.navbar-header .application-name strong {} +.navbar-default .navbar-header .application-name a {text-decoration: none;} +.navbar-inverse .navbar-header .application-name a {color: #fff; text-decoration: none;} +.navbar-header .application-name small {} + +.dropdown-menu > li button.btn-link { + display: block; + padding: 3px 20px; + white-space: nowrap; + color: #333; + width: 100%; + text-align: left; +} +.dropdown-menu > li button.btn-link:hover, +.dropdown-menu > li button.btn-link:focus { + color: #262626; + text-decoration: none; + background-color: #f5f5f5; +} +.dropdown-menu > .active button.btn-link, +.dropdown-menu > .active button.btn-link:hover, +.dropdown-menu > .active button.btn-link:focus { + color: #262626; + text-decoration: none; + background-color: #f5f5f5; +} + +/*--FOOTER-------------*/ + +footer { padding: 1em 0 3em; text-align: center;} +footer p{font-size: 0.875em;} +footer a:hover, footer a:focus{text-decoration: none;} + + + +/*--HEADINGS-------------*/ + +.content h4,h5,h6 {color: #34302d;} + +/*--CONTENT-------------*/ + +/* second container */ +.content { + clear: both; + min-height: 26.3em; + display: block; + padding: 1em; + background: #fff; + box-shadow: 0 0 0 0,0 6px 12px rgba(34,34,34,.1); +} +.content > .panel{ +/* margin: 1em; */ +} + +/*--SHOW-------------*/ + +.content ul.list-unstyled li{ + margin: 0.25em 0; +} +.content ul.list-unstyled li{ + padding: 0.25em 0; +} +.content ul.list-unstyled li strong{ + min-width: 15%; + display: inline-block; + } +.content ul.list-unstyled li span{ + display: inline-block; + padding-left: 1em; +} +.content [id$="FieldSet"] h2{ + display: block; + width: 100%; + padding: 0; + margin-bottom: 20px; + font-size: 21px; + line-height: inherit; + color: inherit; + border-bottom: 1px solid #f1f1f1; +} +dd, dt { + margin: 0px 5px 5px 0px; +} + +/*--ALERTS-------------*/ + +.alert blockquote{ + margin: 0; + font-size: inherit; +} +.alert-info blockquote { + border-left-color: #31708f; +} +/*--FORMS-------------*/ + +legend{ + border-bottom: 1px solid #f1f1f1; +} +.form-horizontal .form-group input[type="radio"], +.form-horizontal .form-group input[type="checkbox"] { + margin-left: 0; +} + +/*--TABLES-------------*/ + +table.dataTable thead .sorting, +table.dataTable thead .sorting_asc, +table.dataTable thead .sorting_desc { + background-image: none; +} + +/** toolbars datatables **/ +div.dataTables_wrapper div.dataTables_paginate, +div.dataTables_wrapper div.dataTables_info{ + padding: 0; +} + +div.dataTables_wrapper div.dataTables_filter, +div.dataTables_wrapper div.dt-buttons.btn-group{ + padding: 1em 0; +} +.pagination{ + text-transform: none; +} +.dataTables_wrapper .dataTables_paginate .paginate_button{ + padding: 0; +} +.dataTables_wrapper .dataTables_paginate .paginate_button:hover { + background: none; +} +/** btn datatables **/ +table a.btn-action { + text-decoration: none; + color: #3e3f3a; +} +table .btn-action + .btn-action { + margin: 0 0 0 0.35em; +} +table a.btn-action:hover, +table a.btn-action:focus, +table a.btn-action:active { + color: #79a736; +} +table.dataTable.no-footer { + border-bottom: 1px solid #dfd7ca; +} + +div.dataTables_wrapper div.dataTables_processing { + position: absolute; + top: 50%; + left: 50%; + width: 200px; + margin-left: -100px; + margin-top: 16px; + padding: 0.5em 0; + height: 30px; + overflow: hidden; + border-radius: 4px; + -moz-animation: progress-bar-stripes 2s linear infinite; + -ms-animation: progress-bar-stripes 2s linear infinite; + -o-animation: progress-bar-stripes 2s linear infinite; + animation: progress-bar-stripes 2s linear infinite; + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-size: 40px 40px; + font-size: 12px; + color: #ffffff; + text-align: center; + background-color: #428bca; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -webkit-transition: width 0.6s ease; + transition: width 0.6s ease; +} +/*--BTN-------------*/ + +.btn-action:before { + font-family: 'FontAwesome'; + padding: 0 0.3em 0 0; +} +.btn-action.delete:before { + content:"\f014"; + } +.btn-action.edit:before, +.btn-action.modify:before { + content:"\f040"; + } +.btn-action.accept:before { + content:"\f00c"; + } +.btn-action.add:before { + content:"\f067"; + } +.btn-action.showInfo:before { + content:"\f06e"; +} +.alert a.btn{ + color: #555555; + text-decoration: none; +} + +/*-------------------INDEX-------------------*/ + +body.home .content{ + background: none; + padding: 0; + box-shadow: none; +} +body.home .box-center{ + padding: 1em 2em; + background: #fff; + box-shadow: 0 0 0 0,0 6px 12px rgba(34,34,34,.1); +} +body.home .navbar { margin-bottom: 0px;} + +/*--HEADER-------------*/ +.jumbotron { + min-height: 6.5em; + text-align: center; + vertical-align: middle; + margin-bottom: 2em; + background-color: #316128; + background-image: linear-gradient(120deg, #316128, #254211); + border-bottom: 1px solid #969595; + border: none; +} +.jumbotron.bg-banner { + min-height: 20em; + color: #fff; + text-align: center; + padding: 3em; + background-image: url(../img/geo.png); + background-repeat: no-repeat; + background-position: 50% 20%; + -webkit-background-size: cover; + -moz-background-size: cover; + -o-background-size: cover; + background-size: cover; +} +.jumbotron .project-name{ + color: #fff; + text-align: center; + font-size: 4em; +} +.jumbotron .project-tagline { + color: #fff; + margin-bottom: 2rem; + font-weight: normal; + opacity: 0.7; +} + +/*--SOCIAL LINKS-------------*/ + +.social-links a{ + color: #999; + text-decoration: none; + font-size: 1.5em; + margin: 0 0.15em; +} + +/*--BLOCKS----------------*/ + +.blocks { margin-top: 2em;} +.block-item { + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.15); + position: relative; + margin-bottom: 30px; +} +.block-item .doc { + padding: 15px; + float: left; + font-size: 4em; +} +.block-item a{ + color: #fff; + cursor: pointer; +} +.block-item .text { + overflow: hidden; + color: rgba(255, 255, 255, 0.9); + padding: 16px 12px; +} +.block-item .text > h2 { + margin: 0; + line-height: 100%; + font-size: 22px; + font-weight: 300; + color: #fff; +} +.block-item .text > small { + margin-bottom: 2px; + display: block; +} +.block-item .text > p, +.block-item .text > h2 { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.block-item > .clearfix, +.block-item > .dl-horizontal dd, +.block-item > .container, +.block-item > .container-fluid, +.block-item > .row, +.block-item > .form-horizontal .form-group, +.block-item > .btn-toolbar, +.block-item > .btn-group-vertical > .btn-group, +.block-item > .nav, +.block-item > .navbar, +.block-item > .navbar-header, +.block-item > .navbar-collapse, +.block-item > .pager, +.block-item > .panel-body, +.block-item > .modal-header, +.block-item > .modal-footer { + position: relative; + z-index: 1; +} +.block-item:before { + -webkit-transition: width; + -o-transition: width; + transition: width; + -webkit-transition-duration: 500ms; + transition-duration: 500ms; + -webkit-backface-visibility: hidden; + -moz-backface-visibility: hidden; + backface-visibility: hidden; + content: ""; + width: 83px; + height: 100%; + background: rgba(0, 0, 0, 0.1); + position: absolute; + left: 0; + top: 0; +} +.block-item:hover .text {color: #fff !important;} +.block-item:hover:before { width: 100%;} + +/* + * Material Background Colors + */ + +.bgm-teal { background-color: #009688 !important;} +.bgm-red { background-color: #f44336 !important;} +.bgm-amber { background-color: #ffc107 !important;} +.bgm-bluegray {background-color: #607d8b !important;} + + +/* SANDSTONE THEME CUSTOM +-----------------------------------------------------------------------------*/ + +/*-- NAVBAR -------------*/ + +.navbar-default .navbar-header .application-name a {color: #fff; text-decoration: none;} + +.dropdown-menu > li button.btn-link { + clear: both; + font-size: 11px; + line-height: 22px; + font-weight: 500; + text-transform: uppercase; + color: #98978b; +} +.dropdown-menu > li button.btn-link:hover, +.dropdown-menu > li button.btn-link:focus { + color: #98978b; + background-color: #f8f5f0; +} +.dropdown-menu > .active button.btn-link, +.dropdown-menu > .active button.btn-link:hover, +.dropdown-menu > .active button.btn-link:focus { + color: #98978b; + background-color: #f8f5f0; +} + +/*-- SELECT2 -------------*/ + +.select2-container--bootstrap .select2-selection{ + height: 46px; + padding: 12px 16px; + font-size: 14px; + line-height: 1.42857143; + color: #3e3f3a; + background-color: #ffffff; + background-image: none; + border: 1px solid #dfd7ca; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s; + -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; + transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; +} +.select2-container--bootstrap .select2-selection--multiple { + padding: 6px; +} +.select2-container--bootstrap .select2-selection--multiple .select2-selection__arrow, +.select2-container--bootstrap .select2-selection--multiple .select2-selection__placeholder, +.select2-container--bootstrap .select2-selection--single .select2-selection__arrow, +.select2-container--bootstrap .select2-selection--single .select2-selection__placeholder{ + color: #dfd7ca; + padding: 0; +} +.select2-container--bootstrap .select2-selection--multiple .select2-selection__arrow b, +.select2-container--bootstrap .select2-selection--single .select2-selection__arrow b { + border-color: #dfd7ca transparent transparent transparent; +} +/* align options in left */ +.select2-container--bootstrap .select2-selection--multiple .select2-selection__rendered{ + padding-right: 0.5em !important; +} +.select2-container--bootstrap .select2-selection--multiple .select2-selection__clear { + margin-right: 0 !important; +} + +/* MEDIA QUERIES +-------------------------------------------------------------------------------*/ + +@media print { + body {background: #fff;} + .content .main {width: 98%;} +} + +@media (max-width: 768px) { + .jumbotron .project-name{font-size: 3em;} + /* navbar fixes */ + .navbar-nav#entitiesMenuEntries { + max-width: 410px; + } +} + +@media (max-width: 992px){ + .navbar-nav.upper-nav > li > a {padding: 15px 5px} +} + +@media (min-width: 1020px){ + /* navbar fixes */ + .navbar-nav#entitiesMenuEntries { + max-width: 370px; + } +} + +@media (min-width: 1100px){ + /* navbar fixes */ + .navbar-nav#entitiesMenuEntries { + max-width: 50%; + } +} diff --git a/roo/src/main/resources/static/public/css/theme.css b/roo/src/main/resources/static/public/css/theme.css new file mode 100644 index 0000000000..02722dd20c --- /dev/null +++ b/roo/src/main/resources/static/public/css/theme.css @@ -0,0 +1,6914 @@ +@import url("https://fonts.googleapis.com/css?family=Roboto:400,500"); +/*! + * bootswatch v3.3.6 + * Homepage: http://bootswatch.com + * Copyright 2012-2015 Thomas Park + * Licensed under MIT + * Based on Bootstrap + * Sandstone theme +*/ +/*! + * Bootstrap v3.3.6 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */ +html { + font-family: sans-serif; + -ms-text-size-adjust: 100%; + -webkit-text-size-adjust: 100%; +} +body { + margin: 0; +} +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +menu, +nav, +section, +summary { + display: block; +} +audio, +canvas, +progress, +video { + display: inline-block; + vertical-align: baseline; +} +audio:not([controls]) { + display: none; + height: 0; +} +[hidden], +template { + display: none; +} +a { + background-color: transparent; +} +a:active, +a:hover { + outline: 0; +} +abbr[title] { + border-bottom: 1px dotted; +} +b, +strong { + font-weight: bold; +} +dfn { + font-style: italic; +} +h1 { + font-size: 2em; + margin: 0.67em 0; +} +/*mark { + background: #ff0; + color: #000; +}*/ +small { + font-size: 80%; +} +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} +sup { + top: -0.5em; +} +sub { + bottom: -0.25em; +} +img { + border: 0; +} +svg:not(:root) { + overflow: hidden; +} +figure { + margin: 1em 40px; +} +hr { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; + height: 0; +} +pre { + overflow: auto; +} +code, +kbd, +pre, +samp { + font-family: monospace, monospace; + font-size: 1em; +} +button, +input, +optgroup, +select, +textarea { + color: inherit; + font: inherit; + margin: 0; +} +button { + overflow: visible; +} +button, +select { + text-transform: none; +} +button, +html input[type="button"], +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; + cursor: pointer; +} +button[disabled], +html input[disabled] { + cursor: default; +} +button::-moz-focus-inner, +input::-moz-focus-inner { + border: 0; + padding: 0; +} +input { + line-height: normal; +} +input[type="checkbox"], +input[type="radio"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + padding: 0; +} +input[type="number"]::-webkit-inner-spin-button, +input[type="number"]::-webkit-outer-spin-button { + height: auto; +} +input[type="search"] { + -webkit-appearance: textfield; + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; +} +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} +fieldset { + border: 1px solid #c0c0c0; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; +} +legend { + border: 0; + padding: 0; +} +textarea { + overflow: auto; +} +optgroup { + font-weight: bold; +} +table { + border-collapse: collapse; + border-spacing: 0; +} +td, +th { + padding: 0; +} +/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */ +@media print { + *, + *:before, + *:after { + background: transparent !important; + color: #000 !important; + -webkit-box-shadow: none !important; + box-shadow: none !important; + text-shadow: none !important; + } + a, + a:visited { + text-decoration: underline; + } + a[href]:after { + content: " (" attr(href) ")"; + } + abbr[title]:after { + content: " (" attr(title) ")"; + } + a[href^="#"]:after, + a[href^="javascript:"]:after { + content: ""; + } + pre, + blockquote { + border: 1px solid #999; + page-break-inside: avoid; + } + thead { + display: table-header-group; + } + tr, + img { + page-break-inside: avoid; + } + img { + max-width: 100% !important; + } + p, + h2, + h3 { + orphans: 3; + widows: 3; + } + h2, + h3 { + page-break-after: avoid; + } + .navbar { + display: none; + } + .btn > .caret, + .dropup > .btn > .caret { + border-top-color: #000 !important; + } + .label { + border: 1px solid #000; + } + .table { + border-collapse: collapse !important; + } + .table td, + .table th { + background-color: #fff !important; + } + .table-bordered th, + .table-bordered td { + border: 1px solid #ddd !important; + } +} +/* @font-face { + font-family: 'Glyphicons Halflings'; + src: url('../fonts/glyphicons-halflings-regular.eot'); + src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg'); +} */ +.glyphicon { + position: relative; + top: 1px; + display: inline-block; + font-family: 'Glyphicons Halflings'; + font-style: normal; + font-weight: normal; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +.glyphicon-asterisk:before { + content: "\002a"; +} +.glyphicon-plus:before { + content: "\002b"; +} +.glyphicon-euro:before, +.glyphicon-eur:before { + content: "\20ac"; +} +.glyphicon-minus:before { + content: "\2212"; +} +.glyphicon-cloud:before { + content: "\2601"; +} +.glyphicon-envelope:before { + content: "\2709"; +} +.glyphicon-pencil:before { + content: "\270f"; +} +.glyphicon-glass:before { + content: "\e001"; +} +.glyphicon-music:before { + content: "\e002"; +} +.glyphicon-search:before { + content: "\e003"; +} +.glyphicon-heart:before { + content: "\e005"; +} +.glyphicon-star:before { + content: "\e006"; +} +.glyphicon-star-empty:before { + content: "\e007"; +} +.glyphicon-user:before { + content: "\e008"; +} +.glyphicon-film:before { + content: "\e009"; +} +.glyphicon-th-large:before { + content: "\e010"; +} +.glyphicon-th:before { + content: "\e011"; +} +.glyphicon-th-list:before { + content: "\e012"; +} +.glyphicon-ok:before { + content: "\e013"; +} +.glyphicon-remove:before { + content: "\e014"; +} +.glyphicon-zoom-in:before { + content: "\e015"; +} +.glyphicon-zoom-out:before { + content: "\e016"; +} +.glyphicon-off:before { + content: "\e017"; +} +.glyphicon-signal:before { + content: "\e018"; +} +.glyphicon-cog:before { + content: "\e019"; +} +.glyphicon-trash:before { + content: "\e020"; +} +.glyphicon-home:before { + content: "\e021"; +} +.glyphicon-file:before { + content: "\e022"; +} +.glyphicon-time:before { + content: "\e023"; +} +.glyphicon-road:before { + content: "\e024"; +} +.glyphicon-download-alt:before { + content: "\e025"; +} +.glyphicon-download:before { + content: "\e026"; +} +.glyphicon-upload:before { + content: "\e027"; +} +.glyphicon-inbox:before { + content: "\e028"; +} +.glyphicon-play-circle:before { + content: "\e029"; +} +.glyphicon-repeat:before { + content: "\e030"; +} +.glyphicon-refresh:before { + content: "\e031"; +} +.glyphicon-list-alt:before { + content: "\e032"; +} +.glyphicon-lock:before { + content: "\e033"; +} +.glyphicon-flag:before { + content: "\e034"; +} +.glyphicon-headphones:before { + content: "\e035"; +} +.glyphicon-volume-off:before { + content: "\e036"; +} +.glyphicon-volume-down:before { + content: "\e037"; +} +.glyphicon-volume-up:before { + content: "\e038"; +} +.glyphicon-qrcode:before { + content: "\e039"; +} +.glyphicon-barcode:before { + content: "\e040"; +} +.glyphicon-tag:before { + content: "\e041"; +} +.glyphicon-tags:before { + content: "\e042"; +} +.glyphicon-book:before { + content: "\e043"; +} +.glyphicon-bookmark:before { + content: "\e044"; +} +.glyphicon-print:before { + content: "\e045"; +} +.glyphicon-camera:before { + content: "\e046"; +} +.glyphicon-font:before { + content: "\e047"; +} +.glyphicon-bold:before { + content: "\e048"; +} +.glyphicon-italic:before { + content: "\e049"; +} +.glyphicon-text-height:before { + content: "\e050"; +} +.glyphicon-text-width:before { + content: "\e051"; +} +.glyphicon-align-left:before { + content: "\e052"; +} +.glyphicon-align-center:before { + content: "\e053"; +} +.glyphicon-align-right:before { + content: "\e054"; +} +.glyphicon-align-justify:before { + content: "\e055"; +} +.glyphicon-list:before { + content: "\e056"; +} +.glyphicon-indent-left:before { + content: "\e057"; +} +.glyphicon-indent-right:before { + content: "\e058"; +} +.glyphicon-facetime-video:before { + content: "\e059"; +} +.glyphicon-picture:before { + content: "\e060"; +} +.glyphicon-map-marker:before { + content: "\e062"; +} +.glyphicon-adjust:before { + content: "\e063"; +} +.glyphicon-tint:before { + content: "\e064"; +} +.glyphicon-edit:before { + content: "\e065"; +} +.glyphicon-share:before { + content: "\e066"; +} +.glyphicon-check:before { + content: "\e067"; +} +.glyphicon-move:before { + content: "\e068"; +} +.glyphicon-step-backward:before { + content: "\e069"; +} +.glyphicon-fast-backward:before { + content: "\e070"; +} +.glyphicon-backward:before { + content: "\e071"; +} +.glyphicon-play:before { + content: "\e072"; +} +.glyphicon-pause:before { + content: "\e073"; +} +.glyphicon-stop:before { + content: "\e074"; +} +.glyphicon-forward:before { + content: "\e075"; +} +.glyphicon-fast-forward:before { + content: "\e076"; +} +.glyphicon-step-forward:before { + content: "\e077"; +} +.glyphicon-eject:before { + content: "\e078"; +} +.glyphicon-chevron-left:before { + content: "\e079"; +} +.glyphicon-chevron-right:before { + content: "\e080"; +} +.glyphicon-plus-sign:before { + content: "\e081"; +} +.glyphicon-minus-sign:before { + content: "\e082"; +} +.glyphicon-remove-sign:before { + content: "\e083"; +} +.glyphicon-ok-sign:before { + content: "\e084"; +} +.glyphicon-question-sign:before { + content: "\e085"; +} +.glyphicon-info-sign:before { + content: "\e086"; +} +.glyphicon-screenshot:before { + content: "\e087"; +} +.glyphicon-remove-circle:before { + content: "\e088"; +} +.glyphicon-ok-circle:before { + content: "\e089"; +} +.glyphicon-ban-circle:before { + content: "\e090"; +} +.glyphicon-arrow-left:before { + content: "\e091"; +} +.glyphicon-arrow-right:before { + content: "\e092"; +} +.glyphicon-arrow-up:before { + content: "\e093"; +} +.glyphicon-arrow-down:before { + content: "\e094"; +} +.glyphicon-share-alt:before { + content: "\e095"; +} +.glyphicon-resize-full:before { + content: "\e096"; +} +.glyphicon-resize-small:before { + content: "\e097"; +} +.glyphicon-exclamation-sign:before { + content: "\e101"; +} +.glyphicon-gift:before { + content: "\e102"; +} +.glyphicon-leaf:before { + content: "\e103"; +} +.glyphicon-fire:before { + content: "\e104"; +} +.glyphicon-eye-open:before { + content: "\e105"; +} +.glyphicon-eye-close:before { + content: "\e106"; +} +.glyphicon-warning-sign:before { + content: "\e107"; +} +.glyphicon-plane:before { + content: "\e108"; +} +.glyphicon-calendar:before { + content: "\e109"; +} +.glyphicon-random:before { + content: "\e110"; +} +.glyphicon-comment:before { + content: "\e111"; +} +.glyphicon-magnet:before { + content: "\e112"; +} +.glyphicon-chevron-up:before { + content: "\e113"; +} +.glyphicon-chevron-down:before { + content: "\e114"; +} +.glyphicon-retweet:before { + content: "\e115"; +} +.glyphicon-shopping-cart:before { + content: "\e116"; +} +.glyphicon-folder-close:before { + content: "\e117"; +} +.glyphicon-folder-open:before { + content: "\e118"; +} +.glyphicon-resize-vertical:before { + content: "\e119"; +} +.glyphicon-resize-horizontal:before { + content: "\e120"; +} +.glyphicon-hdd:before { + content: "\e121"; +} +.glyphicon-bullhorn:before { + content: "\e122"; +} +.glyphicon-bell:before { + content: "\e123"; +} +.glyphicon-certificate:before { + content: "\e124"; +} +.glyphicon-thumbs-up:before { + content: "\e125"; +} +.glyphicon-thumbs-down:before { + content: "\e126"; +} +.glyphicon-hand-right:before { + content: "\e127"; +} +.glyphicon-hand-left:before { + content: "\e128"; +} +.glyphicon-hand-up:before { + content: "\e129"; +} +.glyphicon-hand-down:before { + content: "\e130"; +} +.glyphicon-circle-arrow-right:before { + content: "\e131"; +} +.glyphicon-circle-arrow-left:before { + content: "\e132"; +} +.glyphicon-circle-arrow-up:before { + content: "\e133"; +} +.glyphicon-circle-arrow-down:before { + content: "\e134"; +} +.glyphicon-globe:before { + content: "\e135"; +} +.glyphicon-wrench:before { + content: "\e136"; +} +.glyphicon-tasks:before { + content: "\e137"; +} +.glyphicon-filter:before { + content: "\e138"; +} +.glyphicon-briefcase:before { + content: "\e139"; +} +.glyphicon-fullscreen:before { + content: "\e140"; +} +.glyphicon-dashboard:before { + content: "\e141"; +} +.glyphicon-paperclip:before { + content: "\e142"; +} +.glyphicon-heart-empty:before { + content: "\e143"; +} +.glyphicon-link:before { + content: "\e144"; +} +.glyphicon-phone:before { + content: "\e145"; +} +.glyphicon-pushpin:before { + content: "\e146"; +} +.glyphicon-usd:before { + content: "\e148"; +} +.glyphicon-gbp:before { + content: "\e149"; +} +.glyphicon-sort:before { + content: "\e150"; +} +.glyphicon-sort-by-alphabet:before { + content: "\e151"; +} +.glyphicon-sort-by-alphabet-alt:before { + content: "\e152"; +} +.glyphicon-sort-by-order:before { + content: "\e153"; +} +.glyphicon-sort-by-order-alt:before { + content: "\e154"; +} +.glyphicon-sort-by-attributes:before { + content: "\e155"; +} +.glyphicon-sort-by-attributes-alt:before { + content: "\e156"; +} +.glyphicon-unchecked:before { + content: "\e157"; +} +.glyphicon-expand:before { + content: "\e158"; +} +.glyphicon-collapse-down:before { + content: "\e159"; +} +.glyphicon-collapse-up:before { + content: "\e160"; +} +.glyphicon-log-in:before { + content: "\e161"; +} +.glyphicon-flash:before { + content: "\e162"; +} +.glyphicon-log-out:before { + content: "\e163"; +} +.glyphicon-new-window:before { + content: "\e164"; +} +.glyphicon-record:before { + content: "\e165"; +} +.glyphicon-save:before { + content: "\e166"; +} +.glyphicon-open:before { + content: "\e167"; +} +.glyphicon-saved:before { + content: "\e168"; +} +.glyphicon-import:before { + content: "\e169"; +} +.glyphicon-export:before { + content: "\e170"; +} +.glyphicon-send:before { + content: "\e171"; +} +.glyphicon-floppy-disk:before { + content: "\e172"; +} +.glyphicon-floppy-saved:before { + content: "\e173"; +} +.glyphicon-floppy-remove:before { + content: "\e174"; +} +.glyphicon-floppy-save:before { + content: "\e175"; +} +.glyphicon-floppy-open:before { + content: "\e176"; +} +.glyphicon-credit-card:before { + content: "\e177"; +} +.glyphicon-transfer:before { + content: "\e178"; +} +.glyphicon-cutlery:before { + content: "\e179"; +} +.glyphicon-header:before { + content: "\e180"; +} +.glyphicon-compressed:before { + content: "\e181"; +} +.glyphicon-earphone:before { + content: "\e182"; +} +.glyphicon-phone-alt:before { + content: "\e183"; +} +.glyphicon-tower:before { + content: "\e184"; +} +.glyphicon-stats:before { + content: "\e185"; +} +.glyphicon-sd-video:before { + content: "\e186"; +} +.glyphicon-hd-video:before { + content: "\e187"; +} +.glyphicon-subtitles:before { + content: "\e188"; +} +.glyphicon-sound-stereo:before { + content: "\e189"; +} +.glyphicon-sound-dolby:before { + content: "\e190"; +} +.glyphicon-sound-5-1:before { + content: "\e191"; +} +.glyphicon-sound-6-1:before { + content: "\e192"; +} +.glyphicon-sound-7-1:before { + content: "\e193"; +} +.glyphicon-copyright-mark:before { + content: "\e194"; +} +.glyphicon-registration-mark:before { + content: "\e195"; +} +.glyphicon-cloud-download:before { + content: "\e197"; +} +.glyphicon-cloud-upload:before { + content: "\e198"; +} +.glyphicon-tree-conifer:before { + content: "\e199"; +} +.glyphicon-tree-deciduous:before { + content: "\e200"; +} +.glyphicon-cd:before { + content: "\e201"; +} +.glyphicon-save-file:before { + content: "\e202"; +} +.glyphicon-open-file:before { + content: "\e203"; +} +.glyphicon-level-up:before { + content: "\e204"; +} +.glyphicon-copy:before { + content: "\e205"; +} +.glyphicon-paste:before { + content: "\e206"; +} +.glyphicon-alert:before { + content: "\e209"; +} +.glyphicon-equalizer:before { + content: "\e210"; +} +.glyphicon-king:before { + content: "\e211"; +} +.glyphicon-queen:before { + content: "\e212"; +} +.glyphicon-pawn:before { + content: "\e213"; +} +.glyphicon-bishop:before { + content: "\e214"; +} +.glyphicon-knight:before { + content: "\e215"; +} +.glyphicon-baby-formula:before { + content: "\e216"; +} +.glyphicon-tent:before { + content: "\26fa"; +} +.glyphicon-blackboard:before { + content: "\e218"; +} +.glyphicon-bed:before { + content: "\e219"; +} +.glyphicon-apple:before { + content: "\f8ff"; +} +.glyphicon-erase:before { + content: "\e221"; +} +.glyphicon-hourglass:before { + content: "\231b"; +} +.glyphicon-lamp:before { + content: "\e223"; +} +.glyphicon-duplicate:before { + content: "\e224"; +} +.glyphicon-piggy-bank:before { + content: "\e225"; +} +.glyphicon-scissors:before { + content: "\e226"; +} +.glyphicon-bitcoin:before { + content: "\e227"; +} +.glyphicon-btc:before { + content: "\e227"; +} +.glyphicon-xbt:before { + content: "\e227"; +} +.glyphicon-yen:before { + content: "\00a5"; +} +.glyphicon-jpy:before { + content: "\00a5"; +} +.glyphicon-ruble:before { + content: "\20bd"; +} +.glyphicon-rub:before { + content: "\20bd"; +} +.glyphicon-scale:before { + content: "\e230"; +} +.glyphicon-ice-lolly:before { + content: "\e231"; +} +.glyphicon-ice-lolly-tasted:before { + content: "\e232"; +} +.glyphicon-education:before { + content: "\e233"; +} +.glyphicon-option-horizontal:before { + content: "\e234"; +} +.glyphicon-option-vertical:before { + content: "\e235"; +} +.glyphicon-menu-hamburger:before { + content: "\e236"; +} +.glyphicon-modal-window:before { + content: "\e237"; +} +.glyphicon-oil:before { + content: "\e238"; +} +.glyphicon-grain:before { + content: "\e239"; +} +.glyphicon-sunglasses:before { + content: "\e240"; +} +.glyphicon-text-size:before { + content: "\e241"; +} +.glyphicon-text-color:before { + content: "\e242"; +} +.glyphicon-text-background:before { + content: "\e243"; +} +.glyphicon-object-align-top:before { + content: "\e244"; +} +.glyphicon-object-align-bottom:before { + content: "\e245"; +} +.glyphicon-object-align-horizontal:before { + content: "\e246"; +} +.glyphicon-object-align-left:before { + content: "\e247"; +} +.glyphicon-object-align-vertical:before { + content: "\e248"; +} +.glyphicon-object-align-right:before { + content: "\e249"; +} +.glyphicon-triangle-right:before { + content: "\e250"; +} +.glyphicon-triangle-left:before { + content: "\e251"; +} +.glyphicon-triangle-bottom:before { + content: "\e252"; +} +.glyphicon-triangle-top:before { + content: "\e253"; +} +.glyphicon-console:before { + content: "\e254"; +} +.glyphicon-superscript:before { + content: "\e255"; +} +.glyphicon-subscript:before { + content: "\e256"; +} +.glyphicon-menu-left:before { + content: "\e257"; +} +.glyphicon-menu-right:before { + content: "\e258"; +} +.glyphicon-menu-down:before { + content: "\e259"; +} +.glyphicon-menu-up:before { + content: "\e260"; +} +* { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +*:before, +*:after { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +html { + font-size: 10px; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} +body { + font-family: "Roboto", "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + line-height: 1.42857143; + color: #3e3f3a; + background-color: #ffffff; +} +input, +button, +select, +textarea { + font-family: inherit; + font-size: inherit; + line-height: inherit; +} +a { + color: #93c54b; + text-decoration: none; +} +a:hover, +a:focus { + color: #79a736; + text-decoration: underline; +} +a:focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +figure { + margin: 0; +} +img { + vertical-align: middle; +} +.img-responsive, +.thumbnail > img, +.thumbnail a > img, +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + display: block; + max-width: 100%; + height: auto; +} +.img-rounded { + border-radius: 6px; +} +.img-thumbnail { + padding: 4px; + line-height: 1.42857143; + background-color: #f8f5f0; + border: 1px solid #dfd7ca; + border-radius: 4px; + -webkit-transition: all 0.2s ease-in-out; + -o-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; + display: inline-block; + max-width: 100%; + height: auto; +} +.img-circle { + border-radius: 50%; +} +hr { + margin-top: 20px; + margin-bottom: 20px; + border: 0; + border-top: 1px solid #f8f5f0; +} +.sr-only { + position: absolute; + width: 1px; + height: 1px; + margin: -1px; + padding: 0; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; +} +.sr-only-focusable:active, +.sr-only-focusable:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto; +} +[role="button"] { + cursor: pointer; +} +h1, +h2, +h3, +h4, +h5, +h6, +.h1, +.h2, +.h3, +.h4, +.h5, +.h6 { + font-family: inherit; + font-weight: 400; + line-height: 1.1; + color: inherit; +} +h1 small, +h2 small, +h3 small, +h4 small, +h5 small, +h6 small, +.h1 small, +.h2 small, +.h3 small, +.h4 small, +.h5 small, +.h6 small, +h1 .small, +h2 .small, +h3 .small, +h4 .small, +h5 .small, +h6 .small, +.h1 .small, +.h2 .small, +.h3 .small, +.h4 .small, +.h5 .small, +.h6 .small { + font-weight: normal; + line-height: 1; + color: #98978b; +} +h1, +.h1, +h2, +.h2, +h3, +.h3 { + margin-top: 20px; + margin-bottom: 10px; +} +h1 small, +.h1 small, +h2 small, +.h2 small, +h3 small, +.h3 small, +h1 .small, +.h1 .small, +h2 .small, +.h2 .small, +h3 .small, +.h3 .small { + font-size: 65%; +} +h4, +.h4, +h5, +.h5, +h6, +.h6 { + margin-top: 10px; + margin-bottom: 10px; +} +h4 small, +.h4 small, +h5 small, +.h5 small, +h6 small, +.h6 small, +h4 .small, +.h4 .small, +h5 .small, +.h5 .small, +h6 .small, +.h6 .small { + font-size: 75%; +} +h1, +.h1 { + font-size: 36px; +} +h2, +.h2 { + font-size: 30px; +} +h3, +.h3 { + font-size: 24px; +} +h4, +.h4 { + font-size: 18px; +} +h5, +.h5 { + font-size: 14px; +} +h6, +.h6 { + font-size: 12px; +} +p { + margin: 0 0 10px; +} +.lead { + margin-bottom: 20px; + font-size: 16px; + font-weight: 300; + line-height: 1.4; +} +@media (min-width: 768px) { + .lead { + font-size: 21px; + } +} +small, +.small { + font-size: 85%; +} +/*mark, +.mark { + background-color: #fcf8e3; + padding: .2em; +}*/ +.text-left { + text-align: left; +} +.text-right { + text-align: right; +} +.text-center { + text-align: center; +} +.text-justify { + text-align: justify; +} +.text-nowrap { + white-space: nowrap; +} +.text-lowercase { + text-transform: lowercase; +} +.text-uppercase { + text-transform: uppercase; +} +.text-capitalize { + text-transform: capitalize; +} +.text-muted { + color: #98978b; +} +.text-primary { + color: #325d88; +} +a.text-primary:hover, +a.text-primary:focus { + color: #244363; +} +.text-success { + color: #93c54b; +} +a.text-success:hover, +a.text-success:focus { + color: #79a736; +} +.text-info { + color: #29abe0; +} +a.text-info:hover, +a.text-info:focus { + color: #1b8dbb; +} +.text-warning { + color: #f47c3c; +} +a.text-warning:hover, +a.text-warning:focus { + color: #ef5c0e; +} +.text-danger { + color: #d9534f; +} +a.text-danger:hover, +a.text-danger:focus { + color: #c9302c; +} +.bg-primary { + color: #fff; + background-color: #325d88; +} +a.bg-primary:hover, +a.bg-primary:focus { + background-color: #244363; +} +.bg-success { + background-color: #dff0d8; +} +a.bg-success:hover, +a.bg-success:focus { + background-color: #c1e2b3; +} +.bg-info { + background-color: #d9edf7; +} +a.bg-info:hover, +a.bg-info:focus { + background-color: #afd9ee; +} +.bg-warning { + background-color: #fcf8e3; +} +a.bg-warning:hover, +a.bg-warning:focus { + background-color: #f7ecb5; +} +.bg-danger { + background-color: #f2dede; +} +a.bg-danger:hover, +a.bg-danger:focus { + background-color: #e4b9b9; +} +.page-header { + padding-bottom: 9px; + margin: 40px 0 20px; + border-bottom: 1px solid #f8f5f0; +} +ul, +ol { + margin-top: 0; + margin-bottom: 10px; +} +ul ul, +ol ul, +ul ol, +ol ol { + margin-bottom: 0; +} +.list-unstyled { + padding-left: 0; + list-style: none; +} +.list-inline { + padding-left: 0; + list-style: none; + margin-left: -5px; +} +.list-inline > li { + display: inline-block; + padding-left: 5px; + padding-right: 5px; +} +dl { + margin-top: 0; + margin-bottom: 20px; +} +dt, +dd { + line-height: 1.42857143; +} +dt { + font-weight: bold; +} +dd { + margin-left: 0; +} +@media (min-width: 768px) { + .dl-horizontal dt { + float: left; + width: 160px; + clear: left; + text-align: right; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + .dl-horizontal dd { + margin-left: 180px; + } +} +abbr[title], +abbr[data-original-title] { + cursor: help; + border-bottom: 1px dotted #98978b; +} +.initialism { + font-size: 90%; + text-transform: uppercase; +} +blockquote { + padding: 10px 20px; + margin: 0 0 20px; + font-size: 17.5px; + border-left: 5px solid #dfd7ca; +} +blockquote p:last-child, +blockquote ul:last-child, +blockquote ol:last-child { + margin-bottom: 0; +} +blockquote footer, +blockquote small, +blockquote .small { + display: block; + font-size: 80%; + line-height: 1.42857143; + color: #3e3f3a; +} +blockquote footer:before, +blockquote small:before, +blockquote .small:before { + content: '\2014 \00A0'; +} +.blockquote-reverse, +blockquote.pull-right { + padding-right: 15px; + padding-left: 0; + border-right: 5px solid #dfd7ca; + border-left: 0; + text-align: right; +} +.blockquote-reverse footer:before, +blockquote.pull-right footer:before, +.blockquote-reverse small:before, +blockquote.pull-right small:before, +.blockquote-reverse .small:before, +blockquote.pull-right .small:before { + content: ''; +} +.blockquote-reverse footer:after, +blockquote.pull-right footer:after, +.blockquote-reverse small:after, +blockquote.pull-right small:after, +.blockquote-reverse .small:after, +blockquote.pull-right .small:after { + content: '\00A0 \2014'; +} +address { + margin-bottom: 20px; + font-style: normal; + line-height: 1.42857143; +} +code, +kbd, +pre, +samp { + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; +} +code { + padding: 2px 4px; + font-size: 90%; + color: #c7254e; + background-color: #f9f2f4; + border-radius: 4px; +} +kbd { + padding: 2px 4px; + font-size: 90%; + color: #ffffff; + background-color: #333333; + border-radius: 3px; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25); +} +kbd kbd { + padding: 0; + font-size: 100%; + font-weight: bold; + -webkit-box-shadow: none; + box-shadow: none; +} +pre { + display: block; + padding: 9.5px; + margin: 0 0 10px; + font-size: 13px; + line-height: 1.42857143; + word-break: break-all; + word-wrap: break-word; + color: #8e8c84; + background-color: #f5f5f5; + border: 1px solid #cccccc; + border-radius: 4px; +} +pre code { + padding: 0; + font-size: inherit; + color: inherit; + white-space: pre-wrap; + background-color: transparent; + border-radius: 0; +} +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; +} +.container { + margin-right: auto; + margin-left: auto; + padding-left: 15px; + padding-right: 15px; +} +@media (min-width: 768px) { + .container { + width: 750px; + } +} +@media (min-width: 992px) { + .container { + width: 970px; + } +} +@media (min-width: 1200px) { + .container { + width: 1170px; + } +} +.container-fluid { + margin-right: auto; + margin-left: auto; + padding-left: 15px; + padding-right: 15px; +} +.row { + margin-left: -15px; + margin-right: -15px; +} +.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 { + position: relative; + min-height: 1px; + padding-left: 15px; + padding-right: 15px; +} +.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 { + float: left; +} +.col-xs-12 { + width: 100%; +} +.col-xs-11 { + width: 91.66666667%; +} +.col-xs-10 { + width: 83.33333333%; +} +.col-xs-9 { + width: 75%; +} +.col-xs-8 { + width: 66.66666667%; +} +.col-xs-7 { + width: 58.33333333%; +} +.col-xs-6 { + width: 50%; +} +.col-xs-5 { + width: 41.66666667%; +} +.col-xs-4 { + width: 33.33333333%; +} +.col-xs-3 { + width: 25%; +} +.col-xs-2 { + width: 16.66666667%; +} +.col-xs-1 { + width: 8.33333333%; +} +.col-xs-pull-12 { + right: 100%; +} +.col-xs-pull-11 { + right: 91.66666667%; +} +.col-xs-pull-10 { + right: 83.33333333%; +} +.col-xs-pull-9 { + right: 75%; +} +.col-xs-pull-8 { + right: 66.66666667%; +} +.col-xs-pull-7 { + right: 58.33333333%; +} +.col-xs-pull-6 { + right: 50%; +} +.col-xs-pull-5 { + right: 41.66666667%; +} +.col-xs-pull-4 { + right: 33.33333333%; +} +.col-xs-pull-3 { + right: 25%; +} +.col-xs-pull-2 { + right: 16.66666667%; +} +.col-xs-pull-1 { + right: 8.33333333%; +} +.col-xs-pull-0 { + right: auto; +} +.col-xs-push-12 { + left: 100%; +} +.col-xs-push-11 { + left: 91.66666667%; +} +.col-xs-push-10 { + left: 83.33333333%; +} +.col-xs-push-9 { + left: 75%; +} +.col-xs-push-8 { + left: 66.66666667%; +} +.col-xs-push-7 { + left: 58.33333333%; +} +.col-xs-push-6 { + left: 50%; +} +.col-xs-push-5 { + left: 41.66666667%; +} +.col-xs-push-4 { + left: 33.33333333%; +} +.col-xs-push-3 { + left: 25%; +} +.col-xs-push-2 { + left: 16.66666667%; +} +.col-xs-push-1 { + left: 8.33333333%; +} +.col-xs-push-0 { + left: auto; +} +.col-xs-offset-12 { + margin-left: 100%; +} +.col-xs-offset-11 { + margin-left: 91.66666667%; +} +.col-xs-offset-10 { + margin-left: 83.33333333%; +} +.col-xs-offset-9 { + margin-left: 75%; +} +.col-xs-offset-8 { + margin-left: 66.66666667%; +} +.col-xs-offset-7 { + margin-left: 58.33333333%; +} +.col-xs-offset-6 { + margin-left: 50%; +} +.col-xs-offset-5 { + margin-left: 41.66666667%; +} +.col-xs-offset-4 { + margin-left: 33.33333333%; +} +.col-xs-offset-3 { + margin-left: 25%; +} +.col-xs-offset-2 { + margin-left: 16.66666667%; +} +.col-xs-offset-1 { + margin-left: 8.33333333%; +} +.col-xs-offset-0 { + margin-left: 0%; +} +@media (min-width: 768px) { + .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 { + float: left; + } + .col-sm-12 { + width: 100%; + } + .col-sm-11 { + width: 91.66666667%; + } + .col-sm-10 { + width: 83.33333333%; + } + .col-sm-9 { + width: 75%; + } + .col-sm-8 { + width: 66.66666667%; + } + .col-sm-7 { + width: 58.33333333%; + } + .col-sm-6 { + width: 50%; + } + .col-sm-5 { + width: 41.66666667%; + } + .col-sm-4 { + width: 33.33333333%; + } + .col-sm-3 { + width: 25%; + } + .col-sm-2 { + width: 16.66666667%; + } + .col-sm-1 { + width: 8.33333333%; + } + .col-sm-pull-12 { + right: 100%; + } + .col-sm-pull-11 { + right: 91.66666667%; + } + .col-sm-pull-10 { + right: 83.33333333%; + } + .col-sm-pull-9 { + right: 75%; + } + .col-sm-pull-8 { + right: 66.66666667%; + } + .col-sm-pull-7 { + right: 58.33333333%; + } + .col-sm-pull-6 { + right: 50%; + } + .col-sm-pull-5 { + right: 41.66666667%; + } + .col-sm-pull-4 { + right: 33.33333333%; + } + .col-sm-pull-3 { + right: 25%; + } + .col-sm-pull-2 { + right: 16.66666667%; + } + .col-sm-pull-1 { + right: 8.33333333%; + } + .col-sm-pull-0 { + right: auto; + } + .col-sm-push-12 { + left: 100%; + } + .col-sm-push-11 { + left: 91.66666667%; + } + .col-sm-push-10 { + left: 83.33333333%; + } + .col-sm-push-9 { + left: 75%; + } + .col-sm-push-8 { + left: 66.66666667%; + } + .col-sm-push-7 { + left: 58.33333333%; + } + .col-sm-push-6 { + left: 50%; + } + .col-sm-push-5 { + left: 41.66666667%; + } + .col-sm-push-4 { + left: 33.33333333%; + } + .col-sm-push-3 { + left: 25%; + } + .col-sm-push-2 { + left: 16.66666667%; + } + .col-sm-push-1 { + left: 8.33333333%; + } + .col-sm-push-0 { + left: auto; + } + .col-sm-offset-12 { + margin-left: 100%; + } + .col-sm-offset-11 { + margin-left: 91.66666667%; + } + .col-sm-offset-10 { + margin-left: 83.33333333%; + } + .col-sm-offset-9 { + margin-left: 75%; + } + .col-sm-offset-8 { + margin-left: 66.66666667%; + } + .col-sm-offset-7 { + margin-left: 58.33333333%; + } + .col-sm-offset-6 { + margin-left: 50%; + } + .col-sm-offset-5 { + margin-left: 41.66666667%; + } + .col-sm-offset-4 { + margin-left: 33.33333333%; + } + .col-sm-offset-3 { + margin-left: 25%; + } + .col-sm-offset-2 { + margin-left: 16.66666667%; + } + .col-sm-offset-1 { + margin-left: 8.33333333%; + } + .col-sm-offset-0 { + margin-left: 0%; + } +} +@media (min-width: 992px) { + .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 { + float: left; + } + .col-md-12 { + width: 100%; + } + .col-md-11 { + width: 91.66666667%; + } + .col-md-10 { + width: 83.33333333%; + } + .col-md-9 { + width: 75%; + } + .col-md-8 { + width: 66.66666667%; + } + .col-md-7 { + width: 58.33333333%; + } + .col-md-6 { + width: 50%; + } + .col-md-5 { + width: 41.66666667%; + } + .col-md-4 { + width: 33.33333333%; + } + .col-md-3 { + width: 25%; + } + .col-md-2 { + width: 16.66666667%; + } + .col-md-1 { + width: 8.33333333%; + } + .col-md-pull-12 { + right: 100%; + } + .col-md-pull-11 { + right: 91.66666667%; + } + .col-md-pull-10 { + right: 83.33333333%; + } + .col-md-pull-9 { + right: 75%; + } + .col-md-pull-8 { + right: 66.66666667%; + } + .col-md-pull-7 { + right: 58.33333333%; + } + .col-md-pull-6 { + right: 50%; + } + .col-md-pull-5 { + right: 41.66666667%; + } + .col-md-pull-4 { + right: 33.33333333%; + } + .col-md-pull-3 { + right: 25%; + } + .col-md-pull-2 { + right: 16.66666667%; + } + .col-md-pull-1 { + right: 8.33333333%; + } + .col-md-pull-0 { + right: auto; + } + .col-md-push-12 { + left: 100%; + } + .col-md-push-11 { + left: 91.66666667%; + } + .col-md-push-10 { + left: 83.33333333%; + } + .col-md-push-9 { + left: 75%; + } + .col-md-push-8 { + left: 66.66666667%; + } + .col-md-push-7 { + left: 58.33333333%; + } + .col-md-push-6 { + left: 50%; + } + .col-md-push-5 { + left: 41.66666667%; + } + .col-md-push-4 { + left: 33.33333333%; + } + .col-md-push-3 { + left: 25%; + } + .col-md-push-2 { + left: 16.66666667%; + } + .col-md-push-1 { + left: 8.33333333%; + } + .col-md-push-0 { + left: auto; + } + .col-md-offset-12 { + margin-left: 100%; + } + .col-md-offset-11 { + margin-left: 91.66666667%; + } + .col-md-offset-10 { + margin-left: 83.33333333%; + } + .col-md-offset-9 { + margin-left: 75%; + } + .col-md-offset-8 { + margin-left: 66.66666667%; + } + .col-md-offset-7 { + margin-left: 58.33333333%; + } + .col-md-offset-6 { + margin-left: 50%; + } + .col-md-offset-5 { + margin-left: 41.66666667%; + } + .col-md-offset-4 { + margin-left: 33.33333333%; + } + .col-md-offset-3 { + margin-left: 25%; + } + .col-md-offset-2 { + margin-left: 16.66666667%; + } + .col-md-offset-1 { + margin-left: 8.33333333%; + } + .col-md-offset-0 { + margin-left: 0%; + } +} +@media (min-width: 1200px) { + .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 { + float: left; + } + .col-lg-12 { + width: 100%; + } + .col-lg-11 { + width: 91.66666667%; + } + .col-lg-10 { + width: 83.33333333%; + } + .col-lg-9 { + width: 75%; + } + .col-lg-8 { + width: 66.66666667%; + } + .col-lg-7 { + width: 58.33333333%; + } + .col-lg-6 { + width: 50%; + } + .col-lg-5 { + width: 41.66666667%; + } + .col-lg-4 { + width: 33.33333333%; + } + .col-lg-3 { + width: 25%; + } + .col-lg-2 { + width: 16.66666667%; + } + .col-lg-1 { + width: 8.33333333%; + } + .col-lg-pull-12 { + right: 100%; + } + .col-lg-pull-11 { + right: 91.66666667%; + } + .col-lg-pull-10 { + right: 83.33333333%; + } + .col-lg-pull-9 { + right: 75%; + } + .col-lg-pull-8 { + right: 66.66666667%; + } + .col-lg-pull-7 { + right: 58.33333333%; + } + .col-lg-pull-6 { + right: 50%; + } + .col-lg-pull-5 { + right: 41.66666667%; + } + .col-lg-pull-4 { + right: 33.33333333%; + } + .col-lg-pull-3 { + right: 25%; + } + .col-lg-pull-2 { + right: 16.66666667%; + } + .col-lg-pull-1 { + right: 8.33333333%; + } + .col-lg-pull-0 { + right: auto; + } + .col-lg-push-12 { + left: 100%; + } + .col-lg-push-11 { + left: 91.66666667%; + } + .col-lg-push-10 { + left: 83.33333333%; + } + .col-lg-push-9 { + left: 75%; + } + .col-lg-push-8 { + left: 66.66666667%; + } + .col-lg-push-7 { + left: 58.33333333%; + } + .col-lg-push-6 { + left: 50%; + } + .col-lg-push-5 { + left: 41.66666667%; + } + .col-lg-push-4 { + left: 33.33333333%; + } + .col-lg-push-3 { + left: 25%; + } + .col-lg-push-2 { + left: 16.66666667%; + } + .col-lg-push-1 { + left: 8.33333333%; + } + .col-lg-push-0 { + left: auto; + } + .col-lg-offset-12 { + margin-left: 100%; + } + .col-lg-offset-11 { + margin-left: 91.66666667%; + } + .col-lg-offset-10 { + margin-left: 83.33333333%; + } + .col-lg-offset-9 { + margin-left: 75%; + } + .col-lg-offset-8 { + margin-left: 66.66666667%; + } + .col-lg-offset-7 { + margin-left: 58.33333333%; + } + .col-lg-offset-6 { + margin-left: 50%; + } + .col-lg-offset-5 { + margin-left: 41.66666667%; + } + .col-lg-offset-4 { + margin-left: 33.33333333%; + } + .col-lg-offset-3 { + margin-left: 25%; + } + .col-lg-offset-2 { + margin-left: 16.66666667%; + } + .col-lg-offset-1 { + margin-left: 8.33333333%; + } + .col-lg-offset-0 { + margin-left: 0%; + } +} +table { + background-color: transparent; +} +caption { + padding-top: 8px; + padding-bottom: 8px; + color: #98978b; + text-align: left; +} +th { + text-align: left; +} +.table { + width: 100%; + max-width: 100%; + margin-bottom: 20px; +} +.table > thead > tr > th, +.table > tbody > tr > th, +.table > tfoot > tr > th, +.table > thead > tr > td, +.table > tbody > tr > td, +.table > tfoot > tr > td { + padding: 8px; + line-height: 1.42857143; + vertical-align: top; + border-top: 1px solid #dfd7ca; +} +.table > thead > tr > th { + vertical-align: bottom; + border-bottom: 2px solid #dfd7ca; +} +.table > caption + thead > tr:first-child > th, +.table > colgroup + thead > tr:first-child > th, +.table > thead:first-child > tr:first-child > th, +.table > caption + thead > tr:first-child > td, +.table > colgroup + thead > tr:first-child > td, +.table > thead:first-child > tr:first-child > td { + border-top: 0; +} +.table > tbody + tbody { + border-top: 2px solid #dfd7ca; +} +.table .table { + background-color: #ffffff; +} +.table-condensed > thead > tr > th, +.table-condensed > tbody > tr > th, +.table-condensed > tfoot > tr > th, +.table-condensed > thead > tr > td, +.table-condensed > tbody > tr > td, +.table-condensed > tfoot > tr > td { + padding: 5px; +} +.table-bordered { + border: 1px solid #dfd7ca; +} +.table-bordered > thead > tr > th, +.table-bordered > tbody > tr > th, +.table-bordered > tfoot > tr > th, +.table-bordered > thead > tr > td, +.table-bordered > tbody > tr > td, +.table-bordered > tfoot > tr > td { + border: 1px solid #dfd7ca; +} +.table-bordered > thead > tr > th, +.table-bordered > thead > tr > td { + border-bottom-width: 2px; +} +.table-striped > tbody > tr:nth-of-type(odd) { + background-color: #f8f5f0; +} +.table-hover > tbody > tr:hover { + background-color: #f8f5f0; +} +table col[class*="col-"] { + position: static; + float: none; + display: table-column; +} +table td[class*="col-"], +table th[class*="col-"] { + position: static; + float: none; + display: table-cell; +} +.table > thead > tr > td.active, +.table > tbody > tr > td.active, +.table > tfoot > tr > td.active, +.table > thead > tr > th.active, +.table > tbody > tr > th.active, +.table > tfoot > tr > th.active, +.table > thead > tr.active > td, +.table > tbody > tr.active > td, +.table > tfoot > tr.active > td, +.table > thead > tr.active > th, +.table > tbody > tr.active > th, +.table > tfoot > tr.active > th { + background-color: #f8f5f0; +} +.table-hover > tbody > tr > td.active:hover, +.table-hover > tbody > tr > th.active:hover, +.table-hover > tbody > tr.active:hover > td, +.table-hover > tbody > tr:hover > .active, +.table-hover > tbody > tr.active:hover > th { + background-color: #f0e9df; +} +.table > thead > tr > td.success, +.table > tbody > tr > td.success, +.table > tfoot > tr > td.success, +.table > thead > tr > th.success, +.table > tbody > tr > th.success, +.table > tfoot > tr > th.success, +.table > thead > tr.success > td, +.table > tbody > tr.success > td, +.table > tfoot > tr.success > td, +.table > thead > tr.success > th, +.table > tbody > tr.success > th, +.table > tfoot > tr.success > th { + background-color: #dff0d8; +} +.table-hover > tbody > tr > td.success:hover, +.table-hover > tbody > tr > th.success:hover, +.table-hover > tbody > tr.success:hover > td, +.table-hover > tbody > tr:hover > .success, +.table-hover > tbody > tr.success:hover > th { + background-color: #d0e9c6; +} +.table > thead > tr > td.info, +.table > tbody > tr > td.info, +.table > tfoot > tr > td.info, +.table > thead > tr > th.info, +.table > tbody > tr > th.info, +.table > tfoot > tr > th.info, +.table > thead > tr.info > td, +.table > tbody > tr.info > td, +.table > tfoot > tr.info > td, +.table > thead > tr.info > th, +.table > tbody > tr.info > th, +.table > tfoot > tr.info > th { + background-color: #d9edf7; +} +.table-hover > tbody > tr > td.info:hover, +.table-hover > tbody > tr > th.info:hover, +.table-hover > tbody > tr.info:hover > td, +.table-hover > tbody > tr:hover > .info, +.table-hover > tbody > tr.info:hover > th { + background-color: #c4e3f3; +} +.table > thead > tr > td.warning, +.table > tbody > tr > td.warning, +.table > tfoot > tr > td.warning, +.table > thead > tr > th.warning, +.table > tbody > tr > th.warning, +.table > tfoot > tr > th.warning, +.table > thead > tr.warning > td, +.table > tbody > tr.warning > td, +.table > tfoot > tr.warning > td, +.table > thead > tr.warning > th, +.table > tbody > tr.warning > th, +.table > tfoot > tr.warning > th { + background-color: #fcf8e3; +} +.table-hover > tbody > tr > td.warning:hover, +.table-hover > tbody > tr > th.warning:hover, +.table-hover > tbody > tr.warning:hover > td, +.table-hover > tbody > tr:hover > .warning, +.table-hover > tbody > tr.warning:hover > th { + background-color: #faf2cc; +} +.table > thead > tr > td.danger, +.table > tbody > tr > td.danger, +.table > tfoot > tr > td.danger, +.table > thead > tr > th.danger, +.table > tbody > tr > th.danger, +.table > tfoot > tr > th.danger, +.table > thead > tr.danger > td, +.table > tbody > tr.danger > td, +.table > tfoot > tr.danger > td, +.table > thead > tr.danger > th, +.table > tbody > tr.danger > th, +.table > tfoot > tr.danger > th { + background-color: #f2dede; +} +.table-hover > tbody > tr > td.danger:hover, +.table-hover > tbody > tr > th.danger:hover, +.table-hover > tbody > tr.danger:hover > td, +.table-hover > tbody > tr:hover > .danger, +.table-hover > tbody > tr.danger:hover > th { + background-color: #ebcccc; +} +.table-responsive { + overflow-x: auto; + min-height: 0.01%; +} +@media screen and (max-width: 767px) { + .table-responsive { + width: 100%; + margin-bottom: 15px; + overflow-y: hidden; + -ms-overflow-style: -ms-autohiding-scrollbar; + border: 1px solid #dfd7ca; + } + .table-responsive > .table { + margin-bottom: 0; + } + .table-responsive > .table > thead > tr > th, + .table-responsive > .table > tbody > tr > th, + .table-responsive > .table > tfoot > tr > th, + .table-responsive > .table > thead > tr > td, + .table-responsive > .table > tbody > tr > td, + .table-responsive > .table > tfoot > tr > td { + white-space: nowrap; + } + .table-responsive > .table-bordered { + border: 0; + } + .table-responsive > .table-bordered > thead > tr > th:first-child, + .table-responsive > .table-bordered > tbody > tr > th:first-child, + .table-responsive > .table-bordered > tfoot > tr > th:first-child, + .table-responsive > .table-bordered > thead > tr > td:first-child, + .table-responsive > .table-bordered > tbody > tr > td:first-child, + .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; + } + .table-responsive > .table-bordered > thead > tr > th:last-child, + .table-responsive > .table-bordered > tbody > tr > th:last-child, + .table-responsive > .table-bordered > tfoot > tr > th:last-child, + .table-responsive > .table-bordered > thead > tr > td:last-child, + .table-responsive > .table-bordered > tbody > tr > td:last-child, + .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; + } + .table-responsive > .table-bordered > tbody > tr:last-child > th, + .table-responsive > .table-bordered > tfoot > tr:last-child > th, + .table-responsive > .table-bordered > tbody > tr:last-child > td, + .table-responsive > .table-bordered > tfoot > tr:last-child > td { + border-bottom: 0; + } +} +fieldset { + padding: 0; + margin: 0; + border: 0; + min-width: 0; +} +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 20px; + font-size: 21px; + line-height: inherit; + color: inherit; + border: 0; + border-bottom: 1px solid transparent; +} +label { + display: inline-block; + max-width: 100%; + margin-bottom: 5px; + font-weight: bold; +} +input[type="search"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +input[type="radio"], +input[type="checkbox"] { + margin: 4px 0 0; + margin-top: 1px \9; + line-height: normal; +} +input[type="file"] { + display: block; +} +input[type="range"] { + display: block; + width: 100%; +} +select[multiple], +select[size] { + height: auto; +} +input[type="file"]:focus, +input[type="radio"]:focus, +input[type="checkbox"]:focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +output { + display: block; + padding-top: 13px; + font-size: 14px; + line-height: 1.42857143; + color: #3e3f3a; +} +.form-control { + display: block; + width: 100%; + height: 46px; + padding: 12px 16px; + font-size: 14px; + line-height: 1.42857143; + color: #3e3f3a; + background-color: #ffffff; + background-image: none; + border: 1px solid #dfd7ca; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s; + -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; + transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; +} +/* .form-control:focus { + border-color: transparent; + outline: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(0, 0, 0, 0.6); + box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(0, 0, 0, 0.6); +} */ +.form-control::-moz-placeholder { + color: #dfd7ca; + opacity: 1; +} +.form-control:-ms-input-placeholder { + color: #dfd7ca; +} +.form-control::-webkit-input-placeholder { + color: #dfd7ca; +} +.form-control::-ms-expand { + border: 0; + background-color: transparent; +} +.form-control[disabled], +.form-control[readonly], +fieldset[disabled] .form-control { + background-color: #f8f5f0; + opacity: 1; +} +.form-control[disabled], +fieldset[disabled] .form-control { + cursor: not-allowed; +} +textarea.form-control { + height: auto; +} +input[type="search"] { + -webkit-appearance: none; +} +@media screen and (-webkit-min-device-pixel-ratio: 0) { + input[type="date"].form-control, + input[type="time"].form-control, + input[type="datetime-local"].form-control, + input[type="month"].form-control { + line-height: 46px; + } + input[type="date"].input-sm, + input[type="time"].input-sm, + input[type="datetime-local"].input-sm, + input[type="month"].input-sm, + .input-group-sm input[type="date"], + .input-group-sm input[type="time"], + .input-group-sm input[type="datetime-local"], + .input-group-sm input[type="month"] { + line-height: 30px; + } + input[type="date"].input-lg, + input[type="time"].input-lg, + input[type="datetime-local"].input-lg, + input[type="month"].input-lg, + .input-group-lg input[type="date"], + .input-group-lg input[type="time"], + .input-group-lg input[type="datetime-local"], + .input-group-lg input[type="month"] { + line-height: 66px; + } +} +.form-group { + margin-bottom: 15px; +} +.radio, +.checkbox { + position: relative; + display: block; + margin-top: 10px; + margin-bottom: 10px; +} +.radio label, +.checkbox label { + min-height: 20px; + padding-left: 20px; + margin-bottom: 0; + font-weight: normal; + cursor: pointer; +} +.radio input[type="radio"], +.radio-inline input[type="radio"], +.checkbox input[type="checkbox"], +.checkbox-inline input[type="checkbox"] { + position: absolute; + margin-left: -20px; + margin-top: 4px \9; +} +.radio + .radio, +.checkbox + .checkbox { + margin-top: -5px; +} +.radio-inline, +.checkbox-inline { + position: relative; + display: inline-block; + padding-left: 20px; + margin-bottom: 0; + vertical-align: middle; + font-weight: normal; + cursor: pointer; +} +.radio-inline + .radio-inline, +.checkbox-inline + .checkbox-inline { + margin-top: 0; + margin-left: 10px; +} +input[type="radio"][disabled], +input[type="checkbox"][disabled], +input[type="radio"].disabled, +input[type="checkbox"].disabled, +fieldset[disabled] input[type="radio"], +fieldset[disabled] input[type="checkbox"] { + cursor: not-allowed; +} +.radio-inline.disabled, +.checkbox-inline.disabled, +fieldset[disabled] .radio-inline, +fieldset[disabled] .checkbox-inline { + cursor: not-allowed; +} +.radio.disabled label, +.checkbox.disabled label, +fieldset[disabled] .radio label, +fieldset[disabled] .checkbox label { + cursor: not-allowed; +} +.form-control-static { + padding-top: 13px; + padding-bottom: 13px; + margin-bottom: 0; + min-height: 34px; +} +.form-control-static.input-lg, +.form-control-static.input-sm { + padding-left: 0; + padding-right: 0; +} +.input-sm { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +select.input-sm { + height: 30px; + line-height: 30px; +} +textarea.input-sm, +select[multiple].input-sm { + height: auto; +} +.form-group-sm .form-control { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +.form-group-sm select.form-control { + height: 30px; + line-height: 30px; +} +.form-group-sm textarea.form-control, +.form-group-sm select[multiple].form-control { + height: auto; +} +.form-group-sm .form-control-static { + height: 30px; + min-height: 32px; + padding: 6px 10px; + font-size: 12px; + line-height: 1.5; +} +.input-lg { + height: 66px; + padding: 20px 30px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +select.input-lg { + height: 66px; + line-height: 66px; +} +textarea.input-lg, +select[multiple].input-lg { + height: auto; +} +.form-group-lg .form-control { + height: 66px; + padding: 20px 30px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +.form-group-lg select.form-control { + height: 66px; + line-height: 66px; +} +.form-group-lg textarea.form-control, +.form-group-lg select[multiple].form-control { + height: auto; +} +.form-group-lg .form-control-static { + height: 66px; + min-height: 38px; + padding: 21px 30px; + font-size: 18px; + line-height: 1.3333333; +} +.has-feedback { + position: relative; +} +.has-feedback .form-control { + padding-right: 57.5px; +} +.form-control-feedback { + position: absolute; + top: 0; + right: 0; + z-index: 2; + display: block; + width: 46px; + height: 46px; + line-height: 46px; + text-align: center; + pointer-events: none; +} +.input-lg + .form-control-feedback, +.input-group-lg + .form-control-feedback, +.form-group-lg .form-control + .form-control-feedback { + width: 66px; + height: 66px; + line-height: 66px; +} +.input-sm + .form-control-feedback, +.input-group-sm + .form-control-feedback, +.form-group-sm .form-control + .form-control-feedback { + width: 30px; + height: 30px; + line-height: 30px; +} +.has-success .help-block, +.has-success .control-label, +.has-success .radio, +.has-success .checkbox, +.has-success .radio-inline, +.has-success .checkbox-inline, +.has-success.radio label, +.has-success.checkbox label, +.has-success.radio-inline label, +.has-success.checkbox-inline label { + color: #93c54b; +} +.has-success .form-control { + border-color: #93c54b; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.has-success .form-control:focus { + border-color: #79a736; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c1de98; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c1de98; +} +.has-success .input-group-addon { + color: #93c54b; + border-color: #93c54b; + background-color: #dff0d8; +} +.has-success .form-control-feedback { + color: #93c54b; +} +.has-warning .help-block, +.has-warning .control-label, +.has-warning .radio, +.has-warning .checkbox, +.has-warning .radio-inline, +.has-warning .checkbox-inline, +.has-warning.radio label, +.has-warning.checkbox label, +.has-warning.radio-inline label, +.has-warning.checkbox-inline label { + color: #f47c3c; +} +.has-warning .form-control { + border-color: #f47c3c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.has-warning .form-control:focus { + border-color: #ef5c0e; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #f9bd9d; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #f9bd9d; +} +.has-warning .input-group-addon { + color: #f47c3c; + border-color: #f47c3c; + background-color: #fcf8e3; +} +.has-warning .form-control-feedback { + color: #f47c3c; +} +.has-error .help-block, +.has-error .control-label, +.has-error .radio, +.has-error .checkbox, +.has-error .radio-inline, +.has-error .checkbox-inline, +.has-error.radio label, +.has-error.checkbox label, +.has-error.radio-inline label, +.has-error.checkbox-inline label { + color: #d9534f; +} +.has-error .form-control { + border-color: #d9534f; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.has-error .form-control:focus { + border-color: #c9302c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #eba5a3; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #eba5a3; +} +.has-error .input-group-addon { + color: #d9534f; + border-color: #d9534f; + background-color: #f2dede; +} +.has-error .form-control-feedback { + color: #d9534f; +} +.has-feedback label ~ .form-control-feedback { + top: 25px; +} +.has-feedback label.sr-only ~ .form-control-feedback { + top: 0; +} +.help-block { + display: block; + margin-top: 5px; + margin-bottom: 10px; + color: #7f8177; +} +@media (min-width: 768px) { + .form-inline .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + .form-inline .form-control-static { + display: inline-block; + } + .form-inline .input-group { + display: inline-table; + vertical-align: middle; + } + .form-inline .input-group .input-group-addon, + .form-inline .input-group .input-group-btn, + .form-inline .input-group .form-control { + width: auto; + } + .form-inline .input-group > .form-control { + width: 100%; + } + .form-inline .control-label { + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .radio, + .form-inline .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .radio label, + .form-inline .checkbox label { + padding-left: 0; + } + .form-inline .radio input[type="radio"], + .form-inline .checkbox input[type="checkbox"] { + position: relative; + margin-left: 0; + } + .form-inline .has-feedback .form-control-feedback { + top: 0; + } +} +.form-horizontal .radio, +.form-horizontal .checkbox, +.form-horizontal .radio-inline, +.form-horizontal .checkbox-inline { + margin-top: 0; + margin-bottom: 0; + padding-top: 13px; +} +.form-horizontal .radio, +.form-horizontal .checkbox { + min-height: 33px; +} +.form-horizontal .form-group { + margin-left: -15px; + margin-right: -15px; +} +@media (min-width: 768px) { + .form-horizontal .control-label { + text-align: right; + margin-bottom: 0; + padding-top: 13px; + } +} +.form-horizontal .has-feedback .form-control-feedback { + right: 15px; +} +@media (min-width: 768px) { + .form-horizontal .form-group-lg .control-label { + padding-top: 21px; + font-size: 18px; + } +} +@media (min-width: 768px) { + .form-horizontal .form-group-sm .control-label { + padding-top: 6px; + font-size: 12px; + } +} +.btn { + display: inline-block; + margin-bottom: 0; + font-weight: normal; + text-align: center; + vertical-align: middle; + -ms-touch-action: manipulation; + touch-action: manipulation; + cursor: pointer; + background-image: none; + border: 1px solid transparent; + white-space: nowrap; + padding: 12px 16px; + font-size: 14px; + line-height: 1.42857143; + border-radius: 4px; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +.btn:focus, +.btn:active:focus, +.btn.active:focus, +.btn.focus, +.btn:active.focus, +.btn.active.focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +.btn:hover, +.btn:focus, +.btn.focus { + color: #ffffff; + text-decoration: none; +} +.btn:active, +.btn.active { + outline: 0; + background-image: none; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); +} +.btn.disabled, +.btn[disabled], +fieldset[disabled] .btn { + cursor: not-allowed; + opacity: 0.65; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + box-shadow: none; +} +a.btn.disabled, +fieldset[disabled] a.btn { + pointer-events: none; +} +.btn-default { + color: #ffffff; + background-color: #3e3f3a; + border-color: transparent; +} +.btn-default:focus, +.btn-default.focus { + color: #ffffff; + background-color: #242422; + border-color: rgba(0, 0, 0, 0); +} +.btn-default:hover { + color: #ffffff; + background-color: #242422; + border-color: rgba(0, 0, 0, 0); +} +.btn-default:active, +.btn-default.active, +.open > .dropdown-toggle.btn-default { + color: #ffffff; + background-color: #242422; + border-color: rgba(0, 0, 0, 0); +} +.btn-default:active:hover, +.btn-default.active:hover, +.open > .dropdown-toggle.btn-default:hover, +.btn-default:active:focus, +.btn-default.active:focus, +.open > .dropdown-toggle.btn-default:focus, +.btn-default:active.focus, +.btn-default.active.focus, +.open > .dropdown-toggle.btn-default.focus { + color: #ffffff; + background-color: #121210; + border-color: rgba(0, 0, 0, 0); +} +.btn-default:active, +.btn-default.active, +.open > .dropdown-toggle.btn-default { + background-image: none; +} +.btn-default.disabled:hover, +.btn-default[disabled]:hover, +fieldset[disabled] .btn-default:hover, +.btn-default.disabled:focus, +.btn-default[disabled]:focus, +fieldset[disabled] .btn-default:focus, +.btn-default.disabled.focus, +.btn-default[disabled].focus, +fieldset[disabled] .btn-default.focus { + background-color: #3e3f3a; + border-color: transparent; +} +.btn-default .badge { + color: #3e3f3a; + background-color: #ffffff; +} +.btn-primary { + color: #ffffff; + background-color: #325d88; + border-color: transparent; +} +.btn-primary:focus, +.btn-primary.focus { + color: #ffffff; + background-color: #244363; + border-color: rgba(0, 0, 0, 0); +} +.btn-primary:hover { + color: #ffffff; + background-color: #244363; + border-color: rgba(0, 0, 0, 0); +} +.btn-primary:active, +.btn-primary.active, +.open > .dropdown-toggle.btn-primary { + color: #ffffff; + background-color: #244363; + border-color: rgba(0, 0, 0, 0); +} +.btn-primary:active:hover, +.btn-primary.active:hover, +.open > .dropdown-toggle.btn-primary:hover, +.btn-primary:active:focus, +.btn-primary.active:focus, +.open > .dropdown-toggle.btn-primary:focus, +.btn-primary:active.focus, +.btn-primary.active.focus, +.open > .dropdown-toggle.btn-primary.focus { + color: #ffffff; + background-color: #1b3249; + border-color: rgba(0, 0, 0, 0); +} +.btn-primary:active, +.btn-primary.active, +.open > .dropdown-toggle.btn-primary { + background-image: none; +} +.btn-primary.disabled:hover, +.btn-primary[disabled]:hover, +fieldset[disabled] .btn-primary:hover, +.btn-primary.disabled:focus, +.btn-primary[disabled]:focus, +fieldset[disabled] .btn-primary:focus, +.btn-primary.disabled.focus, +.btn-primary[disabled].focus, +fieldset[disabled] .btn-primary.focus { + background-color: #325d88; + border-color: transparent; +} +.btn-primary .badge { + color: #325d88; + background-color: #ffffff; +} +.btn-success { + color: #ffffff; + background-color: #93c54b; + border-color: transparent; +} +.btn-success:focus, +.btn-success.focus { + color: #ffffff; + background-color: #79a736; + border-color: rgba(0, 0, 0, 0); +} +.btn-success:hover { + color: #ffffff; + background-color: #79a736; + border-color: rgba(0, 0, 0, 0); +} +.btn-success:active, +.btn-success.active, +.open > .dropdown-toggle.btn-success { + color: #ffffff; + background-color: #79a736; + border-color: rgba(0, 0, 0, 0); +} +.btn-success:active:hover, +.btn-success.active:hover, +.open > .dropdown-toggle.btn-success:hover, +.btn-success:active:focus, +.btn-success.active:focus, +.open > .dropdown-toggle.btn-success:focus, +.btn-success:active.focus, +.btn-success.active.focus, +.open > .dropdown-toggle.btn-success.focus { + color: #ffffff; + background-color: #658c2d; + border-color: rgba(0, 0, 0, 0); +} +.btn-success:active, +.btn-success.active, +.open > .dropdown-toggle.btn-success { + background-image: none; +} +.btn-success.disabled:hover, +.btn-success[disabled]:hover, +fieldset[disabled] .btn-success:hover, +.btn-success.disabled:focus, +.btn-success[disabled]:focus, +fieldset[disabled] .btn-success:focus, +.btn-success.disabled.focus, +.btn-success[disabled].focus, +fieldset[disabled] .btn-success.focus { + background-color: #93c54b; + border-color: transparent; +} +.btn-success .badge { + color: #93c54b; + background-color: #ffffff; +} +.btn-info { + color: #ffffff; + background-color: #29abe0; + border-color: transparent; +} +.btn-info:focus, +.btn-info.focus { + color: #ffffff; + background-color: #1b8dbb; + border-color: rgba(0, 0, 0, 0); +} +.btn-info:hover { + color: #ffffff; + background-color: #1b8dbb; + border-color: rgba(0, 0, 0, 0); +} +.btn-info:active, +.btn-info.active, +.open > .dropdown-toggle.btn-info { + color: #ffffff; + background-color: #1b8dbb; + border-color: rgba(0, 0, 0, 0); +} +.btn-info:active:hover, +.btn-info.active:hover, +.open > .dropdown-toggle.btn-info:hover, +.btn-info:active:focus, +.btn-info.active:focus, +.open > .dropdown-toggle.btn-info:focus, +.btn-info:active.focus, +.btn-info.active.focus, +.open > .dropdown-toggle.btn-info.focus { + color: #ffffff; + background-color: #17759c; + border-color: rgba(0, 0, 0, 0); +} +.btn-info:active, +.btn-info.active, +.open > .dropdown-toggle.btn-info { + background-image: none; +} +.btn-info.disabled:hover, +.btn-info[disabled]:hover, +fieldset[disabled] .btn-info:hover, +.btn-info.disabled:focus, +.btn-info[disabled]:focus, +fieldset[disabled] .btn-info:focus, +.btn-info.disabled.focus, +.btn-info[disabled].focus, +fieldset[disabled] .btn-info.focus { + background-color: #29abe0; + border-color: transparent; +} +.btn-info .badge { + color: #29abe0; + background-color: #ffffff; +} +.btn-warning { + color: #ffffff; + background-color: #f47c3c; + border-color: transparent; +} +.btn-warning:focus, +.btn-warning.focus { + color: #ffffff; + background-color: #ef5c0e; + border-color: rgba(0, 0, 0, 0); +} +.btn-warning:hover { + color: #ffffff; + background-color: #ef5c0e; + border-color: rgba(0, 0, 0, 0); +} +.btn-warning:active, +.btn-warning.active, +.open > .dropdown-toggle.btn-warning { + color: #ffffff; + background-color: #ef5c0e; + border-color: rgba(0, 0, 0, 0); +} +.btn-warning:active:hover, +.btn-warning.active:hover, +.open > .dropdown-toggle.btn-warning:hover, +.btn-warning:active:focus, +.btn-warning.active:focus, +.open > .dropdown-toggle.btn-warning:focus, +.btn-warning:active.focus, +.btn-warning.active.focus, +.open > .dropdown-toggle.btn-warning.focus { + color: #ffffff; + background-color: #ce4f0c; + border-color: rgba(0, 0, 0, 0); +} +.btn-warning:active, +.btn-warning.active, +.open > .dropdown-toggle.btn-warning { + background-image: none; +} +.btn-warning.disabled:hover, +.btn-warning[disabled]:hover, +fieldset[disabled] .btn-warning:hover, +.btn-warning.disabled:focus, +.btn-warning[disabled]:focus, +fieldset[disabled] .btn-warning:focus, +.btn-warning.disabled.focus, +.btn-warning[disabled].focus, +fieldset[disabled] .btn-warning.focus { + background-color: #f47c3c; + border-color: transparent; +} +.btn-warning .badge { + color: #f47c3c; + background-color: #ffffff; +} +.btn-danger { + color: #ffffff; + background-color: #d9534f; + border-color: transparent; +} +.btn-danger:focus, +.btn-danger.focus { + color: #ffffff; + background-color: #c9302c; + border-color: rgba(0, 0, 0, 0); +} +.btn-danger:hover { + color: #ffffff; + background-color: #c9302c; + border-color: rgba(0, 0, 0, 0); +} +.btn-danger:active, +.btn-danger.active, +.open > .dropdown-toggle.btn-danger { + color: #ffffff; + background-color: #c9302c; + border-color: rgba(0, 0, 0, 0); +} +.btn-danger:active:hover, +.btn-danger.active:hover, +.open > .dropdown-toggle.btn-danger:hover, +.btn-danger:active:focus, +.btn-danger.active:focus, +.open > .dropdown-toggle.btn-danger:focus, +.btn-danger:active.focus, +.btn-danger.active.focus, +.open > .dropdown-toggle.btn-danger.focus { + color: #ffffff; + background-color: #ac2925; + border-color: rgba(0, 0, 0, 0); +} +.btn-danger:active, +.btn-danger.active, +.open > .dropdown-toggle.btn-danger { + background-image: none; +} +.btn-danger.disabled:hover, +.btn-danger[disabled]:hover, +fieldset[disabled] .btn-danger:hover, +.btn-danger.disabled:focus, +.btn-danger[disabled]:focus, +fieldset[disabled] .btn-danger:focus, +.btn-danger.disabled.focus, +.btn-danger[disabled].focus, +fieldset[disabled] .btn-danger.focus { + background-color: #d9534f; + border-color: transparent; +} +.btn-danger .badge { + color: #d9534f; + background-color: #ffffff; +} +.btn-link { + color: #93c54b; + font-weight: normal; + border-radius: 0; +} +.btn-link, +.btn-link:active, +.btn-link.active, +.btn-link[disabled], +fieldset[disabled] .btn-link { + background-color: transparent; + -webkit-box-shadow: none; + box-shadow: none; +} +.btn-link, +.btn-link:hover, +.btn-link:focus, +.btn-link:active { + border-color: transparent; +} +.btn-link:hover, +.btn-link:focus { + color: #79a736; + text-decoration: underline; + background-color: transparent; +} +.btn-link[disabled]:hover, +fieldset[disabled] .btn-link:hover, +.btn-link[disabled]:focus, +fieldset[disabled] .btn-link:focus { + color: #dfd7ca; + text-decoration: none; +} +.btn-lg, +.btn-group-lg > .btn { + padding: 20px 30px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +.btn-sm, +.btn-group-sm > .btn { + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +.btn-xs, +.btn-group-xs > .btn { + padding: 1px 5px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +.btn-block { + display: block; + width: 100%; +} +.btn-block + .btn-block { + margin-top: 5px; +} +input[type="submit"].btn-block, +input[type="reset"].btn-block, +input[type="button"].btn-block { + width: 100%; +} +.fade { + opacity: 0; + -webkit-transition: opacity 0.15s linear; + -o-transition: opacity 0.15s linear; + transition: opacity 0.15s linear; +} +.fade.in { + opacity: 1; +} +.collapse { + display: none; +} +.collapse.in { + display: block; +} +tr.collapse.in { + display: table-row; +} +tbody.collapse.in { + display: table-row-group; +} +.collapsing { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition-property: height, visibility; + -o-transition-property: height, visibility; + transition-property: height, visibility; + -webkit-transition-duration: 0.35s; + -o-transition-duration: 0.35s; + transition-duration: 0.35s; + -webkit-transition-timing-function: ease; + -o-transition-timing-function: ease; + transition-timing-function: ease; +} +.caret { + display: inline-block; + width: 0; + height: 0; + margin-left: 2px; + vertical-align: middle; + border-top: 4px dashed; + border-top: 4px solid \9; + border-right: 4px solid transparent; + border-left: 4px solid transparent; +} +.dropup, +.dropdown { + position: relative; +} +.dropdown-toggle:focus { + outline: 0; +} +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 160px; + padding: 5px 0; + margin: 2px 0 0; + list-style: none; + font-size: 14px; + text-align: left; + background-color: #ffffff; + border: 1px solid #dfd7ca; + border-radius: 4px; + -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); + box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); + -webkit-background-clip: padding-box; + background-clip: padding-box; +} +.dropdown-menu.pull-right { + right: 0; + left: auto; +} +.dropdown-menu .divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #f8f5f0; +} +.dropdown-menu > li > a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 1.42857143; + color: #98978b; + white-space: nowrap; +} +.dropdown-menu > li > a:hover, +.dropdown-menu > li > a:focus { + text-decoration: none; + color: #98978b; + background-color: #f8f5f0; +} +.dropdown-menu > .active > a, +.dropdown-menu > .active > a:hover, +.dropdown-menu > .active > a:focus { + color: #98978b; + text-decoration: none; + outline: 0; + background-color: #f8f5f0; +} +.dropdown-menu > .disabled > a, +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + color: #dfd7ca; +} +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + text-decoration: none; + background-color: transparent; + background-image: none; + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + cursor: not-allowed; +} +.open > .dropdown-menu { + display: block; +} +.open > a { + outline: 0; +} +.dropdown-menu-right { + left: auto; + right: 0; +} +.dropdown-menu-left { + left: 0; + right: auto; +} +.dropdown-header { + display: block; + padding: 3px 20px; + font-size: 12px; + line-height: 1.42857143; + color: #dfd7ca; + white-space: nowrap; +} +.dropdown-backdrop { + position: fixed; + left: 0; + right: 0; + bottom: 0; + top: 0; + z-index: 990; +} +.pull-right > .dropdown-menu { + right: 0; + left: auto; +} +.dropup .caret, +.navbar-fixed-bottom .dropdown .caret { + border-top: 0; + border-bottom: 4px dashed; + border-bottom: 4px solid \9; + content: ""; +} +.dropup .dropdown-menu, +.navbar-fixed-bottom .dropdown .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 2px; +} +@media (min-width: 768px) { + .navbar-right .dropdown-menu { + left: auto; + right: 0; + } + .navbar-right .dropdown-menu-left { + left: 0; + right: auto; + } +} +.btn-group, +.btn-group-vertical { + position: relative; + display: inline-block; + vertical-align: middle; +} +.btn-group > .btn, +.btn-group-vertical > .btn { + position: relative; + float: left; +} +.btn-group > .btn:hover, +.btn-group-vertical > .btn:hover, +.btn-group > .btn:focus, +.btn-group-vertical > .btn:focus, +.btn-group > .btn:active, +.btn-group-vertical > .btn:active, +.btn-group > .btn.active, +.btn-group-vertical > .btn.active { + z-index: 2; +} +.btn-group .btn + .btn, +.btn-group .btn + .btn-group, +.btn-group .btn-group + .btn, +.btn-group .btn-group + .btn-group { + margin-left: -1px; +} +.btn-toolbar { + margin-left: -5px; +} +.btn-toolbar .btn, +.btn-toolbar .btn-group, +.btn-toolbar .input-group { + float: left; +} +.btn-toolbar > .btn, +.btn-toolbar > .btn-group, +.btn-toolbar > .input-group { + margin-left: 5px; +} +.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { + border-radius: 0; +} +.btn-group > .btn:first-child { + margin-left: 0; +} +.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} +.btn-group > .btn:last-child:not(:first-child), +.btn-group > .dropdown-toggle:not(:first-child) { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +.btn-group > .btn-group { + float: left; +} +.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} +.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child, +.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} +.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0; +} +.btn-group > .btn + .dropdown-toggle { + padding-left: 8px; + padding-right: 8px; +} +.btn-group > .btn-lg + .dropdown-toggle { + padding-left: 12px; + padding-right: 12px; +} +.btn-group.open .dropdown-toggle { + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); +} +.btn-group.open .dropdown-toggle.btn-link { + -webkit-box-shadow: none; + box-shadow: none; +} +.btn .caret { + margin-left: 0; +} +.btn-lg .caret { + border-width: 5px 5px 0; + border-bottom-width: 0; +} +.dropup .btn-lg .caret { + border-width: 0 5px 5px; +} +.btn-group-vertical > .btn, +.btn-group-vertical > .btn-group, +.btn-group-vertical > .btn-group > .btn { + display: block; + float: none; + width: 100%; + max-width: 100%; +} +.btn-group-vertical > .btn-group > .btn { + float: none; +} +.btn-group-vertical > .btn + .btn, +.btn-group-vertical > .btn + .btn-group, +.btn-group-vertical > .btn-group + .btn, +.btn-group-vertical > .btn-group + .btn-group { + margin-top: -1px; + margin-left: 0; +} +.btn-group-vertical > .btn:not(:first-child):not(:last-child) { + border-radius: 0; +} +.btn-group-vertical > .btn:first-child:not(:last-child) { + border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group-vertical > .btn:last-child:not(:first-child) { + border-top-right-radius: 0; + border-top-left-radius: 0; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} +.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} +.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child, +.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { + border-top-right-radius: 0; + border-top-left-radius: 0; +} +.btn-group-justified { + display: table; + width: 100%; + table-layout: fixed; + border-collapse: separate; +} +.btn-group-justified > .btn, +.btn-group-justified > .btn-group { + float: none; + display: table-cell; + width: 1%; +} +.btn-group-justified > .btn-group .btn { + width: 100%; +} +.btn-group-justified > .btn-group .dropdown-menu { + left: auto; +} +[data-toggle="buttons"] > .btn input[type="radio"], +[data-toggle="buttons"] > .btn-group > .btn input[type="radio"], +[data-toggle="buttons"] > .btn input[type="checkbox"], +[data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] { + position: absolute; + clip: rect(0, 0, 0, 0); + pointer-events: none; +} +.input-group { + position: relative; + display: table; + border-collapse: separate; +} +.input-group[class*="col-"] { + float: none; + padding-left: 0; + padding-right: 0; +} +.input-group .form-control { + position: relative; + z-index: 2; + float: left; + width: 100%; + margin-bottom: 0; +} +.input-group .form-control:focus { + z-index: 3; +} +.input-group-lg > .form-control, +.input-group-lg > .input-group-addon, +.input-group-lg > .input-group-btn > .btn { + height: 66px; + padding: 20px 30px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +select.input-group-lg > .form-control, +select.input-group-lg > .input-group-addon, +select.input-group-lg > .input-group-btn > .btn { + height: 66px; + line-height: 66px; +} +textarea.input-group-lg > .form-control, +textarea.input-group-lg > .input-group-addon, +textarea.input-group-lg > .input-group-btn > .btn, +select[multiple].input-group-lg > .form-control, +select[multiple].input-group-lg > .input-group-addon, +select[multiple].input-group-lg > .input-group-btn > .btn { + height: auto; +} +.input-group-sm > .form-control, +.input-group-sm > .input-group-addon, +.input-group-sm > .input-group-btn > .btn { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +select.input-group-sm > .form-control, +select.input-group-sm > .input-group-addon, +select.input-group-sm > .input-group-btn > .btn { + height: 30px; + line-height: 30px; +} +textarea.input-group-sm > .form-control, +textarea.input-group-sm > .input-group-addon, +textarea.input-group-sm > .input-group-btn > .btn, +select[multiple].input-group-sm > .form-control, +select[multiple].input-group-sm > .input-group-addon, +select[multiple].input-group-sm > .input-group-btn > .btn { + height: auto; +} +.input-group-addon, +.input-group-btn, +.input-group .form-control { + display: table-cell; +} +.input-group-addon:not(:first-child):not(:last-child), +.input-group-btn:not(:first-child):not(:last-child), +.input-group .form-control:not(:first-child):not(:last-child) { + border-radius: 0; +} +.input-group-addon, +.input-group-btn { + width: 1%; + white-space: nowrap; + vertical-align: middle; +} +.input-group-addon { + padding: 12px 16px; + font-size: 14px; + font-weight: normal; + line-height: 1; + color: #3e3f3a; + text-align: center; + background-color: #f8f5f0; + border: 1px solid #dfd7ca; + border-radius: 4px; +} +.input-group-addon.input-sm { + padding: 5px 10px; + font-size: 12px; + border-radius: 3px; +} +.input-group-addon.input-lg { + padding: 20px 30px; + font-size: 18px; + border-radius: 6px; +} +.input-group-addon input[type="radio"], +.input-group-addon input[type="checkbox"] { + margin-top: 0; +} +.input-group .form-control:first-child, +.input-group-addon:first-child, +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group > .btn, +.input-group-btn:first-child > .dropdown-toggle, +.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), +.input-group-btn:last-child > .btn-group:not(:last-child) > .btn { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} +.input-group-addon:first-child { + border-right: 0; +} +.input-group .form-control:last-child, +.input-group-addon:last-child, +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .btn-group > .btn, +.input-group-btn:last-child > .dropdown-toggle, +.input-group-btn:first-child > .btn:not(:first-child), +.input-group-btn:first-child > .btn-group:not(:first-child) > .btn { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +.input-group-addon:last-child { + border-left: 0; +} +.input-group-btn { + position: relative; + font-size: 0; + white-space: nowrap; +} +.input-group-btn > .btn { + position: relative; +} +.input-group-btn > .btn + .btn { + margin-left: -1px; +} +.input-group-btn > .btn:hover, +.input-group-btn > .btn:focus, +.input-group-btn > .btn:active { + z-index: 2; +} +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group { + margin-right: -1px; +} +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .btn-group { + z-index: 2; + margin-left: -1px; +} +.nav { + margin-bottom: 0; + padding-left: 0; + list-style: none; +} +.nav > li { + position: relative; + display: block; +} +.nav > li > a { + position: relative; + display: block; + padding: 10px 15px; +} +.nav > li > a:hover, +.nav > li > a:focus { + text-decoration: none; + background-color: #f8f5f0; +} +.nav > li.disabled > a { + color: #dfd7ca; +} +.nav > li.disabled > a:hover, +.nav > li.disabled > a:focus { + color: #dfd7ca; + text-decoration: none; + background-color: transparent; + cursor: not-allowed; +} +.nav .open > a, +.nav .open > a:hover, +.nav .open > a:focus { + background-color: #f8f5f0; + border-color: #93c54b; +} +.nav .nav-divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #e5e5e5; +} +.nav > li > a > img { + max-width: none; +} +.nav-tabs { + border-bottom: 1px solid #dfd7ca; +} +.nav-tabs > li { + float: left; + margin-bottom: -1px; +} +.nav-tabs > li > a { + margin-right: 2px; + line-height: 1.42857143; + border: 1px solid transparent; + border-radius: 4px 4px 0 0; +} +.nav-tabs > li > a:hover { + border-color: #dfd7ca #dfd7ca #dfd7ca; +} +.nav-tabs > li.active > a, +.nav-tabs > li.active > a:hover, +.nav-tabs > li.active > a:focus { + color: #98978b; + background-color: #ffffff; + border: 1px solid #dfd7ca; + border-bottom-color: transparent; + cursor: default; +} +.nav-tabs.nav-justified { + width: 100%; + border-bottom: 0; +} +.nav-tabs.nav-justified > li { + float: none; +} +.nav-tabs.nav-justified > li > a { + text-align: center; + margin-bottom: 5px; +} +.nav-tabs.nav-justified > .dropdown .dropdown-menu { + top: auto; + left: auto; +} +@media (min-width: 768px) { + .nav-tabs.nav-justified > li { + display: table-cell; + width: 1%; + } + .nav-tabs.nav-justified > li > a { + margin-bottom: 0; + } +} +.nav-tabs.nav-justified > li > a { + margin-right: 0; + border-radius: 4px; +} +.nav-tabs.nav-justified > .active > a, +.nav-tabs.nav-justified > .active > a:hover, +.nav-tabs.nav-justified > .active > a:focus { + border: 1px solid #dfd7ca; +} +@media (min-width: 768px) { + .nav-tabs.nav-justified > li > a { + border-bottom: 1px solid #dfd7ca; + border-radius: 4px 4px 0 0; + } + .nav-tabs.nav-justified > .active > a, + .nav-tabs.nav-justified > .active > a:hover, + .nav-tabs.nav-justified > .active > a:focus { + border-bottom-color: #ffffff; + } +} +.nav-pills > li { + float: left; +} +.nav-pills > li > a { + border-radius: 4px; +} +.nav-pills > li + li { + margin-left: 2px; +} +.nav-pills > li.active > a, +.nav-pills > li.active > a:hover, +.nav-pills > li.active > a:focus { + color: #98978b; + background-color: #f8f5f0; +} +.nav-stacked > li { + float: none; +} +.nav-stacked > li + li { + margin-top: 2px; + margin-left: 0; +} +.nav-justified { + width: 100%; +} +.nav-justified > li { + float: none; +} +.nav-justified > li > a { + text-align: center; + margin-bottom: 5px; +} +.nav-justified > .dropdown .dropdown-menu { + top: auto; + left: auto; +} +@media (min-width: 768px) { + .nav-justified > li { + display: table-cell; + width: 1%; + } + .nav-justified > li > a { + margin-bottom: 0; + } +} +.nav-tabs-justified { + border-bottom: 0; +} +.nav-tabs-justified > li > a { + margin-right: 0; + border-radius: 4px; +} +.nav-tabs-justified > .active > a, +.nav-tabs-justified > .active > a:hover, +.nav-tabs-justified > .active > a:focus { + border: 1px solid #dfd7ca; +} +@media (min-width: 768px) { + .nav-tabs-justified > li > a { + border-bottom: 1px solid #dfd7ca; + border-radius: 4px 4px 0 0; + } + .nav-tabs-justified > .active > a, + .nav-tabs-justified > .active > a:hover, + .nav-tabs-justified > .active > a:focus { + border-bottom-color: #ffffff; + } +} +.tab-content > .tab-pane { + display: none; +} +.tab-content > .active { + display: block; +} +.nav-tabs .dropdown-menu { + margin-top: -1px; + border-top-right-radius: 0; + border-top-left-radius: 0; +} +.navbar { + position: relative; + min-height: 60px; + margin-bottom: 20px; + border: 1px solid transparent; +} +@media (min-width: 768px) { + .navbar { + border-radius: 4px; + } +} +@media (min-width: 768px) { + .navbar-header { + float: left; + } +} +.navbar-collapse { + overflow-x: visible; + padding-right: 15px; + padding-left: 15px; + border-top: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1); + -webkit-overflow-scrolling: touch; +} +.navbar-collapse.in { + overflow-y: auto; +} +@media (min-width: 768px) { + .navbar-collapse { + width: auto; + border-top: 0; + -webkit-box-shadow: none; + box-shadow: none; + } + .navbar-collapse.collapse { + display: block !important; + height: auto !important; + padding-bottom: 0; + overflow: visible !important; + } + .navbar-collapse.in { + overflow-y: visible; + } + .navbar-fixed-top .navbar-collapse, + .navbar-static-top .navbar-collapse, + .navbar-fixed-bottom .navbar-collapse { + padding-left: 0; + padding-right: 0; + } +} +.navbar-fixed-top .navbar-collapse, +.navbar-fixed-bottom .navbar-collapse { + max-height: 340px; +} +@media (max-device-width: 480px) and (orientation: landscape) { + .navbar-fixed-top .navbar-collapse, + .navbar-fixed-bottom .navbar-collapse { + max-height: 200px; + } +} +.container > .navbar-header, +.container-fluid > .navbar-header, +.container > .navbar-collapse, +.container-fluid > .navbar-collapse { + margin-right: -15px; + margin-left: -15px; +} +@media (min-width: 768px) { + .container > .navbar-header, + .container-fluid > .navbar-header, + .container > .navbar-collapse, + .container-fluid > .navbar-collapse { + margin-right: 0; + margin-left: 0; + } +} +.navbar-static-top { + z-index: 1000; + border-width: 0 0 1px; +} +@media (min-width: 768px) { + .navbar-static-top { + border-radius: 0; + } +} +.navbar-fixed-top, +.navbar-fixed-bottom { + position: fixed; + right: 0; + left: 0; + z-index: 1030; +} +@media (min-width: 768px) { + .navbar-fixed-top, + .navbar-fixed-bottom { + border-radius: 0; + } +} +.navbar-fixed-top { + top: 0; + border-width: 0 0 1px; +} +.navbar-fixed-bottom { + bottom: 0; + margin-bottom: 0; + border-width: 1px 0 0; +} +.navbar-brand { + float: left; + padding: 20px 15px; + font-size: 18px; + line-height: 20px; + height: 60px; +} +.navbar-brand:hover, +.navbar-brand:focus { + text-decoration: none; +} +.navbar-brand > img { + display: block; +} +@media (min-width: 768px) { + .navbar > .container .navbar-brand, + .navbar > .container-fluid .navbar-brand { + margin-left: -15px; + } +} +.navbar-toggle { + position: relative; + float: right; + margin-right: 15px; + padding: 9px 10px; + margin-top: 13px; + margin-bottom: 13px; + background-color: transparent; + background-image: none; + border: 1px solid transparent; + border-radius: 4px; +} +.navbar-toggle:focus { + outline: 0; +} +.navbar-toggle .icon-bar { + display: block; + width: 22px; + height: 2px; + border-radius: 1px; +} +.navbar-toggle .icon-bar + .icon-bar { + margin-top: 4px; +} +@media (min-width: 768px) { + .navbar-toggle { + display: none; + } +} +.navbar-nav { + margin: 10px -15px; +} +.navbar-nav > li > a { + padding-top: 10px; + padding-bottom: 10px; + line-height: 20px; +} +@media (max-width: 767px) { + .navbar-nav .open .dropdown-menu { + position: static; + float: none; + width: auto; + margin-top: 0; + background-color: transparent; + border: 0; + -webkit-box-shadow: none; + box-shadow: none; + } + .navbar-nav .open .dropdown-menu > li > a, + .navbar-nav .open .dropdown-menu .dropdown-header { + padding: 5px 15px 5px 25px; + } + .navbar-nav .open .dropdown-menu > li > a { + line-height: 20px; + } + .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-nav .open .dropdown-menu > li > a:focus { + background-image: none; + } +} +@media (min-width: 768px) { + .navbar-nav { + float: left; + margin: 0; + } + .navbar-nav > li { + float: left; + } + .navbar-nav > li > a { + padding-top: 20px; + padding-bottom: 20px; + } +} +.navbar-form { + margin-left: -15px; + margin-right: -15px; + padding: 10px 15px; + border-top: 1px solid transparent; + border-bottom: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + margin-top: 7px; + margin-bottom: 7px; +} +@media (min-width: 768px) { + .navbar-form .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + .navbar-form .form-control-static { + display: inline-block; + } + .navbar-form .input-group { + display: inline-table; + vertical-align: middle; + } + .navbar-form .input-group .input-group-addon, + .navbar-form .input-group .input-group-btn, + .navbar-form .input-group .form-control { + width: auto; + } + .navbar-form .input-group > .form-control { + width: 100%; + } + .navbar-form .control-label { + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .radio, + .navbar-form .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .radio label, + .navbar-form .checkbox label { + padding-left: 0; + } + .navbar-form .radio input[type="radio"], + .navbar-form .checkbox input[type="checkbox"] { + position: relative; + margin-left: 0; + } + .navbar-form .has-feedback .form-control-feedback { + top: 0; + } +} +@media (max-width: 767px) { + .navbar-form .form-group { + margin-bottom: 5px; + } + .navbar-form .form-group:last-child { + margin-bottom: 0; + } +} +@media (min-width: 768px) { + .navbar-form { + width: auto; + border: 0; + margin-left: 0; + margin-right: 0; + padding-top: 0; + padding-bottom: 0; + -webkit-box-shadow: none; + box-shadow: none; + } +} +.navbar-nav > li > .dropdown-menu { + margin-top: 0; + border-top-right-radius: 0; + border-top-left-radius: 0; +} +.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { + margin-bottom: 0; + border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.navbar-btn { + margin-top: 7px; + margin-bottom: 7px; +} +.navbar-btn.btn-sm { + margin-top: 15px; + margin-bottom: 15px; +} +.navbar-btn.btn-xs { + margin-top: 19px; + margin-bottom: 19px; +} +.navbar-text { + margin-top: 20px; + margin-bottom: 20px; +} +@media (min-width: 768px) { + .navbar-text { + float: left; + margin-left: 15px; + margin-right: 15px; + } +} +@media (min-width: 768px) { + .navbar-left { + float: left !important; + } + .navbar-right { + float: right !important; + margin-right: -15px; + } + .navbar-right ~ .navbar-right { + margin-right: 0; + } +} +.navbar-default { + background-color: #3e3f3a; + border-color: #3e3f3a; +} +.navbar-default .navbar-brand { + color: #ffffff; +} +.navbar-default .navbar-brand:hover, +.navbar-default .navbar-brand:focus { + color: #ffffff; + background-color: transparent; +} +.navbar-default .navbar-text { + color: #8e8c84; +} +.navbar-default .navbar-nav > li > a { + color: #98978b; +} +.navbar-default .navbar-nav > li > a:hover, +.navbar-default .navbar-nav > li > a:focus { + color: #ffffff; + background-color: transparent; +} +.navbar-default .navbar-nav > .active > a, +.navbar-default .navbar-nav > .active > a:hover, +.navbar-default .navbar-nav > .active > a:focus { + color: #ffffff; + background-color: #393a35; +} +.navbar-default .navbar-nav > .disabled > a, +.navbar-default .navbar-nav > .disabled > a:hover, +.navbar-default .navbar-nav > .disabled > a:focus { + color: #cccccc; + background-color: transparent; +} +.navbar-default .navbar-toggle { + border-color: transparent; +} +.navbar-default .navbar-toggle:hover, +.navbar-default .navbar-toggle:focus { + background-color: #393a35; +} +.navbar-default .navbar-toggle .icon-bar { + background-color: #98978b; +} +.navbar-default .navbar-collapse, +.navbar-default .navbar-form { + border-color: #3e3f3a; +} +.navbar-default .navbar-nav > .open > a, +.navbar-default .navbar-nav > .open > a:hover, +.navbar-default .navbar-nav > .open > a:focus { + background-color: #393a35; + color: #ffffff; +} +@media (max-width: 767px) { + .navbar-default .navbar-nav .open .dropdown-menu > li > a { + color: #98978b; + } + .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { + color: #ffffff; + background-color: transparent; + } + .navbar-default .navbar-nav .open .dropdown-menu > .active > a, + .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #ffffff; + background-color: #393a35; + } + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #cccccc; + background-color: transparent; + } +} +.navbar-default .navbar-link { + color: #98978b; +} +.navbar-default .navbar-link:hover { + color: #ffffff; +} +.navbar-default .btn-link { + color: #98978b; +} +.navbar-default .btn-link:hover, +.navbar-default .btn-link:focus { + color: #ffffff; +} +.navbar-default .btn-link[disabled]:hover, +fieldset[disabled] .navbar-default .btn-link:hover, +.navbar-default .btn-link[disabled]:focus, +fieldset[disabled] .navbar-default .btn-link:focus { + color: #cccccc; +} +.navbar-inverse { + background-color: #93c54b; + border-color: #93c54b; +} +.navbar-inverse .navbar-brand { + color: #ffffff; +} +.navbar-inverse .navbar-brand:hover, +.navbar-inverse .navbar-brand:focus { + color: #ffffff; + background-color: transparent; +} +.navbar-inverse .navbar-text { + color: #dfd7ca; +} +.navbar-inverse .navbar-nav > li > a { + color: #6b9430; +} +.navbar-inverse .navbar-nav > li > a:hover, +.navbar-inverse .navbar-nav > li > a:focus { + color: #ffffff; + background-color: transparent; +} +.navbar-inverse .navbar-nav > .active > a, +.navbar-inverse .navbar-nav > .active > a:hover, +.navbar-inverse .navbar-nav > .active > a:focus { + color: #ffffff; + background-color: #89be3d; +} +.navbar-inverse .navbar-nav > .disabled > a, +.navbar-inverse .navbar-nav > .disabled > a:hover, +.navbar-inverse .navbar-nav > .disabled > a:focus { + color: #444444; + background-color: transparent; +} +.navbar-inverse .navbar-toggle { + border-color: transparent; +} +.navbar-inverse .navbar-toggle:hover, +.navbar-inverse .navbar-toggle:focus { + background-color: #89be3d; +} +.navbar-inverse .navbar-toggle .icon-bar { + background-color: #6b9430; +} +.navbar-inverse .navbar-collapse, +.navbar-inverse .navbar-form { + border-color: #81b33a; +} +.navbar-inverse .navbar-nav > .open > a, +.navbar-inverse .navbar-nav > .open > a:hover, +.navbar-inverse .navbar-nav > .open > a:focus { + background-color: #89be3d; + color: #ffffff; +} +@media (max-width: 767px) { + .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { + border-color: #93c54b; + } + .navbar-inverse .navbar-nav .open .dropdown-menu .divider { + background-color: #93c54b; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { + color: #6b9430; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { + color: #ffffff; + background-color: transparent; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #ffffff; + background-color: #89be3d; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #444444; + background-color: transparent; + } +} +.navbar-inverse .navbar-link { + color: #6b9430; +} +.navbar-inverse .navbar-link:hover { + color: #ffffff; +} +.navbar-inverse .btn-link { + color: #6b9430; +} +.navbar-inverse .btn-link:hover, +.navbar-inverse .btn-link:focus { + color: #ffffff; +} +.navbar-inverse .btn-link[disabled]:hover, +fieldset[disabled] .navbar-inverse .btn-link:hover, +.navbar-inverse .btn-link[disabled]:focus, +fieldset[disabled] .navbar-inverse .btn-link:focus { + color: #444444; +} +.breadcrumb { + padding: 8px 15px; + margin-bottom: 20px; + list-style: none; + background-color: #f8f5f0; + border-radius: 4px; +} +.breadcrumb > li { + display: inline-block; +} +.breadcrumb > li + li:before { + content: "/\00a0"; + padding: 0 5px; + color: #dfd7ca; +} +.breadcrumb > .active { + color: #98978b; +} +.pagination { + display: inline-block; + padding-left: 0; + margin: 20px 0; + border-radius: 4px; +} +.pagination > li { + display: inline; +} +.pagination > li > a, +.pagination > li > span { + position: relative; + float: left; + padding: 12px 16px; + line-height: 1.42857143; + text-decoration: none; + color: #98978b; + background-color: #f8f5f0; + border: 1px solid #dfd7ca; + margin-left: -1px; +} +.pagination > li:first-child > a, +.pagination > li:first-child > span { + margin-left: 0; + border-bottom-left-radius: 4px; + border-top-left-radius: 4px; +} +.pagination > li:last-child > a, +.pagination > li:last-child > span { + border-bottom-right-radius: 4px; + border-top-right-radius: 4px; +} +.pagination > li > a:hover, +.pagination > li > span:hover, +.pagination > li > a:focus, +.pagination > li > span:focus { + z-index: 2; + color: #8e8c84; + background-color: #dfd7ca; + border-color: #dfd7ca; +} +.pagination > .active > a, +.pagination > .active > span, +.pagination > .active > a:hover, +.pagination > .active > span:hover, +.pagination > .active > a:focus, +.pagination > .active > span:focus { + z-index: 3; + color: #8e8c84; + background-color: #dfd7ca; + border-color: #dfd7ca; + cursor: default; +} +.pagination > .disabled > span, +.pagination > .disabled > span:hover, +.pagination > .disabled > span:focus, +.pagination > .disabled > a, +.pagination > .disabled > a:hover, +.pagination > .disabled > a:focus { + color: #dfd7ca; + background-color: #f8f5f0; + border-color: #dfd7ca; + cursor: not-allowed; +} +.pagination-lg > li > a, +.pagination-lg > li > span { + padding: 20px 30px; + font-size: 18px; + line-height: 1.3333333; +} +.pagination-lg > li:first-child > a, +.pagination-lg > li:first-child > span { + border-bottom-left-radius: 6px; + border-top-left-radius: 6px; +} +.pagination-lg > li:last-child > a, +.pagination-lg > li:last-child > span { + border-bottom-right-radius: 6px; + border-top-right-radius: 6px; +} +.pagination-sm > li > a, +.pagination-sm > li > span { + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; +} +.pagination-sm > li:first-child > a, +.pagination-sm > li:first-child > span { + border-bottom-left-radius: 3px; + border-top-left-radius: 3px; +} +.pagination-sm > li:last-child > a, +.pagination-sm > li:last-child > span { + border-bottom-right-radius: 3px; + border-top-right-radius: 3px; +} +.pager { + padding-left: 0; + margin: 20px 0; + list-style: none; + text-align: center; +} +.pager li { + display: inline; +} +.pager li > a, +.pager li > span { + display: inline-block; + padding: 5px 14px; + background-color: #f8f5f0; + border: 1px solid #dfd7ca; + border-radius: 15px; +} +.pager li > a:hover, +.pager li > a:focus { + text-decoration: none; + background-color: #dfd7ca; +} +.pager .next > a, +.pager .next > span { + float: right; +} +.pager .previous > a, +.pager .previous > span { + float: left; +} +.pager .disabled > a, +.pager .disabled > a:hover, +.pager .disabled > a:focus, +.pager .disabled > span { + color: #dfd7ca; + background-color: #f8f5f0; + cursor: not-allowed; +} +.label { + display: inline; + padding: .2em .6em .3em; + font-size: 75%; + font-weight: bold; + line-height: 1; + color: #ffffff; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: .25em; +} +a.label:hover, +a.label:focus { + color: #ffffff; + text-decoration: none; + cursor: pointer; +} +.label:empty { + display: none; +} +.btn .label { + position: relative; + top: -1px; +} +.label-default { + background-color: #3e3f3a; +} +.label-default[href]:hover, +.label-default[href]:focus { + background-color: #242422; +} +.label-primary { + background-color: #325d88; +} +.label-primary[href]:hover, +.label-primary[href]:focus { + background-color: #244363; +} +.label-success { + background-color: #93c54b; +} +.label-success[href]:hover, +.label-success[href]:focus { + background-color: #79a736; +} +.label-info { + background-color: #29abe0; +} +.label-info[href]:hover, +.label-info[href]:focus { + background-color: #1b8dbb; +} +.label-warning { + background-color: #f47c3c; +} +.label-warning[href]:hover, +.label-warning[href]:focus { + background-color: #ef5c0e; +} +.label-danger { + background-color: #d9534f; +} +.label-danger[href]:hover, +.label-danger[href]:focus { + background-color: #c9302c; +} +.badge { + display: inline-block; + min-width: 10px; + padding: 3px 7px; + font-size: 12px; + font-weight: normal; + color: #ffffff; + line-height: 1; + vertical-align: middle; + white-space: nowrap; + text-align: center; + background-color: #93c54b; + border-radius: 10px; +} +.badge:empty { + display: none; +} +.btn .badge { + position: relative; + top: -1px; +} +.btn-xs .badge, +.btn-group-xs > .btn .badge { + top: 0; + padding: 1px 5px; +} +a.badge:hover, +a.badge:focus { + color: #ffffff; + text-decoration: none; + cursor: pointer; +} +.list-group-item.active > .badge, +.nav-pills > .active > a > .badge { + color: #ffffff; + background-color: #93c54b; +} +.list-group-item > .badge { + float: right; +} +.list-group-item > .badge + .badge { + margin-right: 5px; +} +.nav-pills > li > a > .badge { + margin-left: 3px; +} +.jumbotron { + padding-top: 30px; + padding-bottom: 30px; + margin-bottom: 30px; + color: inherit; + background-color: #f8f5f0; +} +.jumbotron h1, +.jumbotron .h1 { + color: inherit; +} +.jumbotron p { + margin-bottom: 15px; + font-size: 21px; + font-weight: 200; +} +.jumbotron > hr { + border-top-color: #e8decd; +} +.container .jumbotron, +.container-fluid .jumbotron { + border-radius: 6px; + padding-left: 15px; + padding-right: 15px; +} +.jumbotron .container { + max-width: 100%; +} +@media screen and (min-width: 768px) { + .jumbotron { + padding-top: 48px; + padding-bottom: 48px; + } + .container .jumbotron, + .container-fluid .jumbotron { + padding-left: 60px; + padding-right: 60px; + } + .jumbotron h1, + .jumbotron .h1 { + font-size: 63px; + } +} +.thumbnail { + display: block; + padding: 4px; + margin-bottom: 20px; + line-height: 1.42857143; + background-color: #f8f5f0; + border: 1px solid #dfd7ca; + border-radius: 4px; + -webkit-transition: border 0.2s ease-in-out; + -o-transition: border 0.2s ease-in-out; + transition: border 0.2s ease-in-out; +} +.thumbnail > img, +.thumbnail a > img { + margin-left: auto; + margin-right: auto; +} +a.thumbnail:hover, +a.thumbnail:focus, +a.thumbnail.active { + border-color: #93c54b; +} +.thumbnail .caption { + padding: 9px; + color: #3e3f3a; +} +.alert { + padding: 15px; + margin-bottom: 20px; + border: 1px solid transparent; + border-radius: 4px; +} +.alert h4 { + margin-top: 0; + color: inherit; +} +.alert .alert-link { + font-weight: bold; +} +.alert > p, +.alert > ul { + margin-bottom: 0; +} +.alert > p + p { + margin-top: 5px; +} +.alert-dismissable, +.alert-dismissible { + padding-right: 35px; +} +.alert-dismissable .close, +.alert-dismissible .close { + position: relative; + top: -2px; + right: -21px; + color: inherit; +} +.alert-success { + background-color: #93c54b; + border-color: transparent; + color: #ffffff; +} +.alert-success hr { + border-top-color: rgba(0, 0, 0, 0); +} +.alert-success .alert-link { + color: #e6e6e6; +} +.alert-info { + background-color: #29abe0; + border-color: transparent; + color: #ffffff; +} +.alert-info hr { + border-top-color: rgba(0, 0, 0, 0); +} +.alert-info .alert-link { + color: #e6e6e6; +} +.alert-warning { + background-color: #f47c3c; + border-color: transparent; + color: #ffffff; +} +.alert-warning hr { + border-top-color: rgba(0, 0, 0, 0); +} +.alert-warning .alert-link { + color: #e6e6e6; +} +.alert-danger { + background-color: #d9534f; + border-color: transparent; + color: #ffffff; +} +.alert-danger hr { + border-top-color: rgba(0, 0, 0, 0); +} +.alert-danger .alert-link { + color: #e6e6e6; +} +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@-o-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +.progress { + overflow: hidden; + height: 20px; + margin-bottom: 20px; + background-color: #f5f5f5; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); +} +.progress-bar { + float: left; + width: 0%; + height: 100%; + font-size: 12px; + line-height: 20px; + color: #ffffff; + text-align: center; + background-color: #325d88; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -webkit-transition: width 0.6s ease; + -o-transition: width 0.6s ease; + transition: width 0.6s ease; +} +.progress-striped .progress-bar, +.progress-bar-striped { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + -webkit-background-size: 40px 40px; + background-size: 40px 40px; +} +.progress.active .progress-bar, +.progress-bar.active { + -webkit-animation: progress-bar-stripes 2s linear infinite; + -o-animation: progress-bar-stripes 2s linear infinite; + animation: progress-bar-stripes 2s linear infinite; +} +.progress-bar-success { + background-color: #93c54b; +} +.progress-striped .progress-bar-success { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.progress-bar-info { + background-color: #29abe0; +} +.progress-striped .progress-bar-info { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.progress-bar-warning { + background-color: #f47c3c; +} +.progress-striped .progress-bar-warning { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.progress-bar-danger { + background-color: #d9534f; +} +.progress-striped .progress-bar-danger { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.media { + margin-top: 15px; +} +.media:first-child { + margin-top: 0; +} +.media, +.media-body { + zoom: 1; + overflow: hidden; +} +.media-body { + width: 10000px; +} +.media-object { + display: block; +} +.media-object.img-thumbnail { + max-width: none; +} +.media-right, +.media > .pull-right { + padding-left: 10px; +} +.media-left, +.media > .pull-left { + padding-right: 10px; +} +.media-left, +.media-right, +.media-body { + display: table-cell; + vertical-align: top; +} +.media-middle { + vertical-align: middle; +} +.media-bottom { + vertical-align: bottom; +} +.media-heading { + margin-top: 0; + margin-bottom: 5px; +} +.media-list { + padding-left: 0; + list-style: none; +} +.list-group { + margin-bottom: 20px; + padding-left: 0; +} +.list-group-item { + position: relative; + display: block; + padding: 10px 15px; + margin-bottom: -1px; + background-color: #ffffff; + border: 1px solid #dfd7ca; +} +.list-group-item:first-child { + border-top-right-radius: 4px; + border-top-left-radius: 4px; +} +.list-group-item:last-child { + margin-bottom: 0; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} +a.list-group-item, +button.list-group-item { + color: #3e3f3a; +} +a.list-group-item .list-group-item-heading, +button.list-group-item .list-group-item-heading { + color: inherit; +} +a.list-group-item:hover, +button.list-group-item:hover, +a.list-group-item:focus, +button.list-group-item:focus { + text-decoration: none; + color: #3e3f3a; + background-color: #f8f5f0; +} +button.list-group-item { + width: 100%; + text-align: left; +} +.list-group-item.disabled, +.list-group-item.disabled:hover, +.list-group-item.disabled:focus { + background-color: #f8f5f0; + color: #dfd7ca; + cursor: not-allowed; +} +.list-group-item.disabled .list-group-item-heading, +.list-group-item.disabled:hover .list-group-item-heading, +.list-group-item.disabled:focus .list-group-item-heading { + color: inherit; +} +.list-group-item.disabled .list-group-item-text, +.list-group-item.disabled:hover .list-group-item-text, +.list-group-item.disabled:focus .list-group-item-text { + color: #dfd7ca; +} +.list-group-item.active, +.list-group-item.active:hover, +.list-group-item.active:focus { + z-index: 2; + color: #3e3f3a; + background-color: #f8f5f0; + border-color: #dfd7ca; +} +.list-group-item.active .list-group-item-heading, +.list-group-item.active:hover .list-group-item-heading, +.list-group-item.active:focus .list-group-item-heading, +.list-group-item.active .list-group-item-heading > small, +.list-group-item.active:hover .list-group-item-heading > small, +.list-group-item.active:focus .list-group-item-heading > small, +.list-group-item.active .list-group-item-heading > .small, +.list-group-item.active:hover .list-group-item-heading > .small, +.list-group-item.active:focus .list-group-item-heading > .small { + color: inherit; +} +.list-group-item.active .list-group-item-text, +.list-group-item.active:hover .list-group-item-text, +.list-group-item.active:focus .list-group-item-text { + color: #3e3f3a; +} +.list-group-item-success { + color: #93c54b; + background-color: #dff0d8; +} +a.list-group-item-success, +button.list-group-item-success { + color: #93c54b; +} +a.list-group-item-success .list-group-item-heading, +button.list-group-item-success .list-group-item-heading { + color: inherit; +} +a.list-group-item-success:hover, +button.list-group-item-success:hover, +a.list-group-item-success:focus, +button.list-group-item-success:focus { + color: #93c54b; + background-color: #d0e9c6; +} +a.list-group-item-success.active, +button.list-group-item-success.active, +a.list-group-item-success.active:hover, +button.list-group-item-success.active:hover, +a.list-group-item-success.active:focus, +button.list-group-item-success.active:focus { + color: #fff; + background-color: #93c54b; + border-color: #93c54b; +} +.list-group-item-info { + color: #29abe0; + background-color: #d9edf7; +} +a.list-group-item-info, +button.list-group-item-info { + color: #29abe0; +} +a.list-group-item-info .list-group-item-heading, +button.list-group-item-info .list-group-item-heading { + color: inherit; +} +a.list-group-item-info:hover, +button.list-group-item-info:hover, +a.list-group-item-info:focus, +button.list-group-item-info:focus { + color: #29abe0; + background-color: #c4e3f3; +} +a.list-group-item-info.active, +button.list-group-item-info.active, +a.list-group-item-info.active:hover, +button.list-group-item-info.active:hover, +a.list-group-item-info.active:focus, +button.list-group-item-info.active:focus { + color: #fff; + background-color: #29abe0; + border-color: #29abe0; +} +.list-group-item-warning { + color: #f47c3c; + background-color: #fcf8e3; +} +a.list-group-item-warning, +button.list-group-item-warning { + color: #f47c3c; +} +a.list-group-item-warning .list-group-item-heading, +button.list-group-item-warning .list-group-item-heading { + color: inherit; +} +a.list-group-item-warning:hover, +button.list-group-item-warning:hover, +a.list-group-item-warning:focus, +button.list-group-item-warning:focus { + color: #f47c3c; + background-color: #faf2cc; +} +a.list-group-item-warning.active, +button.list-group-item-warning.active, +a.list-group-item-warning.active:hover, +button.list-group-item-warning.active:hover, +a.list-group-item-warning.active:focus, +button.list-group-item-warning.active:focus { + color: #fff; + background-color: #f47c3c; + border-color: #f47c3c; +} +.list-group-item-danger { + color: #d9534f; + background-color: #f2dede; +} +a.list-group-item-danger, +button.list-group-item-danger { + color: #d9534f; +} +a.list-group-item-danger .list-group-item-heading, +button.list-group-item-danger .list-group-item-heading { + color: inherit; +} +a.list-group-item-danger:hover, +button.list-group-item-danger:hover, +a.list-group-item-danger:focus, +button.list-group-item-danger:focus { + color: #d9534f; + background-color: #ebcccc; +} +a.list-group-item-danger.active, +button.list-group-item-danger.active, +a.list-group-item-danger.active:hover, +button.list-group-item-danger.active:hover, +a.list-group-item-danger.active:focus, +button.list-group-item-danger.active:focus { + color: #fff; + background-color: #d9534f; + border-color: #d9534f; +} +.list-group-item-heading { + margin-top: 0; + margin-bottom: 5px; +} +.list-group-item-text { + margin-bottom: 0; + line-height: 1.3; +} +.panel { + margin-bottom: 20px; + background-color: #ffffff; + border: 1px solid transparent; + border-radius: 4px; + -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); +} +.panel-body { + padding: 15px; +} +.panel-heading { + padding: 10px 15px; + border-bottom: 1px solid transparent; + border-top-right-radius: 3px; + border-top-left-radius: 3px; +} +.panel-heading > .dropdown .dropdown-toggle { + color: inherit; +} +.panel-title { + margin-top: 0; + margin-bottom: 0; + font-size: 16px; + color: inherit; +} +.panel-title > a, +.panel-title > small, +.panel-title > .small, +.panel-title > small > a, +.panel-title > .small > a { + color: inherit; +} +.panel-footer { + padding: 10px 15px; + background-color: #f8f5f0; + border-top: 1px solid #dfd7ca; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .list-group, +.panel > .panel-collapse > .list-group { + margin-bottom: 0; +} +.panel > .list-group .list-group-item, +.panel > .panel-collapse > .list-group .list-group-item { + border-width: 1px 0; + border-radius: 0; +} +.panel > .list-group:first-child .list-group-item:first-child, +.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child { + border-top: 0; + border-top-right-radius: 3px; + border-top-left-radius: 3px; +} +.panel > .list-group:last-child .list-group-item:last-child, +.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child { + border-bottom: 0; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child { + border-top-right-radius: 0; + border-top-left-radius: 0; +} +.panel-heading + .list-group .list-group-item:first-child { + border-top-width: 0; +} +.list-group + .panel-footer { + border-top-width: 0; +} +.panel > .table, +.panel > .table-responsive > .table, +.panel > .panel-collapse > .table { + margin-bottom: 0; +} +.panel > .table caption, +.panel > .table-responsive > .table caption, +.panel > .panel-collapse > .table caption { + padding-left: 15px; + padding-right: 15px; +} +.panel > .table:first-child, +.panel > .table-responsive:first-child > .table:first-child { + border-top-right-radius: 3px; + border-top-left-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child { + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child td:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child, +.panel > .table:first-child > thead:first-child > tr:first-child th:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child { + border-top-left-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child td:last-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child, +.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child, +.panel > .table:first-child > thead:first-child > tr:first-child th:last-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child, +.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child { + border-top-right-radius: 3px; +} +.panel > .table:last-child, +.panel > .table-responsive:last-child > .table:last-child { + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child { + border-bottom-left-radius: 3px; + border-bottom-right-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child { + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child { + border-bottom-right-radius: 3px; +} +.panel > .panel-body + .table, +.panel > .panel-body + .table-responsive, +.panel > .table + .panel-body, +.panel > .table-responsive + .panel-body { + border-top: 1px solid #dfd7ca; +} +.panel > .table > tbody:first-child > tr:first-child th, +.panel > .table > tbody:first-child > tr:first-child td { + border-top: 0; +} +.panel > .table-bordered, +.panel > .table-responsive > .table-bordered { + border: 0; +} +.panel > .table-bordered > thead > tr > th:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:first-child, +.panel > .table-bordered > tbody > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, +.panel > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-bordered > thead > tr > td:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:first-child, +.panel > .table-bordered > tbody > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, +.panel > .table-bordered > tfoot > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; +} +.panel > .table-bordered > thead > tr > th:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:last-child, +.panel > .table-bordered > tbody > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, +.panel > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-bordered > thead > tr > td:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:last-child, +.panel > .table-bordered > tbody > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, +.panel > .table-bordered > tfoot > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; +} +.panel > .table-bordered > thead > tr:first-child > td, +.panel > .table-responsive > .table-bordered > thead > tr:first-child > td, +.panel > .table-bordered > tbody > tr:first-child > td, +.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td, +.panel > .table-bordered > thead > tr:first-child > th, +.panel > .table-responsive > .table-bordered > thead > tr:first-child > th, +.panel > .table-bordered > tbody > tr:first-child > th, +.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th { + border-bottom: 0; +} +.panel > .table-bordered > tbody > tr:last-child > td, +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, +.panel > .table-bordered > tfoot > tr:last-child > td, +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td, +.panel > .table-bordered > tbody > tr:last-child > th, +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, +.panel > .table-bordered > tfoot > tr:last-child > th, +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th { + border-bottom: 0; +} +.panel > .table-responsive { + border: 0; + margin-bottom: 0; +} +.panel-group { + margin-bottom: 20px; +} +.panel-group .panel { + margin-bottom: 0; + border-radius: 4px; +} +.panel-group .panel + .panel { + margin-top: 5px; +} +.panel-group .panel-heading { + border-bottom: 0; +} +.panel-group .panel-heading + .panel-collapse > .panel-body, +.panel-group .panel-heading + .panel-collapse > .list-group { + border-top: 1px solid #dfd7ca; +} +.panel-group .panel-footer { + border-top: 0; +} +.panel-group .panel-footer + .panel-collapse .panel-body { + border-bottom: 1px solid #dfd7ca; +} +.panel-default { + border-color: #dfd7ca; +} +.panel-default > .panel-heading { + color: #3e3f3a; + background-color: #f8f5f0; + border-color: #dfd7ca; +} +.panel-default > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #dfd7ca; +} +.panel-default > .panel-heading .badge { + color: #f8f5f0; + background-color: #3e3f3a; +} +.panel-default > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #dfd7ca; +} +.panel-primary { + border-color: #325d88; +} +.panel-primary > .panel-heading { + color: #ffffff; + background-color: #325d88; + border-color: #325d88; +} +.panel-primary > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #325d88; +} +.panel-primary > .panel-heading .badge { + color: #325d88; + background-color: #ffffff; +} +.panel-primary > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #325d88; +} +.panel-success { + border-color: #d6e9c6; +} +.panel-success > .panel-heading { + color: #93c54b; + background-color: #93c54b; + border-color: #d6e9c6; +} +.panel-success > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #d6e9c6; +} +.panel-success > .panel-heading .badge { + color: #93c54b; + background-color: #93c54b; +} +.panel-success > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #d6e9c6; +} +.panel-info { + border-color: #bce8f1; +} +.panel-info > .panel-heading { + color: #29abe0; + background-color: #29abe0; + border-color: #bce8f1; +} +.panel-info > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #bce8f1; +} +.panel-info > .panel-heading .badge { + color: #29abe0; + background-color: #29abe0; +} +.panel-info > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #bce8f1; +} +.panel-warning { + border-color: #faebcc; +} +.panel-warning > .panel-heading { + color: #f47c3c; + background-color: #f47c3c; + border-color: #faebcc; +} +.panel-warning > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #faebcc; +} +.panel-warning > .panel-heading .badge { + color: #f47c3c; + background-color: #f47c3c; +} +.panel-warning > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #faebcc; +} +.panel-danger { + border-color: #ebccd1; +} +.panel-danger > .panel-heading { + color: #d9534f; + background-color: #d9534f; + border-color: #ebccd1; +} +.panel-danger > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #ebccd1; +} +.panel-danger > .panel-heading .badge { + color: #d9534f; + background-color: #d9534f; +} +.panel-danger > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #ebccd1; +} +.embed-responsive { + position: relative; + display: block; + height: 0; + padding: 0; + overflow: hidden; +} +.embed-responsive .embed-responsive-item, +.embed-responsive iframe, +.embed-responsive embed, +.embed-responsive object, +.embed-responsive video { + position: absolute; + top: 0; + left: 0; + bottom: 0; + height: 100%; + width: 100%; + border: 0; +} +.embed-responsive-16by9 { + padding-bottom: 56.25%; +} +.embed-responsive-4by3 { + padding-bottom: 75%; +} +.well { + min-height: 20px; + padding: 19px; + margin-bottom: 20px; + background-color: #f8f5f0; + border: 1px solid transparent; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); +} +.well blockquote { + border-color: #ddd; + border-color: rgba(0, 0, 0, 0.15); +} +.well-lg { + padding: 24px; + border-radius: 6px; +} +.well-sm { + padding: 9px; + border-radius: 3px; +} +.close { + float: right; + font-size: 21px; + font-weight: bold; + line-height: 1; + color: #000000; + text-shadow: 0 0 0 transparent; + opacity: 0.2; + filter: alpha(opacity=20); +} +.close:hover, +.close:focus { + color: #000000; + text-decoration: none; + cursor: pointer; + opacity: 0.5; + filter: alpha(opacity=50); +} +button.close { + padding: 0; + cursor: pointer; + background: transparent; + border: 0; + -webkit-appearance: none; +} +.modal-open { + overflow: hidden; +} +.modal { + display: none; + overflow: hidden; + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1050; + -webkit-overflow-scrolling: touch; + outline: 0; +} +.modal.fade .modal-dialog { + -webkit-transform: translate(0, -25%); + -ms-transform: translate(0, -25%); + -o-transform: translate(0, -25%); + transform: translate(0, -25%); + -webkit-transition: -webkit-transform 0.3s ease-out; + -o-transition: -o-transform 0.3s ease-out; + transition: transform 0.3s ease-out; +} +.modal.in .modal-dialog { + -webkit-transform: translate(0, 0); + -ms-transform: translate(0, 0); + -o-transform: translate(0, 0); + transform: translate(0, 0); +} +.modal-open .modal { + overflow-x: hidden; + overflow-y: auto; +} +.modal-dialog { + position: relative; + width: auto; + margin: 10px; +} +.modal-content { + position: relative; + background-color: #ffffff; + border: 1px solid #f8f5f0; + border-radius: 6px; + -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); + box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); + -webkit-background-clip: padding-box; + background-clip: padding-box; + outline: 0; +} +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + background-color: #000000; +} +.modal-backdrop.fade { + opacity: 0; + filter: alpha(opacity=0); +} +.modal-backdrop.in { + opacity: 0.5; + filter: alpha(opacity=50); +} +.modal-header { + padding: 15px; + border-bottom: 1px solid #f8f5f0; +} +.modal-header .close { + margin-top: -2px; +} +.modal-title { + margin: 0; + line-height: 1.42857143; +} +.modal-body { + position: relative; + padding: 15px; +} +.modal-footer { + padding: 15px; + text-align: right; + border-top: 1px solid #f8f5f0; +} +.modal-footer .btn + .btn { + margin-left: 5px; + margin-bottom: 0; +} +.modal-footer .btn-group .btn + .btn { + margin-left: -1px; +} +.modal-footer .btn-block + .btn-block { + margin-left: 0; +} +.modal-scrollbar-measure { + position: absolute; + top: -9999px; + width: 50px; + height: 50px; + overflow: scroll; +} +@media (min-width: 768px) { + .modal-dialog { + width: 600px; + margin: 30px auto; + } + .modal-content { + -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); + box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); + } + .modal-sm { + width: 300px; + } +} +@media (min-width: 992px) { + .modal-lg { + width: 900px; + } +} +.tooltip { + position: absolute; + z-index: 1070; + display: block; + font-family: "Roboto", "Helvetica Neue", Helvetica, Arial, sans-serif; + font-style: normal; + font-weight: normal; + letter-spacing: normal; + line-break: auto; + line-height: 1.42857143; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + white-space: normal; + word-break: normal; + word-spacing: normal; + word-wrap: normal; + font-size: 12px; + opacity: 0; + filter: alpha(opacity=0); +} +.tooltip.in { + opacity: 1; + filter: alpha(opacity=100); +} +.tooltip.top { + margin-top: -3px; + padding: 5px 0; +} +.tooltip.right { + margin-left: 3px; + padding: 0 5px; +} +.tooltip.bottom { + margin-top: 3px; + padding: 5px 0; +} +.tooltip.left { + margin-left: -3px; + padding: 0 5px; +} +.tooltip-inner { + max-width: 200px; + padding: 3px 8px; + color: #ffffff; + text-align: center; + background-color: #3e3f3a; + border-radius: 4px; +} +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +.tooltip.top .tooltip-arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-width: 5px 5px 0; + border-top-color: #3e3f3a; +} +.tooltip.top-left .tooltip-arrow { + bottom: 0; + right: 5px; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #3e3f3a; +} +.tooltip.top-right .tooltip-arrow { + bottom: 0; + left: 5px; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #3e3f3a; +} +.tooltip.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-width: 5px 5px 5px 0; + border-right-color: #3e3f3a; +} +.tooltip.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-width: 5px 0 5px 5px; + border-left-color: #3e3f3a; +} +.tooltip.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-width: 0 5px 5px; + border-bottom-color: #3e3f3a; +} +.tooltip.bottom-left .tooltip-arrow { + top: 0; + right: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #3e3f3a; +} +.tooltip.bottom-right .tooltip-arrow { + top: 0; + left: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #3e3f3a; +} +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1060; + display: none; + max-width: 276px; + padding: 1px; + font-family: "Roboto", "Helvetica Neue", Helvetica, Arial, sans-serif; + font-style: normal; + font-weight: normal; + letter-spacing: normal; + line-break: auto; + line-height: 1.42857143; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + white-space: normal; + word-break: normal; + word-spacing: normal; + word-wrap: normal; + font-size: 14px; + background-color: #ffffff; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #dfd7ca; + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); +} +.popover.top { + margin-top: -10px; +} +.popover.right { + margin-left: 10px; +} +.popover.bottom { + margin-top: 10px; +} +.popover.left { + margin-left: -10px; +} +.popover-title { + margin: 0; + padding: 8px 14px; + font-size: 14px; + background-color: #f8f5f0; + border-bottom: 1px solid #f0e9df; + border-radius: 5px 5px 0 0; +} +.popover-content { + padding: 9px 14px; +} +.popover > .arrow, +.popover > .arrow:after { + position: absolute; + display: block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +.popover > .arrow { + border-width: 11px; +} +.popover > .arrow:after { + border-width: 10px; + content: ""; +} +.popover.top > .arrow { + left: 50%; + margin-left: -11px; + border-bottom-width: 0; + border-top-color: #b9a78a; + border-top-color: #dfd7ca; + bottom: -11px; +} +.popover.top > .arrow:after { + content: " "; + bottom: 1px; + margin-left: -10px; + border-bottom-width: 0; + border-top-color: #ffffff; +} +.popover.right > .arrow { + top: 50%; + left: -11px; + margin-top: -11px; + border-left-width: 0; + border-right-color: #b9a78a; + border-right-color: #dfd7ca; +} +.popover.right > .arrow:after { + content: " "; + left: 1px; + bottom: -10px; + border-left-width: 0; + border-right-color: #ffffff; +} +.popover.bottom > .arrow { + left: 50%; + margin-left: -11px; + border-top-width: 0; + border-bottom-color: #b9a78a; + border-bottom-color: #dfd7ca; + top: -11px; +} +.popover.bottom > .arrow:after { + content: " "; + top: 1px; + margin-left: -10px; + border-top-width: 0; + border-bottom-color: #ffffff; +} +.popover.left > .arrow { + top: 50%; + right: -11px; + margin-top: -11px; + border-right-width: 0; + border-left-color: #b9a78a; + border-left-color: #dfd7ca; +} +.popover.left > .arrow:after { + content: " "; + right: 1px; + border-right-width: 0; + border-left-color: #ffffff; + bottom: -10px; +} +.carousel { + position: relative; +} +.carousel-inner { + position: relative; + overflow: hidden; + width: 100%; +} +.carousel-inner > .item { + display: none; + position: relative; + -webkit-transition: 0.6s ease-in-out left; + -o-transition: 0.6s ease-in-out left; + transition: 0.6s ease-in-out left; +} +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + line-height: 1; +} +@media all and (transform-3d), (-webkit-transform-3d) { + .carousel-inner > .item { + -webkit-transition: -webkit-transform 0.6s ease-in-out; + -o-transition: -o-transform 0.6s ease-in-out; + transition: transform 0.6s ease-in-out; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + -webkit-perspective: 1000px; + perspective: 1000px; + } + .carousel-inner > .item.next, + .carousel-inner > .item.active.right { + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + left: 0; + } + .carousel-inner > .item.prev, + .carousel-inner > .item.active.left { + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + left: 0; + } + .carousel-inner > .item.next.left, + .carousel-inner > .item.prev.right, + .carousel-inner > .item.active { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + left: 0; + } +} +.carousel-inner > .active, +.carousel-inner > .next, +.carousel-inner > .prev { + display: block; +} +.carousel-inner > .active { + left: 0; +} +.carousel-inner > .next, +.carousel-inner > .prev { + position: absolute; + top: 0; + width: 100%; +} +.carousel-inner > .next { + left: 100%; +} +.carousel-inner > .prev { + left: -100%; +} +.carousel-inner > .next.left, +.carousel-inner > .prev.right { + left: 0; +} +.carousel-inner > .active.left { + left: -100%; +} +.carousel-inner > .active.right { + left: 100%; +} +.carousel-control { + position: absolute; + top: 0; + left: 0; + bottom: 0; + width: 15%; + opacity: 0.5; + filter: alpha(opacity=50); + font-size: 20px; + color: #ffffff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); + background-color: rgba(0, 0, 0, 0); +} +.carousel-control.left { + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); + background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, 0.5)), to(rgba(0, 0, 0, 0.0001))); + background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); +} +.carousel-control.right { + left: auto; + right: 0; + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); + background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, 0.0001)), to(rgba(0, 0, 0, 0.5))); + background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); +} +.carousel-control:hover, +.carousel-control:focus { + outline: 0; + color: #ffffff; + text-decoration: none; + opacity: 0.9; + filter: alpha(opacity=90); +} +.carousel-control .icon-prev, +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-left, +.carousel-control .glyphicon-chevron-right { + position: absolute; + top: 50%; + margin-top: -10px; + z-index: 5; + display: inline-block; +} +.carousel-control .icon-prev, +.carousel-control .glyphicon-chevron-left { + left: 50%; + margin-left: -10px; +} +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-right { + right: 50%; + margin-right: -10px; +} +.carousel-control .icon-prev, +.carousel-control .icon-next { + width: 20px; + height: 20px; + line-height: 1; + font-family: serif; +} +.carousel-control .icon-prev:before { + content: '\2039'; +} +.carousel-control .icon-next:before { + content: '\203a'; +} +.carousel-indicators { + position: absolute; + bottom: 10px; + left: 50%; + z-index: 15; + width: 60%; + margin-left: -30%; + padding-left: 0; + list-style: none; + text-align: center; +} +.carousel-indicators li { + display: inline-block; + width: 10px; + height: 10px; + margin: 1px; + text-indent: -999px; + border: 1px solid #ffffff; + border-radius: 10px; + cursor: pointer; + background-color: #000 \9; + background-color: rgba(0, 0, 0, 0); +} +.carousel-indicators .active { + margin: 0; + width: 12px; + height: 12px; + background-color: #ffffff; +} +.carousel-caption { + position: absolute; + left: 15%; + right: 15%; + bottom: 20px; + z-index: 10; + padding-top: 20px; + padding-bottom: 20px; + color: #ffffff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); +} +.carousel-caption .btn { + text-shadow: none; +} +@media screen and (min-width: 768px) { + .carousel-control .glyphicon-chevron-left, + .carousel-control .glyphicon-chevron-right, + .carousel-control .icon-prev, + .carousel-control .icon-next { + width: 30px; + height: 30px; + margin-top: -10px; + font-size: 30px; + } + .carousel-control .glyphicon-chevron-left, + .carousel-control .icon-prev { + margin-left: -10px; + } + .carousel-control .glyphicon-chevron-right, + .carousel-control .icon-next { + margin-right: -10px; + } + .carousel-caption { + left: 20%; + right: 20%; + padding-bottom: 30px; + } + .carousel-indicators { + bottom: 20px; + } +} +.clearfix:before, +.clearfix:after, +.dl-horizontal dd:before, +.dl-horizontal dd:after, +.container:before, +.container:after, +.container-fluid:before, +.container-fluid:after, +.row:before, +.row:after, +.form-horizontal .form-group:before, +.form-horizontal .form-group:after, +.btn-toolbar:before, +.btn-toolbar:after, +.btn-group-vertical > .btn-group:before, +.btn-group-vertical > .btn-group:after, +.nav:before, +.nav:after, +.navbar:before, +.navbar:after, +.navbar-header:before, +.navbar-header:after, +.navbar-collapse:before, +.navbar-collapse:after, +.pager:before, +.pager:after, +.panel-body:before, +.panel-body:after, +.modal-header:before, +.modal-header:after, +.modal-footer:before, +.modal-footer:after { + content: " "; + display: table; +} +.clearfix:after, +.dl-horizontal dd:after, +.container:after, +.container-fluid:after, +.row:after, +.form-horizontal .form-group:after, +.btn-toolbar:after, +.btn-group-vertical > .btn-group:after, +.nav:after, +.navbar:after, +.navbar-header:after, +.navbar-collapse:after, +.pager:after, +.panel-body:after, +.modal-header:after, +.modal-footer:after { + clear: both; +} +.center-block { + display: block; + margin-left: auto; + margin-right: auto; +} +.pull-right { + float: right !important; +} +.pull-left { + float: left !important; +} +.hide { + display: none !important; +} +.show { + display: block !important; +} +.invisible { + visibility: hidden; +} +.text-hide { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} +.hidden { + display: none !important; +} +.affix { + position: fixed; +} +@-ms-viewport { + width: device-width; +} +.visible-xs, +.visible-sm, +.visible-md, +.visible-lg { + display: none !important; +} +.visible-xs-block, +.visible-xs-inline, +.visible-xs-inline-block, +.visible-sm-block, +.visible-sm-inline, +.visible-sm-inline-block, +.visible-md-block, +.visible-md-inline, +.visible-md-inline-block, +.visible-lg-block, +.visible-lg-inline, +.visible-lg-inline-block { + display: none !important; +} +@media (max-width: 767px) { + .visible-xs { + display: block !important; + } + table.visible-xs { + display: table !important; + } + tr.visible-xs { + display: table-row !important; + } + th.visible-xs, + td.visible-xs { + display: table-cell !important; + } +} +@media (max-width: 767px) { + .visible-xs-block { + display: block !important; + } +} +@media (max-width: 767px) { + .visible-xs-inline { + display: inline !important; + } +} +@media (max-width: 767px) { + .visible-xs-inline-block { + display: inline-block !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm { + display: block !important; + } + table.visible-sm { + display: table !important; + } + tr.visible-sm { + display: table-row !important; + } + th.visible-sm, + td.visible-sm { + display: table-cell !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-block { + display: block !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-inline { + display: inline !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-inline-block { + display: inline-block !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md { + display: block !important; + } + table.visible-md { + display: table !important; + } + tr.visible-md { + display: table-row !important; + } + th.visible-md, + td.visible-md { + display: table-cell !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-block { + display: block !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-inline { + display: inline !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-inline-block { + display: inline-block !important; + } +} +@media (min-width: 1200px) { + .visible-lg { + display: block !important; + } + table.visible-lg { + display: table !important; + } + tr.visible-lg { + display: table-row !important; + } + th.visible-lg, + td.visible-lg { + display: table-cell !important; + } +} +@media (min-width: 1200px) { + .visible-lg-block { + display: block !important; + } +} +@media (min-width: 1200px) { + .visible-lg-inline { + display: inline !important; + } +} +@media (min-width: 1200px) { + .visible-lg-inline-block { + display: inline-block !important; + } +} +@media (max-width: 767px) { + .hidden-xs { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .hidden-sm { + display: none !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .hidden-md { + display: none !important; + } +} +@media (min-width: 1200px) { + .hidden-lg { + display: none !important; + } +} +.visible-print { + display: none !important; +} +@media print { + .visible-print { + display: block !important; + } + table.visible-print { + display: table !important; + } + tr.visible-print { + display: table-row !important; + } + th.visible-print, + td.visible-print { + display: table-cell !important; + } +} +.visible-print-block { + display: none !important; +} +@media print { + .visible-print-block { + display: block !important; + } +} +.visible-print-inline { + display: none !important; +} +@media print { + .visible-print-inline { + display: inline !important; + } +} +.visible-print-inline-block { + display: none !important; +} +@media print { + .visible-print-inline-block { + display: inline-block !important; + } +} +@media print { + .hidden-print { + display: none !important; + } +} +.sandstone { + font-size: 11px; + line-height: 22px; + font-weight: 500; + text-transform: uppercase; +} +.navbar .nav > li > a { + font-size: 11px; + line-height: 22px; + font-weight: 500; + text-transform: uppercase; +} +.navbar-form input, +.navbar-form .form-control { + border: none; +} +.btn { + border: none; + font-size: 11px; + line-height: 22px; + font-weight: 500; + text-transform: uppercase; +} +.btn:hover { + border-color: transparent; +} +.btn-lg { + line-height: 26px; +} +.btn-default:hover { + background-color: #393a35; +} +input, +.form-control { + -webkit-box-shadow: none; + box-shadow: none; +} +/* input:focus, +.form-control:focus { + border-color: #dfd7ca; + -webkit-box-shadow: none; + box-shadow: none; +} */ +.nav { + font-size: 11px; + line-height: 22px; + font-weight: 500; + text-transform: uppercase; +} +.nav .open > a, +.nav .open > a:hover, +.nav .open > a:focus { + border-color: #dfd7ca; +} +.nav-tabs > li > a { + background-color: #f8f5f0; + border-color: #dfd7ca; + color: #98978b; +} +.nav-tabs > li.disabled > a:hover { + background-color: #f8f5f0; +} +.nav-pills a { + color: #98978b; +} +.nav-pills li > a { + border: 1px solid transparent; +} +.nav-pills li.active > a, +.nav-pills li > a:hover { + border-color: #dfd7ca; +} +.nav-pills li.disabled > a { + border-color: transparent; +} +.breadcrumb { + font-size: 11px; + line-height: 22px; + font-weight: 500; + text-transform: uppercase; + border: 1px solid #dfd7ca; +} +.breadcrumb a { + color: #98978b; +} +.pagination { + font-size: 11px; + line-height: 22px; + font-weight: 500; + text-transform: uppercase; +} +.pager { + font-size: 11px; + line-height: 22px; + font-weight: 500; + text-transform: uppercase; +} +.pager li > a { + color: #98978b; +} +.dropdown-menu > li > a { + font-size: 11px; + line-height: 22px; + font-weight: 500; + text-transform: uppercase; +} +.alert a, +.alert .alert-link { + color: #fff; +} +.tooltip { + font-size: 11px; + line-height: 22px; + font-weight: 500; + text-transform: uppercase; +} +.progress { + border-radius: 10px; + background-color: #dfd7ca; + -webkit-box-shadow: none; + box-shadow: none; +} +.progress-bar { + -webkit-box-shadow: none; + box-shadow: none; +} +.list-group-item { + padding: 16px 24px; +} +.well { + -webkit-box-shadow: none; + box-shadow: none; +} +.panel { + -webkit-box-shadow: none; + box-shadow: none; +} +.panel .panel-heading, +.panel .panel-title { + font-size: 11px; + line-height: 22px; + font-weight: 500; + text-transform: uppercase; + color: #fff; +} +.panel .panel-footer { + font-size: 11px; + line-height: 22px; + font-weight: 500; + text-transform: uppercase; +} +.panel-default .panel-heading, +.panel-default .panel-title, +.panel-default .panel-footer { + color: #98978b; +} diff --git a/roo/src/main/resources/static/public/fonts/fontawesome-webfont.eot b/roo/src/main/resources/static/public/fonts/fontawesome-webfont.eot new file mode 100644 index 0000000000000000000000000000000000000000..99e847f985b54ecc5e8dd5003d4775cd387b799c GIT binary patch literal 75220 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/roo/src/main/resources/static/public/fonts/fontawesome-webfont.ttf b/roo/src/main/resources/static/public/fonts/fontawesome-webfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..f471fde429ccdfbf6c62b9746d0c75faaade7f2f GIT binary patch literal 150920 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

jH0rRyLL+1|R$y$3@bdgc?;t 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ℨ{dsBK*`T4-6b-D1rq7 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

cl(Ou6^Utmxy^`$=v=$va*K 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 Ucf|P*8a#-I?padb-XkLVUsriYi2wiq literal 0 HcmV?d00001 diff --git a/roo/src/main/resources/static/public/fonts/fontawesome-webfont.woff2 b/roo/src/main/resources/static/public/fonts/fontawesome-webfont.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..aaed3de59c52ca76abc62d509676652b40d55ae4 GIT binary patch literal 70728 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
j0s;6+k3VBhH195iM@+jSx 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 literal 0 HcmV?d00001 diff --git a/roo/src/main/resources/static/public/fonts/glyphicons-halflings-regular.svg b/roo/src/main/resources/static/public/fonts/glyphicons-halflings-regular.svg new file mode 100644 index 0000000000..94fb5490a2 --- /dev/null +++ b/roo/src/main/resources/static/public/fonts/glyphicons-halflings-regular.svg @@ -0,0 +1,288 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/roo/src/main/resources/static/public/fonts/glyphicons-halflings-regular.ttf b/roo/src/main/resources/static/public/fonts/glyphicons-halflings-regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..06e2a16b443c2d296f7fdf95eea5c7c20e81a6a7 GIT binary patch literal 45404 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 literal 0 HcmV?d00001 diff --git a/roo/src/main/resources/static/public/fonts/glyphicons-halflings-regular.woff b/roo/src/main/resources/static/public/fonts/glyphicons-halflings-regular.woff new file mode 100644 index 0000000000000000000000000000000000000000..dda02ad5372b7771616f56ddc04bf58f8ab9bbaa GIT binary patch literal 23424 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⋘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 r*WvQ}vj00xp)KfYD-wz$vNU#5o&H6t8)Z(KX literal 0 HcmV?d00001 diff --git a/roo/src/main/resources/static/public/fonts/glyphicons-halflings-regular.woff2 b/roo/src/main/resources/static/public/fonts/glyphicons-halflings-regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..ad69b8d4c10507b7b80d8894bf97822aa81bccfc GIT binary patch literal 18028 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 literal 0 HcmV?d00001 diff --git a/roo/src/main/resources/static/public/img/es.png b/roo/src/main/resources/static/public/img/es.png new file mode 100644 index 0000000000000000000000000000000000000000..c2de2d7111e3cb59cf6511dd2ab045e824bdb43e GIT binary patch literal 469 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 literal 0 HcmV?d00001 diff --git a/roo/src/main/resources/static/public/img/geo.png b/roo/src/main/resources/static/public/img/geo.png new file mode 100644 index 0000000000000000000000000000000000000000..a4995b6f56d45bad081f089ac6e166c9f7e2a4fc GIT binary patch literal 142350 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 literal 0 HcmV?d00001 diff --git a/roo/src/main/resources/static/public/img/logo.png b/roo/src/main/resources/static/public/img/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..e23f915763c67d9101f70d4883325da7911e4f5d GIT binary patch literal 1761 zcmV<71|Io|P)n6U0*s&eQdzqQ94?9ln zWq0FC3^qslG`n-t|9o@K|NPI<$T8D0f{oFzO2h^f3*2O$bH4*Nvj|Mf*>wTD4TKw` z;eRG#1I}XF`K>@X@Br}h#TGUXP5S+UX&Lt~Ch+&>{D0N7jNdGH@TO&K1}bx|`+z^2 zma$`@@B9w{k>?&i@R(^C2TjXpSg7F50^ld?d%zjfGX7v%#_ELtUU(r>0sI@d89)k9 z3W`*z9$-JPyQ8f$_DzE~fW5$Sr65w{(mN~|&lLL*C?E-(2lfH)0H1WUb@qPU;O_?B z07{jDhDw*_u*>`1Izr6qy`#VoFbs@%$BV!@pbI$UIX%+R)|r|uc-=eJ0;K>#!0AEB zT{qbbH#!_Vqv6+P{N6He6|-}|yQXFQ1K8Km)|sAh!g`XRc8X?@@YWF@_iaq`omvOm zotLlP0Q>^j4ea$ocgAd^0pTep1$=o~@a`8r9^8_lzG7Yl<`Upepu@C`=uE*&pyDfv zO~QvKbizzR>2 zr>+HF1GWJh^Kz+xlr8w^q)ua{Vr8|<`g)hvW`~N9OUeM zLDGhiq~OA3N#BUz!lWhh>MQDKa)M9nx)fRZ{qnNl^q?emOy~5V#5c8`{K!+a1;J~H*nnz`hF1dj zPuGFVDM44i#^HoUc}P)Prci+EvC)*pq~)D+J%^U~;f4yu#zu#XBS>75xfHrH5gQmP z+QT+R!&P3=2B(`wFJ5aNS!q z2?vhry!NTDptSHw7#x$NovbsruCQrZ=I-UC!|CXzo@YJn^L#8GX(~27*bZE|?vpJE zo#!>qOijiq*GH0&ak5wID;1C2p4t$LM}8fPM_Pd`KppT#EFM{!7ko!s=Lz7K^C4Kq z(t`dGk+-!>+K|kE6l$_Vn}BD%F6{}A^EU!Ji_9wRJ;2j*jsJYfoN@C%>k0-M|U&e-hXli$}ImXj))e>jk(^0*?WK>(XxucyLRa_4Urx-4`NDl`nnl z=Z9-E)Rd_YbjiPfkAP33n|g*Po{z;NRY26Myq^Ql6|E(vW!wq;(Hncr$*M~g54WVK zTB5E3mjZUS``J+MfFN`7qS)}K?Ok8YWyC!>2ljj3J_ID@vg<8P8EQ)ZAJZ8J{`!HR z+A^0Ty^@y?`j36s-cb!dQNOEjIa%o(w(k0>PD%=@^&vB#==qr*hnirOO+D0Es;g=G> z20;WBb!BRGUAf&dp5e#CgsRpEZ@d8EX#nZMXjc(x62$Os0rX00000NkvXXu0mjf DKx9>r literal 0 HcmV?d00001 diff --git a/roo/src/main/resources/static/public/img/owasp_logo.png b/roo/src/main/resources/static/public/img/owasp_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..8c820aa076ce15ef4908439a9d5c478c7641f2db GIT binary patch literal 4271 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 R_JjZc002ovPDHLkV1m3z8S4N5 literal 0 HcmV?d00001 diff --git a/roo/src/main/resources/static/public/img/springroo-logo.png b/roo/src/main/resources/static/public/img/springroo-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..5e9891fc3469e2d628a95d6553ac51ea36554df2 GIT binary patch literal 25823 zcmXtg1yohd7w>^fTXM>oQoVJPw9Cf(A(BiF9Btcz(Zj$k-%$n4_r7N$ylYPD^OTy zuUQby-Z?u*Iy%gxH*+6Z628hphdO@fT#B)druxRUbSMylBjq8-B@EySk@yr!yAJUP zW6_4-WYN|@aB_`iq}9S$OX^X91G4vewmPfEZttX^v`h4&&Io{t#t|7n1ZYkhy*bf^ z(%#}KY$F12xU0cK@a}fk-?9OwF!~UjE=a-$7WJA=2!FWH`0B*9OiY6Djax-O`&{Y7cLvPB?hE@u|q zHc=jxk?MKl%)`Vi&k!qjDweRFND4qs!1b19G&yIhk25KRl=_p_u}I9FP|mC9r&`# z^nroRO`_HjD)BWty`CJULg!Me+uP6XBe)*=1W!DyTD7nD)SnI&D9u|d5Axhw#gteC zS#b-J*j2@;IH9YSwr57_L@X7tmS9TdiP)A|{2NYvzHPQbxONUMBA}4qi8SEN@*n~z zND3rL4UO(3S=6C-o^&~Omn(Q`3 zyuvuNA-kg>^AQC8$WTF_}juE2E>r6T8PFFFzPZa^)$tf5xQ zwtL=loLYf99_UH6b;Gdx^_rmMcY4aB=&wy`P}mW=ue)`d*_X*q^1lPdLvg*3%N`%) z%dS2Rb5yzzoQJ@Rp>Ev_>0!C2w|{{DhGnLaohP6Evrtro36s!sg(+UYTAaB`gy&~q+FH5KV z4@c@c`dt9J8j44l_`+TlK1b@tsl1wbG|HwIPFtJF-!ROZbM77Dp~0co!YrT+!~Is5 z@k9qXN41a*3o4I_&`!_UgibFCRRt!flCS*8fma_ewuTAg%dP(>w9_z<7MFS7&#Lk$ zat(-8x8K`NQe4;99J>sx9wu~IgrQQ%!D7`#ec>AQeMjb~3?VqjpfJMB#WTc~RV-sW z7FyhzA)W(DB5Js?%l&lQ^d_*XIEhjO6JFfeg{$7zQxDY~ud)O|eOBzzO`})nY>in= zJ4@(TNEiChZ;R}9C{nUE&!`ELKkP5Sm!OBlqKyHkUK-uR-^oT78S(c+aLgx$uq3Xj zc}C7Hyx*e|2)Ia1&_Iv}P&92+ALf1h@i1w^12T@My^sp==eRtBc{)T)_ydkG79`h} zkq%9^A5bPGldc0M^C(`AO)tDqwEkW`Zntj_>Z>rQlQ_5qRn)U#!Y)#Sl3jmrV-$G~ zE$8rKXGS89GOuJHFf6!$)D?9WLI4!a)&8*XQ?lQ&v=W4M~NkbPfs#EcOxROVx~vB?+iQ3cAtCCok%JKr-?2+_x^7T z6HxqUz zlC@HzxH@c%4xzi$f8J7<|J^ZL0{T`F$N%-L3ms=TTOH4Qqa<4?itX{$r3-^dPzJD`zz^-Y7=O5}A^Cz#??ht2n}?iG%XM z@0Y84Bi$JZv8lzHJ=D)De*4M~W4()b!z_9Z>xTc4sPAa)4XU4XQ&EgCU;1YMWM!NY zfq@Z&xGRa=*9S75|L?Zhb}D5e&X;#y+eYR#jvJM0h2IWE$77F&KTd>Y?`LAi7!{%A z?gf}$K=ToQ(X3Te_tHltZpR2zInO_u*97CyP5hd(BuP838R}Gu#YVjq87DifQ55Ea zJC$%_@|^C!Wh1-#^4KQKaAKS3O@1#eJF2Mkwcko)F}irNms7w>7j8CF8N=VbcFM|mUS zJobb!WMIwd!>OmFXJ4r-_Atq_cMstKom7Zn%!`?(L#4IuKIhp~<~|;~fd=VB<>XyC z44?j7p_#4W!N&PR!w~34rvXg*khRMpgdD%{uuS=p2j~wh9)}~B`F}bYMhsl~pc}b% z&thj|i4P8mU;xbpit3n331FbCSnoC=E)AV24JkOI@KB74>p}~w+YR-%8-}oCA{^+{ z;=A8`IE(O>d|YN9PNF{w>8ytD2JUDErGK@|X;bWs`|dQ#qLh2=yIx7IlOf>I^R+tr zxOkD?3@P;Vi>_HW6u&RcaiwAQv%rkwF{?b?n)T%2uWTAo7e_4PH9y5X->r8#=22j5 z7++Q3#->L?vPE3l6QT@ppSjX441+eheS>%=jLF7(gzf*?*FOIlH54Zk@d$#FRF*nM zc}N7$!To{T%ektCokG4Rglpshsm^Qnke5WyZwE}EPLy_ zef?|Ao9e1ywBWrs&XdwV*5aVkIM&O3s$-*98&%fKGeZu|u>*OJH%1nU+@`ONa; zsK2@zt7BVFg#x>?p63%C7H$Mm7pNdX$j-kmh7i_dh}SFYG)Xx6#>0ELj$a;26%4r$ zi_#QWfUvoe3xw-ZnPB+nd`FuEs?c6QRL9JxP7XY;S`;6PWXjoLhhHe{8#b)L2JERR zX`kI_q(ZoxT*4w%$jrr;cZ4-w%`Z7W{Hxhw7Iw5SN;!<=7$F)RI{7olgvkTq8>u9Q za|g)?e&LW6pX<=DQTOHs2jeanM7+5Q9~nPGl*1k$*SdAPwmsl@%UUX;=GR0m?2G!> zYhE0u;kfVonBD{oeOz)(jmNImXfW6OK!r$@dTQ128AVz$Ty1D7cY(m!b;a+8Y4d(M znW8UQp4ZSlS^c4qj%n>`&yKsR_|0&V#>!gsUi?g&gj{z7oYS5|&pn>uIOzx#5GdL> zykT};`;$AkV)rf*qu3L7>gz7}BmUcXoruE>H`hgrGEJ zKAfFaLZ&#APhgN(Z*>MtZrH1ln)P!@u9&n<(6ez>okt+Ha43jMZN+j@HF?NywM&DD zO@`$^qkpi@9KSlFMrr2z&t?QOM}P0>-}L-aoH<)#)N6EW?%pIv#3jmeA>ouVZ$L+o z0R16-G0Pb%-4IL|OBn_^aJL4a#oZ$QR28i7xlR-`waiq3E{Sx#&Q89jdinnxO`^go zSL+VpC^Zn=E}LgnZroV^7{JnhD9}3Yq#{|E2;-{WDOX$OVhQ6CRp|dC1JM&&AA8Yj z_ELNN33ogOSFKO1qtGsXD2@R4J!qeASg9OIp$~2YBmcV5>ZvsyS6Cq5u(N*$a>bN! z3B6?!B z%J51h7u=acbuPE6Kw8NCWM*7FfFDN2@@7xzkRGqu`>8w=sgQO+6a&M};ci2CJf z6PSN7rDEzMVBW@YsGfJc4whyvo6nV0Yc7S~)W~_qAip8&N#&E1ACO^YiiN>o-*SV; z)@gPp8V*vRsf{&GPv_?Sv?1F0I(STAkXn%)@(1PMuSjmUro(d-5sfw?eKMoe)vk$r z7l-dgsZn)M6!g%qz%+S@ZN`gEmYhln!X@YpUQU;2lo7=aY{|TAFCfSwMa$774)Rj} zmBG2X)N6X$PyIbTYU0*4knlxmw00^NR7fhR~+J%=nIFzIW(2YU4tdQ##q zf$<=KRv|zHwWaYwg!z@#u4`hZoIBo;177oC!1&-tMMk*S!k>1MSV`u1jp^f07l9Kq z)0tE8Za{e^T3kIy7a@f$Glk7}2bM3^?w0?!TUj8~{!kUZU=7Gw?;>lJ}B)0f3#yhfl&S)a)SO zG`urHUc|x|qI}rrF`IT7#031F)dwjZbY|noCfSUL+dNbP6>IK_-&OeLBhi_KbKXiC zcPK=dGsH}Bx#nZ#+@V-KIU=)%L({KHEf*^D*ruXUc$T3G+jNMRrHgjsEntQ>vnMha z3N2|6_oCVCqY#$E#3E(?b>~d zu4jf(CpLeh=gz_DKYl!l6S}g6lH6q_67dk<5(;KrH7E&p07yrm;Af>6N*j1CK33gJ zNiUT(qF$Ao=**-$aemP41SxR%8<~RW1{07=r<8|r1sur}l&usP2N06*j&&SN$c_>q zhV{FDoJ&tCGYLp?Tnh=}uy}KSb|lPp)$!R4OjHscC!!(dDyw^2qMZy`(=JTT$j$XrKwCm*uycJeS~GpNXw!x$2vxIp*(3}640H1 zDB@HBsTr&mNp%L|hb$Z|Q=f1_Fw-unOr=doc@kZFJ_Xv!f6bYNTZHbr4>&vHN`glG zC4T}pIO2@5W)n)NlsV=i(OY6m28HiRzETj4AVBQH7> zJ10{Gn)r++z7K{qu%SHkfP2R3G24LR1=B4QqZo$EoT!O_i*XbtW-?2$oIHAHs3p{9 zRoipz3DJ*^R!Zj0J5j>NM1w3xC>#ge+AJ6q#*uL-G2%gKr2Cqaq0SYTXj-Sr$lmY{ z7lT5tDaXh`LYYnm3I?B4Qnd^ZWQ0x7Zoaw-K@AQyIu^`bWr8lIf_qC4CKFw>)TIVH z;pNKAG+r+2|E(UE2+iTmHmlAKYsjF{ZQp2ifH@h)n*o*upARoPP>?D-a&8(6nlaPn@70xAN5;SrF*de zk{Xk}N|NQ4(DH?X^+8`&0y>7iLFY?}YAcCt5(xQK@gqBTcdN~F!RcW(2PapNLwOxM z@9#sJuHHC$G@@CZsF4E5LS>B2$iH|Zu`yqaYo#z zG*07riSGYyviQ_?21(l{Og)%^M{4nOvve}U>!SZVB!WR0!?L_6bhzd(ot2KNo|0I# zl@qizOg3{e^1a;&{uJ?UTBVXi^D{6lQtQMs`i*yfyv?l^>SE9bO5CFF`_ zWX8b67zqV|8q(NzC_snFV|0!{n2ud^9d6t?r7C33u$L+%6;8Gt>3gLbRDc+H_UO6& zQ1{u*Mvx%3TVJe?Mp|$?1q8aNe+JZ3jUi6}PC#!T6 zfi<=Job+y2GDg}qYIVOt-Wnb&i1lBCKL>L710D!}B~q^l>1Hd;?iN8~*MAGwsxiS0 zn4~!rD*zLVs3aYAiUS%Mod8L$b&bz<9u(i}607`Dq8z0$PVmnZKr6w@P^p@YK2l3N z?E@j%flstV#G@ow&>`V!d$EC7vx#FNv?5z%HKQ_J2FkYYqFShcQILz9Rs_#`9|qwf z>JvU-Zxot*LAUBxsaPmf<=23=+)Z|jW{C=@mnkS|Vs71GL_O^D_W1={wk_oP!7N7l zHpP%xWT4Q|Gcg1pRWIv{74RO6y-Pgi{{`NgQcm^@;S!=W%*VE9__Qnbz87@MF5PKs z8wn~gAAMv&I~ZUivYV?nmi-XJ!)k>Zkh??GYfE!`8R_xKOSUO9WJpm~ySL zv3F}`&nwq}!MelWt}_VR_*tzE#b!EA>L%q6NQnA9eCwunJP~C-Q=N#~Q`fvSVFre> z+G-#&9S1kCC}b0TUA7LL@l>iEwg042-z0c8(%&Y|(?UmG1Ova7llh%%zt-2K3S|$! zJ()_5E);OA%{;XWwwJ~XMkV=0a?~jxocsA~qqneQy#Z*rJc~oGtEljwn%UNBja7y6 zfG*FSd1KXZt!Ul|dIGw;wWhahS*5kclaG&Au8hXI!oz_j=9sRFzAZ0brtP{s85T?z zKGg`c>;d?q<2yR3oK_#>+Sl}4q*68vNY>6X(=DI9M?Ra zZWrRnjcL5g;`qfIZZCEX4-Fy3-Aj751FjZNJpu(!XcCI6_TB7BuAjv(=tOAWO?OnF zb+Luz-H#uVg!ub3ReE<^UXi`p{hRaMs{Wi=(1--SI;&-L4Qpz1N$4)$Oih}$cq%Ki zv1UfN>N0yke%zY4jqF|NVGhv-3!(u@=d-g2T2^ipUE&!iRW3DQt3G70NAkD*3{C52 zCygXALlf_gGkH$u@fH*G z``M$Mb*Rj`L;zn|t_j1PjlMpYc|Q3I^n@Y$p0~CS;WR6zAc-9=kn0@PZZ=*`0qItc z6R_%1_UUTnbeerdnQWA#oc>3=#SYqdVZ{Q=fSrC0+pQ^%X!r_q#E96`{EfJN*h?7| zu+B@sM}p)vaR`$!w3#d2P@YzG*v%C_tSDK2K?!Kq7LEBf-ZZjKjxRPlFBg;9H&4pV z$CT?t*QB=>y1K?P6?k{f&379;>1k(sC0>0&!=(U8d^3@vWt2AptZ5#5jQy~Sgz#l4)rW1SyG?EtY)Ua1;jJup&ei@kvj)}_)sI-%06G_*^24`)0$R$aqp1s z&mjpu>UDZwzr#9Hz<4t;5=E#W4VYd!{xS?c{Uj^M)qxU>wK+J5=Z71m)0-tgqn?j4o!{hW;bo$eRt9M?>^eT3-Lhv zXr@WpnTfVPhm^vuW-5*(SE-0~5TXftfCm^F9t&|!Pk&^-iNK2O-9e3G^Vm-;s(jSr z8;Bg7SY8zA6<$K=L!~i8W^2X6I*iZ|!rIzCwlk=OT216D&{H<6zF9j#U^%O`rQ>+@ zd*vq|O)mO60(b=o7Q&BFHU*z0@2FNmId3Apx$e11MOZnN!RqceuFlNy4eysJmDamC z)L>550b6Z*w^wvO2VgA{!}nq00rO^}*5l&5)X>bzn=BKHK0IPVGJ2F1x<2TKuZ&5T zFNsqrqa$o`&)JF1jeoA80K;I4eQ$qNJ$Cc$M8JA*Cd4mm2mu(9hF|0|xEK|T-6W%{ zX)Kaq*90B_wP}>mr5sjX1iUlB>qtZN2cMMBHC)YPwa|F-(IDHK3 zuxLLni`8Jl*y1Va3`MY(m369}myGzuFrb@ZveZ|64!xcO?_8f;zKIwueFm)EGX;CZ zTum*9s;-z_b8cJbx&Gf=Fj5FDY*f;YHF*n1`zi3=q^~sU$o6YbuXJ&x1v@I5>Fp~I zV@b>7A$~^_>VX5nN61GYL4VREKElw|OqhK2U5Ac^Aq_p{ug&Kde`0P()A7a+?z>wDgxm=!o2pV9ROQCiZ?Gv|8-! zsdpr}Wj_)Y%9UYYh86{sR$<&T59BPHsGS)LH%{erRT8aJtUI6#@EI*2O;@rYi>si&o z!)d&aXDP`%c!IbNN3X*NWmdL&R#-3f}!OMW4z zcR$8qO6gU{Rv{An0bppayx*_qw8!)bdHh(->Y1O%vIBWbgv-oxjpO2#XR3LQRbzs` zuAIcI6ptOd{T#gFc>|mGYen za#B%a=du3}a}Vfp8~%n9NY}=?UiS_8Kz!U~@HJhlh1;tZQ`Y-rg z?P=C0ykE#MTI)vgIOi+$UMT#L@{k2LANbinOHq`y>cEJ*ia77cp3j0b^cKsG+hC^5 zXj$7#XEeLaq^l|`{00*ROi`*^d;i{BE#4*@_OQqZB$#sC=Xv>UmZCV)26%z0y37yhfbR8h$xWn9I{XR&$!59IVH7zrvjY2XBBeY*tE#o2$?8RqM<2h%f_Fw+`yI)8S`>@TQXv43 z+CrbP#rRYu6+)}9-Bn2hUNO$Tvh>h&o66M1Cvn1?_`LnVliE@oij zH7;r764}3`I&ac(pF58g&hF{Xju4ag||c1Wv+GXt5JjmeB9KB6kEAVmJq1IgW3Wc{61VGm@L$O(8k2&qe4~Mz(>- zbmW8r7FaVh(oPI(E4MTFR6qU7^36Ys7%3S#u)M_ZXDP{~n!!!KPsNVzbQ&-ojw==? z<@p7_QaqwT)2+Numhjq3E_YtfO8FYrGM#l4(*M^UjkA{e+>smmY0EFRZ49tYRu$m6v= z#arBwhfFl$;7a}DA*Qvx;pC@6J*`Z9qOJ7Vmyu{njo<*j<4EKcBZLKPLP8B#zlmCQ2W z-P_j^2qSg$_=qi2!!Qpy31u1?B(N9gHi^;tgLy(6IuM}Y^GWEt*(GV^BAGIv<@vXx z@(&opRHmDmO3>aLZ!2JYlaWA!E9_F0h`YCGh{NdMkwm*$FAY-nd;V?%dK}Quz|UF{ zzi_#_zvMmXe9Hc$6l1V9m4%3c@28)z+zRh6_*}s58&Yu2QpJq|hniC%hlT}nA;RC_ zgav=nPpqjH}=JFNpJsbMiKmGz&+cZ`00v%=CZ1-k6kwCKo6{ptpv9spA9?%R>T*!OR8u+(0 zGhYrO$-nNkQtA$Hb3eti^(07x_ga|P8Bm@dDks;AkI5zNkc_na7TNw=k zm~UfvPrHwwxLg2}U4RkavEFs$nTCygeUvYbN13uCmKijdU9NB#7rpjghSHf(&Hhzg&&_q*|T*ei~OHxV^n z;&^LV=3RXcXqtAa)kc+Q-EDX1OqnC4em)N=fidqv?t)m{<0;WZT|4jE7-`Sx>9ts+=rMxF?%oRo>XqB{;#+~akXq( z&Dyd@e1vXoqwSDtt0m+$`SvV>h&K%2;`Xn~6}=t4O>_>#%TP5vjt2- zhkdntEuVH_mT|JY+#7lSy%E!ATWE$Ry=P74)gGDSyL=U1%q~`ZySI;JFv2Lq0J`Se zq~Etw=};F!fMm!%<dvpSQI(@Wrc3 z6ztK-!q(51y0Ax3+(kTSMUX&M!5&*(6y9q%@T;pBo?Y#x1e>zdI)5P=u?7?aAOS_dizUi*d9gk9@vfX zqlB+~PUSis$%hiIazfU{gwuf<{HQNdxpT1p*cyJ%sZMZ9#`6{!3cyC5A(?xV^Vay$P{n%ZjyYQR zCbNIQXMVr-1Is-WVipM96^B~FNGeIf9=+zv%Do|;9LivUmMWigzYWC!+jUj@Zju=2 zFmz?%+}Yu;yKOph2K`}EoP__$I%9Bv_6kEvRMa0!+Z;Dho>ff4dQ|&m{ftSG_F1h1 zW+HrY#j$RS8CXoTqJ`aF-G=sa2255t6ZD_o?I@|1R>Gw2v1Ck<<-2$_p%yzq?N)O+ zKALP7!o^dO-(I}4>J|nFzMnF0=YrF!}>Dq-sf z6I&7ZFS}Y~KO}m8yW6M0UCpbw0&EbCJ8fu_^o+we2nUW%!X>T+j6Ssn`c3S@4>NTM;; zerTYRTRqHIEfVLI+zx!l6!3@iT|Q#KF_i*VjPoqs{^b9Na-*k7t}aUcVd{!G1fRtziBJCvUR6xL5w! zPN0bWO6x^>#2#k+%G9EgJs-P=f%Gx!TJn@Z#4%>hV!Q^G*(=P+ zSz%-wQ&Q~YV{%2NNMJ_X4nng)>W=LJU5}ire{VV#%YFPO>&KR@*wR}sWn0_0tq?EM zW^)!RBezLbWu}GgQN>kgfdW;S=c`Yf`IFwcg4oKGW*W7#O?PRHqb}Usnxjv7?~ny7MqhjuTy?fqZHU-#Nct3C5HQ8Rm{vUa z&`x=X&m&!2rg(!ONO=&P`3r%DFKXP5*+mHcxf`>YssFLvR@JMryL)i|gPnEZ_d9}M zP13b}5CUx}&MLXFeIW$9WH0EzUTHW7s@_Gm|DVMIW*q|8A02ptK+)m+YWomdVM_Umk-<3w@_Cn4?y+y8ckT3;%4&YYR#P6R*un`GfGp_ z&USNkbekkL4~GCruEh;q@EV}MNo1}Lv&`!0DBSHnFE3ABZL>lA#a|E9$_Ky=XY6;t zhy;bJzh4-_>0k30;};&~Klyln2sC)MyW4sc09*|r1NEf+wAfHzRU`X$Sa5#0!1l(|N%I;Vu)D}j zTL#*JqCj|()yLWJ8s~4)#)W0a15Uz^XnB=Qj@LrK3HM9tc}!nhgLpe4_8=i9M)rA{ z4Ad?g^LCPB-L23RmW9&!;T&G%rJm076 zYW!P9>h}z*Aiw+t*vOSka1qa+5)E)*nd)uzU<2p!^!e;lZ{pRz)S;Hy!42hI(X>57 zKNrh)L->#1a$LEa#9yopFkXH}Ha%UIxi+Wf0t{!L3K%b5+X=;KD!R=dfC< zQ6WrnE@4qO_RB+S{%mEhRA05$I(#~Rl<3(h1uw}C)+;I+(r)s^uxf%&OAsHsGY*Lw zEWW!bn_63;jA5)%0@xbU1u;Akc1WiX;JaR3=a9ILX3EcjX*@A|_R9B)(`jsLH^bZJ zh)-$I6T%V8V)vcC_B^)OKdDV*hRF@frCP`CH+)Y>~05Zr28DbF@+u}PZg%)6G=RU2)exEDNI?QTwrDF^Wr(Gvw z^6$sWE|>0s-1Ge(*364<+{G~Z+{ZVa&`KPqlM#D^#46asWS>ghRkTz7!QjUXPLQ>Z zqNrQ(P#!-2;P(^>?8gWf5;l;zN+`{OK{!dshB?z`YA308(i0bd zQo_~PG#MUdKF2;H{7OYvu`xI?8ap4{XPzQ9vp+jnIEZSVdQEvxD)QzJ(kmVezdV74 zE$MjqZ6|(8q*DvPzd|cX-WohO~}lN=L>VZe%2%cqINB<+JcoGf}l0q{LuE zhkM(#zo$RVPMIk{HZ%Uv`|Xcpz(4!OlwabI^Ca2%;Y7us>BJW)GAp9u`3>`b=SJY6 zjDo{YTa_|?&GR+xZUj4gq7`_Bkk*ObbxrfF=_~%ioAU58h2aof*0slT{XQl{Jv|WQ z>vGp@`5FxJqzo@KH-KzZ&74+8e8Tcw@?`_NrhaY8^%Pgm&TJ#SR&5Cm6a?f@if-u3 z-2CPy(SOum2t@xlSlzXcy#LA-W~@H^Ek%s|Kjwk#bU$>ceax>BxM!=ZR*Bw}#uupOEUcyeVl8WL zv1cGIpTSAUy-n;VmxZ@?iXVT(A(M9OZEcOZXga@j`X-LNzQ@>X(_YxYdNAZnt z_V?A@X2vtn(2V}8+}MDXmUbFre)3KK>*Ph8_=tb=&!zXM(N3Qp(-mGq#wKQ~^Vfo~ zgl@lfn4C(%&0}~@qm$~LqviG73_hu+sClBpha@tE-=MI*I~mRr=B2S-JEtCL#gO5o zaoNFb3=Met4K{Q)2_46nj$j}NK9`(*Q&>lY+tH37lv06k@i!8 z`{%nH{rhiG5ezs7?ArbR9cChAmT4ulHGTMaK@o80Gcyc-NV+WMN9HD~ft~LEM#dby zxL6nuDYCe4x*s+*aryA1aoUY|5`Az%1HK%?O7O@glHEg5LiI8={c*S*OMpI*-5@bx z(mL`(-(7FhV$cVeSW&8hWcJ{wWqHLx&0BN6@)w$KLYv+X3zgO^lQ*xR0Qe5mS|Y}z^$Na^Pf7~aSB3KbKoBMRdXwU3bJ#F+-S+!;vOw(a?g`@D+=1kf z^lRz1*_3lIuWLbw(b1)PnkxJ8EEt@F zlbmN9{H7Cv{I7X_;!GUiU_7}yVCZDfk9T?yKV#nJJ@C52Hd6p6 z#{TjGgzuz8l;^P*8QXpxzRV-++fH9yb<>3h?_-tTTGWH}+UT^Me)iY{0SE}&jw~;a2-ll$4s!Wb~Iy)TIy$WrOk+d)RwpqSaAKRkW z-igxd@OSV}U$e8l%gJHrD72OcjW^J+iD(u08FHHY!b`jBy8)HlOEK57TT$SQ z+?BeSpP=xq8gsg46D6gZkKXQg__#4qXgkAigM`8Yd}=n&5Fpp-N_~jR2j#>9Ja#5m z+k74yNKj6;=D$JYiaqTMS)O23KYt(YF6qK4vih%q6QaQ^8oKf^>7w|5uMz$clXGm9 zWs8hiU7X(KKd^E2UH&ucf7xN9@;8H&7;l{eRuM|A*vCB?k4E*|XY26Ou|-w@OGXx# zM=V^Nb#QtAZYJ381NV0`9*L_ap*XmBS()G>>F1n>sCPFc|X_w|2FpFzi{CXfcV86E!OOq z6M3KaDOoH9pW3@N)RnDmfLE;Nr91rX`*dHj2T)A5g2LjhxA}b_5-7MGTm6k?Wh5P< zci|RH&fEIoO0Q9GyibmCWc{(#L)i@oc3!t(nSaz+#e?4`0-@H02y&#uiBJhw?F z@}qt)7>K|6up65hfSOll)Wk+@yL&0Opa(LDPkq$B6=mq-ckd^ZRb0LQ46;<##Zdm$5BW z6TBN~-if+fgZTB>%~OxAk!oG_8o|8*idCO?xJ@iMwWC=?+XHMqenZA=@SZ9ae!mV$ z+>9LHOvm9m4cClCw*h-wV*VL@~s^?49VdHDqd+bM?bwsKHYtV|Em0 z{3+{IHEF`Osr}OXcgk0uIOqRaTHKZUiCt=1l%C~hFJinz+IM_!&my2rQQXup8@XJX z)X~bvo}_yi(kF40K^n+5eaJ=!3-$w>@a$j_*Y)2*MJoy2QzosN&;!Kl4eHBv#~j?h zvpYEJffTmNpcx>;cZ86ToV=xT6Kh%?RAq{_!#^|{`N_OxE@UrJz)Z3${ZR>rGgIILe5gM2KJ_XPnzXfV>@`ok5N$0ko~cZy}#$_ zpI$iBi3wQjeIxKMuUQghU}f56^a+mad^-Io+bKaSr)FQt<@{487UsX$t38wahwoC` zm0cZ%gZ4w$`~3EI=z;Gs$)Dl(*^mN-_FBmvdyP?h5BRK>h-yvFnJtRXGQYH=0O2fh zEP%7_Mm=iwF``l*{6`BGFO2+4{F@KM58`*Hyq- z$^7K=C|7s9qjkery|gaP#_Yefb7o>-Wnpepug@eyP06&4TL50(*D>68J$1L~44;Pz zL!9AM4Aa+AyFx_0&O9b&mxV-#=rR|FILPV@*=OZvBLai*hS_nPi+{B4SN9XGW>0&{216y~9spi1V>pmr4 zR{{{O1bX-*Sh_l226`XTJ4qw(&nxRw->v#Q&DCyNp^v%WT*SUY8>6XghIv)~+-4YkOe&%nSCdnjsn=4?0KmW}MOpv9y>pL`qCWTk=lRZV zE<#Z2-J(Et0U-%Uc98^<4N+Urm#wY$%Q;r9N2{&1dRi3|>h_R`N3GV=U%hc^^;oMy zTd&1>sUf?8B(S?&k_7_UkRr7xD99y{WM`h=9|;yEJG(nGyE_}^{d(!^m7VW=zYnvs z^UU}AeV)&=b(c2dG6PHI`rQ)nZcBaGkZN+XYNt#DFj|K-t6S^ZGMZw$yl!0w2)b5# zSf=yUThMuW`WK*k-~M%Gbu*$iz8iq%m?Q$u13*VO^O-ZZ9bgjQM*;y11YDrVyv`SJ z{J|G;PS$EnrV%#tFSC9XNuhWFTe;#mDdCi*p#I}Fia9jgCEH_&vn8kstJiBMK$F1CAe)c0yR_&AtLoQELm2UPC@IxfFmM=iK8q8r|(Bbz59oMHK&pCx` zuROaeJ09qVG0WWZKja$nPrKhp*bK&>n5+hb=OB-&!R0-9aOiyV4E=>oaWwfIg|8jIQ;bute_>Fzc2eHIgVpPr9S%l?#Tve~ENl zBOtP(uH7_SG#FR~*Z#c`&WalaID1;xDw(C}JdoS0W$z;w!1+YHagN{G>Lyqej z0uv0;8rBOd=Gk*g7DZ6EdW*!wL}FlCB|Jl6WjKrB000EhIJM)H{L8v&uuGiz-!G%F z>A^O`f(K{aJ+T0KwAf81ce|>-{X>F^x@a5}1w%f^m=(>>H-@>c5deUo-6p2OghKkO z-J5n+xgxi)Leoj#9@Q}nT*8d!C6c%MgASiR;5Ip z*GVu;Qx)?I^w`A8@k!<9RZZ_)UFnK=SfSFvnYx}?jl@7DGyf7~+vW>7n*2e>%}q@c z3v~3EGy-IL)wfv4gm|{c%|DI_A*<4qEMg-_{XSrb*aeodgN&vYvcYjTLSfC%Kmv9K zpE2K-34=Ay%)v3PN1XdwwM(IVq}iSnp~#YUn}|kgO17_>-nqKU6}d$g@+2a95c+4g z0*qM>2P|Yq8q?W^; z6=d>dgl+xNwMKR*gbpV~Y}OLR+P@>l(9WDm^Ggo{rhD$o)TigWE6}CjRz0n|yRx)% zUS(-yEEH4__&4#=r4rx-0%}0EExw@RcMU;@o*=HcL}fBXYJwIRN&;`-|J3BniL@&> zS(px+`e9+ZnOu@&>^Drn_T>+C80tVt=#ckRj?@k@1v)Bj#w`59istJi6!TR8&C5~r z*u;i>@kC(H^vLo`SJ#iKN+YL|A~~4(Cjj1u_WHKD0IrvS^^GCNZ)>gJ??Quz9Gmq7QoE_-TT10n8CQ(uM@K_!I_kxXt#+8yVAP9GIQp(10HwRUp(%}tsZye3?@+p z-~}We6)ypJs4?I)tjY}uUAfqqC5{*fsh6|0I7$$40#qr!sEm0jz*r!I`=88)2Z}E9 zhW7!aIkH)ilnNv5(aSmWrcMBGvexq@l7^JqW*v1E2v99NlnDr=`Fmr~ri=zlRF!V_ zd0dg}$liZCKs5kjmU%oJBEF|F;P_7?Y+!vVX&EKH!W(y`#}W%O!xUE-DQkZNHWHb& zok)8T5mi`wy$D9NfrjWt*yM9{oF3h6lZULIK&<^5F>qS>yb?VMa>n9?05DtY=>*QK zGe1P-l&!lwuFeO<0oyn*-G>DB)`{>?<7&rD-Gej76!JGcjIub#H>b%G3ll@}?}L;4 zt0rXS3Y7v<{|#g-`b14G8dQ-p2aKz8}1wGm~3NR!Y?ebX1k20T$xf0;8d;W zGx0`KIP*hPRCMh1xH}ihEV}@#j?-L_f~T0Z7p5PiWW|cnSr^ehsB^En$HIj6G?`;z zVtQ;NHX>e0V@a8n9&3z+RH|xaGdhK6j*)Zi*BWMw4hCnxn#+_DbIfXftGwau0Q6Kn zyxw)QMjZ}=VMX~5J?GmctT2@`KSZ^=d*catd1Zqtb83_{1)Z1b9L}!f<<8dGN7`ZL zbD_Rh$TpifDoR;omN`?`?MIxKV+Nm>CUXp9up*=W)j2a_7Y(}3SNI+?I4YL77CK@Y z7^GT0l^J@j)0mu-d#}@Rz9E#=7Ec0jnT{?ZP2TWUQ#x}1C@Ko~RkjuWWkXsCK-kr+hqsWxDIcQ7(MYv>Vq7a)^qX(^=DyKWl;9hy5J z8f!nf_ih7CN}96T;@JSM(bGqiWmVmKA?R;<`e&fN;@%SNH7xW)0G`A^aJMFSK+i?@ z5_QVS=i~2WAP}daXYG^`44$LjiW}2ojYT$~fYhBiFiI*A zSv5N+h)XhULn1OzZg%v2lKT#j11O zKtCzPzuI{zgH`h*8N8&rdYO9kvc=H{D=)=qA)ttR(_)Jb-U}2SON^gn+K#k9yhwK+ zjBg$6-?1ni4!vxC(M<$Aq`M=+8~%l>cO=sExX%x~4d5R-N6Z(j{CVd5qUk#OiOY=p zicgWE^cN=RO$TKGJbUPmta0X~s72!%qb*Iuk1SrSJrE()gu_KSP?UH-6a@mmN{c}j zSw*F*Ybk&YYHbL7{qoi0&rXv`n#d)pK_(?!(@4Iw|5*aG*8)ET(e($TJ70I*<2u#= zvyQ|IQ8vG10hks+zh7Y?b6uj1-~M%HFEKx&b4&m@QDOREMor1Z2J|%~Gv*adCV}Mu zN_BTec&&LsTic;Ov&Wg+5%VpL2}adpE;-fVxY3}#4Cm9{gSUWaoO&x-S~ac95{t1o z0wORm{l7TPgsdnFSx3prR5G{?@S{xIkuH{byALvx5snG~F0|WwSC!Wkonugc0D$tE zsb4SaFM12iwT5&^cx%N2;iR?~`s{hn05BqZXCx87T2@>1puq)esH~>wdn8dS0EYqn zF=X+j7oMzf=KcK~^Wj3k=LQb-kS{RCbj4SiR*jnoMqEvL1+xAnE{kDHkNueE5&xk# z*B5f!oDO@Eff*zedKy61i9G3{-=6ann7a+?Zafn;m(>(6s_+)+svI`kTQqV;P077X z@&*uHV32)L8j$u*il8^x!{Gli$OZ!Fp5FeE;j;O~R}4z6YGy{wl(Mqg;sy{s2N+g* zb#coB>q3WrkTuTSCUH!uJAz?1IshC8lAbfua(hF=*gQpu7ZEq7mfo7}+F}L1S;S<{ z)OGtA6!)P=;9vSe&dKSpDN&kMJMUzeOLsgS3^*!bWQ>3S;ihPmHkZ{F|9(bo$%RGU zgi~|roSI^HS#9wn2cy(Y#0vo!C>_hcK78po8P4pO{1kwoVU`dI!FXjxw0M1aZSl`$ z)=V0c=()4KXCGHKzvTL|n&JB0IntQwFObyKcl9&i3kA@)`97>FIusZ z&k#jKJPiZIKr~lCQ-?lc+d;3^vzIJcBA3?`-Nr=CFmR$uz(fWfVv-&zn_sjE3i(LT zT9C4t74b!(9U?wc0hJK*%!ARW3xJf8%_=5ubN$*Q0{*hbnFBG!`uClflNVc5Mk55e z%^z@dRJtSoV|3ri&=@GZ7lfZ!rQq=Pbbaw;gvILOT1*F8S*{*d!7B3hV0 z)6G4$k@uwBAd6u`rK{^LV*YIcP0y1?Nv|&5oPOaE0B8t|J&OeY6@Xe4c8bc7nhXEJ z)jI^!HHcR z5r}>f&COlw3ptHkTF4^RTjgMii(cCfVd1mPXf)WB$8Ww0jK`_*f=ml_=3(mS@64H z{#xvY2+MhS{{g71Z4&QIfr%NVwXSUeh#$?g9R{(SdI~OHvSf*&t1HXB9Uqa6X9M`y z$bK_~%uJWBtP87FkQ1Pok%&a#8x`)~hOmOZ)|8VMk2JO z#W~6!axRpK!(hyg(|nHr&HWcK+ZQUlG!QsF z>6*$74P)~f1BKT#1|7``kw3}&*$?vhKt>~sEru7Bu1Gx?KTr4sqH)ahTWQpXUA};G z-tx7Mq|=p{A(n-l<-VZfnLayj8{Aro7ihN^3NAdfwKO+49s{Z&&J)Qh)lLx@obc|;Z2LQgbr9S+8q9@p@r*-dU z#vFghaT9gy@b(BkaM_{0Ei8<}5Yg(E~`l z4)qxzen5_*&KGp7CBg^Hw1yRg?fnP;o|ALRUbj2g9|*YYeSIGnMD2Dbh+GUR^M^23 zfRlL%*a-#S@l1~_KlFjzhw&;2Yta$%@!jz{70fb|)`VahGO{?0a7$ggx2(4KV*rl= zv9}z|05Lz4XWxIvGH-e(BFziiHcqc8u8;^XVc^+oX0|CLu35QYT~Y#IHeg_L9EdDx zTw1XNko0MBbW-K+de9eeYy{!|kesrY05FXi(*OnuAex(t zD0agabf5>jf!u#hx|4OC1hgwQ+qbKxc6>SdUZ@G*U`rws42IZ|SjfOob}8F6ooFyE zb?r~is-5zI4CNK*tRtQxJ_GoM=KAm(nKEEiefx(1DreLd|CoS>Va^h|FSG67Eh{zT z+ka`ltLmJ{hXAhf1)L9ol!X8#QxdcQz`0;LmjEa-LmDMa(VI3k#hm}kVCRa0WMz)4^oYkWOcSQsWBs+Z+;>pEOs*G#+I zcR!f#MCPAcgU}l`n{s=TH*AJwZf>n>e|$zwQBaV0ior#hHfWHY47$6uuI)K!e6t*K zfy(3V40&8#b68*&fH$;u4uEJtt!O+3k?oX)8mR%GTk4r?hkZ-cjTxq6d*VQI_oty0Xd@ zxujwUM-BiCDvNb8DQHS$kmdz#ZJ^k>>MHDv+H*4YY#555H`vp%pzR(aauGPwbsDx1 z=({a-Z5Nxwk$*vJeYmOblbmS;+y@|&84ofup6$2wO=_)c`yI6VT6KBEs%eoG9#`aI zAyEkf&j8r1bs&u#Bu1UBw|7dWa;ayzJ0lg-I_HAhrd9|XTYsNf^+C+wn1VVa#6BHnr45NyU#@!ht?o2j73{+CoxPQ%o%0Bo z0pJ~@`&Xe4L{G{>o>b-PTpX*>^3b?3pxDdo3RA+)j5zs9T@3aHy+KpPt~4)bYiq6x zdx(@$0$xCRU&vO1`P(hFc4u>4+iPhYHz|V81pAxo+85^8_;dz-0$^JjhwlOSzhxVb zZmneUAHbS>~mAmT?soWozS$-B6q82=38}-;;P1U$s zuu0M%0PGs#(60Wd@_V&&i74iBt02-;p()*PPBaXlH^$-c6<4J0VO{Bp1U;_ET)|w4 z0jHj-ps!vKJt>hg!Bg6KTlKVV)yYFtq3CLZ-=2uoV) z!cQdJK0`DwSiictuKhY9ng-%WDRs}T{QzDh!E;+|?d2`?;WuN+j+%{S-tfNGy7tHW zZMhS{d_9=|hSc5TZ3NuiugK1py70ZLykWy)E;QG4X=oUmCkkvHf-(n0hOv3lDBERVz6=A!3G_yg?q

;ybr>53$$!{CJ|?=Puk;#$PsZ&m>OCeL=_ zUCX@7vQ8uY^2;xmwock`E-}vq)A;~OpxqCA2;hBUelORKHMk6X; z4AA*BkT$GV8$gXd0L@^2UlDk7<$`bmsn6OltUy~s!)%)<*g6S72?0(JIWbTVHV?pY zUm0sR29`9oGSM0VIq=WUE$yk8U8KU9A5K%#!~!{AzJP#o0=pQPhWIf7pMuZ^#!6D? z?dZPIO@l#q86gmG*$;@%CMyalA9r=FPvtC6FN+sLI;F61vJfnypN|PAdfgfVW6zRE zdI~@#6Lx_4PX}!y@6IModuEV7E@{Nue#uKjr}? z#xn*#{wElJAwf@Qt+#DPX53eN3IwJCm;_)F7-I#Ioxxu?F9!A#&^I`%-@rfz*?3*E zH{6*q!_&y+mtQV@IKE>lh$jvFhqJ&q76Upchf*{Y0G|_~m%$xiY*a|vc<=y1>mEtZ zGbR<)R!v2!o%vT;ycp8go#RIL$)bQHDv+Rz005Th00|t7%JM&|&*?TrI*Wyc(KLjM zM%sFN94sT3{lpX*000CyNklByjMVco=^L>8=;ZV7<4>Mz|BJ*WNh2s z6&Y*hmr@H0qsgXv=2^kO10?yGhK0p&pt>l$4?xP65&@tg=x`EnL#*Q@=rPNYTO4g9 z6aZ&oVPRnwB=G%+y{El5O3`Q2X^(}48L*tWg@r}d&=?x;0q9zlCQrwUg14|3j#$pz z!ongeSi0GnORPKvm2@<+_dk$Mn=CBMg5}IDERJGUtQehdR2kD$Gjb1}#6Z;bkPy@T zl~cA3rA1(2G3>FNxrN11NKAs-j{b+9PK55j}-Tq+V{fie5)B`djje){D0FD{- z#y}vtcl0yqw8_H4Ojyp`!r~}I;piU#oCiPvG=f3iQytFN-dQ_kM5b-~D!!28Dk6F` zb_?DwB)&G2S`8K!nZ|PF78XYt4S@+K0;oFj2w#*R-QU=-);T)uM#Z2p=)3}q=b`qj zV)2v8v%5B>&ngQG^I+ z@Gw-KQ4G8-e?I!hX*A8k!n9b<+`{50q|z0s15_P409*yKZS;qncP-uQ%#G7lH;WfT z@&%kXF}Mwci`Ci^;Fk{AuC(^aEi4AGoVkU?Q3w&(`tD!h;+@dB8?mO%4f29^T+dwXx++j>eBH?46NDN*H85dAv<`@T zV87OJEi8s3mNU1UxrGIq0)=NPL@xsZzUEJf)E)x2E3$-Vf$SWmzt+ERFmh z5jg!eSXg8i!+x2a8RQQ+J^^sz5Qn#VT#+&9w#mXGoA9r4&St@P0GJCPFNH&GCh&_) z;t5Y_=Z+MPV_`Au81~K_0DOVMTS4^1S3f7>Ybr~-Udn_`78cn?L%3+9?LhAZOt=`} zY5=F}>{4c6H31D!ls|f=Z&_)CofZ~HBS(cZ2L_5YfH4oiWH34a)Oy^J*D`IFg+;c~ z5Og?g;7TTp2jdI^jbY$4CKM2(0KhQ-7{G2Y?}iXNz`P#71~7+vfu?V`yFSnCzrw;| bc<}!Lw@DCRefresh"; + } + callback(emptyData(data.draw)); + }); + } + + + /** + * Converts the first char of the given string to lower case. + * @param str the string to convert + * @returns the converted string + */ + function toLowerCaseFirst(str) { + if (str.length > 0) { + var value = str.charAt(0).toLowerCase(); + if (str.length > 1) { + value = value.concat(str.slice(1)); + } + return value; + } + } + + /** + * Returns the parent datatables whose id is given through + * the 'data-parent-table' attribute. + */ + function getParentDatatables(datatables) { + var parentTableId = getParentTableId(datatables); + // Validate if parent-table id has been specified and + // if the parent Datatable has been initialized + if (parentTableId && $.fn.dataTable.isDataTable($(parentTableId))) { + return $(parentTableId).DataTable(); + } + } + + /** + * Returns the parent table id when this datatables is a detail. + */ + function getParentTableId(datatables) { + var parentTableId = getDataValue(datatables, 'parent-table'); + if (parentTableId) { + return "#" + parentTableId; + } + } + + /** + * Returns the id of the selected row in the parent table, if any. + * @param datatables child datatables + * @returns the id of the parent datatables selected row + */ + function getParentSelectedRowId(datatables) { + var parentDatatables = getParentDatatables(datatables); + if (parentDatatables) { + var selected = parentDatatables.row({ + selected: true + }); + + if (selected.any()) { + return selected.data().id; + } + } + } + + /** + * Returns if the datatables has a related parent datatables + * @param datatables to find if it has a parent datatables + * @returns if there is a parent datatables + */ + function hasParentTable(datatables) { + var parentTableId = getParentTableId(datatables); + if (parentTableId) { + return true; + } + return false; + } + + /** + * Process the given Url to perform the following actions* + * - If the given datatables is not related to a parent one, it + * returns the given url as is. + * - If the url contains the '_PARENTID_' valuea and there is a related + * parent table, if the parent table has a selected row, its identifier + * is used to replace the '_PARENTID_' value in the given url. + * Otherwise no url is returned because it is considered as an invalid + * url. + * If the processed url is valid, the given id value is used to replace + * the '_ID_' parameter in the url + * @param datatables DataTable on which the calling should act upon + * @param url to process + * @param id (optional) identifier of the datatables row to act upon + * @returns the processed url + */ + function processUrl(datatables, url, id) { + var processedUrl = url; + // If it is a detail table, we have to get the parent id from + // the selected row in the parent table, and replace the + // _PARENTID_ variable in the given URL. + if (url && url.indexOf('_PARENTID_') > -1 && hasParentTable(datatables)) { + var parentRowId = getParentSelectedRowId(datatables); + if (parentRowId !== undefined) { + processedUrl = url.replace('_PARENTID_', parentRowId); + } else { + processedUrl = undefined; + } + } + + if (id !== undefined && processedUrl) { + processedUrl = processedUrl.replace('_ID_', id); + } + + return processedUrl; + } + + /** + * Process the given Url and the Datatables configuration to build + * an URL that contains the Datatables parameters. + * This function is useful when is necessary to make a petition + * to the server side without using AJAX. + * + * @param datatables DataTable on which the calling should act upon + * @param url to process + * @returns the processed url + */ + function getUrlWithDatatablesParams(datatables, url) { + + // Remove existing parameters + url = url.split("?")[0]; + + // Getting data from Datatables + var dtContext = datatables.context[0]; + var data = dtContext.oAjaxData; + + // Getting search value + var searchValue = data.search.value; + + // Getting order + var order = data.order; + + // Getting columns + var columns = data.columns; + + var sortParams = ""; + for (var i = 0; i < order.length; i++) { + if (order[i] !== null && order[i] !== undefined && + order[i].column !== null && order[i].column !== undefined) { + var columnName = columns[order[i].column].data; + var dir = order[i].dir; + + sortParams += "sort=" + columnName + "," + dir + "&"; + + } + } + if (sortParams.length > 0) { + sortParams = sortParams.substr(0, sortParams.length - 1); + } + + var datatablesColumns = ""; + for (i = 0; i < columns.length; i++) { + if (columns[i] !== null && columns[i] !== undefined && + columns[i].data !== null && columns[i].data !== undefined && + datatablesColumns.indexOf(columns[i].data) === -1) { + datatablesColumns += columns[i].data + ","; + } + } + if (datatablesColumns.length > 0) { + datatablesColumns = datatablesColumns.substr(0, datatablesColumns.length - 1); + datatablesColumns = "datatablesColumns=" + datatablesColumns; + } + + + // Build URL parameters + var hasParameters = false; + var params = ""; + if (searchValue != null && searchValue != "" && searchValue != undefined) { + if (hasParameters) { + params += "&"; + } + params += "search[value]=" + searchValue; + hasParameters = true; + } + + if (sortParams != null && sortParams != "" && sortParams != undefined) { + if (hasParameters) { + params += "&"; + } + params += sortParams; + hasParameters = true; + } + + if (datatablesColumns != null && datatablesColumns != "" && datatablesColumns != undefined) { + if (hasParameters) { + params += "&"; + } + params += datatablesColumns; + } + + return url + "?" + params; + + } + + /** + * Deletes the element whose id is the one in the datatables + * row whose _delete_ button has been selected, and the + * the opened modal confirmacion has been accepted + * (see modal-confirm-delete.html) + * @param datatables DataTable on which the calling should act upon + */ + function deleteElement(datatables) { + var $token = $("meta[name='_csrf']"); + var $header = $("meta[name='_csrf_header']"); + + var tableId = getTableId(datatables); + var rowId = $('#' + tableId + 'DeleteRowId').data('row-id'); + var url = getDeleteUrl(datatables, rowId); + + $.ajax({ + url: url, + type: 'DELETE', + beforeSend: function(request) { + if ($token != null && $token.length > 0 && $header != null && $header.length > 0) { + request.setRequestHeader($header.attr("content"), $token.attr("content")); + } + } + }) + .done(function(result) { + var $deleteSuccess = $('#' + tableId + 'DeleteSuccess'); + $deleteSuccess.modal(); + datatables.ajax.reload(); // Refresh Datatables + }) + .fail(function(jqXHR, status) { + var $deleteError = $('#' + tableId + 'DeleteError'); + $deleteError.modal(); + }); + } + + /** + * Returns the URL to load the data for a Datatables. The value + * is defined through a 'data-load-url' attribute in the + * Datatables table tag. + * @param datatables DataTable on which the calling should act upon + */ + function getLoadUrl(datatables) { + var url = getDataValue(datatables, 'load-url'); + return processUrl(datatables, url); + } + + /** + * Returns the URL to create a new element for the Datatables. + * The URL is processed to replace any parameters. + * + * @param datatables DataTable on which the calling should act upon + */ + function getCreateUrl(datatables) { + var url = getDataCreateUrl(datatables); + return processUrl(datatables, url); + } + + /** + * Returns the URL to create a new element for the Datatables + * as defined in the table data attributes. + * The value is defined in the Datatables table tag with a + * 'data-create-url-function' as a function which returns the URL + * or, if it is not defined, the value of the attribute + * 'data-create-url' to be used as the URL. + * + * @param datatables DataTable on which the calling should act upon + */ + function getDataCreateUrl(datatables) { + var urlFunction = getDataValue(datatables, 'create-url-function'); + var url = urlFunction ? $[urlFunction]() : getDataValue(datatables, 'create-url'); + return url; + } + + /** + * Returns the URL to show the details of an element of the Datatables. + * The value is defined in the Datatables table tag with a + * 'data-show-url' as the URL to use. + * The URL contains the text *_ID_* in the place where + * the selected element Id has to be inserted. + * + * @param datatables DataTable on which the calling should act upon + * @param id identifier of the element to edit + */ + function getShowUrl(datatables, id) { + if (id == null || id === "null") { + return null; + } + var url = getDataValue(datatables, 'show-url'); + return processUrl(datatables, url, id); + } + + /** + * Returns the URL to edit an element of the Datatables. + * The value is defined in the Datatables table tag with a + * 'data-edit-url' as the URL to use. + * The URL contains the text *_ID_* in the place where + * the selected element Id has to be inserted. + * + * @param datatables DataTable on which the calling should act upon + * @param id identifier of the element to edit + */ + function getEditUrl(datatables, id) { + var url = getDataValue(datatables, 'edit-url'); + return processUrl(datatables, url, id); + } + + /** + * Returns the URL to remove an element of the Datatables. + * The value is defined in the Datatables table tag with a + * 'data-delete-url' as the URL to use. + * The URL contains the text *_ID_* in the place where + * the selected element Id has to be inserted. + * + * @param datatables DataTable on which the calling should act upon + */ + function getDataDeleteUrl(datatables) { + var url = getDataValue(datatables, 'delete-url'); + return url; + } + + /** + * Returns the URL to remove an element of the Datatables. + * The value is defined in the Datatables table tag with a + * 'data-delete-url' as the URL to use. + * + * The URL contains the text *_ID_* in the place where + * the selected element Id has to be inserted, AND it is + * replaced with the provided id. + * + * @param datatables DataTable on which the calling should act upon + * @param id identifier of the element to remove + */ + function getDeleteUrl(datatables, id) { + var url = getDataDeleteUrl(datatables); + return processUrl(datatables, url, id); + } + + /** + * Returns the URL to remove a list of elements from the Datatables. + * The value is defined in the Datatables table tag with a + * 'data-delete-batch-url' as the URL to use. + * The URL contains the text *_ID_* in the place where + * the selected elements Ids have to be inserted. + * + * @param datatables DataTable on which the calling should act upon + */ + function getDataDeleteBatchUrl(datatables) { + var url = getDataValue(datatables, 'delete-batch-url'); + return url; + } + + /** + * Returns the URL to remove a list of elements from the Datatables. + * The value is defined in the Datatables table tag with a + * 'data-delete-batch-url' as the URL to use. + * The URL contains the text *_ID_* in the place where + * the selected elements Ids have to be inserted, and it is + * replaced with the provided idlist. + * + * @param datatables DataTable on which the calling should act upon + * @param idlist list of identifiers of the elements to remove + */ + function getDeleteBatchUrl(datatables, idlist) { + var url = getDataDeleteBatchUrl(datatables); + return processUrl(datatables, url, idlist); + } + + /** + * Returns the 'data-name' attribute value of a datatables. + * @param datatables DataTable on which the calling should act upon + * @param name the name of the data attribute to return the value of + */ + function getDataValue(datatables, name) { + var $dt = jQueryTable(datatables); + return $dt.data(name); + } + + /** + * Returns all the 'data-*' attributes of a datatables. + * @param datatables DataTable on which the calling should act upon + */ + function getAllDataValues(datatables) { + var $dt = jQueryTable(datatables); + return $dt.data(); + } + + /** + * Returns the jQuery object for the given datatables element. + */ + function jQueryTable(datatables) { + return $(datatables.table().node()); + } + + /** + * Returns the table id attribute for the given datatables element. + */ + function getTableId(datatables) { + var $jQueryTable = jQueryTable(datatables); + return $jQueryTable.attr('id'); + } + + /** + * Generates a JSON object with the necessary data for indicating a + * DataTables object that 0 elements have been found. + * This is used for details related tables, when a parent table + * row is not selected. + * + * @param draw DataTables request counter + * @returns {json} JSON object with empty data + */ + function emptyData(draw) { + return { + 'data': [], + 'draw': draw, + 'error': null, + 'recordsFiltered': '0', + 'recordsTotal': '0' + }; + } + + /** + * This function will be called when DataTables has been fully + * initialised and data loaded. + */ + function onInitComplete(oSettings, json) { + var datatables = this.DataTable(); + // Save the selected row to state + saveSelectedRowToState(datatables, oSettings, json); + // Register checkboxes + registerCheckBoxesEvents(datatables); + } + + /** + * If a row is selected, store it in the persisted table state + * so if the user goes to another page and returns, the current + * selected row is still selected. + * @param datatables the Datatables element + * @param oSettings DataTable object options + * @param json + */ + function saveSelectedRowToState(datatables, oSettings, json) { + var state = datatables.state; + datatables.on('select', function(e, dt, type, indexes) { + if (type === 'row') { + var rowSelectedId = datatables.rows(indexes).ids()[0]; + state.loaded().rowSelectedId = rowSelectedId; + state.save(); + } + }); + datatables.on('deselect', function(e, dt, type, indexes) { + if (type === 'row') { + state.loaded().rowSelectedId = undefined; + state.save(); + } + }); + if (!state.loaded()) { + oSettings.oLoadedState = datatables.state(); + } + } + + /** + * Loads a previously persisted datatables state. + * @param settings DataTable object options + * @param data DataTable object data + */ + function loadFromState(settings, data) { + var datatables = this.DataTable(); + loadSelectedRowFromState(datatables, data); + } + + /** + * Loads a previously selected row id from the persisted state. + * @param settings DataTable object options + * @param data DataTable object data + */ + function loadSelectedRowFromState(datatables, data) { + var state = datatables.state; + if (state.loaded()) { + var rowSelectedId = state.loaded().rowSelectedId; + if (rowSelectedId) { + data.rowSelectedId = rowSelectedId; + } + } + } + + /** + * Registers events for the given datatables + */ + function registerEvents(datatables) { + registerDeleteModalEvents(datatables); + registerAddModalEvents(datatables); + registerToParentEvents(datatables); + registerOnDrawFinishesEvents(datatables); + } + + /** + * This function registers all the necessary actions to execute + * when the provided datatables is completly drawed. + */ + function registerOnDrawFinishesEvents(datatables) { + // When this datatable is re-drawed, the + // following actions will be executed + datatables.on('draw.dt', function() { + // Register events to the new included checkboxes + registerCheckBoxesEvents(datatables); + }); + } + + /** + * Registers events related to the checkboxes of the given + * datatables. + */ + function registerCheckBoxesEvents(datatables) { + // Getting the table id + var tableId = getTableId(datatables); + // Obtain all checkboxes for this table + var checkBoxes = jQuery("#" + tableId + " input:checkbox"); + // Register change event for every checkbox. Every time that some checkbox + // changes, validates if the delete batch button should be enabled or not + jQuery.each(checkBoxes, function(item) { + jQuery(this).change(function() { + var rows_selected = datatables.columns().checkboxes.selected(); + if (rows_selected.join(",") === "") { + datatables.button('delete:name').disable(); + } else { + datatables.button('delete:name').enable(); + } + }); + }); + + // Re-initialize the delete batch button + var rows_selected = datatables.columns().checkboxes.selected(); + if (rows_selected.join(",") === "") { + datatables.button('delete:name').disable(); + } else { + datatables.button('delete:name').enable(); + } + + } + + /** + * Registers the events related to the delete modals, so the + * modal knows the id of the row to delete. + */ + function registerDeleteModalEvents(datatables) { + var tableId = getTableId(datatables); + var $deleteConfirm = $('#' + tableId + 'DeleteConfirm'); + + // When the delete element modal is opened, copy the current + // element id to be deleted to the 'TABLE_ID + DeleteRowId' + // element + $deleteConfirm.on('show.bs.modal', function(e) { + // Get data-row-id attribute of the clicked element + var rowId = jQuery(e.relatedTarget).data('row-id'); + // Populate the row-id data attribute in the modal + $('#' + tableId + 'DeleteRowId').data('row-id', rowId) + }); + + $('#' + tableId + 'DeleteButton').on('click', function() { + deleteElement(datatables); + }); + } + + /** + * When a table is linked to parent table, for a master detail list + * for example, it registers the row selection events in the parent + * table to update the data in the child table. + */ + function registerToParentEvents(datatables) { + var parentDatatables = getParentDatatables(datatables); + + if (parentDatatables) { + // Register to de/select events + parentDatatables.on('select', function() { + datatables.button('add:name').enable(); + datatables.ajax.reload(); + }); + + parentDatatables.on('deselect', function() { + datatables.button('add:name').disable(); + datatables.ajax.reload(); + }); + + // Register to reload finished event, needed when the selected row has + // been deleted in the parent table or any other change + parentDatatables.on('xhr.dt', function() { + datatables.ajax.reload(); + }); + + datatables.button('add:name').disable(); + } + } + + /** + * Registers the events related to the delete modals, so the + * modal knows the id of the row to delete. + */ + function registerAddModalEvents(datatables) { + var parentDatatables = getParentDatatables(datatables); + + // The add modal dialog is only used in child datatables + if (parentDatatables) { + var tableId = getTableId(datatables); + + $('#' + tableId + 'AddButton').on('click', function() { + var url = getCreateUrl(datatables); + $addForm = $('#' + tableId + 'AddForm'); + var params = $addForm.serialize(); + $.ajax({ + type: $addForm.attr('method'), + url: url, + data: params, + success: function(data) { + datatables.ajax.reload(); + } + }); + }); + } + } + + /** + * Renders the tools column, with the buttons to perform operations + * on the table rows. + */ + function renderTools(data, type, full, meta) { + var datatables = new $.fn.dataTable.Api(meta.settings); + var tableId = getTableId(datatables); + var rowId = data; + var buttons = '
'; + + var showUrl = getShowUrl(datatables, rowId); + // Check if the show will be inline + var showInline = getDataValue(datatables, 'show-inline'); + if (showUrl && !showInline) { + buttons = buttons.concat(''); + }else if(showUrl && showInline){ + buttons = buttons.concat(''); + } + + var editUrl = getEditUrl(datatables, rowId); + if (editUrl) { + buttons = buttons.concat(''); + } + + var deleteUrl = getDeleteUrl(datatables, rowId); + if (deleteUrl) { + buttons = buttons.concat(''); + } + + buttons = buttons.concat('
'); + return buttons; + } + + + /** + * This method tries to display the show view of the selected record + * expanding the selected row. + */ + function showInline(showButton, datatables, showUrl){ + var tr = showButton.closest('tr'); + var row = datatables.row( tr ); + if ( row.child.isShown() ) { + // This row is already open - close it + $(showButton).attr("aria-expanded", "false"); + row.child.hide(); + } + else { + $(showButton).attr("aria-expanded", "true"); + $.ajax({ + url: showUrl + "/inline", + dataType: 'html' + }).done(function(data) { + // Open this row + row.child(data).show(); + }).fail(function(data){ + // Show error in new row + row.child("
ERROR: An error occurred while trying to obtain more info.
").show(); + }); + } + } + + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * DataTables Advanced Extension API + * + * For complete documentation, please refer to the docs/api directory or the + * DataTables site + */ + + // Local variables to improve compression + var apiRegister = DataTable.Api.register; + + apiRegister('advanced()', function() { + return this.iterator('table', function(settings) { + DataTable.advanced.init(settings); + }); + }); + + apiRegister('advanced.getTableId()', getTableId); + apiRegister('advanced.getCreateUrl()', getCreateUrl); + apiRegister('advanced.getEditUrl()', getEditUrl) + apiRegister('advanced.getDeleteUrl()', getDeleteUrl); + apiRegister('advanced.getDeleteBatchUrl()', getDeleteBatchUrl); + apiRegister('advanced.getShowUrl()', getShowUrl); + apiRegister('advanced.getDataValue()', getDataValue); + apiRegister('advanced.processUrl()', processUrl); + + apiRegister('advanced.getCreateButton()', createButton); + apiRegister('advanced.getDeleteBatchButton()', deleteBatchButton); + apiRegister('advanced.getExportCsvButton()', exportCsvButton); + apiRegister('advanced.getExportExcelButton()', exportExcelButton); + apiRegister('advanced.getExportPdfButton()', exportPdfButton); + + apiRegister('advanced.showInline()', showInline); + + + + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Initialization + */ + + // DataTables creation - check if advanced has been defined in the options. + $(document).on('preInit.dt.dtadvanced', function(e, settings) { + if (e.namespace !== 'dt') { + return; + } + + // If the 'advanced' option has been specified, + // initialize the advanced configuration for this + // DataTable. + if (settings.oInit.advanced !== undefined) { + DataTable.advanced.init(settings); + } + + }); + + return DataTable.advanced; +})); diff --git a/roo/src/main/resources/static/public/js/datatables-defaults.js b/roo/src/main/resources/static/public/js/datatables-defaults.js new file mode 100644 index 0000000000..ab247078e4 --- /dev/null +++ b/roo/src/main/resources/static/public/js/datatables-defaults.js @@ -0,0 +1,29 @@ +// IIFE - Immediately Invoked Function Expression +(function(extendDatatables) { + + // The global jQuery object is passed as a parameter + extendDatatables(window.jQuery, window, document); + +}(function($, window, document) { + + // The $ is now locally scoped, it won't collide with other libraries + + // Listen for the jQuery ready event on the document + // READY EVENT BEGIN + $(function() { + // Initialize all datatables in current page + $('table[data-datatables="true"]').each(function(){ + // Use the advanced extension to auto-configure all + // advanced features (ajax, export, add, edit, show, delete, etc.) + $(this).DataTable({ + mark: true, + advanced: true + }); + }); + }); + + // READY EVENT END + //console.log('The DOM may not be ready'); + + // The rest of code goes here! +})); \ No newline at end of file diff --git a/roo/src/main/resources/static/public/js/datetimepicker-defaults.js b/roo/src/main/resources/static/public/js/datetimepicker-defaults.js new file mode 100644 index 0000000000..3d114d93aa --- /dev/null +++ b/roo/src/main/resources/static/public/js/datetimepicker-defaults.js @@ -0,0 +1,107 @@ +(function(jQuery) { + jQuery(document).ready(function() { + + /* + * jQuery Utilities ================================================== + */ + /** + * Select the most switchable time format for time selectod related to + * requiered format + * + * @param format + * @returns time format + */ + function getSelectorTimeFormat(format) { + // + if (format.search(/h{1,2}/) > -1 && format.search(/[aA]/) > -1) { + if (format.search(/[A]/) > -1) { + return "hh:mm A"; + } else { + return "hh:mm a"; + } + } + return "HH:mm"; + } + + // Use the same locale than MomentJs + // (set it before setDateFormater as setLocale override formatter) + jQuery.datetimepicker.setLocale(moment.locale()); + + // Define parse/format date using moment library + jQuery.datetimepicker.setDateFormatter({ + parseDate : function(date, format) { + var d = moment(date, format); + return d.isValid() ? d.toDate() : false; + }, + + formatDate : function(date, format) { + return moment(date).format(format); + } + }); + + jQuery(".datetimepicker").each(function(index) { + var $input = jQuery(this); + var options = { + step : 5 + }; + + var pattern = $input.attr("data-dateformat"); + var value = $input.attr("data-timestep"); + + if (value) { + try { + options.step = parseInt(value); + } catch (e) { + timeStep = 5; + } + } + + // FormatDate YYYY/MM/DD + value = $input.attr("data-startdate"); + if (value) { + options.startDate = value; + } + value = $input.attr("data-mindate"); + if (value) { + options.minDate = value; + } + value = $input.attr("data-maxdate"); + if (value) { + options.maxDate = value; + } + + // FormatTime : "HH:mm" + value = $input.attr("data-mintime"); + if (value) { + options.minTime = value; + } + value = $input.attr("data-maxtime"); + if (value) { + options.maxTime = value; + } + value = $input.attr("data-allowtimes"); + if (value) { + options.allowTimes = value.split(","); + } + + if (isNotEmpty(pattern)) { + var momentPattern = moment.javaToMomentDateFormat(pattern); + jQuery.extend(options, { + format : momentPattern, + datepicker : moment.isDateFormatDate(momentPattern), + timepicker : moment.isDateFormatTime(momentPattern), + formatDate : "YYYY/MM/DD", + formatTime : getSelectorTimeFormat(momentPattern) + }); + } else { + var emptyMomentPattern = moment.javaToMomentDateFormat(); + jQuery.extend(options, { + format : emptyMomentPattern, + formatDate : "YYYY/MM/DD", + formatTime : "HH:mm" + }); + } + $input.datetimepicker(options); + }); + }); +})(jQuery); \ No newline at end of file diff --git a/roo/src/main/resources/static/public/js/inputmask-defaults.js b/roo/src/main/resources/static/public/js/inputmask-defaults.js new file mode 100644 index 0000000000..f3a299bb5d --- /dev/null +++ b/roo/src/main/resources/static/public/js/inputmask-defaults.js @@ -0,0 +1,30 @@ +(function(jQuery) { + jQuery(document).ready(function() { + + /* + Inputmask.extendDefaults({ + 'autoUnmask' : true + }); + */ + + jQuery(".inputmask").each(function(index) { + var $input = jQuery(this); + var options = { + removeMaskOnSubmit : true + }; + + var pattern = $input.attr("data-inputmask-mask"); + if (pattern) { + options.mask = pattern; + } else { + var alias = $input.attr("data-inputmask-alias"); + if (alias) { + options.alias = alias; + } else { + throw "missing input initialization value on (id='"+this.id+"' name='"+this.name+"')"; + } + } + $input.inputmask(options); + }); + }); +})(jQuery); \ No newline at end of file diff --git a/roo/src/main/resources/static/public/js/main.js b/roo/src/main/resources/static/public/js/main.js new file mode 100644 index 0000000000..b704282624 --- /dev/null +++ b/roo/src/main/resources/static/public/js/main.js @@ -0,0 +1,70 @@ +(function(jQuery) { + jQuery(document).ready( + function() { + + //dropdown + jQuery('ul.dropdown-menu [data-toggle=dropdown]').on( + 'click', + function(event) { + event.preventDefault(); + event.stopPropagation(); + jQuery(this).parent().siblings() + .removeClass('open'); + jQuery(this).parent().toggleClass('open'); + }); + + //tooltip + jQuery('[data-toggle="tooltip"]').tooltip(); + + }); +})(jQuery); + +/** + * Checks if an object in JavaScript is undefined, null or empty string + * + * @param obj + * @returns {Boolean} + */ +function isEmpty(obj) { + if (jQuery.isPlainObject(obj)) { + return jQuery.isEmptyObject(obj); + } else if (jQuery.isArray(obj)) { + return 0 === obj.length; + } else if (typeof obj === "string") { + return (isNull(obj) || 0 === obj.length); + } + return isNull(obj); +} + +/** + * Checks if an object in JavaScript is undefined or null + * + * @param obj + * @returns {Boolean} + */ +function isNull(obj) { + if (typeof obj === "undefined" || obj == null) { + return true; + } + return false; +} + +/** + * Checks if an object in JavaScript is defined and not null + * + * @param obj + * @returns {Boolean} + */ +function isNotNull(obj) { + return !isNull(obj); +} + +/** + * Checks if an object in JavaScript is undefined, null or empty string + * + * @param obj + * @returns {Boolean} + */ +function isNotEmpty(obj) { + return !isEmpty(obj); +} diff --git a/roo/src/main/resources/static/public/js/moment-defaults.js b/roo/src/main/resources/static/public/js/moment-defaults.js new file mode 100644 index 0000000000..e8f4cf963a --- /dev/null +++ b/roo/src/main/resources/static/public/js/moment-defaults.js @@ -0,0 +1,88 @@ +(function(jQuery) { + + moment().format(); + + /** + * Convert Java's SimpleDateFormat to momentJS formatDate. Takes a Java + * pattern + * (http://docs.oracle.com/javase/6/docs/api/java/text/SimpleDateFormat.html) + * and turns it into the expected momentJS formatDate + * (http://momentjs.com/docs/#/parsing/string-format/). + * + * @param pattern + * SimpleDateFormat pattern + * @return moment pattern (if 'pattern' is ommited return defautl + * pattern) + */ + moment.javaToMomentDateFormat = function (pattern) { + if (pattern) { + // Year + if (pattern.search(/y{3,}/g) >= 0) { + pattern = pattern.replace(/y{3,}/g, "YYYY"); // yyyy to + // yy + } else if (pattern.search(/y{2}/g) >= 0) { // yy to YY + pattern = pattern.replace(/y{2}/g, "YY"); + } + + // Day + if (pattern.search(/d{2,}/g) >= 0) { // dd to DD + pattern = pattern.replace(/d{2,}/g, "DD"); + } else if (pattern.search(/d{1}/g) >= 0) { // d to D + pattern = pattern.replace(/d{1}/g, "D"); + } else if (pattern.search(/D{1,}/g) >= 0) { // D,DD, DDD to DDD + pattern = pattern.replace(/D{1,}/g, "DDD"); + } + + // Day in week + if (pattern.search(/E{4,}/g) >= 0) { // EEEE to dddd + pattern = pattern.replace(/E{4,}/g, "dddd"); + } else if (pattern.search(/E{2,3}/g) >= 0) { // EEE to ddd + pattern = pattern.replace(/E{2,3}/g, "ddd"); + } + + // Day in week (number) + if (pattern.search(/F{1}/g) >= 0) { // F to e + pattern = pattern.replace(/F{1}/g, "e"); + } + + // week of the year + if (pattern.search(/w{1,}/g) >= 0) { // ww to WW + pattern = pattern.replace(/w{1,}/g, "WW"); + } + } else { + return "YYYY/MM/DD HH:mm"; + } + + return pattern; + } + + /** + * Informs if date format (momentJS) includes date information + * + * @param format + * string + * @returns true if !format or format contains ('YQDMdw') + */ + moment.isDateFormatDate = function (format) { + if (!format) { + return true; + } + return format.search(/[YQDMdw]/) > -1; + } + + /** + * Informs if date format (ISO 8601) includes time information + * + * @param format + * string + * @returns true if !format or format contains ('HmAasSZ') + */ + moment.isDateFormatTime = function (format) { + if (!format) { + return true; + } + return format.search(/[HhmAasSZ]/) > -1; + ; + } + +})(jQuery); diff --git a/roo/src/main/resources/static/public/js/moment-locale-es.js b/roo/src/main/resources/static/public/js/moment-locale-es.js new file mode 100644 index 0000000000..fbf94e406e --- /dev/null +++ b/roo/src/main/resources/static/public/js/moment-locale-es.js @@ -0,0 +1,73 @@ +//! moment.js locale configuration +//! locale : spanish (es) +//! author : Julio Napurí : https://github.com/julionc + +// ROO-3814 Remove var "monthsShortDot" and "if" that assigns it. + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['moment'], factory) : + factory(global.moment) +}(this, function (moment) { 'use strict'; + + var es = moment.defineLocale('es', { + months : 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split('_'), + monthsShort : 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_'), + monthsParseExact : true, + weekdays : 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'), + weekdaysShort : 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'), + weekdaysMin : 'do_lu_ma_mi_ju_vi_sá'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'H:mm', + LTS : 'H:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D [de] MMMM [de] YYYY', + LLL : 'D [de] MMMM [de] YYYY H:mm', + LLLL : 'dddd, D [de] MMMM [de] YYYY H:mm' + }, + calendar : { + sameDay : function () { + return '[hoy a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + nextDay : function () { + return '[mañana a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + nextWeek : function () { + return 'dddd [a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + lastDay : function () { + return '[ayer a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + lastWeek : function () { + return '[el] dddd [pasado a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + sameElse : 'L' + }, + relativeTime : { + future : 'en %s', + past : 'hace %s', + s : 'unos segundos', + m : 'un minuto', + mm : '%d minutos', + h : 'una hora', + hh : '%d horas', + d : 'un día', + dd : '%d días', + M : 'un mes', + MM : '%d meses', + y : 'un año', + yy : '%d años' + }, + ordinalParse : /\d{1,2}º/, + ordinal : '%dº', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + return es; + +})); \ No newline at end of file diff --git a/roo/src/main/resources/static/public/js/select2-defaults.js b/roo/src/main/resources/static/public/js/select2-defaults.js new file mode 100644 index 0000000000..6e45799dfb --- /dev/null +++ b/roo/src/main/resources/static/public/js/select2-defaults.js @@ -0,0 +1,49 @@ +// IIFE - Immediately Invoked Function Expression +(function(extendSelect2) { + + // The global jQuery object is passed as a parameter + extendSelect2(window.jQuery, window, document); + +}(function($, window, document) { + + // The $ is now locally scoped, it won't collide with other libraries + + // Listen for the jQuery ready event on the document + // READY EVENT BEGIN + $(function() { + + // The DOM is ready! + //console.log('The DOM is ready'); + + // Init select simple + $('.dropdown-select-simple').select2({ + debug : false, + theme : 'bootstrap', + allowClear : true, + }); + + // Init select with AJAX search + $('.dropdown-select-ajax').select2({ + debug : false, + theme : 'bootstrap', + allowClear : true, + ajax : { + data : function(params) { + // set search params names to match with GlobalSearch and + // Pageable arguments + var query = { + 'search[value]' : params.term, + 'page' : params.page - 1, + }; + return query; + } + } + }); + }); + + // READY EVENT END + //console.log('The DOM may not be ready'); + + // The rest of code goes here! +})); + diff --git a/roo/src/main/resources/static/public/js/validation-defaults.js b/roo/src/main/resources/static/public/js/validation-defaults.js new file mode 100644 index 0000000000..a92da83d58 --- /dev/null +++ b/roo/src/main/resources/static/public/js/validation-defaults.js @@ -0,0 +1,233 @@ +(function(jQuery) { + jQuery(document) + .ready( + function() { + + function getLanguage() { + // usamos el locale de momentjs + moment.locale(); + } + + jQuery.validator.setDefaults({ + ignoreTitle : true + }); + + /** + * Initialize jQuery Validator methods + */ + /** + * Date/time validation with format + * + * @name jQuery.validator.methods.number + * @type Boolean + */ + jQuery.validator.addMethod("dateformat", function(value, element, params) { + if (this.optional(element)) { + return true; + } + if (params === "DEFAULT") { + return moment(value, moment.javaToMomentDateFormat()).isValid(); + } else { + return moment(value, params, true).isValid(); + } + }, "Please enter a correct date/time"); + + /** + * Replaces the standard number validation to support number with comma. + * + * @name jQuery.validator.methods.number + * @type Boolean + */ + jQuery.validator.methods.number = function(value, element) { + return this.optional(element) || Inputmask.isValid(value, { + alias : "numeric" + }); + }; + + /** + * Replaces the standar min validation to support number with comma. + * + * @name jQuery.validator.methods.number + * @type Boolean + */ + jQuery.validator.methods.min = function(value, element, params) { + var localizedValue = Inputmask.unmask(value, { + alias : "numeric", + unmaskAsNumber : true + }); + return this.optional(element) || localizedValue >= params; + }; + + /** + * Replaces the standar max validation to support number with comma. + * + * @name jQuery.validator.methods.number + * @type Boolean + */ + jQuery.validator.methods.max = function(value, element, params) { + var localizedValue = Inputmask.unmask(value, { + alias : "numeric", + unmaskAsNumber : true + }); + return this.optional(element) || localizedValue <= params; + }; + + /** + * Replaces the standard range validation to support number with comma. + * + * @name jQuery.validator.methods.number + * @type Boolean + */ + jQuery.validator.methods.range = function(value, element, params) { + var localizedValue = Inputmask.unmask(value, { + alias : "numeric", + unmaskAsNumber : true + }); + return this.optional(element) + || (localizedValue >= params[0] && localizedValue <= params[1]); + }; + + /** + * Return true if the field value matches the given RegExp + * + * The difference between `pattern` method is than this one + * use parameter as expression literally (`pattern` includes + * prefix and suffix). + */ + $.validator.addMethod("regexp", function(value, element, param) { + if (this.optional(element)) { + return true; + } + if (typeof param === "string") { + param = new RegExp(param); + } + return param.test(value); + }, "Invalid format."); + + /** + * jquery.inputmask rule: delegates on inputmask control + */ + jQuery.validator.addMethod("inputmask", function(value, element, params) { + if (this.optional(element)) { + return true; + } + var $inputmask = jQuery(element); + return $inputmask.inputmask && $inputmask.inputmask("isComplete"); + }, "Please enter a valid value."); + + // Form validation init + jQuery("form.validate") + .each( + function(index) { + var $form = $(this); + + // see options at https://jqueryvalidation.org/documentation/ + $form + .validate({ + highlight : function(element) { + var $element = $(element); + // añadir marca error + $element.closest('.form-group').addClass('has-error has-feedback'); + // añadir span con icono + var iconSpan = $element.parent().find('span.form-control-feedback'); + if (!iconSpan.length) { + $element + .after(''); + } + }, + unhighlight : function(element) { + var $element = $(element); + // añadir marca error + $element.closest('.form-group').removeClass('has-error has-feedback'); + // quitar span con icono + $element.parent().find('span.form-control-feedback.glyphicon-remove') + .remove(); + // limpiar errores + if ($element.parent('.input-group').length) { + $element.parent('.input-group').parent().find( + 'span.help-block[id=' + $element.attr('id') + '-error]') + .remove(); + + } else { + $element.parent().find( + 'span.help-block[id=' + $element.attr('id') + '-error]') + .remove(); + } + }, + errorElement : 'span', + errorClass : 'help-block', + errorPlacement : function(error, element) { + var $element = $(element); + + var $previousErrors; + if ($element.parent('.input-group').length) { + $previousErrors = $element.parent('.input-group').parent() + .find('span.help-block[id=' + $element.attr('id') + '-error]'); + } else { + $previousErrors = $element.parent().find( + 'span.help-block[id=' + $element.attr('id') + '-error]'); + } + + if ($previousErrors.length === 1) { + $previousErrors.replaceWith(error); + } else { + if ($previousErrors.length > 1) { + // mas de un error limpiamos + $previousErrors.remove(); + } + // insertar error + if ($element.parent('.input-group').length) { + error.insertAfter($element.parent()); + } else { + $element.parent().append(error); + } + } + + } + }); + + // Iterate form inputs to set validation rules and messages + $form.find("input,textarea,select").each(function(index) { + var $input = $(this); + var data = $input.data(); + + // this input validation rules + var rules = { + required : data.required, + messages : {} + }; + if (isNotNull(data.missing)) { + rules.messages.required = data.missing + } + if (isNotNull(data.invalid)) { + rules.messages.remote = data.invalid + } + + // inputmaks + if ($input.hasClass("inputmask")) { + rules["inputmask"] = true; + if (isNotNull(data.invalid)) { + rules.messages.inputmask = data.invalid + } + } + // datetimepicker + if (isNotEmpty(data.dateformat)) { + rules["dateformat"] = moment.javaToMomentDateFormat(data.dateformat); + if (isNotNull(data.invalid)) { + rules.messages.dateformat = data.invalid + } + // datetimepicker without format + } else if ($input.hasClass("datetimepicker")) { + rules["dateformat"] = "DEFAULT"; + if (isNotNull(data.invalid)) { + rules.messages.dateformat = data.invalid + } + } + + $input.rules("add", rules); + }); + }); + }); +})(jQuery); + + diff --git a/roo/src/main/resources/templates/accessibility.html b/roo/src/main/resources/templates/accessibility.html new file mode 100644 index 0000000000..f486646c65 --- /dev/null +++ b/roo/src/main/resources/templates/accessibility.html @@ -0,0 +1,61 @@ + + + + + Accessibility - Spring Roo application + + + + +
+ +
+ + +
+ + +
+ +
+
+

Accessibility

+

Accessibility policy application

+

+ Spring Roo Application is committed to ensuring the accessibility of + its web content to people with disabilities. All of the content on + our website will meet + W3C WAI's Web Content Accessibility Guidelines 2.0, Level AA + conformance. Any issues should be reported to + springroo@disid.com. + The technologies that is depended to access the accessible content are HTML, CSS and Javascript. +

+
+
+ +
+ +
+ + +
+ +
+ + + + + +
+
+ + + + \ No newline at end of file diff --git a/roo/src/main/resources/templates/books/create.html b/roo/src/main/resources/templates/books/create.html new file mode 100644 index 0000000000..dabe34da10 --- /dev/null +++ b/roo/src/main/resources/templates/books/create.html @@ -0,0 +1,153 @@ + + + + + + Create Book - roo - SpringRoo Application + + + + + + + + +
+ +
+ + +
+ + +
+
+ +

Create Book

+ + +
+ +
+ Book data + +
+ +
+ + + Error message. +
+
+
+ +
+ + + Error message. +
+
+
+ +
+ + + Error message. +
+
+
+ + + +
+
+ + +
+
+ +
+ + +
+ +
+ +
+ + +
+ +
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
+ + + + \ No newline at end of file diff --git a/roo/src/main/resources/templates/books/edit.html b/roo/src/main/resources/templates/books/edit.html new file mode 100644 index 0000000000..e6d39a44be --- /dev/null +++ b/roo/src/main/resources/templates/books/edit.html @@ -0,0 +1,171 @@ + + + + + + Edit Book - Spring Roo application + + + + + + + + + +
+ +
+ + +
+ + +
+ +
+ +

Edit Book

+ + +
+ + + + +
+

Warning! This record has been updated by an other user.

+
+ +
+
+ +
+
+ +
+ + +
+ Book data + +
+ +
+ + + Error message. +
+
+
+ +
+ + + Error message. +
+
+
+ +
+ + + Error message. +
+
+
+ + + +
+
+
+ +
+
+ +
+
+
+ +
+ + +
+ +
+ +
+ + +
+ +
+ + + + + +
+ + + + + + + + + + + + + + + + + +
+ + + + diff --git a/roo/src/main/resources/templates/books/list.html b/roo/src/main/resources/templates/books/list.html new file mode 100644 index 0000000000..d7e1fe24ca --- /dev/null +++ b/roo/src/main/resources/templates/books/list.html @@ -0,0 +1,98 @@ + + + + + + List Book - roo - SpringRoo Application + + + + + +
+ +
+ + +
+ + +
+
+ +

Books

+ + +
+ + + + + + + + + + + + + + + + + + + + +
Book List
titleauthorisbnTools
titleauthorisbnTools
+ +
+
+
+
+
+
+
+ + + +
+ +
+ +
+ +
+ +
+ + +
+ +
+ + + + + +
+
+ + + + diff --git a/roo/src/main/resources/templates/books/show.html b/roo/src/main/resources/templates/books/show.html new file mode 100644 index 0000000000..92311c36f5 --- /dev/null +++ b/roo/src/main/resources/templates/books/show.html @@ -0,0 +1,86 @@ + + + + + Show Book - Spring Roo application + + + + + +
+ +
+ + +
+ + +
+
+ + +

Show Book

+ +
+

Book data

+
    +
  • + title + titleValue +
  • +
  • + author + authorValue +
  • +
  • + isbn + isbnValue +
  • +
+
+ + +
+
+ Edit +
+
+ + +
+ +
+
+ +
+ +
+ + +
+ +
+ + + + + +
+
+ + + + diff --git a/roo/src/main/resources/templates/books/showInline.html b/roo/src/main/resources/templates/books/showInline.html new file mode 100644 index 0000000000..9fbc62cf26 --- /dev/null +++ b/roo/src/main/resources/templates/books/showInline.html @@ -0,0 +1,67 @@ + + + + + Show Book - Spring Roo application + + + + + +
+ +
+ + +
+ + +
+
+ + +
+
    +
  • + title + titleValue +
  • +
  • + author + authorValue +
  • +
  • + isbn + isbnValue +
  • +
+
+ +
+ +
+ +
+ + +
+ +
+ + + + + +
+
+ + + + diff --git a/roo/src/main/resources/templates/error.html b/roo/src/main/resources/templates/error.html new file mode 100644 index 0000000000..7559baba22 --- /dev/null +++ b/roo/src/main/resources/templates/error.html @@ -0,0 +1,40 @@ + + + + + Error - Spring Roo application + + + + + +
+

Error Page

+ +
+ + +
+ + +
+ +
+ +
+ +
+ +
+ + \ No newline at end of file diff --git a/roo/src/main/resources/templates/fragments/footer.html b/roo/src/main/resources/templates/fragments/footer.html new file mode 100644 index 0000000000..38999c1b75 --- /dev/null +++ b/roo/src/main/resources/templates/fragments/footer.html @@ -0,0 +1,51 @@ + + + + + Footer + + + + + + + diff --git a/roo/src/main/resources/templates/fragments/header.html b/roo/src/main/resources/templates/fragments/header.html new file mode 100644 index 0000000000..8421d6d77f --- /dev/null +++ b/roo/src/main/resources/templates/fragments/header.html @@ -0,0 +1,21 @@ + + + + + Header + + + +
+
+
+

roo

+

Hello, this is your home page.

+
+
+
+ + \ No newline at end of file diff --git a/roo/src/main/resources/templates/fragments/js/datatables-locale.js b/roo/src/main/resources/templates/fragments/js/datatables-locale.js new file mode 100644 index 0000000000..ad1a32955d --- /dev/null +++ b/roo/src/main/resources/templates/fragments/js/datatables-locale.js @@ -0,0 +1,67 @@ +// IIFE - Immediately Invoked Function Expression +(function(translateDatatables) { + + // The global jQuery object is passed as a parameter + translateDatatables(window.jQuery, window, document); + +}(function($, window, document) { + + // The $ is now locally scoped, it won't collide with other libraries + + // Listen for the jQuery ready event on the document + // READY EVENT BEGIN + $(function() { + + // The DOM is ready! + //console.log('The DOM is ready'); + + // Set datatables defaults + $.extend($.fn.dataTable.defaults, { + // multilingual texts definitions, adding some to those already provided + // default by Datatables + 'language': { + 'buttons': { + 'add': /*[[#{label_datatables_add}]]*/ 'Add', + 'delete': /*[[#{label_datatables_delete}]]*/ 'Delete', + 'colvis': /*[[#{label_datatables_columns}]]*/ 'Columns', + 'pageLength': /*[[#{label_datatables_showRows}]]*/ 'Show %d rows' + }, + 'select': { + 'rows': { + _: /*[[#{label_datatables_selectedRows}]]*/ '%d selected rows', + 0: "", + 1: /*[[#{label_datatables_selectedRow}]]*/ '1 selected row' + } + }, + 'decimal': /*[[#{label_datatables_decimal}]]*/ '.', + 'emptyTable': /*[[#{label_datatables_emptyTable}]]*/ 'No data available in table', + 'info': /*[[#{label_datatables_info}]]*/ 'Showing _START_ to _END_ of _TOTAL_ entries', + 'infoEmpty': /*[[#{label_datatables_infoEmpty}]]*/ 'Showing 0 to 0 of 0 entries', + 'infoFiltered': /*[[#{label_datatables_infoFiltered}]]*/ '(filtered from _MAX_ total entries)', + 'infoPostFix': /*[[#{label_datatables_infoPostFix}]]*/ '', + 'thousands': /*[[#{label_datatables_thousands}]]*/ '', + 'lengthMenu': /*[[#{label_datatables_lengthMenu}]]*/ 'Show _MENU_ entries', + 'loadingRecords': /*[[#{label_datatables_loadingRecords}]]*/ 'Loading...', + 'processing': /*[[#{label_datatables_processing}]]*/ 'Processing...', + 'search': /*[[#{label_datatables_search}]]*/ 'Search:', + 'zeroRecords': /*[[#{label_datatables_zeroRecords}]]*/ ' No matching records found', + 'paginate': { + 'first': /*[[#{label_datatables_first}]]*/ 'First', + 'last': /*[[#{label_datatables_last}]]*/ 'Last', + 'next': /*[[#{label_datatables_next}]]*/ 'Next', + 'previous': /*[[#{label_datatables_previous}]]*/ 'Previous' + }, + 'aria': { + 'sortAscending': /*[[#{label_datatables_sortAscending}]]*/ ': activate to sort column ascending', + 'sortDescending': /*[[#{label_datatables_sortDescending}]]*/ ': activate to sort column descending' + } + } + }); + + }); + + // READY EVENT END + //console.log('The DOM may not be ready'); + + // The rest of code goes here! +})); diff --git a/roo/src/main/resources/templates/fragments/js/datatables.html b/roo/src/main/resources/templates/fragments/js/datatables.html new file mode 100644 index 0000000000..5993777eb3 --- /dev/null +++ b/roo/src/main/resources/templates/fragments/js/datatables.html @@ -0,0 +1,78 @@ + + + + + Session info + + + + + +
+ + +
+

Error

+
+ + + + + + + + + + + + + + + + + + + + + + + + +
+ + \ No newline at end of file diff --git a/roo/src/main/resources/templates/fragments/js/select2.html b/roo/src/main/resources/templates/fragments/js/select2.html new file mode 100644 index 0000000000..ce2c6bd7a4 --- /dev/null +++ b/roo/src/main/resources/templates/fragments/js/select2.html @@ -0,0 +1,16 @@ + + + + +Select2 + + +
+ + + +
+ + diff --git a/roo/src/main/resources/templates/fragments/languages.html b/roo/src/main/resources/templates/fragments/languages.html new file mode 100644 index 0000000000..248f9eaea0 --- /dev/null +++ b/roo/src/main/resources/templates/fragments/languages.html @@ -0,0 +1,33 @@ + + + + + Languages + + + + + + + \ No newline at end of file diff --git a/roo/src/main/resources/templates/fragments/menu.html b/roo/src/main/resources/templates/fragments/menu.html new file mode 100644 index 0000000000..86143276e1 --- /dev/null +++ b/roo/src/main/resources/templates/fragments/menu.html @@ -0,0 +1,107 @@ + + + + + Page menu + + + + + + + + + + diff --git a/roo/src/main/resources/templates/fragments/modal-confirm-delete-batch.html b/roo/src/main/resources/templates/fragments/modal-confirm-delete-batch.html new file mode 100644 index 0000000000..3ce82279ac --- /dev/null +++ b/roo/src/main/resources/templates/fragments/modal-confirm-delete-batch.html @@ -0,0 +1,34 @@ + + + + +Modal + + + +
+
+
+

Going to remove the selected elements

+
+
+ + +
+
+ +
+

Removed selected items

+
+ +
+

Error deleting selected items.

+
+ +
+ + \ No newline at end of file diff --git a/roo/src/main/resources/templates/fragments/modal-confirm-delete.html b/roo/src/main/resources/templates/fragments/modal-confirm-delete.html new file mode 100644 index 0000000000..658c04054f --- /dev/null +++ b/roo/src/main/resources/templates/fragments/modal-confirm-delete.html @@ -0,0 +1,35 @@ + + + + +Modal + + + +
+
+
+

Going to remove the selected + element

+
+
+ + +
+
+ +
+

1 Removed item

+
+ +
+

Error deleting selected item.

+
+ +
+ + \ No newline at end of file diff --git a/roo/src/main/resources/templates/fragments/modal-confirm.html b/roo/src/main/resources/templates/fragments/modal-confirm.html new file mode 100644 index 0000000000..7d0fb8d4f8 --- /dev/null +++ b/roo/src/main/resources/templates/fragments/modal-confirm.html @@ -0,0 +1,32 @@ + + + + +Modal + + + +
+
+
+ +

Going to remove the selected + element

+ +
+
+ 100% Complete +
+
+
+ +
+
+ + \ No newline at end of file diff --git a/roo/src/main/resources/templates/fragments/modal-export-empty-error.html b/roo/src/main/resources/templates/fragments/modal-export-empty-error.html new file mode 100644 index 0000000000..dd84d8fe9e --- /dev/null +++ b/roo/src/main/resources/templates/fragments/modal-export-empty-error.html @@ -0,0 +1,20 @@ + + + + +Modal + + + +
+ +
+

No records found to generate a report.

+
+ +
+ + \ No newline at end of file diff --git a/roo/src/main/resources/templates/fragments/modal.html b/roo/src/main/resources/templates/fragments/modal.html new file mode 100644 index 0000000000..55e13158a4 --- /dev/null +++ b/roo/src/main/resources/templates/fragments/modal.html @@ -0,0 +1,27 @@ + + + + + Modal + + + + + + \ No newline at end of file diff --git a/roo/src/main/resources/templates/fragments/session-links.html b/roo/src/main/resources/templates/fragments/session-links.html new file mode 100644 index 0000000000..786a7a4aec --- /dev/null +++ b/roo/src/main/resources/templates/fragments/session-links.html @@ -0,0 +1,46 @@ + + + + + Session info + + + + + + + + + \ No newline at end of file diff --git a/roo/src/main/resources/templates/index.html b/roo/src/main/resources/templates/index.html new file mode 100644 index 0000000000..e4aac5e9a7 --- /dev/null +++ b/roo/src/main/resources/templates/index.html @@ -0,0 +1,150 @@ + + + + + Welcome - SpringRoo Application + + + + + +
+ +
+ + +
+ + +
+
+ +
+ +
+ +
+

With Roo you can easily build full Java applications in minutes.

+

Spring Roo is a next-generation rapid application development tool for Java developers. + It focuses on higher productivity, stock-standard Java APIs, high usability, avoiding engineering trade-offs and + facilitating easy Roo removal. +

+

Thanks for your interest in Spring Roo!

+
+
+
+ + +
+ + +
+
+
+
+ +
+
+

Doc

+ If you are looking for Reference Documentation you can get it here. +
+
+
+
+ + +
+
+
+
+ +
+
+

Project Page

+ All the info about Spring Roo development. +
+
+
+
+ + +
+
+
+
+ +
+
+

Support

+ If you have any question about the project, + you can check it. +
+
+
+
+ + +
+
+
+
+ +
+
+

Code

+ Known, modify and redistribute the source code. +
+
+
+
+ +
+ + +
+
+ +
+
+ +
+
+ +
+ + +
+ +
+ + + + + +
+
+ + + + diff --git a/roo/src/main/resources/templates/layouts/default-layout-no-menu.html b/roo/src/main/resources/templates/layouts/default-layout-no-menu.html new file mode 100644 index 0000000000..40d502800f --- /dev/null +++ b/roo/src/main/resources/templates/layouts/default-layout-no-menu.html @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + Spring Roo application + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+ +
+ +

Sample static body for direct display of the template

+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent + scelerisque neque neque, ac elementum quam dignissim interdum. Phasellus et + placerat elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. + Praesent scelerisque neque neque, ac elementum quam dignissim interdum. + Phasellus et placerat elit.

+
+ +
+ +
+ + © 2016 Spring Roo (footer for example for direct display of the template) +
+ + + + + + + + + + + + + + + + + + +
+ +
+ + + + + diff --git a/roo/src/main/resources/templates/layouts/default-layout.html b/roo/src/main/resources/templates/layouts/default-layout.html new file mode 100644 index 0000000000..ba597630d4 --- /dev/null +++ b/roo/src/main/resources/templates/layouts/default-layout.html @@ -0,0 +1,110 @@ + + + + + + + + + + + + + + + + Spring Roo application + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+ +
+ +

Sample static body for direct display of the template

+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent + scelerisque neque neque, ac elementum quam dignissim interdum. Phasellus et + placerat elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. + Praesent scelerisque neque neque, ac elementum quam dignissim interdum. + Phasellus et placerat elit.

+
+ +
+ +
+ + © 2016 Spring Roo (footer for example for direct display of the template) +
+ + + + + + + + + + + + + + + + + + + +
+
+ +
+ +
+ + + + + diff --git a/roo/src/main/resources/templates/layouts/default-list-layout.html b/roo/src/main/resources/templates/layouts/default-list-layout.html new file mode 100644 index 0000000000..23f5002241 --- /dev/null +++ b/roo/src/main/resources/templates/layouts/default-list-layout.html @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + Spring Roo application + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+ +
+ +

Sample static body for direct display of the template

+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent + scelerisque neque neque, ac elementum quam dignissim interdum. Phasellus et + placerat elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. + Praesent scelerisque neque neque, ac elementum quam dignissim interdum. + Phasellus et placerat elit.

+
+ +
+ +
+ + © 2016 Spring Roo (footer for example for direct display of the template) +
+ + + + + + + + + + + + + + + + + + + +
+
+ +
+ +
+ + + + + diff --git a/roo/src/main/resources/templates/layouts/home-layout.html b/roo/src/main/resources/templates/layouts/home-layout.html new file mode 100644 index 0000000000..7c1d2f7c5c --- /dev/null +++ b/roo/src/main/resources/templates/layouts/home-layout.html @@ -0,0 +1,104 @@ + + + + + + + + + + + + + + Spring Roo application + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +

Sample page header for direct display of the template

+
+
+ +
+ +
+ +

Sample static body for direct display of the template

+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent + scelerisque neque neque, ac elementum quam dignissim interdum. Phasellus et + placerat elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. + Praesent scelerisque neque neque, ac elementum quam dignissim interdum. + Phasellus et placerat elit.

+
+ +
+ +
+ + © 2016 Spring Roo (footer for example for direct display of the template) +
+ + + + + + + + + + + + + + + + + + +
+ +
+ + + + + diff --git a/roo/src/main/resources/templates/login.html b/roo/src/main/resources/templates/login.html new file mode 100644 index 0000000000..627b165049 --- /dev/null +++ b/roo/src/main/resources/templates/login.html @@ -0,0 +1,108 @@ + + + + + Login- Spring Roo application + + + + + +
+ +
+ + +
+ + +
+
+ +
+
+

Login

+
+
+
+
+ Enter your login and password + + + + + + +
+ +
+ + +
+
+
+ +
+ + +
+
+
+
+ + +
+
+
+
+
+
+
+
+ +
+ + +
+ +
+ + + + + +
+
+ + + + diff --git a/roo/src/main/resources/templates/reports/export_default.jrxml b/roo/src/main/resources/templates/reports/export_default.jrxml new file mode 100644 index 0000000000..3540f690de --- /dev/null +++ b/roo/src/main/resources/templates/reports/export_default.jrxml @@ -0,0 +1,59 @@ + + + + + + + + + + <band height="94"> + <frame> + <reportElement mode="Opaque" x="-20" y="-20" width="595" height="92" backcolor="#054571" uuid="96670a12-0a0b-4503-8309-d43c1bd41fa5"/> + <staticText> + <reportElement x="20" y="20" width="234" height="43" forecolor="#FFFFFF" uuid="887580cd-50ec-499d-ba19-3971bf3a5552"/> + <textElement> + <font size="34" isBold="true"/> + </textElement> + <text><![CDATA[Export]]></text> + </staticText> + </frame> + <staticText> + <reportElement x="206" y="74" width="100" height="20" uuid="6efdf519-1cda-447d-bb04-5dfca2ae8aed"/> + <text><![CDATA[]]></text> + </staticText> + </band> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 18903e239dd1962d1db3f1abb5adbc2ae76cc235 Mon Sep 17 00:00:00 2001 From: iaforek Date: Tue, 18 Apr 2017 11:21:57 +0100 Subject: [PATCH 04/54] Moved project from roo to spring-roo folder. --- {roo => spring-roo}/pom.xml | 0 .../src/main/java/com/baeldung/RooApplication.java | 0 ...ingDataJpaDetachableRepositoryConfiguration.java | 0 ...onfiguration_Roo_Jpa_Repository_Configuration.aj | 0 .../com/baeldung/config/WebMvcConfiguration.java | 0 ...MvcConfiguration_Roo_ThymeleafUIConfiguration.aj | 0 .../WebMvcConfiguration_Roo_WebMvcConfiguration.aj | 0 .../baeldung/config/jackson/DomainModelModule.java | 0 .../DomainModelModule_Roo_DomainModelModule.aj | 0 .../src/main/java/com/baeldung/domain/Book.java | 0 .../java/com/baeldung/domain/Book_Roo_Equals.aj | 0 .../java/com/baeldung/domain/Book_Roo_JavaBean.aj | 0 .../java/com/baeldung/domain/Book_Roo_Jpa_Entity.aj | 0 .../java/com/baeldung/domain/Book_Roo_ToString.aj | 0 .../com/baeldung/repository/BookRepository.java | 0 .../baeldung/repository/BookRepositoryCustom.java | 0 ...ookRepositoryCustom_Roo_Jpa_Repository_Custom.aj | 0 .../com/baeldung/repository/BookRepositoryImpl.java | 0 .../BookRepositoryImpl_Roo_Jpa_Repository_Impl.aj | 0 .../repository/BookRepository_Roo_Jpa_Repository.aj | 0 .../java/com/baeldung/service/api/BookService.java | 0 .../baeldung/service/api/BookService_Roo_Service.aj | 0 .../com/baeldung/service/impl/BookServiceImpl.java | 0 .../impl/BookServiceImpl_Roo_Service_Impl.aj | 0 .../java/com/baeldung/web/BookDeserializer.java | 0 .../web/BookDeserializer_Roo_EntityDeserializer.aj | 0 .../main/java/com/baeldung/web/BookJsonMixin.java | 0 .../web/BooksCollectionThymeleafController.java | 0 ...sCollectionThymeleafController_Roo_Controller.aj | 0 ...ksCollectionThymeleafController_Roo_Thymeleaf.aj | 0 .../web/BooksCollectionThymeleafLinkFactory.java | 0 ...ollectionThymeleafLinkFactory_Roo_LinkFactory.aj | 0 .../baeldung/web/BooksItemThymeleafController.java | 0 .../BooksItemThymeleafController_Roo_Controller.aj | 0 .../BooksItemThymeleafController_Roo_Thymeleaf.aj | 0 .../baeldung/web/BooksItemThymeleafLinkFactory.java | 0 ...BooksItemThymeleafLinkFactory_Roo_LinkFactory.aj | 0 .../main/java/com/baeldung/web/MainController.java | 0 .../MainController_Roo_Thymeleaf_MainController.aj | 0 .../web/reports/ExportingErrorException.java | 0 .../web/reports/JasperReportsCsvExporter.java | 0 .../baeldung/web/reports/JasperReportsExporter.java | 0 .../web/reports/JasperReportsPdfExporter.java | 0 .../web/reports/JasperReportsXlsExporter.java | 0 .../src/main/resources/application-dev.properties | 0 .../src/main/resources/application.properties | 0 {roo => spring-roo}/src/main/resources/banner.txt | 0 .../src/main/resources/messages.properties | 0 .../main/resources/static/public/css/springroo.css | 0 .../src/main/resources/static/public/css/theme.css | 0 .../static/public/fonts/fontawesome-webfont.eot | Bin .../static/public/fonts/fontawesome-webfont.svg | 0 .../static/public/fonts/fontawesome-webfont.ttf | Bin .../static/public/fonts/fontawesome-webfont.woff | Bin .../static/public/fonts/fontawesome-webfont.woff2 | Bin .../public/fonts/glyphicons-halflings-regular.eot | Bin .../public/fonts/glyphicons-halflings-regular.svg | 0 .../public/fonts/glyphicons-halflings-regular.ttf | Bin .../public/fonts/glyphicons-halflings-regular.woff | Bin .../public/fonts/glyphicons-halflings-regular.woff2 | Bin .../static/public/img/apple-touch-icon.png | Bin .../src/main/resources/static/public/img/en.png | Bin .../src/main/resources/static/public/img/es.png | Bin .../main/resources/static/public/img/favicon.ico | Bin .../src/main/resources/static/public/img/geo.png | Bin .../src/main/resources/static/public/img/logo.png | Bin .../main/resources/static/public/img/owasp_logo.png | Bin .../resources/static/public/img/springroo-logo.png | Bin .../static/public/js/dataTables.advanced.js | 0 .../static/public/js/datatables-defaults.js | 0 .../static/public/js/datetimepicker-defaults.js | 0 .../static/public/js/inputmask-defaults.js | 0 .../src/main/resources/static/public/js/main.js | 0 .../resources/static/public/js/moment-defaults.js | 0 .../resources/static/public/js/moment-locale-es.js | 0 .../resources/static/public/js/select2-defaults.js | 0 .../static/public/js/validation-defaults.js | 0 .../src/main/resources/templates/accessibility.html | 0 .../src/main/resources/templates/books/create.html | 0 .../src/main/resources/templates/books/edit.html | 0 .../src/main/resources/templates/books/list.html | 0 .../src/main/resources/templates/books/show.html | 0 .../main/resources/templates/books/showInline.html | 0 .../src/main/resources/templates/error.html | 0 .../main/resources/templates/fragments/footer.html | 0 .../main/resources/templates/fragments/header.html | 0 .../templates/fragments/js/datatables-locale.js | 0 .../templates/fragments/js/datatables.html | 0 .../resources/templates/fragments/js/select2.html | 0 .../resources/templates/fragments/languages.html | 0 .../main/resources/templates/fragments/menu.html | 0 .../fragments/modal-confirm-delete-batch.html | 0 .../templates/fragments/modal-confirm-delete.html | 0 .../templates/fragments/modal-confirm.html | 0 .../fragments/modal-export-empty-error.html | 0 .../main/resources/templates/fragments/modal.html | 0 .../templates/fragments/session-links.html | 0 .../src/main/resources/templates/index.html | 0 .../templates/layouts/default-layout-no-menu.html | 0 .../resources/templates/layouts/default-layout.html | 0 .../templates/layouts/default-list-layout.html | 0 .../resources/templates/layouts/home-layout.html | 0 .../src/main/resources/templates/login.html | 0 .../templates/reports/export_default.jrxml | 0 104 files changed, 0 insertions(+), 0 deletions(-) rename {roo => spring-roo}/pom.xml (100%) rename {roo => spring-roo}/src/main/java/com/baeldung/RooApplication.java (100%) rename {roo => spring-roo}/src/main/java/com/baeldung/config/SpringDataJpaDetachableRepositoryConfiguration.java (100%) rename {roo => spring-roo}/src/main/java/com/baeldung/config/SpringDataJpaDetachableRepositoryConfiguration_Roo_Jpa_Repository_Configuration.aj (100%) rename {roo => spring-roo}/src/main/java/com/baeldung/config/WebMvcConfiguration.java (100%) rename {roo => spring-roo}/src/main/java/com/baeldung/config/WebMvcConfiguration_Roo_ThymeleafUIConfiguration.aj (100%) rename {roo => spring-roo}/src/main/java/com/baeldung/config/WebMvcConfiguration_Roo_WebMvcConfiguration.aj (100%) rename {roo => spring-roo}/src/main/java/com/baeldung/config/jackson/DomainModelModule.java (100%) rename {roo => spring-roo}/src/main/java/com/baeldung/config/jackson/DomainModelModule_Roo_DomainModelModule.aj (100%) rename {roo => spring-roo}/src/main/java/com/baeldung/domain/Book.java (100%) rename {roo => spring-roo}/src/main/java/com/baeldung/domain/Book_Roo_Equals.aj (100%) rename {roo => spring-roo}/src/main/java/com/baeldung/domain/Book_Roo_JavaBean.aj (100%) rename {roo => spring-roo}/src/main/java/com/baeldung/domain/Book_Roo_Jpa_Entity.aj (100%) rename {roo => spring-roo}/src/main/java/com/baeldung/domain/Book_Roo_ToString.aj (100%) rename {roo => spring-roo}/src/main/java/com/baeldung/repository/BookRepository.java (100%) rename {roo => spring-roo}/src/main/java/com/baeldung/repository/BookRepositoryCustom.java (100%) rename {roo => spring-roo}/src/main/java/com/baeldung/repository/BookRepositoryCustom_Roo_Jpa_Repository_Custom.aj (100%) rename {roo => spring-roo}/src/main/java/com/baeldung/repository/BookRepositoryImpl.java (100%) rename {roo => spring-roo}/src/main/java/com/baeldung/repository/BookRepositoryImpl_Roo_Jpa_Repository_Impl.aj (100%) rename {roo => spring-roo}/src/main/java/com/baeldung/repository/BookRepository_Roo_Jpa_Repository.aj (100%) rename {roo => spring-roo}/src/main/java/com/baeldung/service/api/BookService.java (100%) rename {roo => spring-roo}/src/main/java/com/baeldung/service/api/BookService_Roo_Service.aj (100%) rename {roo => spring-roo}/src/main/java/com/baeldung/service/impl/BookServiceImpl.java (100%) rename {roo => spring-roo}/src/main/java/com/baeldung/service/impl/BookServiceImpl_Roo_Service_Impl.aj (100%) rename {roo => spring-roo}/src/main/java/com/baeldung/web/BookDeserializer.java (100%) rename {roo => spring-roo}/src/main/java/com/baeldung/web/BookDeserializer_Roo_EntityDeserializer.aj (100%) rename {roo => spring-roo}/src/main/java/com/baeldung/web/BookJsonMixin.java (100%) rename {roo => spring-roo}/src/main/java/com/baeldung/web/BooksCollectionThymeleafController.java (100%) rename {roo => spring-roo}/src/main/java/com/baeldung/web/BooksCollectionThymeleafController_Roo_Controller.aj (100%) rename {roo => spring-roo}/src/main/java/com/baeldung/web/BooksCollectionThymeleafController_Roo_Thymeleaf.aj (100%) rename {roo => spring-roo}/src/main/java/com/baeldung/web/BooksCollectionThymeleafLinkFactory.java (100%) rename {roo => spring-roo}/src/main/java/com/baeldung/web/BooksCollectionThymeleafLinkFactory_Roo_LinkFactory.aj (100%) rename {roo => spring-roo}/src/main/java/com/baeldung/web/BooksItemThymeleafController.java (100%) rename {roo => spring-roo}/src/main/java/com/baeldung/web/BooksItemThymeleafController_Roo_Controller.aj (100%) rename {roo => spring-roo}/src/main/java/com/baeldung/web/BooksItemThymeleafController_Roo_Thymeleaf.aj (100%) rename {roo => spring-roo}/src/main/java/com/baeldung/web/BooksItemThymeleafLinkFactory.java (100%) rename {roo => spring-roo}/src/main/java/com/baeldung/web/BooksItemThymeleafLinkFactory_Roo_LinkFactory.aj (100%) rename {roo => spring-roo}/src/main/java/com/baeldung/web/MainController.java (100%) rename {roo => spring-roo}/src/main/java/com/baeldung/web/MainController_Roo_Thymeleaf_MainController.aj (100%) rename {roo => spring-roo}/src/main/java/com/baeldung/web/reports/ExportingErrorException.java (100%) rename {roo => spring-roo}/src/main/java/com/baeldung/web/reports/JasperReportsCsvExporter.java (100%) rename {roo => spring-roo}/src/main/java/com/baeldung/web/reports/JasperReportsExporter.java (100%) rename {roo => spring-roo}/src/main/java/com/baeldung/web/reports/JasperReportsPdfExporter.java (100%) rename {roo => spring-roo}/src/main/java/com/baeldung/web/reports/JasperReportsXlsExporter.java (100%) rename {roo => spring-roo}/src/main/resources/application-dev.properties (100%) rename {roo => spring-roo}/src/main/resources/application.properties (100%) rename {roo => spring-roo}/src/main/resources/banner.txt (100%) rename {roo => spring-roo}/src/main/resources/messages.properties (100%) rename {roo => spring-roo}/src/main/resources/static/public/css/springroo.css (100%) rename {roo => spring-roo}/src/main/resources/static/public/css/theme.css (100%) rename {roo => spring-roo}/src/main/resources/static/public/fonts/fontawesome-webfont.eot (100%) rename {roo => spring-roo}/src/main/resources/static/public/fonts/fontawesome-webfont.svg (100%) rename {roo => spring-roo}/src/main/resources/static/public/fonts/fontawesome-webfont.ttf (100%) rename {roo => spring-roo}/src/main/resources/static/public/fonts/fontawesome-webfont.woff (100%) rename {roo => spring-roo}/src/main/resources/static/public/fonts/fontawesome-webfont.woff2 (100%) rename {roo => spring-roo}/src/main/resources/static/public/fonts/glyphicons-halflings-regular.eot (100%) rename {roo => spring-roo}/src/main/resources/static/public/fonts/glyphicons-halflings-regular.svg (100%) rename {roo => spring-roo}/src/main/resources/static/public/fonts/glyphicons-halflings-regular.ttf (100%) rename {roo => spring-roo}/src/main/resources/static/public/fonts/glyphicons-halflings-regular.woff (100%) rename {roo => spring-roo}/src/main/resources/static/public/fonts/glyphicons-halflings-regular.woff2 (100%) rename {roo => spring-roo}/src/main/resources/static/public/img/apple-touch-icon.png (100%) rename {roo => spring-roo}/src/main/resources/static/public/img/en.png (100%) rename {roo => spring-roo}/src/main/resources/static/public/img/es.png (100%) rename {roo => spring-roo}/src/main/resources/static/public/img/favicon.ico (100%) rename {roo => spring-roo}/src/main/resources/static/public/img/geo.png (100%) rename {roo => spring-roo}/src/main/resources/static/public/img/logo.png (100%) rename {roo => spring-roo}/src/main/resources/static/public/img/owasp_logo.png (100%) rename {roo => spring-roo}/src/main/resources/static/public/img/springroo-logo.png (100%) rename {roo => spring-roo}/src/main/resources/static/public/js/dataTables.advanced.js (100%) rename {roo => spring-roo}/src/main/resources/static/public/js/datatables-defaults.js (100%) rename {roo => spring-roo}/src/main/resources/static/public/js/datetimepicker-defaults.js (100%) rename {roo => spring-roo}/src/main/resources/static/public/js/inputmask-defaults.js (100%) rename {roo => spring-roo}/src/main/resources/static/public/js/main.js (100%) rename {roo => spring-roo}/src/main/resources/static/public/js/moment-defaults.js (100%) rename {roo => spring-roo}/src/main/resources/static/public/js/moment-locale-es.js (100%) rename {roo => spring-roo}/src/main/resources/static/public/js/select2-defaults.js (100%) rename {roo => spring-roo}/src/main/resources/static/public/js/validation-defaults.js (100%) rename {roo => spring-roo}/src/main/resources/templates/accessibility.html (100%) rename {roo => spring-roo}/src/main/resources/templates/books/create.html (100%) rename {roo => spring-roo}/src/main/resources/templates/books/edit.html (100%) rename {roo => spring-roo}/src/main/resources/templates/books/list.html (100%) rename {roo => spring-roo}/src/main/resources/templates/books/show.html (100%) rename {roo => spring-roo}/src/main/resources/templates/books/showInline.html (100%) rename {roo => spring-roo}/src/main/resources/templates/error.html (100%) rename {roo => spring-roo}/src/main/resources/templates/fragments/footer.html (100%) rename {roo => spring-roo}/src/main/resources/templates/fragments/header.html (100%) rename {roo => spring-roo}/src/main/resources/templates/fragments/js/datatables-locale.js (100%) rename {roo => spring-roo}/src/main/resources/templates/fragments/js/datatables.html (100%) rename {roo => spring-roo}/src/main/resources/templates/fragments/js/select2.html (100%) rename {roo => spring-roo}/src/main/resources/templates/fragments/languages.html (100%) rename {roo => spring-roo}/src/main/resources/templates/fragments/menu.html (100%) rename {roo => spring-roo}/src/main/resources/templates/fragments/modal-confirm-delete-batch.html (100%) rename {roo => spring-roo}/src/main/resources/templates/fragments/modal-confirm-delete.html (100%) rename {roo => spring-roo}/src/main/resources/templates/fragments/modal-confirm.html (100%) rename {roo => spring-roo}/src/main/resources/templates/fragments/modal-export-empty-error.html (100%) rename {roo => spring-roo}/src/main/resources/templates/fragments/modal.html (100%) rename {roo => spring-roo}/src/main/resources/templates/fragments/session-links.html (100%) rename {roo => spring-roo}/src/main/resources/templates/index.html (100%) rename {roo => spring-roo}/src/main/resources/templates/layouts/default-layout-no-menu.html (100%) rename {roo => spring-roo}/src/main/resources/templates/layouts/default-layout.html (100%) rename {roo => spring-roo}/src/main/resources/templates/layouts/default-list-layout.html (100%) rename {roo => spring-roo}/src/main/resources/templates/layouts/home-layout.html (100%) rename {roo => spring-roo}/src/main/resources/templates/login.html (100%) rename {roo => spring-roo}/src/main/resources/templates/reports/export_default.jrxml (100%) diff --git a/roo/pom.xml b/spring-roo/pom.xml similarity index 100% rename from roo/pom.xml rename to spring-roo/pom.xml diff --git a/roo/src/main/java/com/baeldung/RooApplication.java b/spring-roo/src/main/java/com/baeldung/RooApplication.java similarity index 100% rename from roo/src/main/java/com/baeldung/RooApplication.java rename to spring-roo/src/main/java/com/baeldung/RooApplication.java diff --git a/roo/src/main/java/com/baeldung/config/SpringDataJpaDetachableRepositoryConfiguration.java b/spring-roo/src/main/java/com/baeldung/config/SpringDataJpaDetachableRepositoryConfiguration.java similarity index 100% rename from roo/src/main/java/com/baeldung/config/SpringDataJpaDetachableRepositoryConfiguration.java rename to spring-roo/src/main/java/com/baeldung/config/SpringDataJpaDetachableRepositoryConfiguration.java diff --git a/roo/src/main/java/com/baeldung/config/SpringDataJpaDetachableRepositoryConfiguration_Roo_Jpa_Repository_Configuration.aj b/spring-roo/src/main/java/com/baeldung/config/SpringDataJpaDetachableRepositoryConfiguration_Roo_Jpa_Repository_Configuration.aj similarity index 100% rename from roo/src/main/java/com/baeldung/config/SpringDataJpaDetachableRepositoryConfiguration_Roo_Jpa_Repository_Configuration.aj rename to spring-roo/src/main/java/com/baeldung/config/SpringDataJpaDetachableRepositoryConfiguration_Roo_Jpa_Repository_Configuration.aj diff --git a/roo/src/main/java/com/baeldung/config/WebMvcConfiguration.java b/spring-roo/src/main/java/com/baeldung/config/WebMvcConfiguration.java similarity index 100% rename from roo/src/main/java/com/baeldung/config/WebMvcConfiguration.java rename to spring-roo/src/main/java/com/baeldung/config/WebMvcConfiguration.java diff --git a/roo/src/main/java/com/baeldung/config/WebMvcConfiguration_Roo_ThymeleafUIConfiguration.aj b/spring-roo/src/main/java/com/baeldung/config/WebMvcConfiguration_Roo_ThymeleafUIConfiguration.aj similarity index 100% rename from roo/src/main/java/com/baeldung/config/WebMvcConfiguration_Roo_ThymeleafUIConfiguration.aj rename to spring-roo/src/main/java/com/baeldung/config/WebMvcConfiguration_Roo_ThymeleafUIConfiguration.aj diff --git a/roo/src/main/java/com/baeldung/config/WebMvcConfiguration_Roo_WebMvcConfiguration.aj b/spring-roo/src/main/java/com/baeldung/config/WebMvcConfiguration_Roo_WebMvcConfiguration.aj similarity index 100% rename from roo/src/main/java/com/baeldung/config/WebMvcConfiguration_Roo_WebMvcConfiguration.aj rename to spring-roo/src/main/java/com/baeldung/config/WebMvcConfiguration_Roo_WebMvcConfiguration.aj diff --git a/roo/src/main/java/com/baeldung/config/jackson/DomainModelModule.java b/spring-roo/src/main/java/com/baeldung/config/jackson/DomainModelModule.java similarity index 100% rename from roo/src/main/java/com/baeldung/config/jackson/DomainModelModule.java rename to spring-roo/src/main/java/com/baeldung/config/jackson/DomainModelModule.java diff --git a/roo/src/main/java/com/baeldung/config/jackson/DomainModelModule_Roo_DomainModelModule.aj b/spring-roo/src/main/java/com/baeldung/config/jackson/DomainModelModule_Roo_DomainModelModule.aj similarity index 100% rename from roo/src/main/java/com/baeldung/config/jackson/DomainModelModule_Roo_DomainModelModule.aj rename to spring-roo/src/main/java/com/baeldung/config/jackson/DomainModelModule_Roo_DomainModelModule.aj diff --git a/roo/src/main/java/com/baeldung/domain/Book.java b/spring-roo/src/main/java/com/baeldung/domain/Book.java similarity index 100% rename from roo/src/main/java/com/baeldung/domain/Book.java rename to spring-roo/src/main/java/com/baeldung/domain/Book.java diff --git a/roo/src/main/java/com/baeldung/domain/Book_Roo_Equals.aj b/spring-roo/src/main/java/com/baeldung/domain/Book_Roo_Equals.aj similarity index 100% rename from roo/src/main/java/com/baeldung/domain/Book_Roo_Equals.aj rename to spring-roo/src/main/java/com/baeldung/domain/Book_Roo_Equals.aj diff --git a/roo/src/main/java/com/baeldung/domain/Book_Roo_JavaBean.aj b/spring-roo/src/main/java/com/baeldung/domain/Book_Roo_JavaBean.aj similarity index 100% rename from roo/src/main/java/com/baeldung/domain/Book_Roo_JavaBean.aj rename to spring-roo/src/main/java/com/baeldung/domain/Book_Roo_JavaBean.aj diff --git a/roo/src/main/java/com/baeldung/domain/Book_Roo_Jpa_Entity.aj b/spring-roo/src/main/java/com/baeldung/domain/Book_Roo_Jpa_Entity.aj similarity index 100% rename from roo/src/main/java/com/baeldung/domain/Book_Roo_Jpa_Entity.aj rename to spring-roo/src/main/java/com/baeldung/domain/Book_Roo_Jpa_Entity.aj diff --git a/roo/src/main/java/com/baeldung/domain/Book_Roo_ToString.aj b/spring-roo/src/main/java/com/baeldung/domain/Book_Roo_ToString.aj similarity index 100% rename from roo/src/main/java/com/baeldung/domain/Book_Roo_ToString.aj rename to spring-roo/src/main/java/com/baeldung/domain/Book_Roo_ToString.aj diff --git a/roo/src/main/java/com/baeldung/repository/BookRepository.java b/spring-roo/src/main/java/com/baeldung/repository/BookRepository.java similarity index 100% rename from roo/src/main/java/com/baeldung/repository/BookRepository.java rename to spring-roo/src/main/java/com/baeldung/repository/BookRepository.java diff --git a/roo/src/main/java/com/baeldung/repository/BookRepositoryCustom.java b/spring-roo/src/main/java/com/baeldung/repository/BookRepositoryCustom.java similarity index 100% rename from roo/src/main/java/com/baeldung/repository/BookRepositoryCustom.java rename to spring-roo/src/main/java/com/baeldung/repository/BookRepositoryCustom.java diff --git a/roo/src/main/java/com/baeldung/repository/BookRepositoryCustom_Roo_Jpa_Repository_Custom.aj b/spring-roo/src/main/java/com/baeldung/repository/BookRepositoryCustom_Roo_Jpa_Repository_Custom.aj similarity index 100% rename from roo/src/main/java/com/baeldung/repository/BookRepositoryCustom_Roo_Jpa_Repository_Custom.aj rename to spring-roo/src/main/java/com/baeldung/repository/BookRepositoryCustom_Roo_Jpa_Repository_Custom.aj diff --git a/roo/src/main/java/com/baeldung/repository/BookRepositoryImpl.java b/spring-roo/src/main/java/com/baeldung/repository/BookRepositoryImpl.java similarity index 100% rename from roo/src/main/java/com/baeldung/repository/BookRepositoryImpl.java rename to spring-roo/src/main/java/com/baeldung/repository/BookRepositoryImpl.java diff --git a/roo/src/main/java/com/baeldung/repository/BookRepositoryImpl_Roo_Jpa_Repository_Impl.aj b/spring-roo/src/main/java/com/baeldung/repository/BookRepositoryImpl_Roo_Jpa_Repository_Impl.aj similarity index 100% rename from roo/src/main/java/com/baeldung/repository/BookRepositoryImpl_Roo_Jpa_Repository_Impl.aj rename to spring-roo/src/main/java/com/baeldung/repository/BookRepositoryImpl_Roo_Jpa_Repository_Impl.aj diff --git a/roo/src/main/java/com/baeldung/repository/BookRepository_Roo_Jpa_Repository.aj b/spring-roo/src/main/java/com/baeldung/repository/BookRepository_Roo_Jpa_Repository.aj similarity index 100% rename from roo/src/main/java/com/baeldung/repository/BookRepository_Roo_Jpa_Repository.aj rename to spring-roo/src/main/java/com/baeldung/repository/BookRepository_Roo_Jpa_Repository.aj diff --git a/roo/src/main/java/com/baeldung/service/api/BookService.java b/spring-roo/src/main/java/com/baeldung/service/api/BookService.java similarity index 100% rename from roo/src/main/java/com/baeldung/service/api/BookService.java rename to spring-roo/src/main/java/com/baeldung/service/api/BookService.java diff --git a/roo/src/main/java/com/baeldung/service/api/BookService_Roo_Service.aj b/spring-roo/src/main/java/com/baeldung/service/api/BookService_Roo_Service.aj similarity index 100% rename from roo/src/main/java/com/baeldung/service/api/BookService_Roo_Service.aj rename to spring-roo/src/main/java/com/baeldung/service/api/BookService_Roo_Service.aj diff --git a/roo/src/main/java/com/baeldung/service/impl/BookServiceImpl.java b/spring-roo/src/main/java/com/baeldung/service/impl/BookServiceImpl.java similarity index 100% rename from roo/src/main/java/com/baeldung/service/impl/BookServiceImpl.java rename to spring-roo/src/main/java/com/baeldung/service/impl/BookServiceImpl.java diff --git a/roo/src/main/java/com/baeldung/service/impl/BookServiceImpl_Roo_Service_Impl.aj b/spring-roo/src/main/java/com/baeldung/service/impl/BookServiceImpl_Roo_Service_Impl.aj similarity index 100% rename from roo/src/main/java/com/baeldung/service/impl/BookServiceImpl_Roo_Service_Impl.aj rename to spring-roo/src/main/java/com/baeldung/service/impl/BookServiceImpl_Roo_Service_Impl.aj diff --git a/roo/src/main/java/com/baeldung/web/BookDeserializer.java b/spring-roo/src/main/java/com/baeldung/web/BookDeserializer.java similarity index 100% rename from roo/src/main/java/com/baeldung/web/BookDeserializer.java rename to spring-roo/src/main/java/com/baeldung/web/BookDeserializer.java diff --git a/roo/src/main/java/com/baeldung/web/BookDeserializer_Roo_EntityDeserializer.aj b/spring-roo/src/main/java/com/baeldung/web/BookDeserializer_Roo_EntityDeserializer.aj similarity index 100% rename from roo/src/main/java/com/baeldung/web/BookDeserializer_Roo_EntityDeserializer.aj rename to spring-roo/src/main/java/com/baeldung/web/BookDeserializer_Roo_EntityDeserializer.aj diff --git a/roo/src/main/java/com/baeldung/web/BookJsonMixin.java b/spring-roo/src/main/java/com/baeldung/web/BookJsonMixin.java similarity index 100% rename from roo/src/main/java/com/baeldung/web/BookJsonMixin.java rename to spring-roo/src/main/java/com/baeldung/web/BookJsonMixin.java diff --git a/roo/src/main/java/com/baeldung/web/BooksCollectionThymeleafController.java b/spring-roo/src/main/java/com/baeldung/web/BooksCollectionThymeleafController.java similarity index 100% rename from roo/src/main/java/com/baeldung/web/BooksCollectionThymeleafController.java rename to spring-roo/src/main/java/com/baeldung/web/BooksCollectionThymeleafController.java diff --git a/roo/src/main/java/com/baeldung/web/BooksCollectionThymeleafController_Roo_Controller.aj b/spring-roo/src/main/java/com/baeldung/web/BooksCollectionThymeleafController_Roo_Controller.aj similarity index 100% rename from roo/src/main/java/com/baeldung/web/BooksCollectionThymeleafController_Roo_Controller.aj rename to spring-roo/src/main/java/com/baeldung/web/BooksCollectionThymeleafController_Roo_Controller.aj diff --git a/roo/src/main/java/com/baeldung/web/BooksCollectionThymeleafController_Roo_Thymeleaf.aj b/spring-roo/src/main/java/com/baeldung/web/BooksCollectionThymeleafController_Roo_Thymeleaf.aj similarity index 100% rename from roo/src/main/java/com/baeldung/web/BooksCollectionThymeleafController_Roo_Thymeleaf.aj rename to spring-roo/src/main/java/com/baeldung/web/BooksCollectionThymeleafController_Roo_Thymeleaf.aj diff --git a/roo/src/main/java/com/baeldung/web/BooksCollectionThymeleafLinkFactory.java b/spring-roo/src/main/java/com/baeldung/web/BooksCollectionThymeleafLinkFactory.java similarity index 100% rename from roo/src/main/java/com/baeldung/web/BooksCollectionThymeleafLinkFactory.java rename to spring-roo/src/main/java/com/baeldung/web/BooksCollectionThymeleafLinkFactory.java diff --git a/roo/src/main/java/com/baeldung/web/BooksCollectionThymeleafLinkFactory_Roo_LinkFactory.aj b/spring-roo/src/main/java/com/baeldung/web/BooksCollectionThymeleafLinkFactory_Roo_LinkFactory.aj similarity index 100% rename from roo/src/main/java/com/baeldung/web/BooksCollectionThymeleafLinkFactory_Roo_LinkFactory.aj rename to spring-roo/src/main/java/com/baeldung/web/BooksCollectionThymeleafLinkFactory_Roo_LinkFactory.aj diff --git a/roo/src/main/java/com/baeldung/web/BooksItemThymeleafController.java b/spring-roo/src/main/java/com/baeldung/web/BooksItemThymeleafController.java similarity index 100% rename from roo/src/main/java/com/baeldung/web/BooksItemThymeleafController.java rename to spring-roo/src/main/java/com/baeldung/web/BooksItemThymeleafController.java diff --git a/roo/src/main/java/com/baeldung/web/BooksItemThymeleafController_Roo_Controller.aj b/spring-roo/src/main/java/com/baeldung/web/BooksItemThymeleafController_Roo_Controller.aj similarity index 100% rename from roo/src/main/java/com/baeldung/web/BooksItemThymeleafController_Roo_Controller.aj rename to spring-roo/src/main/java/com/baeldung/web/BooksItemThymeleafController_Roo_Controller.aj diff --git a/roo/src/main/java/com/baeldung/web/BooksItemThymeleafController_Roo_Thymeleaf.aj b/spring-roo/src/main/java/com/baeldung/web/BooksItemThymeleafController_Roo_Thymeleaf.aj similarity index 100% rename from roo/src/main/java/com/baeldung/web/BooksItemThymeleafController_Roo_Thymeleaf.aj rename to spring-roo/src/main/java/com/baeldung/web/BooksItemThymeleafController_Roo_Thymeleaf.aj diff --git a/roo/src/main/java/com/baeldung/web/BooksItemThymeleafLinkFactory.java b/spring-roo/src/main/java/com/baeldung/web/BooksItemThymeleafLinkFactory.java similarity index 100% rename from roo/src/main/java/com/baeldung/web/BooksItemThymeleafLinkFactory.java rename to spring-roo/src/main/java/com/baeldung/web/BooksItemThymeleafLinkFactory.java diff --git a/roo/src/main/java/com/baeldung/web/BooksItemThymeleafLinkFactory_Roo_LinkFactory.aj b/spring-roo/src/main/java/com/baeldung/web/BooksItemThymeleafLinkFactory_Roo_LinkFactory.aj similarity index 100% rename from roo/src/main/java/com/baeldung/web/BooksItemThymeleafLinkFactory_Roo_LinkFactory.aj rename to spring-roo/src/main/java/com/baeldung/web/BooksItemThymeleafLinkFactory_Roo_LinkFactory.aj diff --git a/roo/src/main/java/com/baeldung/web/MainController.java b/spring-roo/src/main/java/com/baeldung/web/MainController.java similarity index 100% rename from roo/src/main/java/com/baeldung/web/MainController.java rename to spring-roo/src/main/java/com/baeldung/web/MainController.java diff --git a/roo/src/main/java/com/baeldung/web/MainController_Roo_Thymeleaf_MainController.aj b/spring-roo/src/main/java/com/baeldung/web/MainController_Roo_Thymeleaf_MainController.aj similarity index 100% rename from roo/src/main/java/com/baeldung/web/MainController_Roo_Thymeleaf_MainController.aj rename to spring-roo/src/main/java/com/baeldung/web/MainController_Roo_Thymeleaf_MainController.aj diff --git a/roo/src/main/java/com/baeldung/web/reports/ExportingErrorException.java b/spring-roo/src/main/java/com/baeldung/web/reports/ExportingErrorException.java similarity index 100% rename from roo/src/main/java/com/baeldung/web/reports/ExportingErrorException.java rename to spring-roo/src/main/java/com/baeldung/web/reports/ExportingErrorException.java diff --git a/roo/src/main/java/com/baeldung/web/reports/JasperReportsCsvExporter.java b/spring-roo/src/main/java/com/baeldung/web/reports/JasperReportsCsvExporter.java similarity index 100% rename from roo/src/main/java/com/baeldung/web/reports/JasperReportsCsvExporter.java rename to spring-roo/src/main/java/com/baeldung/web/reports/JasperReportsCsvExporter.java diff --git a/roo/src/main/java/com/baeldung/web/reports/JasperReportsExporter.java b/spring-roo/src/main/java/com/baeldung/web/reports/JasperReportsExporter.java similarity index 100% rename from roo/src/main/java/com/baeldung/web/reports/JasperReportsExporter.java rename to spring-roo/src/main/java/com/baeldung/web/reports/JasperReportsExporter.java diff --git a/roo/src/main/java/com/baeldung/web/reports/JasperReportsPdfExporter.java b/spring-roo/src/main/java/com/baeldung/web/reports/JasperReportsPdfExporter.java similarity index 100% rename from roo/src/main/java/com/baeldung/web/reports/JasperReportsPdfExporter.java rename to spring-roo/src/main/java/com/baeldung/web/reports/JasperReportsPdfExporter.java diff --git a/roo/src/main/java/com/baeldung/web/reports/JasperReportsXlsExporter.java b/spring-roo/src/main/java/com/baeldung/web/reports/JasperReportsXlsExporter.java similarity index 100% rename from roo/src/main/java/com/baeldung/web/reports/JasperReportsXlsExporter.java rename to spring-roo/src/main/java/com/baeldung/web/reports/JasperReportsXlsExporter.java diff --git a/roo/src/main/resources/application-dev.properties b/spring-roo/src/main/resources/application-dev.properties similarity index 100% rename from roo/src/main/resources/application-dev.properties rename to spring-roo/src/main/resources/application-dev.properties diff --git a/roo/src/main/resources/application.properties b/spring-roo/src/main/resources/application.properties similarity index 100% rename from roo/src/main/resources/application.properties rename to spring-roo/src/main/resources/application.properties diff --git a/roo/src/main/resources/banner.txt b/spring-roo/src/main/resources/banner.txt similarity index 100% rename from roo/src/main/resources/banner.txt rename to spring-roo/src/main/resources/banner.txt diff --git a/roo/src/main/resources/messages.properties b/spring-roo/src/main/resources/messages.properties similarity index 100% rename from roo/src/main/resources/messages.properties rename to spring-roo/src/main/resources/messages.properties diff --git a/roo/src/main/resources/static/public/css/springroo.css b/spring-roo/src/main/resources/static/public/css/springroo.css similarity index 100% rename from roo/src/main/resources/static/public/css/springroo.css rename to spring-roo/src/main/resources/static/public/css/springroo.css diff --git a/roo/src/main/resources/static/public/css/theme.css b/spring-roo/src/main/resources/static/public/css/theme.css similarity index 100% rename from roo/src/main/resources/static/public/css/theme.css rename to spring-roo/src/main/resources/static/public/css/theme.css diff --git a/roo/src/main/resources/static/public/fonts/fontawesome-webfont.eot b/spring-roo/src/main/resources/static/public/fonts/fontawesome-webfont.eot similarity index 100% rename from roo/src/main/resources/static/public/fonts/fontawesome-webfont.eot rename to spring-roo/src/main/resources/static/public/fonts/fontawesome-webfont.eot diff --git a/roo/src/main/resources/static/public/fonts/fontawesome-webfont.svg b/spring-roo/src/main/resources/static/public/fonts/fontawesome-webfont.svg similarity index 100% rename from roo/src/main/resources/static/public/fonts/fontawesome-webfont.svg rename to spring-roo/src/main/resources/static/public/fonts/fontawesome-webfont.svg diff --git a/roo/src/main/resources/static/public/fonts/fontawesome-webfont.ttf b/spring-roo/src/main/resources/static/public/fonts/fontawesome-webfont.ttf similarity index 100% rename from roo/src/main/resources/static/public/fonts/fontawesome-webfont.ttf rename to spring-roo/src/main/resources/static/public/fonts/fontawesome-webfont.ttf diff --git a/roo/src/main/resources/static/public/fonts/fontawesome-webfont.woff b/spring-roo/src/main/resources/static/public/fonts/fontawesome-webfont.woff similarity index 100% rename from roo/src/main/resources/static/public/fonts/fontawesome-webfont.woff rename to spring-roo/src/main/resources/static/public/fonts/fontawesome-webfont.woff diff --git a/roo/src/main/resources/static/public/fonts/fontawesome-webfont.woff2 b/spring-roo/src/main/resources/static/public/fonts/fontawesome-webfont.woff2 similarity index 100% rename from roo/src/main/resources/static/public/fonts/fontawesome-webfont.woff2 rename to spring-roo/src/main/resources/static/public/fonts/fontawesome-webfont.woff2 diff --git a/roo/src/main/resources/static/public/fonts/glyphicons-halflings-regular.eot b/spring-roo/src/main/resources/static/public/fonts/glyphicons-halflings-regular.eot similarity index 100% rename from roo/src/main/resources/static/public/fonts/glyphicons-halflings-regular.eot rename to spring-roo/src/main/resources/static/public/fonts/glyphicons-halflings-regular.eot diff --git a/roo/src/main/resources/static/public/fonts/glyphicons-halflings-regular.svg b/spring-roo/src/main/resources/static/public/fonts/glyphicons-halflings-regular.svg similarity index 100% rename from roo/src/main/resources/static/public/fonts/glyphicons-halflings-regular.svg rename to spring-roo/src/main/resources/static/public/fonts/glyphicons-halflings-regular.svg diff --git a/roo/src/main/resources/static/public/fonts/glyphicons-halflings-regular.ttf b/spring-roo/src/main/resources/static/public/fonts/glyphicons-halflings-regular.ttf similarity index 100% rename from roo/src/main/resources/static/public/fonts/glyphicons-halflings-regular.ttf rename to spring-roo/src/main/resources/static/public/fonts/glyphicons-halflings-regular.ttf diff --git a/roo/src/main/resources/static/public/fonts/glyphicons-halflings-regular.woff b/spring-roo/src/main/resources/static/public/fonts/glyphicons-halflings-regular.woff similarity index 100% rename from roo/src/main/resources/static/public/fonts/glyphicons-halflings-regular.woff rename to spring-roo/src/main/resources/static/public/fonts/glyphicons-halflings-regular.woff diff --git a/roo/src/main/resources/static/public/fonts/glyphicons-halflings-regular.woff2 b/spring-roo/src/main/resources/static/public/fonts/glyphicons-halflings-regular.woff2 similarity index 100% rename from roo/src/main/resources/static/public/fonts/glyphicons-halflings-regular.woff2 rename to spring-roo/src/main/resources/static/public/fonts/glyphicons-halflings-regular.woff2 diff --git a/roo/src/main/resources/static/public/img/apple-touch-icon.png b/spring-roo/src/main/resources/static/public/img/apple-touch-icon.png similarity index 100% rename from roo/src/main/resources/static/public/img/apple-touch-icon.png rename to spring-roo/src/main/resources/static/public/img/apple-touch-icon.png diff --git a/roo/src/main/resources/static/public/img/en.png b/spring-roo/src/main/resources/static/public/img/en.png similarity index 100% rename from roo/src/main/resources/static/public/img/en.png rename to spring-roo/src/main/resources/static/public/img/en.png diff --git a/roo/src/main/resources/static/public/img/es.png b/spring-roo/src/main/resources/static/public/img/es.png similarity index 100% rename from roo/src/main/resources/static/public/img/es.png rename to spring-roo/src/main/resources/static/public/img/es.png diff --git a/roo/src/main/resources/static/public/img/favicon.ico b/spring-roo/src/main/resources/static/public/img/favicon.ico similarity index 100% rename from roo/src/main/resources/static/public/img/favicon.ico rename to spring-roo/src/main/resources/static/public/img/favicon.ico diff --git a/roo/src/main/resources/static/public/img/geo.png b/spring-roo/src/main/resources/static/public/img/geo.png similarity index 100% rename from roo/src/main/resources/static/public/img/geo.png rename to spring-roo/src/main/resources/static/public/img/geo.png diff --git a/roo/src/main/resources/static/public/img/logo.png b/spring-roo/src/main/resources/static/public/img/logo.png similarity index 100% rename from roo/src/main/resources/static/public/img/logo.png rename to spring-roo/src/main/resources/static/public/img/logo.png diff --git a/roo/src/main/resources/static/public/img/owasp_logo.png b/spring-roo/src/main/resources/static/public/img/owasp_logo.png similarity index 100% rename from roo/src/main/resources/static/public/img/owasp_logo.png rename to spring-roo/src/main/resources/static/public/img/owasp_logo.png diff --git a/roo/src/main/resources/static/public/img/springroo-logo.png b/spring-roo/src/main/resources/static/public/img/springroo-logo.png similarity index 100% rename from roo/src/main/resources/static/public/img/springroo-logo.png rename to spring-roo/src/main/resources/static/public/img/springroo-logo.png diff --git a/roo/src/main/resources/static/public/js/dataTables.advanced.js b/spring-roo/src/main/resources/static/public/js/dataTables.advanced.js similarity index 100% rename from roo/src/main/resources/static/public/js/dataTables.advanced.js rename to spring-roo/src/main/resources/static/public/js/dataTables.advanced.js diff --git a/roo/src/main/resources/static/public/js/datatables-defaults.js b/spring-roo/src/main/resources/static/public/js/datatables-defaults.js similarity index 100% rename from roo/src/main/resources/static/public/js/datatables-defaults.js rename to spring-roo/src/main/resources/static/public/js/datatables-defaults.js diff --git a/roo/src/main/resources/static/public/js/datetimepicker-defaults.js b/spring-roo/src/main/resources/static/public/js/datetimepicker-defaults.js similarity index 100% rename from roo/src/main/resources/static/public/js/datetimepicker-defaults.js rename to spring-roo/src/main/resources/static/public/js/datetimepicker-defaults.js diff --git a/roo/src/main/resources/static/public/js/inputmask-defaults.js b/spring-roo/src/main/resources/static/public/js/inputmask-defaults.js similarity index 100% rename from roo/src/main/resources/static/public/js/inputmask-defaults.js rename to spring-roo/src/main/resources/static/public/js/inputmask-defaults.js diff --git a/roo/src/main/resources/static/public/js/main.js b/spring-roo/src/main/resources/static/public/js/main.js similarity index 100% rename from roo/src/main/resources/static/public/js/main.js rename to spring-roo/src/main/resources/static/public/js/main.js diff --git a/roo/src/main/resources/static/public/js/moment-defaults.js b/spring-roo/src/main/resources/static/public/js/moment-defaults.js similarity index 100% rename from roo/src/main/resources/static/public/js/moment-defaults.js rename to spring-roo/src/main/resources/static/public/js/moment-defaults.js diff --git a/roo/src/main/resources/static/public/js/moment-locale-es.js b/spring-roo/src/main/resources/static/public/js/moment-locale-es.js similarity index 100% rename from roo/src/main/resources/static/public/js/moment-locale-es.js rename to spring-roo/src/main/resources/static/public/js/moment-locale-es.js diff --git a/roo/src/main/resources/static/public/js/select2-defaults.js b/spring-roo/src/main/resources/static/public/js/select2-defaults.js similarity index 100% rename from roo/src/main/resources/static/public/js/select2-defaults.js rename to spring-roo/src/main/resources/static/public/js/select2-defaults.js diff --git a/roo/src/main/resources/static/public/js/validation-defaults.js b/spring-roo/src/main/resources/static/public/js/validation-defaults.js similarity index 100% rename from roo/src/main/resources/static/public/js/validation-defaults.js rename to spring-roo/src/main/resources/static/public/js/validation-defaults.js diff --git a/roo/src/main/resources/templates/accessibility.html b/spring-roo/src/main/resources/templates/accessibility.html similarity index 100% rename from roo/src/main/resources/templates/accessibility.html rename to spring-roo/src/main/resources/templates/accessibility.html diff --git a/roo/src/main/resources/templates/books/create.html b/spring-roo/src/main/resources/templates/books/create.html similarity index 100% rename from roo/src/main/resources/templates/books/create.html rename to spring-roo/src/main/resources/templates/books/create.html diff --git a/roo/src/main/resources/templates/books/edit.html b/spring-roo/src/main/resources/templates/books/edit.html similarity index 100% rename from roo/src/main/resources/templates/books/edit.html rename to spring-roo/src/main/resources/templates/books/edit.html diff --git a/roo/src/main/resources/templates/books/list.html b/spring-roo/src/main/resources/templates/books/list.html similarity index 100% rename from roo/src/main/resources/templates/books/list.html rename to spring-roo/src/main/resources/templates/books/list.html diff --git a/roo/src/main/resources/templates/books/show.html b/spring-roo/src/main/resources/templates/books/show.html similarity index 100% rename from roo/src/main/resources/templates/books/show.html rename to spring-roo/src/main/resources/templates/books/show.html diff --git a/roo/src/main/resources/templates/books/showInline.html b/spring-roo/src/main/resources/templates/books/showInline.html similarity index 100% rename from roo/src/main/resources/templates/books/showInline.html rename to spring-roo/src/main/resources/templates/books/showInline.html diff --git a/roo/src/main/resources/templates/error.html b/spring-roo/src/main/resources/templates/error.html similarity index 100% rename from roo/src/main/resources/templates/error.html rename to spring-roo/src/main/resources/templates/error.html diff --git a/roo/src/main/resources/templates/fragments/footer.html b/spring-roo/src/main/resources/templates/fragments/footer.html similarity index 100% rename from roo/src/main/resources/templates/fragments/footer.html rename to spring-roo/src/main/resources/templates/fragments/footer.html diff --git a/roo/src/main/resources/templates/fragments/header.html b/spring-roo/src/main/resources/templates/fragments/header.html similarity index 100% rename from roo/src/main/resources/templates/fragments/header.html rename to spring-roo/src/main/resources/templates/fragments/header.html diff --git a/roo/src/main/resources/templates/fragments/js/datatables-locale.js b/spring-roo/src/main/resources/templates/fragments/js/datatables-locale.js similarity index 100% rename from roo/src/main/resources/templates/fragments/js/datatables-locale.js rename to spring-roo/src/main/resources/templates/fragments/js/datatables-locale.js diff --git a/roo/src/main/resources/templates/fragments/js/datatables.html b/spring-roo/src/main/resources/templates/fragments/js/datatables.html similarity index 100% rename from roo/src/main/resources/templates/fragments/js/datatables.html rename to spring-roo/src/main/resources/templates/fragments/js/datatables.html diff --git a/roo/src/main/resources/templates/fragments/js/select2.html b/spring-roo/src/main/resources/templates/fragments/js/select2.html similarity index 100% rename from roo/src/main/resources/templates/fragments/js/select2.html rename to spring-roo/src/main/resources/templates/fragments/js/select2.html diff --git a/roo/src/main/resources/templates/fragments/languages.html b/spring-roo/src/main/resources/templates/fragments/languages.html similarity index 100% rename from roo/src/main/resources/templates/fragments/languages.html rename to spring-roo/src/main/resources/templates/fragments/languages.html diff --git a/roo/src/main/resources/templates/fragments/menu.html b/spring-roo/src/main/resources/templates/fragments/menu.html similarity index 100% rename from roo/src/main/resources/templates/fragments/menu.html rename to spring-roo/src/main/resources/templates/fragments/menu.html diff --git a/roo/src/main/resources/templates/fragments/modal-confirm-delete-batch.html b/spring-roo/src/main/resources/templates/fragments/modal-confirm-delete-batch.html similarity index 100% rename from roo/src/main/resources/templates/fragments/modal-confirm-delete-batch.html rename to spring-roo/src/main/resources/templates/fragments/modal-confirm-delete-batch.html diff --git a/roo/src/main/resources/templates/fragments/modal-confirm-delete.html b/spring-roo/src/main/resources/templates/fragments/modal-confirm-delete.html similarity index 100% rename from roo/src/main/resources/templates/fragments/modal-confirm-delete.html rename to spring-roo/src/main/resources/templates/fragments/modal-confirm-delete.html diff --git a/roo/src/main/resources/templates/fragments/modal-confirm.html b/spring-roo/src/main/resources/templates/fragments/modal-confirm.html similarity index 100% rename from roo/src/main/resources/templates/fragments/modal-confirm.html rename to spring-roo/src/main/resources/templates/fragments/modal-confirm.html diff --git a/roo/src/main/resources/templates/fragments/modal-export-empty-error.html b/spring-roo/src/main/resources/templates/fragments/modal-export-empty-error.html similarity index 100% rename from roo/src/main/resources/templates/fragments/modal-export-empty-error.html rename to spring-roo/src/main/resources/templates/fragments/modal-export-empty-error.html diff --git a/roo/src/main/resources/templates/fragments/modal.html b/spring-roo/src/main/resources/templates/fragments/modal.html similarity index 100% rename from roo/src/main/resources/templates/fragments/modal.html rename to spring-roo/src/main/resources/templates/fragments/modal.html diff --git a/roo/src/main/resources/templates/fragments/session-links.html b/spring-roo/src/main/resources/templates/fragments/session-links.html similarity index 100% rename from roo/src/main/resources/templates/fragments/session-links.html rename to spring-roo/src/main/resources/templates/fragments/session-links.html diff --git a/roo/src/main/resources/templates/index.html b/spring-roo/src/main/resources/templates/index.html similarity index 100% rename from roo/src/main/resources/templates/index.html rename to spring-roo/src/main/resources/templates/index.html diff --git a/roo/src/main/resources/templates/layouts/default-layout-no-menu.html b/spring-roo/src/main/resources/templates/layouts/default-layout-no-menu.html similarity index 100% rename from roo/src/main/resources/templates/layouts/default-layout-no-menu.html rename to spring-roo/src/main/resources/templates/layouts/default-layout-no-menu.html diff --git a/roo/src/main/resources/templates/layouts/default-layout.html b/spring-roo/src/main/resources/templates/layouts/default-layout.html similarity index 100% rename from roo/src/main/resources/templates/layouts/default-layout.html rename to spring-roo/src/main/resources/templates/layouts/default-layout.html diff --git a/roo/src/main/resources/templates/layouts/default-list-layout.html b/spring-roo/src/main/resources/templates/layouts/default-list-layout.html similarity index 100% rename from roo/src/main/resources/templates/layouts/default-list-layout.html rename to spring-roo/src/main/resources/templates/layouts/default-list-layout.html diff --git a/roo/src/main/resources/templates/layouts/home-layout.html b/spring-roo/src/main/resources/templates/layouts/home-layout.html similarity index 100% rename from roo/src/main/resources/templates/layouts/home-layout.html rename to spring-roo/src/main/resources/templates/layouts/home-layout.html diff --git a/roo/src/main/resources/templates/login.html b/spring-roo/src/main/resources/templates/login.html similarity index 100% rename from roo/src/main/resources/templates/login.html rename to spring-roo/src/main/resources/templates/login.html diff --git a/roo/src/main/resources/templates/reports/export_default.jrxml b/spring-roo/src/main/resources/templates/reports/export_default.jrxml similarity index 100% rename from roo/src/main/resources/templates/reports/export_default.jrxml rename to spring-roo/src/main/resources/templates/reports/export_default.jrxml From d889dba9281d6f4a376b606b8a5e4fb018f0a835 Mon Sep 17 00:00:00 2001 From: iaforek Date: Sun, 7 May 2017 22:53:55 +0100 Subject: [PATCH 05/54] BAEL-838 Initial code showing how to remove last char - helper class and tests. --- .../com/baeldung/string/RemoveLastChar.java | 18 ++++++ .../baeldung/string/RemoveLastCharTest.java | 56 +++++++++++++++++++ 2 files changed, 74 insertions(+) create mode 100644 core-java/src/main/java/com/baeldung/string/RemoveLastChar.java create mode 100644 core-java/src/test/java/com/baeldung/string/RemoveLastCharTest.java diff --git a/core-java/src/main/java/com/baeldung/string/RemoveLastChar.java b/core-java/src/main/java/com/baeldung/string/RemoveLastChar.java new file mode 100644 index 0000000000..3816a61f45 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/string/RemoveLastChar.java @@ -0,0 +1,18 @@ +/** + * + */ +package com.baeldung.string; + +/** + * @author iaforek + * + */ +public class RemoveLastChar { + public static String substring (String s) { + if (s == null || s.length() == 0) { + return null; + } else { + return (s.substring(0, s.length() - 1)); + } + } +} diff --git a/core-java/src/test/java/com/baeldung/string/RemoveLastCharTest.java b/core-java/src/test/java/com/baeldung/string/RemoveLastCharTest.java new file mode 100644 index 0000000000..80d76e96ac --- /dev/null +++ b/core-java/src/test/java/com/baeldung/string/RemoveLastCharTest.java @@ -0,0 +1,56 @@ +/** + * + */ +package com.baeldung.string; + +import org.apache.commons.lang3.StringUtils; +import org.junit.Assert; +import org.junit.Test; + +/** + * @author iaforek + * + */ +public class RemoveLastCharTest { + + public static final String TEST_STRING = "abcdef"; + public static final String NULL_STRING = null; + public static final String EMPTY_STRING = ""; + public static final String ONE_CHAR_STRING = "a"; + public static final String WHITE_SPACE_AT_THE_END_STRING = "abc "; + + /** + * Test method for {@link com.baeldung.string.RemoveLastChar#substring(java.lang.String)}. + */ + @Test + public void givenTestString_substring_getStingWithoutLastChar() { + Assert.assertEquals("abcde", RemoveLastChar.substring(TEST_STRING)); + Assert.assertEquals("abcde", StringUtils.chop(TEST_STRING)); + } + + @Test + public void givenNullString_substring_getNullString() { + Assert.assertEquals(NULL_STRING, RemoveLastChar.substring(NULL_STRING)); + Assert.assertEquals(NULL_STRING, StringUtils.chop(NULL_STRING)); + + } + + @Test + public void givenEmptyString_substring_getEmptyString() { + Assert.assertEquals(NULL_STRING, RemoveLastChar.substring(EMPTY_STRING)); + Assert.assertEquals(NULL_STRING, StringUtils.chop(NULL_STRING)); + } + + @Test + public void givenOneCharString_substring_getEmptyString() { + Assert.assertEquals(EMPTY_STRING, RemoveLastChar.substring(ONE_CHAR_STRING)); + Assert.assertEquals(EMPTY_STRING, StringUtils.chop(ONE_CHAR_STRING)); + } + + @Test + public void givenStringWithWhiteSpaceAtTheEnd_substring_getStringWithoutWhiteSpaceAtTheEnd() { + Assert.assertEquals("abc", RemoveLastChar.substring(WHITE_SPACE_AT_THE_END_STRING)); + Assert.assertEquals("abc", StringUtils.chop(WHITE_SPACE_AT_THE_END_STRING)); + } + +} From 124966a0f68f39802efb41a8b886280485d374b1 Mon Sep 17 00:00:00 2001 From: iaforek Date: Sun, 7 May 2017 23:11:03 +0100 Subject: [PATCH 06/54] BAEL-838 Corrected Helper class and associated empty string test case. Added StringUtils.substing tests. --- .../main/java/com/baeldung/string/RemoveLastChar.java | 2 +- .../java/com/baeldung/string/RemoveLastCharTest.java | 10 ++++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/core-java/src/main/java/com/baeldung/string/RemoveLastChar.java b/core-java/src/main/java/com/baeldung/string/RemoveLastChar.java index 3816a61f45..faf30f7b25 100644 --- a/core-java/src/main/java/com/baeldung/string/RemoveLastChar.java +++ b/core-java/src/main/java/com/baeldung/string/RemoveLastChar.java @@ -10,7 +10,7 @@ package com.baeldung.string; public class RemoveLastChar { public static String substring (String s) { if (s == null || s.length() == 0) { - return null; + return s; } else { return (s.substring(0, s.length() - 1)); } diff --git a/core-java/src/test/java/com/baeldung/string/RemoveLastCharTest.java b/core-java/src/test/java/com/baeldung/string/RemoveLastCharTest.java index 80d76e96ac..a39212ced4 100644 --- a/core-java/src/test/java/com/baeldung/string/RemoveLastCharTest.java +++ b/core-java/src/test/java/com/baeldung/string/RemoveLastCharTest.java @@ -26,6 +26,7 @@ public class RemoveLastCharTest { public void givenTestString_substring_getStingWithoutLastChar() { Assert.assertEquals("abcde", RemoveLastChar.substring(TEST_STRING)); Assert.assertEquals("abcde", StringUtils.chop(TEST_STRING)); + Assert.assertEquals("abcde", StringUtils.substring(TEST_STRING, 0, TEST_STRING.length() - 1)); } @Test @@ -37,20 +38,25 @@ public class RemoveLastCharTest { @Test public void givenEmptyString_substring_getEmptyString() { - Assert.assertEquals(NULL_STRING, RemoveLastChar.substring(EMPTY_STRING)); - Assert.assertEquals(NULL_STRING, StringUtils.chop(NULL_STRING)); + Assert.assertEquals(EMPTY_STRING, RemoveLastChar.substring(EMPTY_STRING)); + Assert.assertEquals(EMPTY_STRING, StringUtils.chop(EMPTY_STRING)); + Assert.assertEquals(EMPTY_STRING, StringUtils.substring(EMPTY_STRING, 0, EMPTY_STRING.length() - 1)); + } @Test public void givenOneCharString_substring_getEmptyString() { Assert.assertEquals(EMPTY_STRING, RemoveLastChar.substring(ONE_CHAR_STRING)); Assert.assertEquals(EMPTY_STRING, StringUtils.chop(ONE_CHAR_STRING)); + Assert.assertEquals(EMPTY_STRING, StringUtils.substring(ONE_CHAR_STRING, 0, ONE_CHAR_STRING.length() - 1)); + } @Test public void givenStringWithWhiteSpaceAtTheEnd_substring_getStringWithoutWhiteSpaceAtTheEnd() { Assert.assertEquals("abc", RemoveLastChar.substring(WHITE_SPACE_AT_THE_END_STRING)); Assert.assertEquals("abc", StringUtils.chop(WHITE_SPACE_AT_THE_END_STRING)); + Assert.assertEquals("abc", StringUtils.substring(WHITE_SPACE_AT_THE_END_STRING, 0, WHITE_SPACE_AT_THE_END_STRING.length() - 1)); } } From d9d35f8a4f8b4d9a014c6d5b83fe6cfbffccea7a Mon Sep 17 00:00:00 2001 From: iaforek Date: Mon, 8 May 2017 19:12:17 +0100 Subject: [PATCH 07/54] BAEL-838 Refromatted code using formatter.xml. Added Assert.assertEquals import. Renamed test to follow convention. Reordered tests. --- .../com/baeldung/string/RemoveLastChar.java | 21 ++--- .../baeldung/string/RemoveLastCharTest.java | 87 ++++++++----------- 2 files changed, 44 insertions(+), 64 deletions(-) diff --git a/core-java/src/main/java/com/baeldung/string/RemoveLastChar.java b/core-java/src/main/java/com/baeldung/string/RemoveLastChar.java index faf30f7b25..ee1d5c597d 100644 --- a/core-java/src/main/java/com/baeldung/string/RemoveLastChar.java +++ b/core-java/src/main/java/com/baeldung/string/RemoveLastChar.java @@ -1,18 +1,11 @@ -/** - * - */ package com.baeldung.string; -/** - * @author iaforek - * - */ public class RemoveLastChar { - public static String substring (String s) { - if (s == null || s.length() == 0) { - return s; - } else { - return (s.substring(0, s.length() - 1)); - } - } + public static String substring(String s) { + if (s == null || s.length() == 0) { + return s; + } else { + return (s.substring(0, s.length() - 1)); + } + } } diff --git a/core-java/src/test/java/com/baeldung/string/RemoveLastCharTest.java b/core-java/src/test/java/com/baeldung/string/RemoveLastCharTest.java index a39212ced4..f1212b2ed9 100644 --- a/core-java/src/test/java/com/baeldung/string/RemoveLastCharTest.java +++ b/core-java/src/test/java/com/baeldung/string/RemoveLastCharTest.java @@ -1,62 +1,49 @@ -/** - * - */ package com.baeldung.string; +import static org.junit.Assert.assertEquals; + import org.apache.commons.lang3.StringUtils; -import org.junit.Assert; import org.junit.Test; -/** - * @author iaforek - * - */ public class RemoveLastCharTest { - - public static final String TEST_STRING = "abcdef"; - public static final String NULL_STRING = null; - public static final String EMPTY_STRING = ""; - public static final String ONE_CHAR_STRING = "a"; - public static final String WHITE_SPACE_AT_THE_END_STRING = "abc "; - /** - * Test method for {@link com.baeldung.string.RemoveLastChar#substring(java.lang.String)}. - */ - @Test - public void givenTestString_substring_getStingWithoutLastChar() { - Assert.assertEquals("abcde", RemoveLastChar.substring(TEST_STRING)); - Assert.assertEquals("abcde", StringUtils.chop(TEST_STRING)); - Assert.assertEquals("abcde", StringUtils.substring(TEST_STRING, 0, TEST_STRING.length() - 1)); - } - - @Test - public void givenNullString_substring_getNullString() { - Assert.assertEquals(NULL_STRING, RemoveLastChar.substring(NULL_STRING)); - Assert.assertEquals(NULL_STRING, StringUtils.chop(NULL_STRING)); + public static final String TEST_STRING = "abcdef"; + public static final String NULL_STRING = null; + public static final String EMPTY_STRING = ""; + public static final String ONE_CHAR_STRING = "a"; + public static final String WHITE_SPACE_AT_THE_END_STRING = "abc "; - } + @Test + public void givenTestString_whenSubstring_thenGetStingWithoutLastChar() { + assertEquals("abcde", RemoveLastChar.substring(TEST_STRING)); + assertEquals("abcde", StringUtils.substring(TEST_STRING, 0, TEST_STRING.length() - 1)); + assertEquals("abcde", StringUtils.chop(TEST_STRING)); + } - @Test - public void givenEmptyString_substring_getEmptyString() { - Assert.assertEquals(EMPTY_STRING, RemoveLastChar.substring(EMPTY_STRING)); - Assert.assertEquals(EMPTY_STRING, StringUtils.chop(EMPTY_STRING)); - Assert.assertEquals(EMPTY_STRING, StringUtils.substring(EMPTY_STRING, 0, EMPTY_STRING.length() - 1)); + @Test + public void givenNullString_whenSubstring_thenGetNullString() { + assertEquals(NULL_STRING, RemoveLastChar.substring(NULL_STRING)); + assertEquals(NULL_STRING, StringUtils.chop(NULL_STRING)); + } - } - - @Test - public void givenOneCharString_substring_getEmptyString() { - Assert.assertEquals(EMPTY_STRING, RemoveLastChar.substring(ONE_CHAR_STRING)); - Assert.assertEquals(EMPTY_STRING, StringUtils.chop(ONE_CHAR_STRING)); - Assert.assertEquals(EMPTY_STRING, StringUtils.substring(ONE_CHAR_STRING, 0, ONE_CHAR_STRING.length() - 1)); + @Test + public void givenEmptyString_whenSubstring_thenGetEmptyString() { + assertEquals(EMPTY_STRING, RemoveLastChar.substring(EMPTY_STRING)); + assertEquals(EMPTY_STRING, StringUtils.substring(EMPTY_STRING, 0, EMPTY_STRING.length() - 1)); + assertEquals(EMPTY_STRING, StringUtils.chop(EMPTY_STRING)); + } - } - - @Test - public void givenStringWithWhiteSpaceAtTheEnd_substring_getStringWithoutWhiteSpaceAtTheEnd() { - Assert.assertEquals("abc", RemoveLastChar.substring(WHITE_SPACE_AT_THE_END_STRING)); - Assert.assertEquals("abc", StringUtils.chop(WHITE_SPACE_AT_THE_END_STRING)); - Assert.assertEquals("abc", StringUtils.substring(WHITE_SPACE_AT_THE_END_STRING, 0, WHITE_SPACE_AT_THE_END_STRING.length() - 1)); - } - + @Test + public void givenOneCharString_whenSubstring_thenGetEmptyString() { + assertEquals(EMPTY_STRING, RemoveLastChar.substring(ONE_CHAR_STRING)); + assertEquals(EMPTY_STRING, StringUtils.substring(ONE_CHAR_STRING, 0, ONE_CHAR_STRING.length() - 1)); + assertEquals(EMPTY_STRING, StringUtils.chop(ONE_CHAR_STRING)); + } + + @Test + public void givenStringWithWhiteSpaceAtTheEnd_whenSubstring_thenGetStringWithoutWhiteSpaceAtTheEnd() { + assertEquals("abc", RemoveLastChar.substring(WHITE_SPACE_AT_THE_END_STRING)); + assertEquals("abc", StringUtils.substring(WHITE_SPACE_AT_THE_END_STRING, 0, WHITE_SPACE_AT_THE_END_STRING.length() - 1)); + assertEquals("abc", StringUtils.chop(WHITE_SPACE_AT_THE_END_STRING)); + } } From 0fb69164c0be88c51211a344d53ae97cf62cb7b2 Mon Sep 17 00:00:00 2001 From: iaforek Date: Wed, 10 May 2017 13:47:45 +0100 Subject: [PATCH 08/54] BAEL-838 - Added regex method and updated tests. --- .../main/java/com/baeldung/string/RemoveLastChar.java | 8 ++++++++ .../java/com/baeldung/string/RemoveLastCharTest.java | 9 +++++++++ 2 files changed, 17 insertions(+) diff --git a/core-java/src/main/java/com/baeldung/string/RemoveLastChar.java b/core-java/src/main/java/com/baeldung/string/RemoveLastChar.java index ee1d5c597d..c6bb81b133 100644 --- a/core-java/src/main/java/com/baeldung/string/RemoveLastChar.java +++ b/core-java/src/main/java/com/baeldung/string/RemoveLastChar.java @@ -8,4 +8,12 @@ public class RemoveLastChar { return (s.substring(0, s.length() - 1)); } } + + public static String chop(String s) { + if (s == null) { + return s; + } else { + return s.replaceAll(".$", ""); + } + } } diff --git a/core-java/src/test/java/com/baeldung/string/RemoveLastCharTest.java b/core-java/src/test/java/com/baeldung/string/RemoveLastCharTest.java index f1212b2ed9..7d82d1a91b 100644 --- a/core-java/src/test/java/com/baeldung/string/RemoveLastCharTest.java +++ b/core-java/src/test/java/com/baeldung/string/RemoveLastCharTest.java @@ -18,12 +18,15 @@ public class RemoveLastCharTest { assertEquals("abcde", RemoveLastChar.substring(TEST_STRING)); assertEquals("abcde", StringUtils.substring(TEST_STRING, 0, TEST_STRING.length() - 1)); assertEquals("abcde", StringUtils.chop(TEST_STRING)); + assertEquals("abcde", TEST_STRING.replaceAll(".$", "")); + assertEquals("abcde", RemoveLastChar.chop(TEST_STRING)); } @Test public void givenNullString_whenSubstring_thenGetNullString() { assertEquals(NULL_STRING, RemoveLastChar.substring(NULL_STRING)); assertEquals(NULL_STRING, StringUtils.chop(NULL_STRING)); + assertEquals(NULL_STRING, RemoveLastChar.chop(NULL_STRING)); } @Test @@ -31,6 +34,8 @@ public class RemoveLastCharTest { assertEquals(EMPTY_STRING, RemoveLastChar.substring(EMPTY_STRING)); assertEquals(EMPTY_STRING, StringUtils.substring(EMPTY_STRING, 0, EMPTY_STRING.length() - 1)); assertEquals(EMPTY_STRING, StringUtils.chop(EMPTY_STRING)); + assertEquals(EMPTY_STRING, EMPTY_STRING.replaceAll(".$", "")); + assertEquals(EMPTY_STRING, RemoveLastChar.chop(EMPTY_STRING)); } @Test @@ -38,6 +43,8 @@ public class RemoveLastCharTest { assertEquals(EMPTY_STRING, RemoveLastChar.substring(ONE_CHAR_STRING)); assertEquals(EMPTY_STRING, StringUtils.substring(ONE_CHAR_STRING, 0, ONE_CHAR_STRING.length() - 1)); assertEquals(EMPTY_STRING, StringUtils.chop(ONE_CHAR_STRING)); + assertEquals(EMPTY_STRING, ONE_CHAR_STRING.replaceAll(".$", "")); + assertEquals(EMPTY_STRING, RemoveLastChar.chop(ONE_CHAR_STRING)); } @Test @@ -45,5 +52,7 @@ public class RemoveLastCharTest { assertEquals("abc", RemoveLastChar.substring(WHITE_SPACE_AT_THE_END_STRING)); assertEquals("abc", StringUtils.substring(WHITE_SPACE_AT_THE_END_STRING, 0, WHITE_SPACE_AT_THE_END_STRING.length() - 1)); assertEquals("abc", StringUtils.chop(WHITE_SPACE_AT_THE_END_STRING)); + assertEquals("abc", WHITE_SPACE_AT_THE_END_STRING.replaceAll(".$", "")); + assertEquals("abc", RemoveLastChar.chop(WHITE_SPACE_AT_THE_END_STRING)); } } From cbed304478e917c24c6b563160539f2892c6cfa1 Mon Sep 17 00:00:00 2001 From: iaforek Date: Wed, 10 May 2017 14:21:33 +0100 Subject: [PATCH 09/54] BAEL-838 Added new line examples. --- .../baeldung/string/RemoveLastCharTest.java | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/core-java/src/test/java/com/baeldung/string/RemoveLastCharTest.java b/core-java/src/test/java/com/baeldung/string/RemoveLastCharTest.java index 7d82d1a91b..5ada9c66f2 100644 --- a/core-java/src/test/java/com/baeldung/string/RemoveLastCharTest.java +++ b/core-java/src/test/java/com/baeldung/string/RemoveLastCharTest.java @@ -1,6 +1,7 @@ package com.baeldung.string; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; import org.apache.commons.lang3.StringUtils; import org.junit.Test; @@ -12,6 +13,8 @@ public class RemoveLastCharTest { public static final String EMPTY_STRING = ""; public static final String ONE_CHAR_STRING = "a"; public static final String WHITE_SPACE_AT_THE_END_STRING = "abc "; + public static final String NEW_LINE_AT_THE_END_STRING = "abc\n"; + public static final String MULTIPLE_LINES_STRING = "abc\ndef"; @Test public void givenTestString_whenSubstring_thenGetStingWithoutLastChar() { @@ -55,4 +58,22 @@ public class RemoveLastCharTest { assertEquals("abc", WHITE_SPACE_AT_THE_END_STRING.replaceAll(".$", "")); assertEquals("abc", RemoveLastChar.chop(WHITE_SPACE_AT_THE_END_STRING)); } + + @Test + public void givenStringWithNewLineAtTheEnd_whenSubstring_thenGetStringWithoutNewLine() { + assertEquals("abc", RemoveLastChar.substring(NEW_LINE_AT_THE_END_STRING)); + assertEquals("abc", StringUtils.substring(NEW_LINE_AT_THE_END_STRING, 0, NEW_LINE_AT_THE_END_STRING.length() - 1)); + assertEquals("abc", StringUtils.chop(NEW_LINE_AT_THE_END_STRING)); + assertNotEquals("abc", NEW_LINE_AT_THE_END_STRING.replaceAll(".$", "")); + assertNotEquals("abc", RemoveLastChar.chop(NEW_LINE_AT_THE_END_STRING)); + } + + @Test + public void givenMultiLineString_whenSubstring_thenGetStringWithoutNewLine() { + assertEquals("abc\nde", RemoveLastChar.substring(MULTIPLE_LINES_STRING)); + assertEquals("abc\nde", StringUtils.substring(MULTIPLE_LINES_STRING, 0, MULTIPLE_LINES_STRING.length() - 1)); + assertEquals("abc\nde", StringUtils.chop(MULTIPLE_LINES_STRING)); + assertEquals("abc\nde", MULTIPLE_LINES_STRING.replaceAll(".$", "")); + assertEquals("abc\nde", RemoveLastChar.chop(MULTIPLE_LINES_STRING)); + } } From 1af7196a652db82b2907844731998d1b09987603 Mon Sep 17 00:00:00 2001 From: iaforek Date: Fri, 12 May 2017 13:18:01 +0100 Subject: [PATCH 10/54] BAEL-838 Renamed RemoveLastChar class to StringHelper and added Java8 examples. Refactord code. --- .../com/baeldung/string/RemoveLastChar.java | 19 -------- .../com/baeldung/string/StringHelper.java | 26 +++++++++++ ...astCharTest.java => StringHelperTest.java} | 44 ++++++++++++------- 3 files changed, 55 insertions(+), 34 deletions(-) delete mode 100644 core-java/src/main/java/com/baeldung/string/RemoveLastChar.java create mode 100644 core-java/src/main/java/com/baeldung/string/StringHelper.java rename core-java/src/test/java/com/baeldung/string/{RemoveLastCharTest.java => StringHelperTest.java} (55%) diff --git a/core-java/src/main/java/com/baeldung/string/RemoveLastChar.java b/core-java/src/main/java/com/baeldung/string/RemoveLastChar.java deleted file mode 100644 index 8d15f0d7f5..0000000000 --- a/core-java/src/main/java/com/baeldung/string/RemoveLastChar.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.baeldung.string; - -public class RemoveLastChar { - public static String substring(String s) { - if (s == null || s.length() == 0) { - return s; - } else { - return (s.substring(0, s.length() - 1)); - } - } - - public static String chop(String s) { - if (s == null) { - return s; - } else { - return s.replaceAll(".$", ""); - } - } -} diff --git a/core-java/src/main/java/com/baeldung/string/StringHelper.java b/core-java/src/main/java/com/baeldung/string/StringHelper.java new file mode 100644 index 0000000000..6b9d5d36d7 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/string/StringHelper.java @@ -0,0 +1,26 @@ +package com.baeldung.string; + +import java.util.Optional; + +public class StringHelper { + public static String withoutLastChar(String s) { + return (s == null || s.length() == 0) ? s : (s.substring(0, s.length() - 1)); + } + + public static String removeLastChar(String s) { + return (s == null) ? s : s.replaceAll(".$", ""); + } + + public static String withoutLastCharacter(String s) { + return Optional.ofNullable(s) + .filter(str -> str.length() != 0) + .map(str -> str.substring(0, str.length() - 1)) + .orElse(s); + } + + public static String removeLastCharacter(String s) { + return Optional.ofNullable(s) + .map(str -> str.replaceAll(".$", "")) + .orElse(null); + } +} diff --git a/core-java/src/test/java/com/baeldung/string/RemoveLastCharTest.java b/core-java/src/test/java/com/baeldung/string/StringHelperTest.java similarity index 55% rename from core-java/src/test/java/com/baeldung/string/RemoveLastCharTest.java rename to core-java/src/test/java/com/baeldung/string/StringHelperTest.java index 29cf856da3..ae8aaec71e 100644 --- a/core-java/src/test/java/com/baeldung/string/RemoveLastCharTest.java +++ b/core-java/src/test/java/com/baeldung/string/StringHelperTest.java @@ -5,7 +5,7 @@ import static org.junit.Assert.assertNotEquals; import org.apache.commons.lang3.StringUtils; import org.junit.Test; -public class RemoveLastCharTest { +public class StringHelperTest { public static final String TEST_STRING = "abcdef"; public static final String NULL_STRING = null; @@ -17,62 +17,76 @@ public class RemoveLastCharTest { @Test public void givenTestString_whenSubstring_thenGetStingWithoutLastChar() { - assertEquals("abcde", RemoveLastChar.substring(TEST_STRING)); + assertEquals("abcde", StringHelper.withoutLastChar(TEST_STRING)); assertEquals("abcde", StringUtils.substring(TEST_STRING, 0, TEST_STRING.length() - 1)); assertEquals("abcde", StringUtils.chop(TEST_STRING)); assertEquals("abcde", TEST_STRING.replaceAll(".$", "")); - assertEquals("abcde", RemoveLastChar.chop(TEST_STRING)); + assertEquals("abcde", StringHelper.removeLastChar(TEST_STRING)); + assertEquals("abcde", StringHelper.withoutLastCharacter(TEST_STRING)); + assertEquals("abcde", StringHelper.removeLastCharacter(TEST_STRING)); } @Test public void givenNullString_whenSubstring_thenGetNullString() { - assertEquals(NULL_STRING, RemoveLastChar.substring(NULL_STRING)); + assertEquals(NULL_STRING, StringHelper.withoutLastChar(NULL_STRING)); assertEquals(NULL_STRING, StringUtils.chop(NULL_STRING)); - assertEquals(NULL_STRING, RemoveLastChar.chop(NULL_STRING)); + assertEquals(NULL_STRING, StringHelper.removeLastChar(NULL_STRING)); + assertEquals(NULL_STRING, StringHelper.withoutLastCharacter(NULL_STRING)); + assertEquals(NULL_STRING, StringHelper.removeLastCharacter(NULL_STRING)); } @Test public void givenEmptyString_whenSubstring_thenGetEmptyString() { - assertEquals(EMPTY_STRING, RemoveLastChar.substring(EMPTY_STRING)); + assertEquals(EMPTY_STRING, StringHelper.withoutLastChar(EMPTY_STRING)); assertEquals(EMPTY_STRING, StringUtils.substring(EMPTY_STRING, 0, EMPTY_STRING.length() - 1)); assertEquals(EMPTY_STRING, StringUtils.chop(EMPTY_STRING)); assertEquals(EMPTY_STRING, EMPTY_STRING.replaceAll(".$", "")); - assertEquals(EMPTY_STRING, RemoveLastChar.chop(EMPTY_STRING)); + assertEquals(EMPTY_STRING, StringHelper.removeLastChar(EMPTY_STRING)); + assertEquals(EMPTY_STRING, StringHelper.withoutLastCharacter(EMPTY_STRING)); + assertEquals(EMPTY_STRING, StringHelper.removeLastCharacter(EMPTY_STRING)); } @Test public void givenOneCharString_whenSubstring_thenGetEmptyString() { - assertEquals(EMPTY_STRING, RemoveLastChar.substring(ONE_CHAR_STRING)); + assertEquals(EMPTY_STRING, StringHelper.withoutLastChar(ONE_CHAR_STRING)); assertEquals(EMPTY_STRING, StringUtils.substring(ONE_CHAR_STRING, 0, ONE_CHAR_STRING.length() - 1)); assertEquals(EMPTY_STRING, StringUtils.chop(ONE_CHAR_STRING)); assertEquals(EMPTY_STRING, ONE_CHAR_STRING.replaceAll(".$", "")); - assertEquals(EMPTY_STRING, RemoveLastChar.chop(ONE_CHAR_STRING)); + assertEquals(EMPTY_STRING, StringHelper.removeLastChar(ONE_CHAR_STRING)); + assertEquals(EMPTY_STRING, StringHelper.withoutLastCharacter(ONE_CHAR_STRING)); + assertEquals(EMPTY_STRING, StringHelper.removeLastCharacter(ONE_CHAR_STRING)); } @Test public void givenStringWithWhiteSpaceAtTheEnd_whenSubstring_thenGetStringWithoutWhiteSpaceAtTheEnd() { - assertEquals("abc", RemoveLastChar.substring(WHITE_SPACE_AT_THE_END_STRING)); + assertEquals("abc", StringHelper.withoutLastChar(WHITE_SPACE_AT_THE_END_STRING)); assertEquals("abc", StringUtils.substring(WHITE_SPACE_AT_THE_END_STRING, 0, WHITE_SPACE_AT_THE_END_STRING.length() - 1)); assertEquals("abc", StringUtils.chop(WHITE_SPACE_AT_THE_END_STRING)); assertEquals("abc", WHITE_SPACE_AT_THE_END_STRING.replaceAll(".$", "")); - assertEquals("abc", RemoveLastChar.chop(WHITE_SPACE_AT_THE_END_STRING)); + assertEquals("abc", StringHelper.removeLastChar(WHITE_SPACE_AT_THE_END_STRING)); + assertEquals("abc", StringHelper.withoutLastCharacter(WHITE_SPACE_AT_THE_END_STRING)); + assertEquals("abc", StringHelper.removeLastCharacter(WHITE_SPACE_AT_THE_END_STRING)); } @Test public void givenStringWithNewLineAtTheEnd_whenSubstring_thenGetStringWithoutNewLine() { - assertEquals("abc", RemoveLastChar.substring(NEW_LINE_AT_THE_END_STRING)); + assertEquals("abc", StringHelper.withoutLastChar(NEW_LINE_AT_THE_END_STRING)); assertEquals("abc", StringUtils.substring(NEW_LINE_AT_THE_END_STRING, 0, NEW_LINE_AT_THE_END_STRING.length() - 1)); assertEquals("abc", StringUtils.chop(NEW_LINE_AT_THE_END_STRING)); assertNotEquals("abc", NEW_LINE_AT_THE_END_STRING.replaceAll(".$", "")); - assertNotEquals("abc", RemoveLastChar.chop(NEW_LINE_AT_THE_END_STRING)); + assertNotEquals("abc", StringHelper.removeLastChar(NEW_LINE_AT_THE_END_STRING)); + assertEquals("abc", StringHelper.withoutLastCharacter(NEW_LINE_AT_THE_END_STRING)); + assertNotEquals("abc", StringHelper.removeLastCharacter(NEW_LINE_AT_THE_END_STRING)); } @Test public void givenMultiLineString_whenSubstring_thenGetStringWithoutNewLine() { - assertEquals("abc\nde", RemoveLastChar.substring(MULTIPLE_LINES_STRING)); + assertEquals("abc\nde", StringHelper.withoutLastChar(MULTIPLE_LINES_STRING)); assertEquals("abc\nde", StringUtils.substring(MULTIPLE_LINES_STRING, 0, MULTIPLE_LINES_STRING.length() - 1)); assertEquals("abc\nde", StringUtils.chop(MULTIPLE_LINES_STRING)); assertEquals("abc\nde", MULTIPLE_LINES_STRING.replaceAll(".$", "")); - assertEquals("abc\nde", RemoveLastChar.chop(MULTIPLE_LINES_STRING)); + assertEquals("abc\nde", StringHelper.removeLastChar(MULTIPLE_LINES_STRING)); + assertEquals("abc\nde", StringHelper.withoutLastCharacter(MULTIPLE_LINES_STRING)); + assertEquals("abc\nde", StringHelper.removeLastCharacter(MULTIPLE_LINES_STRING)); } } From e497266a8205bc436fd95d06bd08cff1c1e0f006 Mon Sep 17 00:00:00 2001 From: Predrag Maric Date: Sun, 14 May 2017 00:13:18 +0200 Subject: [PATCH 11/54] BAEL-838 Changed method names --- .gitignore | 2 - .../com/baeldung/string/StringHelper.java | 8 +-- .../com/baeldung/string/StringHelperTest.java | 56 +++++++++---------- 3 files changed, 32 insertions(+), 34 deletions(-) diff --git a/.gitignore b/.gitignore index 111ff98630..60c38ed8f5 100644 --- a/.gitignore +++ b/.gitignore @@ -33,5 +33,3 @@ spring-openid/src/main/resources/application.properties spring-security-openid/src/main/resources/application.properties spring-all/*.log -core-java/src/main/java/com/baeldung/string/RemoveLastChar.java -core-java/src/test/java/com/baeldung/string/RemoveLastCharTest.java diff --git a/core-java/src/main/java/com/baeldung/string/StringHelper.java b/core-java/src/main/java/com/baeldung/string/StringHelper.java index 6b9d5d36d7..93ce1b684e 100644 --- a/core-java/src/main/java/com/baeldung/string/StringHelper.java +++ b/core-java/src/main/java/com/baeldung/string/StringHelper.java @@ -3,22 +3,22 @@ package com.baeldung.string; import java.util.Optional; public class StringHelper { - public static String withoutLastChar(String s) { + public static String removeLastChar(String s) { return (s == null || s.length() == 0) ? s : (s.substring(0, s.length() - 1)); } - public static String removeLastChar(String s) { + public static String removeLastCharRegex(String s) { return (s == null) ? s : s.replaceAll(".$", ""); } - public static String withoutLastCharacter(String s) { + public static String removeLastCharOptional(String s) { return Optional.ofNullable(s) .filter(str -> str.length() != 0) .map(str -> str.substring(0, str.length() - 1)) .orElse(s); } - public static String removeLastCharacter(String s) { + public static String removeLastCharRegexOptional(String s) { return Optional.ofNullable(s) .map(str -> str.replaceAll(".$", "")) .orElse(null); diff --git a/core-java/src/test/java/com/baeldung/string/StringHelperTest.java b/core-java/src/test/java/com/baeldung/string/StringHelperTest.java index ae8aaec71e..48a9fb9364 100644 --- a/core-java/src/test/java/com/baeldung/string/StringHelperTest.java +++ b/core-java/src/test/java/com/baeldung/string/StringHelperTest.java @@ -17,76 +17,76 @@ public class StringHelperTest { @Test public void givenTestString_whenSubstring_thenGetStingWithoutLastChar() { - assertEquals("abcde", StringHelper.withoutLastChar(TEST_STRING)); + assertEquals("abcde", StringHelper.removeLastChar(TEST_STRING)); assertEquals("abcde", StringUtils.substring(TEST_STRING, 0, TEST_STRING.length() - 1)); assertEquals("abcde", StringUtils.chop(TEST_STRING)); assertEquals("abcde", TEST_STRING.replaceAll(".$", "")); - assertEquals("abcde", StringHelper.removeLastChar(TEST_STRING)); - assertEquals("abcde", StringHelper.withoutLastCharacter(TEST_STRING)); - assertEquals("abcde", StringHelper.removeLastCharacter(TEST_STRING)); + assertEquals("abcde", StringHelper.removeLastCharRegex(TEST_STRING)); + assertEquals("abcde", StringHelper.removeLastCharOptional(TEST_STRING)); + assertEquals("abcde", StringHelper.removeLastCharRegexOptional(TEST_STRING)); } @Test public void givenNullString_whenSubstring_thenGetNullString() { - assertEquals(NULL_STRING, StringHelper.withoutLastChar(NULL_STRING)); - assertEquals(NULL_STRING, StringUtils.chop(NULL_STRING)); assertEquals(NULL_STRING, StringHelper.removeLastChar(NULL_STRING)); - assertEquals(NULL_STRING, StringHelper.withoutLastCharacter(NULL_STRING)); - assertEquals(NULL_STRING, StringHelper.removeLastCharacter(NULL_STRING)); + assertEquals(NULL_STRING, StringUtils.chop(NULL_STRING)); + assertEquals(NULL_STRING, StringHelper.removeLastCharRegex(NULL_STRING)); + assertEquals(NULL_STRING, StringHelper.removeLastCharOptional(NULL_STRING)); + assertEquals(NULL_STRING, StringHelper.removeLastCharRegexOptional(NULL_STRING)); } @Test public void givenEmptyString_whenSubstring_thenGetEmptyString() { - assertEquals(EMPTY_STRING, StringHelper.withoutLastChar(EMPTY_STRING)); + assertEquals(EMPTY_STRING, StringHelper.removeLastChar(EMPTY_STRING)); assertEquals(EMPTY_STRING, StringUtils.substring(EMPTY_STRING, 0, EMPTY_STRING.length() - 1)); assertEquals(EMPTY_STRING, StringUtils.chop(EMPTY_STRING)); assertEquals(EMPTY_STRING, EMPTY_STRING.replaceAll(".$", "")); - assertEquals(EMPTY_STRING, StringHelper.removeLastChar(EMPTY_STRING)); - assertEquals(EMPTY_STRING, StringHelper.withoutLastCharacter(EMPTY_STRING)); - assertEquals(EMPTY_STRING, StringHelper.removeLastCharacter(EMPTY_STRING)); + assertEquals(EMPTY_STRING, StringHelper.removeLastCharRegex(EMPTY_STRING)); + assertEquals(EMPTY_STRING, StringHelper.removeLastCharOptional(EMPTY_STRING)); + assertEquals(EMPTY_STRING, StringHelper.removeLastCharRegexOptional(EMPTY_STRING)); } @Test public void givenOneCharString_whenSubstring_thenGetEmptyString() { - assertEquals(EMPTY_STRING, StringHelper.withoutLastChar(ONE_CHAR_STRING)); + assertEquals(EMPTY_STRING, StringHelper.removeLastChar(ONE_CHAR_STRING)); assertEquals(EMPTY_STRING, StringUtils.substring(ONE_CHAR_STRING, 0, ONE_CHAR_STRING.length() - 1)); assertEquals(EMPTY_STRING, StringUtils.chop(ONE_CHAR_STRING)); assertEquals(EMPTY_STRING, ONE_CHAR_STRING.replaceAll(".$", "")); - assertEquals(EMPTY_STRING, StringHelper.removeLastChar(ONE_CHAR_STRING)); - assertEquals(EMPTY_STRING, StringHelper.withoutLastCharacter(ONE_CHAR_STRING)); - assertEquals(EMPTY_STRING, StringHelper.removeLastCharacter(ONE_CHAR_STRING)); + assertEquals(EMPTY_STRING, StringHelper.removeLastCharRegex(ONE_CHAR_STRING)); + assertEquals(EMPTY_STRING, StringHelper.removeLastCharOptional(ONE_CHAR_STRING)); + assertEquals(EMPTY_STRING, StringHelper.removeLastCharRegexOptional(ONE_CHAR_STRING)); } @Test public void givenStringWithWhiteSpaceAtTheEnd_whenSubstring_thenGetStringWithoutWhiteSpaceAtTheEnd() { - assertEquals("abc", StringHelper.withoutLastChar(WHITE_SPACE_AT_THE_END_STRING)); + assertEquals("abc", StringHelper.removeLastChar(WHITE_SPACE_AT_THE_END_STRING)); assertEquals("abc", StringUtils.substring(WHITE_SPACE_AT_THE_END_STRING, 0, WHITE_SPACE_AT_THE_END_STRING.length() - 1)); assertEquals("abc", StringUtils.chop(WHITE_SPACE_AT_THE_END_STRING)); assertEquals("abc", WHITE_SPACE_AT_THE_END_STRING.replaceAll(".$", "")); - assertEquals("abc", StringHelper.removeLastChar(WHITE_SPACE_AT_THE_END_STRING)); - assertEquals("abc", StringHelper.withoutLastCharacter(WHITE_SPACE_AT_THE_END_STRING)); - assertEquals("abc", StringHelper.removeLastCharacter(WHITE_SPACE_AT_THE_END_STRING)); + assertEquals("abc", StringHelper.removeLastCharRegex(WHITE_SPACE_AT_THE_END_STRING)); + assertEquals("abc", StringHelper.removeLastCharOptional(WHITE_SPACE_AT_THE_END_STRING)); + assertEquals("abc", StringHelper.removeLastCharRegexOptional(WHITE_SPACE_AT_THE_END_STRING)); } @Test public void givenStringWithNewLineAtTheEnd_whenSubstring_thenGetStringWithoutNewLine() { - assertEquals("abc", StringHelper.withoutLastChar(NEW_LINE_AT_THE_END_STRING)); + assertEquals("abc", StringHelper.removeLastChar(NEW_LINE_AT_THE_END_STRING)); assertEquals("abc", StringUtils.substring(NEW_LINE_AT_THE_END_STRING, 0, NEW_LINE_AT_THE_END_STRING.length() - 1)); assertEquals("abc", StringUtils.chop(NEW_LINE_AT_THE_END_STRING)); assertNotEquals("abc", NEW_LINE_AT_THE_END_STRING.replaceAll(".$", "")); - assertNotEquals("abc", StringHelper.removeLastChar(NEW_LINE_AT_THE_END_STRING)); - assertEquals("abc", StringHelper.withoutLastCharacter(NEW_LINE_AT_THE_END_STRING)); - assertNotEquals("abc", StringHelper.removeLastCharacter(NEW_LINE_AT_THE_END_STRING)); + assertNotEquals("abc", StringHelper.removeLastCharRegex(NEW_LINE_AT_THE_END_STRING)); + assertEquals("abc", StringHelper.removeLastCharOptional(NEW_LINE_AT_THE_END_STRING)); + assertNotEquals("abc", StringHelper.removeLastCharRegexOptional(NEW_LINE_AT_THE_END_STRING)); } @Test public void givenMultiLineString_whenSubstring_thenGetStringWithoutNewLine() { - assertEquals("abc\nde", StringHelper.withoutLastChar(MULTIPLE_LINES_STRING)); + assertEquals("abc\nde", StringHelper.removeLastChar(MULTIPLE_LINES_STRING)); assertEquals("abc\nde", StringUtils.substring(MULTIPLE_LINES_STRING, 0, MULTIPLE_LINES_STRING.length() - 1)); assertEquals("abc\nde", StringUtils.chop(MULTIPLE_LINES_STRING)); assertEquals("abc\nde", MULTIPLE_LINES_STRING.replaceAll(".$", "")); - assertEquals("abc\nde", StringHelper.removeLastChar(MULTIPLE_LINES_STRING)); - assertEquals("abc\nde", StringHelper.withoutLastCharacter(MULTIPLE_LINES_STRING)); - assertEquals("abc\nde", StringHelper.removeLastCharacter(MULTIPLE_LINES_STRING)); + assertEquals("abc\nde", StringHelper.removeLastCharRegex(MULTIPLE_LINES_STRING)); + assertEquals("abc\nde", StringHelper.removeLastCharOptional(MULTIPLE_LINES_STRING)); + assertEquals("abc\nde", StringHelper.removeLastCharRegexOptional(MULTIPLE_LINES_STRING)); } } From a8041fef4f011566322086550540d32fb4311a09 Mon Sep 17 00:00:00 2001 From: iaforek Date: Tue, 16 May 2017 12:17:59 +0100 Subject: [PATCH 12/54] BAEL-838 Tiny change to keep code consistant. Return null or empty. --- core-java/src/main/java/com/baeldung/string/StringHelper.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java/src/main/java/com/baeldung/string/StringHelper.java b/core-java/src/main/java/com/baeldung/string/StringHelper.java index 93ce1b684e..ad2a0b3419 100644 --- a/core-java/src/main/java/com/baeldung/string/StringHelper.java +++ b/core-java/src/main/java/com/baeldung/string/StringHelper.java @@ -21,6 +21,6 @@ public class StringHelper { public static String removeLastCharRegexOptional(String s) { return Optional.ofNullable(s) .map(str -> str.replaceAll(".$", "")) - .orElse(null); + .orElse(s); } } From 467646d61373825260fece59e46a2afaf748d79f Mon Sep 17 00:00:00 2001 From: iaforek Date: Tue, 16 May 2017 15:32:16 +0100 Subject: [PATCH 13/54] BAEL-838 Removed unresolved conflict. --- core-java/src/main/java/com/baeldung/string/StringHelper.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/core-java/src/main/java/com/baeldung/string/StringHelper.java b/core-java/src/main/java/com/baeldung/string/StringHelper.java index adf8d70531..ad2a0b3419 100644 --- a/core-java/src/main/java/com/baeldung/string/StringHelper.java +++ b/core-java/src/main/java/com/baeldung/string/StringHelper.java @@ -21,10 +21,6 @@ public class StringHelper { public static String removeLastCharRegexOptional(String s) { return Optional.ofNullable(s) .map(str -> str.replaceAll(".$", "")) -<<<<<<< HEAD .orElse(s); -======= - .orElse(null); ->>>>>>> refs/remotes/eugenp/master } } From 6d407f88a339f6ef905063096de21f266a41d020 Mon Sep 17 00:00:00 2001 From: iaforek Date: Tue, 30 May 2017 09:57:12 +0100 Subject: [PATCH 14/54] BAEL-821 New class that shows different rounding techniques. Updated POM. --- core-java/pom.xml | 7 ++++ .../main/java/com/baeldung/maths/Round.java | 38 +++++++++++++++++++ 2 files changed, 45 insertions(+) create mode 100644 core-java/src/main/java/com/baeldung/maths/Round.java diff --git a/core-java/pom.xml b/core-java/pom.xml index bcec20b1e1..5c9bf06a57 100644 --- a/core-java/pom.xml +++ b/core-java/pom.xml @@ -45,6 +45,12 @@ commons-math3 ${commons-math3.version} + + + org.decimal4j + decimal4j + ${decimal4j.version} + org.bouncycastle @@ -369,6 +375,7 @@ 1.55 1.10 3.6.1 + 1.0.3 2.5 4.1 4.01 diff --git a/core-java/src/main/java/com/baeldung/maths/Round.java b/core-java/src/main/java/com/baeldung/maths/Round.java new file mode 100644 index 0000000000..3b30ab2c7a --- /dev/null +++ b/core-java/src/main/java/com/baeldung/maths/Round.java @@ -0,0 +1,38 @@ +package com.baeldung.maths; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.text.DecimalFormat; + +import org.apache.commons.math3.util.Precision; +import org.decimal4j.util.DoubleRounder; + +public class Round { + private static final double PI = 3.1415d; + + public static void main (String args[]) { + System.out.println("PI: " + PI); + System.out.printf("Value with 3 digits after decimal point %.3f %n", PI); + // OUTPUTS: Value with 3 digits after decimal point 3.142 + DecimalFormat df = new DecimalFormat("###.###"); + System.out.println(df.format(PI)); + System.out.println(round(PI, 3)); + System.out.println(roundOptional(PI, 3)); + System.out.println(Precision.round(PI, 3)); + System.out.println(DoubleRounder.round(PI, 3)); + } + + public static double round(double value, int places) { + if (places < 0) throw new IllegalArgumentException(); + + BigDecimal bd = new BigDecimal(value); + bd = bd.setScale(places, RoundingMode.HALF_UP); + return bd.doubleValue(); + } + + public static double roundOptional(double value, int places) { + double scale = Math.pow(10, places); + double rounded = Math.round(value * scale) / scale; + return rounded; + } +} From fc58395ad484e24fa99496c5317ccc716ba6c7c0 Mon Sep 17 00:00:00 2001 From: iaforek Date: Wed, 31 May 2017 10:21:08 +0100 Subject: [PATCH 15/54] BAEL-821 - Added unit test for different round methods. --- .../java/com/baeldung/maths/RoundTest.java | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 core-java/src/test/java/com/baeldung/maths/RoundTest.java diff --git a/core-java/src/test/java/com/baeldung/maths/RoundTest.java b/core-java/src/test/java/com/baeldung/maths/RoundTest.java new file mode 100644 index 0000000000..932836e417 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/maths/RoundTest.java @@ -0,0 +1,29 @@ +package com.baeldung.maths; + +import org.apache.commons.math3.util.Precision; +import org.decimal4j.util.DoubleRounder; +import org.junit.Assert; +import org.junit.Test; + +public class RoundTest { + private double value = 2.03456d; + private int places = 2; + private double delta = 0.0d; + private double expected = 2.03d; + + @Test + public void givenDecimalNumber_roundToNDecimalPlaces_getExpectedResult() { + Assert.assertEquals(expected, Round.round(value, places), delta); + Assert.assertEquals(expected, Round.roundOptional(value, places), delta); + Assert.assertEquals(expected, Precision.round(value, places), delta); + Assert.assertEquals(expected, DoubleRounder.round(value, places), delta); + + places = 3; + expected = 2.035d; + + Assert.assertEquals(expected, Round.round(value, places), delta); + Assert.assertEquals(expected, Round.roundOptional(value, places), delta); + Assert.assertEquals(expected, Precision.round(value, places), delta); + Assert.assertEquals(expected, DoubleRounder.round(value, places), delta); + } +} From efeffc4034a6f04282178482fb90b6891ac9c2a9 Mon Sep 17 00:00:00 2001 From: Predrag Maric Date: Thu, 1 Jun 2017 01:11:25 +0200 Subject: [PATCH 16/54] BAEL-821 Changed test method name to follow the convention --- core-java/src/test/java/com/baeldung/maths/RoundTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java/src/test/java/com/baeldung/maths/RoundTest.java b/core-java/src/test/java/com/baeldung/maths/RoundTest.java index 932836e417..2621cfb65c 100644 --- a/core-java/src/test/java/com/baeldung/maths/RoundTest.java +++ b/core-java/src/test/java/com/baeldung/maths/RoundTest.java @@ -12,7 +12,7 @@ public class RoundTest { private double expected = 2.03d; @Test - public void givenDecimalNumber_roundToNDecimalPlaces_getExpectedResult() { + public void givenDecimalNumber_whenRoundToNDecimalPlaces_thenGetExpectedResult() { Assert.assertEquals(expected, Round.round(value, places), delta); Assert.assertEquals(expected, Round.roundOptional(value, places), delta); Assert.assertEquals(expected, Precision.round(value, places), delta); From c763d263ece2957f5166f704326074e084225e84 Mon Sep 17 00:00:00 2001 From: iaforek Date: Fri, 2 Jun 2017 00:18:29 +0100 Subject: [PATCH 17/54] BAEL-821 Added more test and updated round methods. --- .../main/java/com/baeldung/maths/Round.java | 13 +++++- .../java/com/baeldung/maths/RoundTest.java | 46 ++++++++++++++++++- 2 files changed, 55 insertions(+), 4 deletions(-) diff --git a/core-java/src/main/java/com/baeldung/maths/Round.java b/core-java/src/main/java/com/baeldung/maths/Round.java index 3b30ab2c7a..a38f5e2526 100644 --- a/core-java/src/main/java/com/baeldung/maths/Round.java +++ b/core-java/src/main/java/com/baeldung/maths/Round.java @@ -17,7 +17,8 @@ public class Round { DecimalFormat df = new DecimalFormat("###.###"); System.out.println(df.format(PI)); System.out.println(round(PI, 3)); - System.out.println(roundOptional(PI, 3)); + System.out.println(roundNotPrecise(PI, 3)); + System.out.println(roundAvoid(PI, 3)); System.out.println(Precision.round(PI, 3)); System.out.println(DoubleRounder.round(PI, 3)); } @@ -25,12 +26,20 @@ public class Round { public static double round(double value, int places) { if (places < 0) throw new IllegalArgumentException(); + BigDecimal bd = new BigDecimal(Double.toString(value)); + bd = bd.setScale(places, RoundingMode.HALF_UP); + return bd.doubleValue(); + } + + public static double roundNotPrecise(double value, int places) { + if (places < 0) throw new IllegalArgumentException(); + BigDecimal bd = new BigDecimal(value); bd = bd.setScale(places, RoundingMode.HALF_UP); return bd.doubleValue(); } - public static double roundOptional(double value, int places) { + public static double roundAvoid(double value, int places) { double scale = Math.pow(10, places); double rounded = Math.round(value * scale) / scale; return rounded; diff --git a/core-java/src/test/java/com/baeldung/maths/RoundTest.java b/core-java/src/test/java/com/baeldung/maths/RoundTest.java index 932836e417..8a31b90cb3 100644 --- a/core-java/src/test/java/com/baeldung/maths/RoundTest.java +++ b/core-java/src/test/java/com/baeldung/maths/RoundTest.java @@ -14,7 +14,8 @@ public class RoundTest { @Test public void givenDecimalNumber_roundToNDecimalPlaces_getExpectedResult() { Assert.assertEquals(expected, Round.round(value, places), delta); - Assert.assertEquals(expected, Round.roundOptional(value, places), delta); + Assert.assertEquals(expected, Round.roundNotPrecise(value, places), delta); + Assert.assertEquals(expected, Round.roundAvoid(value, places), delta); Assert.assertEquals(expected, Precision.round(value, places), delta); Assert.assertEquals(expected, DoubleRounder.round(value, places), delta); @@ -22,7 +23,48 @@ public class RoundTest { expected = 2.035d; Assert.assertEquals(expected, Round.round(value, places), delta); - Assert.assertEquals(expected, Round.roundOptional(value, places), delta); + Assert.assertEquals(expected, Round.roundNotPrecise(value, places), delta); + Assert.assertEquals(expected, Round.roundAvoid(value, places), delta); + Assert.assertEquals(expected, Precision.round(value, places), delta); + Assert.assertEquals(expected, DoubleRounder.round(value, places), delta); + + value = 1000.0d; + places = 17; + expected = 1000.0d; + + Assert.assertEquals(expected, Round.round(value, places), delta); + Assert.assertEquals(expected, Round.roundNotPrecise(value, places), delta); + Assert.assertNotEquals(expected, Round.roundAvoid(value, places), delta); // Returns: 92.23372036854776 ! + Assert.assertEquals(expected, Precision.round(value, places), delta); + Assert.assertEquals(expected, DoubleRounder.round(value, places), delta); + + value = 256.025d; + places = 2; + expected = 256.03d; + + Assert.assertEquals(expected, Round.round(value, places), delta); + Assert.assertNotEquals(expected, Round.roundNotPrecise(value, places), delta); // Returns: 256.02 ! + Assert.assertNotEquals(expected, Round.roundAvoid(value, places), delta); // Returns: 256.02 ! + Assert.assertEquals(expected, Precision.round(value, places), delta); + Assert.assertNotEquals(expected, DoubleRounder.round(value, places), delta); // Returns: 256.02 ! + + value = 260.775d; + places = 2; + expected = 260.78d; + + Assert.assertEquals(expected, Round.round(value, places), delta); + Assert.assertNotEquals(expected, Round.roundNotPrecise(value, places), delta); // Returns: 260.77 ! + Assert.assertNotEquals(expected, Round.roundAvoid(value, places), delta); // Returns: 260.77 ! + Assert.assertEquals(expected, Precision.round(value, places), delta); + Assert.assertNotEquals(expected, DoubleRounder.round(value, places), delta); // Returns: 260.77 ! + + value = 90080070060.1d; + places = 9; + expected = 90080070060.1d; + + Assert.assertEquals(expected, Round.round(value, places), delta); + Assert.assertEquals(expected, Round.roundNotPrecise(value, places), delta); + Assert.assertNotEquals(expected, Round.roundAvoid(value, places), delta); // Returns: 9.223372036854776E9 ! Assert.assertEquals(expected, Precision.round(value, places), delta); Assert.assertEquals(expected, DoubleRounder.round(value, places), delta); } From c5f2fb5b2c30f2ce40cded6760180350f097f722 Mon Sep 17 00:00:00 2001 From: iaforek Date: Mon, 12 Jun 2017 12:21:57 +0100 Subject: [PATCH 18/54] BAEL-837 - initial commit. A few examples of adding doubles. --- .../maths/FloatingPointArithmetic.java | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 core-java/src/main/java/com/baeldung/maths/FloatingPointArithmetic.java diff --git a/core-java/src/main/java/com/baeldung/maths/FloatingPointArithmetic.java b/core-java/src/main/java/com/baeldung/maths/FloatingPointArithmetic.java new file mode 100644 index 0000000000..9cdeeb5e81 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/maths/FloatingPointArithmetic.java @@ -0,0 +1,44 @@ +package com.baeldung.maths; + +import java.math.BigDecimal; + +public class FloatingPointArithmetic { + public static void main(String[] args) { + + double a = 13.22; + double b = 4.88; + double c = 21.45; + + System.out.println("a = " + a); + System.out.println("b = " + b); + System.out.println("c = " + c); + + double ab = a + b; + System.out.println("a + b = " + ab); + + double abc = a + b + c; + System.out.println("a + b + c = " + abc); + + double ac = a + c; + System.out.println("a + c = " + ac); + + double acb = a + c + b; + System.out.println("a + c + b = " + acb); + + double ac_b = ac + b; + System.out.println("ac + b = " + ac_b); + + BigDecimal d = new BigDecimal(String.valueOf(a)); + BigDecimal e = new BigDecimal(String.valueOf(b)); + BigDecimal f = new BigDecimal(String.valueOf(c)); + + BigDecimal def; + BigDecimal dfe; + + def = d.add(e).add(f); + dfe = d.add(f).add(e); + + System.out.println("d + e + f = " + def); + System.out.println("d + f + e = " + dfe); + } +} From de138a4a925c8019cdacc10cb2ecce2ea58f3c53 Mon Sep 17 00:00:00 2001 From: iaforek Date: Tue, 13 Jun 2017 22:29:27 +0100 Subject: [PATCH 19/54] BAEL-837 - Couple of smaller changes --- .../maths/FloatingPointArithmetic.java | 27 ++++++++++++------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/core-java/src/main/java/com/baeldung/maths/FloatingPointArithmetic.java b/core-java/src/main/java/com/baeldung/maths/FloatingPointArithmetic.java index 9cdeeb5e81..4163adcf09 100644 --- a/core-java/src/main/java/com/baeldung/maths/FloatingPointArithmetic.java +++ b/core-java/src/main/java/com/baeldung/maths/FloatingPointArithmetic.java @@ -13,30 +13,37 @@ public class FloatingPointArithmetic { System.out.println("b = " + b); System.out.println("c = " + c); - double ab = a + b; - System.out.println("a + b = " + ab); + double sum_ab = a + b; + System.out.println("a + b = " + sum_ab); double abc = a + b + c; System.out.println("a + b + c = " + abc); - double ac = a + c; - System.out.println("a + c = " + ac); + double ab_c = sum_ab + c; + System.out.println("ab + c = " + ab_c); + + double sum_ac = a + c; + System.out.println("a + c = " + sum_ac); double acb = a + c + b; System.out.println("a + c + b = " + acb); - double ac_b = ac + b; + double ac_b = sum_ac + b; System.out.println("ac + b = " + ac_b); + double ab = 18.1; + double ac = 34.67; + double sum_ab_c = ab + c; + double sum_ac_b = ac + b; + System.out.println("ab + c = " + sum_ab_c); + System.out.println("ac + b = " + sum_ac_b); + BigDecimal d = new BigDecimal(String.valueOf(a)); BigDecimal e = new BigDecimal(String.valueOf(b)); BigDecimal f = new BigDecimal(String.valueOf(c)); - BigDecimal def; - BigDecimal dfe; - - def = d.add(e).add(f); - dfe = d.add(f).add(e); + BigDecimal def = d.add(e).add(f); + BigDecimal dfe = d.add(f).add(e); System.out.println("d + e + f = " + def); System.out.println("d + f + e = " + dfe); From f6a39f84bb36adad56c75ed77e411ab775d2cd54 Mon Sep 17 00:00:00 2001 From: iaforek Date: Tue, 13 Jun 2017 22:29:27 +0100 Subject: [PATCH 20/54] BAEL-837 - Added jUnit test. --- .../maths/FloatingPointArithmetic.java | 27 ++++++----- .../maths/FloatingPointArithmeticTest.java | 45 +++++++++++++++++++ 2 files changed, 62 insertions(+), 10 deletions(-) create mode 100644 core-java/src/test/java/com/baeldung/maths/FloatingPointArithmeticTest.java diff --git a/core-java/src/main/java/com/baeldung/maths/FloatingPointArithmetic.java b/core-java/src/main/java/com/baeldung/maths/FloatingPointArithmetic.java index 9cdeeb5e81..4163adcf09 100644 --- a/core-java/src/main/java/com/baeldung/maths/FloatingPointArithmetic.java +++ b/core-java/src/main/java/com/baeldung/maths/FloatingPointArithmetic.java @@ -13,30 +13,37 @@ public class FloatingPointArithmetic { System.out.println("b = " + b); System.out.println("c = " + c); - double ab = a + b; - System.out.println("a + b = " + ab); + double sum_ab = a + b; + System.out.println("a + b = " + sum_ab); double abc = a + b + c; System.out.println("a + b + c = " + abc); - double ac = a + c; - System.out.println("a + c = " + ac); + double ab_c = sum_ab + c; + System.out.println("ab + c = " + ab_c); + + double sum_ac = a + c; + System.out.println("a + c = " + sum_ac); double acb = a + c + b; System.out.println("a + c + b = " + acb); - double ac_b = ac + b; + double ac_b = sum_ac + b; System.out.println("ac + b = " + ac_b); + double ab = 18.1; + double ac = 34.67; + double sum_ab_c = ab + c; + double sum_ac_b = ac + b; + System.out.println("ab + c = " + sum_ab_c); + System.out.println("ac + b = " + sum_ac_b); + BigDecimal d = new BigDecimal(String.valueOf(a)); BigDecimal e = new BigDecimal(String.valueOf(b)); BigDecimal f = new BigDecimal(String.valueOf(c)); - BigDecimal def; - BigDecimal dfe; - - def = d.add(e).add(f); - dfe = d.add(f).add(e); + BigDecimal def = d.add(e).add(f); + BigDecimal dfe = d.add(f).add(e); System.out.println("d + e + f = " + def); System.out.println("d + f + e = " + dfe); diff --git a/core-java/src/test/java/com/baeldung/maths/FloatingPointArithmeticTest.java b/core-java/src/test/java/com/baeldung/maths/FloatingPointArithmeticTest.java new file mode 100644 index 0000000000..2066f13c6d --- /dev/null +++ b/core-java/src/test/java/com/baeldung/maths/FloatingPointArithmeticTest.java @@ -0,0 +1,45 @@ +package com.baeldung.maths; + +import java.math.BigDecimal; + +import org.junit.Assert; +import org.junit.Test; + +public class FloatingPointArithmeticTest { + + @Test + public void givenDecimalNumbers_whenAddedTogether_thenGetExpectedResult() { + double a = 13.22; + double b = 4.88; + double c = 21.45; + double result = 39.55; + + double abc = a + b + c; + double acb = a + c + b; + + Assert.assertEquals(result, abc, 0); + Assert.assertNotEquals(result, acb, 0); + + double ab = 18.1; + double ac = 34.67; + + double ab_c = ab + c; + double ac_b = ac + b; + + Assert.assertEquals(result, ab_c, 0); + Assert.assertNotEquals(result, ac_b, 0); + + BigDecimal d = new BigDecimal(String.valueOf(a)); + BigDecimal e = new BigDecimal(String.valueOf(b)); + BigDecimal f = new BigDecimal(String.valueOf(c)); + BigDecimal sum = new BigDecimal("39.55"); + + BigDecimal def = d.add(e).add(f); + BigDecimal dfe = d.add(f).add(e); + + Assert.assertEquals(0, def.compareTo(sum)); + Assert.assertEquals(0, dfe.compareTo(sum)); + + Assert.assertNotEquals(0, sum.compareTo(new BigDecimal(String.valueOf(acb)))); + } +} From f775bf91e53a1ecfb9b70596688d7c8202bf495f Mon Sep 17 00:00:00 2001 From: iaforek Date: Tue, 4 Jul 2017 15:16:41 +0100 Subject: [PATCH 21/54] BAEL-579 Updated Spring Cloud Version I was getting error: java.lang.NoSuchMethodError: org.springframework.cloud.config.environment.Environment After version update, all is okay. --- spring-cloud/spring-cloud-config/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-cloud/spring-cloud-config/pom.xml b/spring-cloud/spring-cloud-config/pom.xml index 81693b7e2e..d91b30d13f 100644 --- a/spring-cloud/spring-cloud-config/pom.xml +++ b/spring-cloud/spring-cloud-config/pom.xml @@ -34,7 +34,7 @@ - Brixton.SR7 + Dalston.SR1 From 076657a26a57e0aa676989a4d97966a3b9d53e1c Mon Sep 17 00:00:00 2001 From: iaforek Date: Tue, 4 Jul 2017 17:39:33 +0100 Subject: [PATCH 22/54] BAEL-579 Added actuator to Cloud Config Client. --- .../spring-cloud-config/client/pom.xml | 98 ++++++++++--------- .../cloud/config/client/ConfigClient.java | 60 ++++++------ 2 files changed, 82 insertions(+), 76 deletions(-) diff --git a/spring-cloud/spring-cloud-config/client/pom.xml b/spring-cloud/spring-cloud-config/client/pom.xml index 667040ed3c..c49f26f65d 100644 --- a/spring-cloud/spring-cloud-config/client/pom.xml +++ b/spring-cloud/spring-cloud-config/client/pom.xml @@ -1,47 +1,51 @@ - - - 4.0.0 - - - com.baeldung.spring.cloud - spring-cloud-config - 1.0-SNAPSHOT - - client - - - - org.springframework.cloud - spring-cloud-starter-config - ${spring-cloud-starter-config.version} - - - org.springframework.boot - spring-boot-starter-web - ${org.springframework.boot.version} - - - - org.springframework.boot - spring-boot-starter-test - ${org.springframework.boot.version} - test - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - - - 1.2.2.RELEASE - 1.4.2.RELEASE - - + + + 4.0.0 + + + com.baeldung.spring.cloud + spring-cloud-config + 1.0-SNAPSHOT + + client + + + + org.springframework.cloud + spring-cloud-starter-config + ${spring-cloud-starter-config.version} + + + org.springframework.boot + spring-boot-starter-web + ${org.springframework.boot.version} + + + + org.springframework.boot + spring-boot-starter-test + ${org.springframework.boot.version} + test + + + org.springframework.boot + spring-boot-actuator + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + 1.2.2.RELEASE + 1.4.2.RELEASE + + diff --git a/spring-cloud/spring-cloud-config/client/src/main/java/com/baeldung/spring/cloud/config/client/ConfigClient.java b/spring-cloud/spring-cloud-config/client/src/main/java/com/baeldung/spring/cloud/config/client/ConfigClient.java index 1dd3bbdab0..96121eb9b5 100644 --- a/spring-cloud/spring-cloud-config/client/src/main/java/com/baeldung/spring/cloud/config/client/ConfigClient.java +++ b/spring-cloud/spring-cloud-config/client/src/main/java/com/baeldung/spring/cloud/config/client/ConfigClient.java @@ -1,29 +1,31 @@ -package com.baeldung.spring.cloud.config.client; - -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.http.MediaType; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RestController; - -@SpringBootApplication -@RestController -public class ConfigClient { - @Value("${user.role}") - private String role; - - @Value("${user.password}") - private String password; - - public static void main(String[] args) { - SpringApplication.run(ConfigClient.class, args); - } - - @RequestMapping(value = "/whoami/{username}", method = RequestMethod.GET, produces = MediaType.TEXT_PLAIN_VALUE) - public String whoami(@PathVariable("username") String username) { - return String.format("Hello %s! You are a(n) %s and your password is '%s'.\n", username, role, password); - } -} +package com.baeldung.spring.cloud.config.client; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +@SpringBootApplication +@RestController +@RefreshScope +public class ConfigClient { + @Value("${user.role}") + private String role; + + @Value("${user.password}") + private String password; + + public static void main(String[] args) { + SpringApplication.run(ConfigClient.class, args); + } + + @RequestMapping(value = "/whoami/{username}", method = RequestMethod.GET, produces = MediaType.TEXT_PLAIN_VALUE) + public String whoami(@PathVariable("username") String username) { + return String.format("Hello %s! You are a(n) %s and your password is '%s'.\n", username, role, password); + } +} From 7845da922d89d53506dd0fff387ea13694c50bc1 Mon Sep 17 00:00:00 2001 From: iaforek Date: Tue, 4 Jul 2017 23:04:25 +0100 Subject: [PATCH 23/54] BAEL-579 Enabled cloud bus and updated dependencies. --- .../spring-cloud-config/server/pom.xml | 107 +++++++++--------- .../src/main/resources/application.properties | 23 ++-- 2 files changed, 67 insertions(+), 63 deletions(-) diff --git a/spring-cloud/spring-cloud-config/server/pom.xml b/spring-cloud/spring-cloud-config/server/pom.xml index 0157851001..7aeb1967a0 100644 --- a/spring-cloud/spring-cloud-config/server/pom.xml +++ b/spring-cloud/spring-cloud-config/server/pom.xml @@ -1,54 +1,53 @@ - - - 4.0.0 - - - com.baeldung.spring.cloud - spring-cloud-config - 1.0-SNAPSHOT - - server - - - - org.springframework.cloud - spring-cloud-config-server - ${spring-cloud-config-server.version} - - - org.springframework.boot - spring-boot-starter-security - ${org.springframework.boot.version} - - - org.springframework.boot - spring-boot-starter-web - ${org.springframework.boot.version} - - - - org.springframework.boot - spring-boot-starter-test - ${org.springframework.boot.version} - test - - - - - - - org.springframework.boot - spring-boot-maven-plugin - ${org.springframework.boot.version} - - - - - - 1.2.2.RELEASE - 1.4.2.RELEASE - - - + + + 4.0.0 + + + com.baeldung.spring.cloud + spring-cloud-config + 1.0-SNAPSHOT + + server + + + + org.springframework.cloud + spring-cloud-config-server + + + org.springframework.boot + spring-boot-starter-security + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-test + test + + + + org.springframework.cloud + spring-cloud-config-monitor + + + org.springframework.cloud + spring-cloud-starter-stream-rabbit + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/spring-cloud/spring-cloud-config/server/src/main/resources/application.properties b/spring-cloud/spring-cloud-config/server/src/main/resources/application.properties index 3d4f3bcd47..95699c9fa0 100644 --- a/spring-cloud/spring-cloud-config/server/src/main/resources/application.properties +++ b/spring-cloud/spring-cloud-config/server/src/main/resources/application.properties @@ -1,9 +1,14 @@ -server.port=8888 -spring.cloud.config.server.git.uri= -spring.cloud.config.server.git.clone-on-start=true -security.user.name=root -security.user.password=s3cr3t -encrypt.key-store.location=classpath:/config-server.jks -encrypt.key-store.password=my-s70r3-s3cr3t -encrypt.key-store.alias=config-server-key -encrypt.key-store.secret=my-k34-s3cr3t +server.port=8888 +spring.cloud.config.server.git.uri= +spring.cloud.config.server.git.clone-on-start=true +security.user.name=root +security.user.password=s3cr3t +encrypt.key-store.location=classpath:/config-server.jks +encrypt.key-store.password=my-s70r3-s3cr3t +encrypt.key-store.alias=config-server-key +encrypt.key-store.secret=my-k34-s3cr3t +spring.cloud.bus.enabled=true +spring.rabbitmq.host=localhost +spring.rabbitmq.port=5672 +spring.rabbitmq.username=guest +spring.rabbitmq.password=guest \ No newline at end of file From 1d96bc5761994a33af9a7a9aa5ab68604a5b44dc Mon Sep 17 00:00:00 2001 From: iaforek Date: Tue, 4 Jul 2017 23:41:22 +0100 Subject: [PATCH 24/54] BAEL-579 Config Client using Spring Cloud Bus. --- .../spring-cloud-config/client/pom.xml | 12 ++++------ .../cloud/config/client/ConfigClient.java | 20 ---------------- .../config/client/ConfigClientController.java | 24 +++++++++++++++++++ .../src/main/resources/bootstrap.properties | 16 ++++++++----- 4 files changed, 39 insertions(+), 33 deletions(-) create mode 100644 spring-cloud/spring-cloud-config/client/src/main/java/com/baeldung/spring/cloud/config/client/ConfigClientController.java diff --git a/spring-cloud/spring-cloud-config/client/pom.xml b/spring-cloud/spring-cloud-config/client/pom.xml index c49f26f65d..e7316aa832 100644 --- a/spring-cloud/spring-cloud-config/client/pom.xml +++ b/spring-cloud/spring-cloud-config/client/pom.xml @@ -15,24 +15,26 @@ org.springframework.cloud spring-cloud-starter-config - ${spring-cloud-starter-config.version} org.springframework.boot spring-boot-starter-web - ${org.springframework.boot.version} org.springframework.boot spring-boot-starter-test - ${org.springframework.boot.version} test + org.springframework.boot spring-boot-actuator + + org.springframework.cloud + spring-cloud-starter-bus-amqp + @@ -44,8 +46,4 @@ - - 1.2.2.RELEASE - 1.4.2.RELEASE - diff --git a/spring-cloud/spring-cloud-config/client/src/main/java/com/baeldung/spring/cloud/config/client/ConfigClient.java b/spring-cloud/spring-cloud-config/client/src/main/java/com/baeldung/spring/cloud/config/client/ConfigClient.java index 96121eb9b5..1cc3752a16 100644 --- a/spring-cloud/spring-cloud-config/client/src/main/java/com/baeldung/spring/cloud/config/client/ConfigClient.java +++ b/spring-cloud/spring-cloud-config/client/src/main/java/com/baeldung/spring/cloud/config/client/ConfigClient.java @@ -1,31 +1,11 @@ package com.baeldung.spring.cloud.config.client; -import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cloud.context.config.annotation.RefreshScope; -import org.springframework.http.MediaType; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RestController; @SpringBootApplication -@RestController -@RefreshScope public class ConfigClient { - @Value("${user.role}") - private String role; - - @Value("${user.password}") - private String password; - public static void main(String[] args) { SpringApplication.run(ConfigClient.class, args); } - - @RequestMapping(value = "/whoami/{username}", method = RequestMethod.GET, produces = MediaType.TEXT_PLAIN_VALUE) - public String whoami(@PathVariable("username") String username) { - return String.format("Hello %s! You are a(n) %s and your password is '%s'.\n", username, role, password); - } } diff --git a/spring-cloud/spring-cloud-config/client/src/main/java/com/baeldung/spring/cloud/config/client/ConfigClientController.java b/spring-cloud/spring-cloud-config/client/src/main/java/com/baeldung/spring/cloud/config/client/ConfigClientController.java new file mode 100644 index 0000000000..bd882e5870 --- /dev/null +++ b/spring-cloud/spring-cloud-config/client/src/main/java/com/baeldung/spring/cloud/config/client/ConfigClientController.java @@ -0,0 +1,24 @@ +package com.baeldung.spring.cloud.config.client; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RefreshScope +public class ConfigClientController { + @Value("${user.role}") + private String role; + + @Value("${user.password}") + private String password; + + @RequestMapping(value = "/whoami/{username}", method = RequestMethod.GET, produces = MediaType.TEXT_PLAIN_VALUE) + public String whoami(@PathVariable("username") String username) { + return String.format("Hello %s! You are a(n) %s and your password is '%s'.\n", username, role, password); + } +} diff --git a/spring-cloud/spring-cloud-config/client/src/main/resources/bootstrap.properties b/spring-cloud/spring-cloud-config/client/src/main/resources/bootstrap.properties index 5dde8baa28..8b3f97b5c6 100644 --- a/spring-cloud/spring-cloud-config/client/src/main/resources/bootstrap.properties +++ b/spring-cloud/spring-cloud-config/client/src/main/resources/bootstrap.properties @@ -1,6 +1,10 @@ -spring.application.name=config-client -spring.profiles.active=development -spring.cloud.config.uri=http://localhost:8888 -spring.cloud.config.username=root -spring.cloud.config.password=s3cr3t -spring.cloud.config.fail-fast=true +spring.application.name=config-client +spring.profiles.active=development +spring.cloud.config.uri=http://localhost:8888 +spring.cloud.config.username=root +spring.cloud.config.password=s3cr3t +spring.cloud.config.fail-fast=true +spring.rabbitmq.host=localhost +spring.rabbitmq.port=5672 +spring.rabbitmq.username=guest +spring.rabbitmq.password=guest \ No newline at end of file From 73d05a5d5f97f41e4eab4a422898abbee53ebffd Mon Sep 17 00:00:00 2001 From: iaforek Date: Wed, 5 Jul 2017 12:51:02 +0100 Subject: [PATCH 25/54] BAEL-579 Recreated Basic Config Server. --- .../spring-cloud-config-server/pom.xml | 68 ++++++++++++++++++ .../SpringCloudConfigServerApplication.java | 14 ++++ .../src/main/resources/application.properties | 9 +++ .../src/main/resources/config-server.jks | Bin 0 -> 3842 bytes ...ringCloudConfigServerApplicationTests.java | 16 +++++ 5 files changed, 107 insertions(+) create mode 100644 spring-cloud-bus/spring-cloud-config-server/pom.xml create mode 100644 spring-cloud-bus/spring-cloud-config-server/src/main/java/com/baeldung/SpringCloudConfigServerApplication.java create mode 100644 spring-cloud-bus/spring-cloud-config-server/src/main/resources/application.properties create mode 100644 spring-cloud-bus/spring-cloud-config-server/src/main/resources/config-server.jks create mode 100644 spring-cloud-bus/spring-cloud-config-server/src/test/java/com/baeldung/SpringCloudConfigServerApplicationTests.java diff --git a/spring-cloud-bus/spring-cloud-config-server/pom.xml b/spring-cloud-bus/spring-cloud-config-server/pom.xml new file mode 100644 index 0000000000..e03a975c54 --- /dev/null +++ b/spring-cloud-bus/spring-cloud-config-server/pom.xml @@ -0,0 +1,68 @@ + + + 4.0.0 + + com.baeldung.spring.cloud + spring-cloud-config-server + 0.0.1-SNAPSHOT + jar + + spring-cloud-config-server + Demo Spring Cloud Config Server + + + org.springframework.boot + spring-boot-starter-parent + 1.5.4.RELEASE + + + + + UTF-8 + UTF-8 + 1.8 + Dalston.SR1 + + + + + org.springframework.cloud + spring-cloud-config-server + + + + org.springframework.boot + spring-boot-starter-security + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.cloud + spring-cloud-dependencies + ${spring-cloud.version} + pom + import + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + diff --git a/spring-cloud-bus/spring-cloud-config-server/src/main/java/com/baeldung/SpringCloudConfigServerApplication.java b/spring-cloud-bus/spring-cloud-config-server/src/main/java/com/baeldung/SpringCloudConfigServerApplication.java new file mode 100644 index 0000000000..4feace7c89 --- /dev/null +++ b/spring-cloud-bus/spring-cloud-config-server/src/main/java/com/baeldung/SpringCloudConfigServerApplication.java @@ -0,0 +1,14 @@ +package com.baeldung; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.config.server.EnableConfigServer; + +@SpringBootApplication +@EnableConfigServer +public class SpringCloudConfigServerApplication { + + public static void main(String[] args) { + SpringApplication.run(SpringCloudConfigServerApplication.class, args); + } +} diff --git a/spring-cloud-bus/spring-cloud-config-server/src/main/resources/application.properties b/spring-cloud-bus/spring-cloud-config-server/src/main/resources/application.properties new file mode 100644 index 0000000000..45be8c1e89 --- /dev/null +++ b/spring-cloud-bus/spring-cloud-config-server/src/main/resources/application.properties @@ -0,0 +1,9 @@ +server.port=8888 +spring.cloud.config.server.git.uri=https://github.com/iaforek/spring-cloudconfig-properties +spring.cloud.config.server.git.clone-on-start=true +security.user.name=root +security.user.password=s3cr3t +encrypt.key-store.location=classpath:/config-server.jks +encrypt.key-store.password=my-s70r3-s3cr3t +encrypt.key-store.alias=config-server-key +encrypt.key-store.secret=my-k34-s3cr3t \ No newline at end of file diff --git a/spring-cloud-bus/spring-cloud-config-server/src/main/resources/config-server.jks b/spring-cloud-bus/spring-cloud-config-server/src/main/resources/config-server.jks new file mode 100644 index 0000000000000000000000000000000000000000..f3dddb4a8f4c4773a8feae4d8534b129e5e67f45 GIT binary patch literal 3842 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 Date: Wed, 5 Jul 2017 13:08:33 +0100 Subject: [PATCH 26/54] BAEL-579 Recreated Config Client. --- .../spring-cloud-config-client/pom.xml | 66 +++++++++++++++++++ .../SpringCloudConfigClientApplication.java | 30 +++++++++ .../src/main/resources/bootstrap.properties | 6 ++ ...ringCloudConfigClientApplicationTests.java | 16 +++++ 4 files changed, 118 insertions(+) create mode 100644 spring-cloud-bus/spring-cloud-config-client/pom.xml create mode 100644 spring-cloud-bus/spring-cloud-config-client/src/main/java/com/baeldung/SpringCloudConfigClientApplication.java create mode 100644 spring-cloud-bus/spring-cloud-config-client/src/main/resources/bootstrap.properties create mode 100644 spring-cloud-bus/spring-cloud-config-client/src/test/java/com/baeldung/SpringCloudConfigClientApplicationTests.java diff --git a/spring-cloud-bus/spring-cloud-config-client/pom.xml b/spring-cloud-bus/spring-cloud-config-client/pom.xml new file mode 100644 index 0000000000..58726bc3cc --- /dev/null +++ b/spring-cloud-bus/spring-cloud-config-client/pom.xml @@ -0,0 +1,66 @@ + + + 4.0.0 + + com.baeldung.spring.cloud + spring-cloud-config-client + 0.0.1-SNAPSHOT + jar + + spring-cloud-config-client + Demo Spring Cloud Config Client + + + org.springframework.boot + spring-boot-starter-parent + 1.5.4.RELEASE + + + + UTF-8 + UTF-8 + 1.8 + Dalston.SR1 + + + + + org.springframework.cloud + spring-cloud-starter-config + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.cloud + spring-cloud-dependencies + ${spring-cloud.version} + pom + import + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + diff --git a/spring-cloud-bus/spring-cloud-config-client/src/main/java/com/baeldung/SpringCloudConfigClientApplication.java b/spring-cloud-bus/spring-cloud-config-client/src/main/java/com/baeldung/SpringCloudConfigClientApplication.java new file mode 100644 index 0000000000..cfa56eea99 --- /dev/null +++ b/spring-cloud-bus/spring-cloud-config-client/src/main/java/com/baeldung/SpringCloudConfigClientApplication.java @@ -0,0 +1,30 @@ +package com.baeldung; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +@SpringBootApplication +@RestController +public class SpringCloudConfigClientApplication { + + @Value("${user.role}") + private String role; + + @Value("${user.password}") + private String password; + + public static void main(String[] args) { + SpringApplication.run(SpringCloudConfigClientApplication.class, args); + } + + @RequestMapping(value = "/whoami/{username}", method = RequestMethod.GET, produces = MediaType.TEXT_PLAIN_VALUE) + public String whoami(@PathVariable("username") String username) { + return String.format("Hello %s! You are a(n) %s and your password is '%s'.\n", username, role, password); + } +} diff --git a/spring-cloud-bus/spring-cloud-config-client/src/main/resources/bootstrap.properties b/spring-cloud-bus/spring-cloud-config-client/src/main/resources/bootstrap.properties new file mode 100644 index 0000000000..a0af4978c2 --- /dev/null +++ b/spring-cloud-bus/spring-cloud-config-client/src/main/resources/bootstrap.properties @@ -0,0 +1,6 @@ +spring.application.name=config-client +spring.profiles.active=development +spring.cloud.config.uri=http://localhost:8888 +spring.cloud.config.username=root +spring.cloud.config.password=s3cr3t +spring.cloud.config.fail-fast=true \ No newline at end of file diff --git a/spring-cloud-bus/spring-cloud-config-client/src/test/java/com/baeldung/SpringCloudConfigClientApplicationTests.java b/spring-cloud-bus/spring-cloud-config-client/src/test/java/com/baeldung/SpringCloudConfigClientApplicationTests.java new file mode 100644 index 0000000000..3b361f385a --- /dev/null +++ b/spring-cloud-bus/spring-cloud-config-client/src/test/java/com/baeldung/SpringCloudConfigClientApplicationTests.java @@ -0,0 +1,16 @@ +package com.baeldung; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest +public class SpringCloudConfigClientApplicationTests { + + @Test + public void contextLoads() { + } + +} From 2b55217ee98bb5438a9261b23ff37b7933830ae2 Mon Sep 17 00:00:00 2001 From: iaforek Date: Thu, 6 Jul 2017 09:37:50 +0100 Subject: [PATCH 27/54] BAEL-579 Removed test Git URL. --- .../src/main/resources/application.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-cloud-bus/spring-cloud-config-server/src/main/resources/application.properties b/spring-cloud-bus/spring-cloud-config-server/src/main/resources/application.properties index 45be8c1e89..1a7c67b7cd 100644 --- a/spring-cloud-bus/spring-cloud-config-server/src/main/resources/application.properties +++ b/spring-cloud-bus/spring-cloud-config-server/src/main/resources/application.properties @@ -1,5 +1,5 @@ server.port=8888 -spring.cloud.config.server.git.uri=https://github.com/iaforek/spring-cloudconfig-properties +spring.cloud.config.server.git.uri= spring.cloud.config.server.git.clone-on-start=true security.user.name=root security.user.password=s3cr3t From 42af88c3c2e105bf56e30bf29503e3d661ce6dfc Mon Sep 17 00:00:00 2001 From: iaforek Date: Thu, 6 Jul 2017 10:34:48 +0100 Subject: [PATCH 28/54] BAEL-579 Added Actuator to Config Client --- spring-cloud-bus/spring-cloud-config-client/pom.xml | 5 +++++ .../com/baeldung/SpringCloudConfigClientApplication.java | 2 ++ .../src/main/resources/bootstrap.properties | 3 ++- 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/spring-cloud-bus/spring-cloud-config-client/pom.xml b/spring-cloud-bus/spring-cloud-config-client/pom.xml index 58726bc3cc..fce0e6d56b 100644 --- a/spring-cloud-bus/spring-cloud-config-client/pom.xml +++ b/spring-cloud-bus/spring-cloud-config-client/pom.xml @@ -39,6 +39,11 @@ spring-boot-starter-test test + + + org.springframework.boot + spring-boot-actuator + diff --git a/spring-cloud-bus/spring-cloud-config-client/src/main/java/com/baeldung/SpringCloudConfigClientApplication.java b/spring-cloud-bus/spring-cloud-config-client/src/main/java/com/baeldung/SpringCloudConfigClientApplication.java index cfa56eea99..d0afd7f6bf 100644 --- a/spring-cloud-bus/spring-cloud-config-client/src/main/java/com/baeldung/SpringCloudConfigClientApplication.java +++ b/spring-cloud-bus/spring-cloud-config-client/src/main/java/com/baeldung/SpringCloudConfigClientApplication.java @@ -3,6 +3,7 @@ package com.baeldung; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; @@ -11,6 +12,7 @@ import org.springframework.web.bind.annotation.RestController; @SpringBootApplication @RestController +@RefreshScope public class SpringCloudConfigClientApplication { @Value("${user.role}") diff --git a/spring-cloud-bus/spring-cloud-config-client/src/main/resources/bootstrap.properties b/spring-cloud-bus/spring-cloud-config-client/src/main/resources/bootstrap.properties index a0af4978c2..7b362614ba 100644 --- a/spring-cloud-bus/spring-cloud-config-client/src/main/resources/bootstrap.properties +++ b/spring-cloud-bus/spring-cloud-config-client/src/main/resources/bootstrap.properties @@ -3,4 +3,5 @@ spring.profiles.active=development spring.cloud.config.uri=http://localhost:8888 spring.cloud.config.username=root spring.cloud.config.password=s3cr3t -spring.cloud.config.fail-fast=true \ No newline at end of file +spring.cloud.config.fail-fast=true +management.security.enabled=false \ No newline at end of file From dc5a4b3af6ddcfbb5190faa373a9c6ebb043a298 Mon Sep 17 00:00:00 2001 From: iaforek Date: Thu, 6 Jul 2017 11:24:30 +0100 Subject: [PATCH 29/54] BAEL-579 Added Spring Cloud Bus to Client. --- spring-cloud-bus/spring-cloud-config-client/pom.xml | 5 +++++ .../src/main/resources/application.yml | 7 +++++++ 2 files changed, 12 insertions(+) create mode 100644 spring-cloud-bus/spring-cloud-config-client/src/main/resources/application.yml diff --git a/spring-cloud-bus/spring-cloud-config-client/pom.xml b/spring-cloud-bus/spring-cloud-config-client/pom.xml index fce0e6d56b..2eb0191c79 100644 --- a/spring-cloud-bus/spring-cloud-config-client/pom.xml +++ b/spring-cloud-bus/spring-cloud-config-client/pom.xml @@ -44,6 +44,11 @@ org.springframework.boot spring-boot-actuator + + + org.springframework.cloud + spring-cloud-starter-bus-amqp + diff --git a/spring-cloud-bus/spring-cloud-config-client/src/main/resources/application.yml b/spring-cloud-bus/spring-cloud-config-client/src/main/resources/application.yml new file mode 100644 index 0000000000..547e0284f3 --- /dev/null +++ b/spring-cloud-bus/spring-cloud-config-client/src/main/resources/application.yml @@ -0,0 +1,7 @@ +--- +spring: + rabbitmq: + host: localhost + port: 5672 + username: guest + password: guest \ No newline at end of file From ee95780416b48528ee92b8fb41920595d4c8f10c Mon Sep 17 00:00:00 2001 From: iaforek Date: Thu, 6 Jul 2017 12:02:51 +0100 Subject: [PATCH 30/54] BAEL-579 Server changes for Spring Cloud Bus Added dependencies and removed git.clone-on-start as this was causing server to throw errors after git properties change. --- spring-cloud-bus/spring-cloud-config-server/pom.xml | 10 ++++++++++ .../src/main/resources/application.properties | 9 ++++++--- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/spring-cloud-bus/spring-cloud-config-server/pom.xml b/spring-cloud-bus/spring-cloud-config-server/pom.xml index e03a975c54..2425c95620 100644 --- a/spring-cloud-bus/spring-cloud-config-server/pom.xml +++ b/spring-cloud-bus/spring-cloud-config-server/pom.xml @@ -41,6 +41,16 @@ spring-boot-starter-test test + + + org.springframework.cloud + spring-cloud-config-monitor + + + + org.springframework.cloud + spring-cloud-starter-stream-rabbit + diff --git a/spring-cloud-bus/spring-cloud-config-server/src/main/resources/application.properties b/spring-cloud-bus/spring-cloud-config-server/src/main/resources/application.properties index 1a7c67b7cd..85b75fa64a 100644 --- a/spring-cloud-bus/spring-cloud-config-server/src/main/resources/application.properties +++ b/spring-cloud-bus/spring-cloud-config-server/src/main/resources/application.properties @@ -1,9 +1,12 @@ server.port=8888 -spring.cloud.config.server.git.uri= -spring.cloud.config.server.git.clone-on-start=true +spring.cloud.config.server.git.uri=https://github.com/iaforek/spring-cloudconfig-properties security.user.name=root security.user.password=s3cr3t encrypt.key-store.location=classpath:/config-server.jks encrypt.key-store.password=my-s70r3-s3cr3t encrypt.key-store.alias=config-server-key -encrypt.key-store.secret=my-k34-s3cr3t \ No newline at end of file +encrypt.key-store.secret=my-k34-s3cr3t +spring.rabbitmq.host=localhost +spring.rabbitmq.port=5672 +spring.rabbitmq.username=guest +spring.rabbitmq.password=guest \ No newline at end of file From 7f8b32cdd68d15ea31a07e653b7a81d8fdc30ba8 Mon Sep 17 00:00:00 2001 From: iaforek Date: Thu, 6 Jul 2017 12:05:13 +0100 Subject: [PATCH 31/54] BAEL-579 Removed Git URL. --- .../src/main/resources/application.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-cloud-bus/spring-cloud-config-server/src/main/resources/application.properties b/spring-cloud-bus/spring-cloud-config-server/src/main/resources/application.properties index 85b75fa64a..4c18c192c0 100644 --- a/spring-cloud-bus/spring-cloud-config-server/src/main/resources/application.properties +++ b/spring-cloud-bus/spring-cloud-config-server/src/main/resources/application.properties @@ -1,5 +1,5 @@ server.port=8888 -spring.cloud.config.server.git.uri=https://github.com/iaforek/spring-cloudconfig-properties +spring.cloud.config.server.git.uri= security.user.name=root security.user.password=s3cr3t encrypt.key-store.location=classpath:/config-server.jks From a68b0e59f31aa2b747283c41b487d6cdcbb53ffe Mon Sep 17 00:00:00 2001 From: iaforek Date: Thu, 6 Jul 2017 12:13:29 +0100 Subject: [PATCH 32/54] Revert "BAEL-579 Updated Spring Cloud Version" This reverts commit f775bf91e53a1ecfb9b70596688d7c8202bf495f. --- spring-cloud/spring-cloud-config/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-cloud/spring-cloud-config/pom.xml b/spring-cloud/spring-cloud-config/pom.xml index d91b30d13f..81693b7e2e 100644 --- a/spring-cloud/spring-cloud-config/pom.xml +++ b/spring-cloud/spring-cloud-config/pom.xml @@ -34,7 +34,7 @@ - Dalston.SR1 + Brixton.SR7 From 5681be08446e16eb2ab20e888fa5a47688361104 Mon Sep 17 00:00:00 2001 From: iaforek Date: Thu, 6 Jul 2017 12:18:37 +0100 Subject: [PATCH 33/54] Revert "BAEL-579 Config Client using Spring Cloud Bus." This reverts commit 1d96bc5761994a33af9a7a9aa5ab68604a5b44dc. --- .../spring-cloud-config/client/pom.xml | 12 ++++++---- .../cloud/config/client/ConfigClient.java | 20 ++++++++++++++++ .../config/client/ConfigClientController.java | 24 ------------------- .../src/main/resources/bootstrap.properties | 16 +++++-------- 4 files changed, 33 insertions(+), 39 deletions(-) delete mode 100644 spring-cloud/spring-cloud-config/client/src/main/java/com/baeldung/spring/cloud/config/client/ConfigClientController.java diff --git a/spring-cloud/spring-cloud-config/client/pom.xml b/spring-cloud/spring-cloud-config/client/pom.xml index e7316aa832..c49f26f65d 100644 --- a/spring-cloud/spring-cloud-config/client/pom.xml +++ b/spring-cloud/spring-cloud-config/client/pom.xml @@ -15,26 +15,24 @@ org.springframework.cloud spring-cloud-starter-config + ${spring-cloud-starter-config.version} org.springframework.boot spring-boot-starter-web + ${org.springframework.boot.version} org.springframework.boot spring-boot-starter-test + ${org.springframework.boot.version} test - org.springframework.boot spring-boot-actuator - - org.springframework.cloud - spring-cloud-starter-bus-amqp - @@ -46,4 +44,8 @@ + + 1.2.2.RELEASE + 1.4.2.RELEASE + diff --git a/spring-cloud/spring-cloud-config/client/src/main/java/com/baeldung/spring/cloud/config/client/ConfigClient.java b/spring-cloud/spring-cloud-config/client/src/main/java/com/baeldung/spring/cloud/config/client/ConfigClient.java index 1cc3752a16..96121eb9b5 100644 --- a/spring-cloud/spring-cloud-config/client/src/main/java/com/baeldung/spring/cloud/config/client/ConfigClient.java +++ b/spring-cloud/spring-cloud-config/client/src/main/java/com/baeldung/spring/cloud/config/client/ConfigClient.java @@ -1,11 +1,31 @@ package com.baeldung.spring.cloud.config.client; +import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; @SpringBootApplication +@RestController +@RefreshScope public class ConfigClient { + @Value("${user.role}") + private String role; + + @Value("${user.password}") + private String password; + public static void main(String[] args) { SpringApplication.run(ConfigClient.class, args); } + + @RequestMapping(value = "/whoami/{username}", method = RequestMethod.GET, produces = MediaType.TEXT_PLAIN_VALUE) + public String whoami(@PathVariable("username") String username) { + return String.format("Hello %s! You are a(n) %s and your password is '%s'.\n", username, role, password); + } } diff --git a/spring-cloud/spring-cloud-config/client/src/main/java/com/baeldung/spring/cloud/config/client/ConfigClientController.java b/spring-cloud/spring-cloud-config/client/src/main/java/com/baeldung/spring/cloud/config/client/ConfigClientController.java deleted file mode 100644 index bd882e5870..0000000000 --- a/spring-cloud/spring-cloud-config/client/src/main/java/com/baeldung/spring/cloud/config/client/ConfigClientController.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.baeldung.spring.cloud.config.client; - -import org.springframework.beans.factory.annotation.Value; -import org.springframework.cloud.context.config.annotation.RefreshScope; -import org.springframework.http.MediaType; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RestController; - -@RestController -@RefreshScope -public class ConfigClientController { - @Value("${user.role}") - private String role; - - @Value("${user.password}") - private String password; - - @RequestMapping(value = "/whoami/{username}", method = RequestMethod.GET, produces = MediaType.TEXT_PLAIN_VALUE) - public String whoami(@PathVariable("username") String username) { - return String.format("Hello %s! You are a(n) %s and your password is '%s'.\n", username, role, password); - } -} diff --git a/spring-cloud/spring-cloud-config/client/src/main/resources/bootstrap.properties b/spring-cloud/spring-cloud-config/client/src/main/resources/bootstrap.properties index 8b3f97b5c6..5dde8baa28 100644 --- a/spring-cloud/spring-cloud-config/client/src/main/resources/bootstrap.properties +++ b/spring-cloud/spring-cloud-config/client/src/main/resources/bootstrap.properties @@ -1,10 +1,6 @@ -spring.application.name=config-client -spring.profiles.active=development -spring.cloud.config.uri=http://localhost:8888 -spring.cloud.config.username=root -spring.cloud.config.password=s3cr3t -spring.cloud.config.fail-fast=true -spring.rabbitmq.host=localhost -spring.rabbitmq.port=5672 -spring.rabbitmq.username=guest -spring.rabbitmq.password=guest \ No newline at end of file +spring.application.name=config-client +spring.profiles.active=development +spring.cloud.config.uri=http://localhost:8888 +spring.cloud.config.username=root +spring.cloud.config.password=s3cr3t +spring.cloud.config.fail-fast=true From 3856d1a83238f752f49fc40a8fb18c312c9026c1 Mon Sep 17 00:00:00 2001 From: iaforek Date: Thu, 6 Jul 2017 12:19:08 +0100 Subject: [PATCH 34/54] Revert "BAEL-579 Enabled cloud bus and updated dependencies." This reverts commit 7845da922d89d53506dd0fff387ea13694c50bc1. --- .../spring-cloud-config/server/pom.xml | 107 +++++++++--------- .../src/main/resources/application.properties | 23 ++-- 2 files changed, 63 insertions(+), 67 deletions(-) diff --git a/spring-cloud/spring-cloud-config/server/pom.xml b/spring-cloud/spring-cloud-config/server/pom.xml index 7aeb1967a0..0157851001 100644 --- a/spring-cloud/spring-cloud-config/server/pom.xml +++ b/spring-cloud/spring-cloud-config/server/pom.xml @@ -1,53 +1,54 @@ - - - 4.0.0 - - - com.baeldung.spring.cloud - spring-cloud-config - 1.0-SNAPSHOT - - server - - - - org.springframework.cloud - spring-cloud-config-server - - - org.springframework.boot - spring-boot-starter-security - - - org.springframework.boot - spring-boot-starter-web - - - - org.springframework.boot - spring-boot-starter-test - test - - - - org.springframework.cloud - spring-cloud-config-monitor - - - org.springframework.cloud - spring-cloud-starter-stream-rabbit - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - - + + + 4.0.0 + + + com.baeldung.spring.cloud + spring-cloud-config + 1.0-SNAPSHOT + + server + + + + org.springframework.cloud + spring-cloud-config-server + ${spring-cloud-config-server.version} + + + org.springframework.boot + spring-boot-starter-security + ${org.springframework.boot.version} + + + org.springframework.boot + spring-boot-starter-web + ${org.springframework.boot.version} + + + + org.springframework.boot + spring-boot-starter-test + ${org.springframework.boot.version} + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + ${org.springframework.boot.version} + + + + + + 1.2.2.RELEASE + 1.4.2.RELEASE + + + diff --git a/spring-cloud/spring-cloud-config/server/src/main/resources/application.properties b/spring-cloud/spring-cloud-config/server/src/main/resources/application.properties index 95699c9fa0..3d4f3bcd47 100644 --- a/spring-cloud/spring-cloud-config/server/src/main/resources/application.properties +++ b/spring-cloud/spring-cloud-config/server/src/main/resources/application.properties @@ -1,14 +1,9 @@ -server.port=8888 -spring.cloud.config.server.git.uri= -spring.cloud.config.server.git.clone-on-start=true -security.user.name=root -security.user.password=s3cr3t -encrypt.key-store.location=classpath:/config-server.jks -encrypt.key-store.password=my-s70r3-s3cr3t -encrypt.key-store.alias=config-server-key -encrypt.key-store.secret=my-k34-s3cr3t -spring.cloud.bus.enabled=true -spring.rabbitmq.host=localhost -spring.rabbitmq.port=5672 -spring.rabbitmq.username=guest -spring.rabbitmq.password=guest \ No newline at end of file +server.port=8888 +spring.cloud.config.server.git.uri= +spring.cloud.config.server.git.clone-on-start=true +security.user.name=root +security.user.password=s3cr3t +encrypt.key-store.location=classpath:/config-server.jks +encrypt.key-store.password=my-s70r3-s3cr3t +encrypt.key-store.alias=config-server-key +encrypt.key-store.secret=my-k34-s3cr3t From bf7829d539acbfe3a7d580e1db617e3c56fb2922 Mon Sep 17 00:00:00 2001 From: iaforek Date: Thu, 6 Jul 2017 12:19:26 +0100 Subject: [PATCH 35/54] Revert "BAEL-579 Added actuator to Cloud Config Client." This reverts commit 076657a26a57e0aa676989a4d97966a3b9d53e1c. --- .../spring-cloud-config/client/pom.xml | 98 +++++++++---------- .../cloud/config/client/ConfigClient.java | 60 ++++++------ 2 files changed, 76 insertions(+), 82 deletions(-) diff --git a/spring-cloud/spring-cloud-config/client/pom.xml b/spring-cloud/spring-cloud-config/client/pom.xml index c49f26f65d..667040ed3c 100644 --- a/spring-cloud/spring-cloud-config/client/pom.xml +++ b/spring-cloud/spring-cloud-config/client/pom.xml @@ -1,51 +1,47 @@ - - - 4.0.0 - - - com.baeldung.spring.cloud - spring-cloud-config - 1.0-SNAPSHOT - - client - - - - org.springframework.cloud - spring-cloud-starter-config - ${spring-cloud-starter-config.version} - - - org.springframework.boot - spring-boot-starter-web - ${org.springframework.boot.version} - - - - org.springframework.boot - spring-boot-starter-test - ${org.springframework.boot.version} - test - - - org.springframework.boot - spring-boot-actuator - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - - - 1.2.2.RELEASE - 1.4.2.RELEASE - - + + + 4.0.0 + + + com.baeldung.spring.cloud + spring-cloud-config + 1.0-SNAPSHOT + + client + + + + org.springframework.cloud + spring-cloud-starter-config + ${spring-cloud-starter-config.version} + + + org.springframework.boot + spring-boot-starter-web + ${org.springframework.boot.version} + + + + org.springframework.boot + spring-boot-starter-test + ${org.springframework.boot.version} + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + 1.2.2.RELEASE + 1.4.2.RELEASE + + diff --git a/spring-cloud/spring-cloud-config/client/src/main/java/com/baeldung/spring/cloud/config/client/ConfigClient.java b/spring-cloud/spring-cloud-config/client/src/main/java/com/baeldung/spring/cloud/config/client/ConfigClient.java index 96121eb9b5..1dd3bbdab0 100644 --- a/spring-cloud/spring-cloud-config/client/src/main/java/com/baeldung/spring/cloud/config/client/ConfigClient.java +++ b/spring-cloud/spring-cloud-config/client/src/main/java/com/baeldung/spring/cloud/config/client/ConfigClient.java @@ -1,31 +1,29 @@ -package com.baeldung.spring.cloud.config.client; - -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cloud.context.config.annotation.RefreshScope; -import org.springframework.http.MediaType; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RestController; - -@SpringBootApplication -@RestController -@RefreshScope -public class ConfigClient { - @Value("${user.role}") - private String role; - - @Value("${user.password}") - private String password; - - public static void main(String[] args) { - SpringApplication.run(ConfigClient.class, args); - } - - @RequestMapping(value = "/whoami/{username}", method = RequestMethod.GET, produces = MediaType.TEXT_PLAIN_VALUE) - public String whoami(@PathVariable("username") String username) { - return String.format("Hello %s! You are a(n) %s and your password is '%s'.\n", username, role, password); - } -} +package com.baeldung.spring.cloud.config.client; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +@SpringBootApplication +@RestController +public class ConfigClient { + @Value("${user.role}") + private String role; + + @Value("${user.password}") + private String password; + + public static void main(String[] args) { + SpringApplication.run(ConfigClient.class, args); + } + + @RequestMapping(value = "/whoami/{username}", method = RequestMethod.GET, produces = MediaType.TEXT_PLAIN_VALUE) + public String whoami(@PathVariable("username") String username) { + return String.format("Hello %s! You are a(n) %s and your password is '%s'.\n", username, role, password); + } +} From 67dc0bd2e6366bce742ddcfbf31276e05b87fc6c Mon Sep 17 00:00:00 2001 From: iaforek Date: Fri, 7 Jul 2017 09:44:38 +0100 Subject: [PATCH 36/54] BAEL-579 Added missing dependency versions. --- .../spring-cloud-config-server/pom.xml | 159 +++++++++--------- 1 file changed, 81 insertions(+), 78 deletions(-) diff --git a/spring-cloud-bus/spring-cloud-config-server/pom.xml b/spring-cloud-bus/spring-cloud-config-server/pom.xml index 2425c95620..9ec661b718 100644 --- a/spring-cloud-bus/spring-cloud-config-server/pom.xml +++ b/spring-cloud-bus/spring-cloud-config-server/pom.xml @@ -1,78 +1,81 @@ - - - 4.0.0 - - com.baeldung.spring.cloud - spring-cloud-config-server - 0.0.1-SNAPSHOT - jar - - spring-cloud-config-server - Demo Spring Cloud Config Server - - - org.springframework.boot - spring-boot-starter-parent - 1.5.4.RELEASE - - - - - UTF-8 - UTF-8 - 1.8 - Dalston.SR1 - - - - - org.springframework.cloud - spring-cloud-config-server - - - - org.springframework.boot - spring-boot-starter-security - - - - org.springframework.boot - spring-boot-starter-test - test - - - - org.springframework.cloud - spring-cloud-config-monitor - - - - org.springframework.cloud - spring-cloud-starter-stream-rabbit - - - - - - - org.springframework.cloud - spring-cloud-dependencies - ${spring-cloud.version} - pom - import - - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - - - + + + 4.0.0 + + com.baeldung.spring.cloud + spring-cloud-config-server + 0.0.1-SNAPSHOT + jar + + spring-cloud-config-server + Demo Spring Cloud Config Server + + + org.springframework.boot + spring-boot-starter-parent + 1.5.4.RELEASE + + + + UTF-8 + UTF-8 + 1.8 + Dalston.SR1 + + + + + org.springframework.cloud + spring-cloud-config-server + 1.3.1.RELEASE + + + + org.springframework.boot + spring-boot-starter-security + 1.5.4.RELEASE + + + + org.springframework.boot + spring-boot-starter-test + 1.5.4.RELEASE + test + + + + org.springframework.cloud + spring-cloud-config-monitor + 1.3.1.RELEASE + + + + org.springframework.cloud + spring-cloud-starter-stream-rabbit + 1.2.1.RELEASE + + + + + + + org.springframework.cloud + spring-cloud-dependencies + ${spring-cloud.version} + pom + import + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + From fc3af59d27a491263246c6d9677d3bc4627cdc0b Mon Sep 17 00:00:00 2001 From: iaforek Date: Fri, 7 Jul 2017 09:49:29 +0100 Subject: [PATCH 37/54] BAEL-579 Added missing dependency versions. --- .../spring-cloud-config-client/pom.xml | 157 +++++++++--------- .../spring-cloud-config-server/pom.xml | 1 + 2 files changed, 82 insertions(+), 76 deletions(-) diff --git a/spring-cloud-bus/spring-cloud-config-client/pom.xml b/spring-cloud-bus/spring-cloud-config-client/pom.xml index 2eb0191c79..977f18b17f 100644 --- a/spring-cloud-bus/spring-cloud-config-client/pom.xml +++ b/spring-cloud-bus/spring-cloud-config-client/pom.xml @@ -1,76 +1,81 @@ - - - 4.0.0 - - com.baeldung.spring.cloud - spring-cloud-config-client - 0.0.1-SNAPSHOT - jar - - spring-cloud-config-client - Demo Spring Cloud Config Client - - - org.springframework.boot - spring-boot-starter-parent - 1.5.4.RELEASE - - - - UTF-8 - UTF-8 - 1.8 - Dalston.SR1 - - - - - org.springframework.cloud - spring-cloud-starter-config - - - org.springframework.boot - spring-boot-starter-web - - - - org.springframework.boot - spring-boot-starter-test - test - - - - org.springframework.boot - spring-boot-actuator - - - - org.springframework.cloud - spring-cloud-starter-bus-amqp - - - - - - - org.springframework.cloud - spring-cloud-dependencies - ${spring-cloud.version} - pom - import - - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - - - + + + 4.0.0 + + com.baeldung.spring.cloud + spring-cloud-config-client + 0.0.1-SNAPSHOT + jar + + spring-cloud-config-client + Demo Spring Cloud Config Client + + + org.springframework.boot + spring-boot-starter-parent + 1.5.4.RELEASE + + + + UTF-8 + UTF-8 + 1.8 + Dalston.SR1 + + + + + org.springframework.cloud + spring-cloud-starter-config + 1.3.1.RELEASE + + + org.springframework.boot + spring-boot-starter-web + 1.5.4.RELEASE + + + + org.springframework.boot + spring-boot-starter-test + 1.5.4.RELEASE + test + + + + org.springframework.boot + spring-boot-actuator + 1.5.4.RELEASE + + + + org.springframework.cloud + spring-cloud-starter-bus-amqp + 1.3.1.RELEASE + + + + + + + org.springframework.cloud + spring-cloud-dependencies + ${spring-cloud.version} + pom + import + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + 1.5.4.RELEASE + + + + + diff --git a/spring-cloud-bus/spring-cloud-config-server/pom.xml b/spring-cloud-bus/spring-cloud-config-server/pom.xml index 9ec661b718..e37f601d2c 100644 --- a/spring-cloud-bus/spring-cloud-config-server/pom.xml +++ b/spring-cloud-bus/spring-cloud-config-server/pom.xml @@ -74,6 +74,7 @@ org.springframework.boot spring-boot-maven-plugin + 1.5.4.RELEASE From ac7c7f2701bd9f6ea3506f175271805cc77df57d Mon Sep 17 00:00:00 2001 From: iaforek Date: Tue, 8 Aug 2017 12:41:24 +0100 Subject: [PATCH 38/54] Updated gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 1890e8bd0e..67f33c2a0b 100644 --- a/.gitignore +++ b/.gitignore @@ -41,3 +41,4 @@ SpringDataInjectionDemo/.mvn/wrapper/maven-wrapper.properties spring-call-getters-using-reflection/.mvn/wrapper/maven-wrapper.properties spring-check-if-a-property-is-null/.mvn/wrapper/maven-wrapper.properties +*.springBeans From 21279619227ea2459a24f30de18c822b54fd70bd Mon Sep 17 00:00:00 2001 From: iaforek Date: Wed, 9 Aug 2017 23:01:59 +0100 Subject: [PATCH 39/54] BAEL-1065 Simple performance check StringBuffer vs StringBuilder. --- .../string/StringBufferStringBuilder.java | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 core-java/src/main/java/com/baeldung/string/StringBufferStringBuilder.java diff --git a/core-java/src/main/java/com/baeldung/string/StringBufferStringBuilder.java b/core-java/src/main/java/com/baeldung/string/StringBufferStringBuilder.java new file mode 100644 index 0000000000..4623b83de0 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/string/StringBufferStringBuilder.java @@ -0,0 +1,25 @@ +package com.baeldung.string; + +public class StringBufferStringBuilder { + + public static void main(String[] args) { + + int iterations = 10000000; + + System.gc(); + long startTime = System.currentTimeMillis(); + StringBuffer stringBuffer = new StringBuffer("abc"); + for (int i = 0; i < iterations; i++) { + stringBuffer.append("def"); + } + System.out.println("Time taken by StringBuffer: " + (System.currentTimeMillis() - startTime) + "ms"); // Time taken by StringBuffer: 394ms + + System.gc(); + startTime = System.currentTimeMillis(); + StringBuilder stringBuilder = new StringBuilder("abc"); + for (int i = 0; i < iterations; i++) { + stringBuilder.append("def"); + } + System.out.println("Time taken by StringBuilder: " + (System.currentTimeMillis() - startTime) + "ms"); // Time taken by StringBuilder: 129ms + } +} From 6c4397787690ae61e6121f8506c4b78380f3f43e Mon Sep 17 00:00:00 2001 From: iaforek Date: Mon, 4 Sep 2017 21:09:29 +0100 Subject: [PATCH 40/54] BAEL-1065 Added JMH benchmarks --- core-java/pom.xml | 784 +++++++++--------- .../string/StringBufferStringBuilder.java | 57 +- 2 files changed, 449 insertions(+), 392 deletions(-) diff --git a/core-java/pom.xml b/core-java/pom.xml index 84a56c8bc7..295eabc265 100644 --- a/core-java/pom.xml +++ b/core-java/pom.xml @@ -1,420 +1,456 @@ - 4.0.0 - com.baeldung - core-java - 0.1.0-SNAPSHOT - jar + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 + com.baeldung + core-java + 0.1.0-SNAPSHOT + jar - core-java + core-java - + - - - net.sourceforge.collections - collections-generic - ${collections-generic.version} - - - com.google.guava - guava - ${guava.version} - + + org.openjdk.jmh + jmh-core + 1.19 + + + org.openjdk.jmh + jmh-generator-annprocess + 1.19 + - - org.apache.commons - commons-collections4 - ${commons-collections4.version} - + + + net.sourceforge.collections + collections-generic + ${collections-generic.version} + + + com.google.guava + guava + ${guava.version} + - - commons-io - commons-io - ${commons-io.version} - + + org.apache.commons + commons-collections4 + ${commons-collections4.version} + - - org.apache.commons - commons-lang3 - ${commons-lang3.version} - + + commons-io + commons-io + ${commons-io.version} + - - org.apache.commons - commons-math3 - ${commons-math3.version} - + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + - - org.decimal4j - decimal4j - ${decimal4j.version} - + + org.apache.commons + commons-math3 + ${commons-math3.version} + - - org.bouncycastle - bcprov-jdk15on - ${bouncycastle.version} - + + org.decimal4j + decimal4j + ${decimal4j.version} + - - org.unix4j - unix4j-command - ${unix4j.version} - + + org.bouncycastle + bcprov-jdk15on + ${bouncycastle.version} + - - com.googlecode.grep4j - grep4j - ${grep4j.version} - - + + org.unix4j + unix4j-command + ${unix4j.version} + - + + com.googlecode.grep4j + grep4j + ${grep4j.version} + + - - com.fasterxml.jackson.core - jackson-databind - ${jackson.version} - + - + + com.fasterxml.jackson.core + jackson-databind + ${jackson.version} + - - org.slf4j - slf4j-api - ${org.slf4j.version} - - - ch.qos.logback - logback-classic - ${logback.version} - - - - org.slf4j - jcl-over-slf4j - ${org.slf4j.version} - - - - org.slf4j - log4j-over-slf4j - ${org.slf4j.version} - - - org.projectlombok - lombok - ${lombok.version} - provided - + - + + org.slf4j + slf4j-api + ${org.slf4j.version} + + + ch.qos.logback + logback-classic + ${logback.version} + + + + org.slf4j + jcl-over-slf4j + ${org.slf4j.version} + + + + org.slf4j + log4j-over-slf4j + ${org.slf4j.version} + + + org.projectlombok + lombok + ${lombok.version} + provided + - - org.hamcrest - hamcrest-all - 1.3 - test - + - - junit - junit - ${junit.version} - test - + + org.hamcrest + hamcrest-all + 1.3 + test + - - org.hamcrest - hamcrest-core - ${org.hamcrest.version} - test - - - org.hamcrest - hamcrest-library - ${org.hamcrest.version} - test - + + junit + junit + ${junit.version} + test + - - org.assertj - assertj-core - ${assertj.version} - test - + + org.hamcrest + hamcrest-core + ${org.hamcrest.version} + test + + + org.hamcrest + hamcrest-library + ${org.hamcrest.version} + test + - - org.mockito - mockito-core - ${mockito.version} - test - - - com.jayway.awaitility - awaitility - ${avaitility.version} - test - + + org.assertj + assertj-core + ${assertj.version} + test + - - commons-codec - commons-codec - ${commons-codec.version} - + + org.mockito + mockito-core + ${mockito.version} + test + + + com.jayway.awaitility + awaitility + ${avaitility.version} + test + - - org.javamoney - moneta - 1.1 - + + commons-codec + commons-codec + ${commons-codec.version} + - - org.owasp.esapi - esapi - 2.1.0.1 - + + org.javamoney + moneta + 1.1 + - - com.sun.messaging.mq - fscontext - ${fscontext.version} - - + + org.owasp.esapi + esapi + 2.1.0.1 + - - core-java - - - src/main/resources - true - - + + com.sun.messaging.mq + fscontext + ${fscontext.version} + + - + + core-java + + + src/main/resources + true + + - - org.apache.maven.plugins - maven-compiler-plugin - ${maven-compiler-plugin.version} - - 1.8 - 1.8 - - + - - org.apache.maven.plugins - maven-surefire-plugin - - - **/*IntegrationTest.java - **/*LongRunningUnitTest.java - **/*ManualTest.java - - true - - + + org.codehaus.mojo + exec-maven-plugin - - org.apache.maven.plugins - maven-dependency-plugin - - - copy-dependencies - prepare-package - - copy-dependencies - - - ${project.build.directory}/libs - - - - + + + run-benchmarks + integration-test + + exec + + + test + java + + -classpath + + org.openjdk.jmh.Main + .* + + + + + - - org.apache.maven.plugins - maven-jar-plugin - - - - true - libs/ - org.baeldung.executable.ExecutableMavenJar - - - - + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + 1.8 + 1.8 + + - - org.apache.maven.plugins - maven-assembly-plugin - - - package - - single - - - ${project.basedir} - - - org.baeldung.executable.ExecutableMavenJar - - - - jar-with-dependencies - - - - - + + org.apache.maven.plugins + maven-surefire-plugin + + + **/*IntegrationTest.java + **/*LongRunningUnitTest.java + **/*ManualTest.java + + true + + - - org.apache.maven.plugins - maven-shade-plugin - - - - shade - - - true - - - org.baeldung.executable.ExecutableMavenJar - - - - - - + + org.apache.maven.plugins + maven-dependency-plugin + + + copy-dependencies + prepare-package + + copy-dependencies + + + ${project.build.directory}/libs + + + + - - com.jolira - onejar-maven-plugin - - - - org.baeldung.executable.ExecutableMavenJar - true - ${project.build.finalName}-onejar.${project.packaging} - - - one-jar - - - - + + org.apache.maven.plugins + maven-jar-plugin + + + + true + libs/ + org.baeldung.executable.ExecutableMavenJar + + + + - - org.springframework.boot - spring-boot-maven-plugin - - - - repackage - - - spring-boot - org.baeldung.executable.ExecutableMavenJar - - - - + + org.apache.maven.plugins + maven-assembly-plugin + + + package + + single + + + ${project.basedir} + + + org.baeldung.executable.ExecutableMavenJar + + + + jar-with-dependencies + + + + + - - org.codehaus.mojo - exec-maven-plugin - 1.6.0 - - java - com.baeldung.outofmemoryerror.OutOfMemoryGCLimitExceed - - -Xmx300m - -XX:+UseParallelGC - -classpath - - com.baeldung.outofmemoryerror.OutOfMemoryGCLimitExceed - - - - + + org.apache.maven.plugins + maven-shade-plugin + + + + shade + + + true + + + org.baeldung.executable.ExecutableMavenJar + + + + + + - + + com.jolira + onejar-maven-plugin + + + + org.baeldung.executable.ExecutableMavenJar + true + ${project.build.finalName}-onejar.${project.packaging} + + + one-jar + + + + - - - integration - - - - org.apache.maven.plugins - maven-surefire-plugin - - - integration-test - - test - - - - **/*ManualTest.java - - - **/*IntegrationTest.java - - - - - - - json - - - - - - - + + org.springframework.boot + spring-boot-maven-plugin + + + + repackage + + + spring-boot + org.baeldung.executable.ExecutableMavenJar + + + + - - - 2.8.5 + + org.codehaus.mojo + exec-maven-plugin + 1.6.0 + + java + com.baeldung.outofmemoryerror.OutOfMemoryGCLimitExceed + + -Xmx300m + -XX:+UseParallelGC + -classpath + + com.baeldung.outofmemoryerror.OutOfMemoryGCLimitExceed + + + + - - 1.7.21 - 1.1.7 + - - 21.0 - 3.5 - 1.55 - 1.10 - 3.6.1 - 1.0.3 - 2.5 - 4.1 - 4.01 - 0.4 - 1.8.7 - 1.16.12 - 4.6-b01 + + + integration + + + + org.apache.maven.plugins + maven-surefire-plugin + + + integration-test + + test + + + + **/*ManualTest.java + + + **/*IntegrationTest.java + + + + + + + json + + + + + + + - - 1.3 - 4.12 - 1.10.19 - 3.6.1 - 1.7.0 + + + 2.8.5 - - 3.6.0 - 2.19.1 + + 1.7.21 + 1.1.7 - + + 21.0 + 3.5 + 1.55 + 1.10 + 3.6.1 + 1.0.3 + 2.5 + 4.1 + 4.01 + 0.4 + 1.8.7 + 1.16.12 + 4.6-b01 + + + 1.3 + 4.12 + 1.10.19 + 3.6.1 + 1.7.0 + + + 3.6.0 + 2.19.1 + + \ No newline at end of file diff --git a/core-java/src/main/java/com/baeldung/string/StringBufferStringBuilder.java b/core-java/src/main/java/com/baeldung/string/StringBufferStringBuilder.java index 4623b83de0..74f489d57f 100644 --- a/core-java/src/main/java/com/baeldung/string/StringBufferStringBuilder.java +++ b/core-java/src/main/java/com/baeldung/string/StringBufferStringBuilder.java @@ -1,25 +1,46 @@ package com.baeldung.string; +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.Scope; +import org.openjdk.jmh.annotations.State; +import org.openjdk.jmh.runner.Runner; +import org.openjdk.jmh.runner.RunnerException; +import org.openjdk.jmh.runner.options.Options; +import org.openjdk.jmh.runner.options.OptionsBuilder; + public class StringBufferStringBuilder { - public static void main(String[] args) { + public static void main(String[] args) throws RunnerException { - int iterations = 10000000; + Options opt = new OptionsBuilder() + .include(StringBufferStringBuilder.class.getSimpleName()) + .build(); - System.gc(); - long startTime = System.currentTimeMillis(); - StringBuffer stringBuffer = new StringBuffer("abc"); - for (int i = 0; i < iterations; i++) { - stringBuffer.append("def"); - } - System.out.println("Time taken by StringBuffer: " + (System.currentTimeMillis() - startTime) + "ms"); // Time taken by StringBuffer: 394ms - - System.gc(); - startTime = System.currentTimeMillis(); - StringBuilder stringBuilder = new StringBuilder("abc"); - for (int i = 0; i < iterations; i++) { - stringBuilder.append("def"); - } - System.out.println("Time taken by StringBuilder: " + (System.currentTimeMillis() - startTime) + "ms"); // Time taken by StringBuilder: 129ms + new Runner(opt).run(); } -} + + @State(Scope.Benchmark) + public static class MyState { + int iterations = 1000; + String initial = "abc"; + String suffix = "def"; + } + + @Benchmark + public StringBuffer benchmarkStringBuffer(MyState state) { + StringBuffer stringBuffer = new StringBuffer(state.initial); + for (int i = 0; i < state.iterations; i++) { + stringBuffer.append(state.suffix); + } + return stringBuffer; + } + + @Benchmark + public StringBuilder benchmarkStringBuilder(MyState state) { + StringBuilder stringBuilder = new StringBuilder(state.initial); + for (int i = 0; i < state.iterations; i++) { + stringBuilder.append(state.suffix); + } + return stringBuilder; + } +} \ No newline at end of file From e5ce748b165301b0fe9dcbd66a7c429afb35e4d1 Mon Sep 17 00:00:00 2001 From: iaforek Date: Mon, 13 Nov 2017 21:38:21 +0000 Subject: [PATCH 41/54] BAEL-1298 Sudoku - Backtracking Algorithm --- .../sudoku/BacktrackingAlgorithm.java | 89 +++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 algorithms/src/main/java/com/baeldung/algorithms/sudoku/BacktrackingAlgorithm.java diff --git a/algorithms/src/main/java/com/baeldung/algorithms/sudoku/BacktrackingAlgorithm.java b/algorithms/src/main/java/com/baeldung/algorithms/sudoku/BacktrackingAlgorithm.java new file mode 100644 index 0000000000..e763653fc8 --- /dev/null +++ b/algorithms/src/main/java/com/baeldung/algorithms/sudoku/BacktrackingAlgorithm.java @@ -0,0 +1,89 @@ +package com.baeldung.algorithms.sudoku; + +public class BacktrackingAlgorithm { + + public static void main(String[] args) { + + char[][] board = { + { '8', '.', '.', '.', '.', '.', '.', '.', '.' }, + { '.', '.', '3', '6', '.', '.', '.', '.', '.' }, + { '.', '7', '.', '.', '9', '.', '2', '.', '.' }, + { '.', '5', '.', '.', '.', '7', '.', '.', '.' }, + { '.', '.', '.', '.', '4', '5', '7', '.', '.' }, + { '.', '.', '.', '1', '.', '.', '.', '3', '.' }, + { '.', '.', '1', '.', '.', '.', '.', '6', '8' }, + { '.', '.', '8', '5', '.', '.', '.', '1', '.' }, + { '.', '9', '.', '.', '.', '.', '4', '.', '.' } + }; + + BacktrackingAlgorithm solver = new BacktrackingAlgorithm(); + solver.solve(board); + + for (int i = 0; i < 9; i++) { + for (int j = 0; j < 9; j++) { + System.out.print(board[i][j] + " "); + } + System.out.println(); + } + } + + public boolean solve(char[][] board) { + for (int r = 0; r < board.length; r++) { + for (int c = 0; c < board[0].length; c++) { + if (board[r][c] == '.') { + for (int k = 1; k <= 9; k++) { + board[r][c] = (char) ('0' + k); + if (isValid(board, r, c) && solve(board)) { + return true; + } else { + board[r][c] = '.'; + } + } + return false; + } + } + } + return true; + } + + public boolean isValid(char[][] board, int r, int c) { + //check row + boolean[] row = new boolean[9]; + for (int i = 0; i < 9; i++) { + if (board[r][i] >= '1' && board[r][i] <= '9') { + if (row[board[r][i] - '1'] == false) { + row[board[r][i] - '1'] = true; + } else { + return false; + } + } + } + + //check column + boolean[] col = new boolean[9]; + for (int i = 0; i < 9; i++) { + if (board[i][c] >= '1' && board[i][c] <= '9') { + if (col[board[i][c] - '1'] == false) { + col[board[i][c] - '1'] = true; + } else { + return false; + } + } + } + + //check the 3*3 grid + boolean[] grid = new boolean[9]; + for (int i = (r / 3) * 3; i < (r / 3) * 3 + 3; i++) { + for (int j = (c / 3) * 3; j < (c / 3) * 3 + 3; j++) { + if (board[i][j] >= '1' && board[i][j] <= '9') { + if (grid[board[i][j] - '1'] == false) { + grid[board[i][j] - '1'] = true; + } else { + return false; + } + } + } + } + return true; + } +} From 3351d50a5adf25f82ab58bacb547ba78ef5128d4 Mon Sep 17 00:00:00 2001 From: iaforek Date: Mon, 13 Nov 2017 21:39:44 +0000 Subject: [PATCH 42/54] BAEL-1298 Sudoku - Backtracking Algorithm --- .../baeldung/algorithms/sudoku/BacktrackingAlgorithm.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/algorithms/src/main/java/com/baeldung/algorithms/sudoku/BacktrackingAlgorithm.java b/algorithms/src/main/java/com/baeldung/algorithms/sudoku/BacktrackingAlgorithm.java index e763653fc8..6d41caf97e 100644 --- a/algorithms/src/main/java/com/baeldung/algorithms/sudoku/BacktrackingAlgorithm.java +++ b/algorithms/src/main/java/com/baeldung/algorithms/sudoku/BacktrackingAlgorithm.java @@ -47,7 +47,6 @@ public class BacktrackingAlgorithm { } public boolean isValid(char[][] board, int r, int c) { - //check row boolean[] row = new boolean[9]; for (int i = 0; i < 9; i++) { if (board[r][i] >= '1' && board[r][i] <= '9') { @@ -59,7 +58,6 @@ public class BacktrackingAlgorithm { } } - //check column boolean[] col = new boolean[9]; for (int i = 0; i < 9; i++) { if (board[i][c] >= '1' && board[i][c] <= '9') { @@ -70,8 +68,7 @@ public class BacktrackingAlgorithm { } } } - - //check the 3*3 grid + boolean[] grid = new boolean[9]; for (int i = (r / 3) * 3; i < (r / 3) * 3 + 3; i++) { for (int j = (c / 3) * 3; j < (c / 3) * 3 + 3; j++) { From cbf7bcbbbf8ba18d88a5c7af34e11c361102dc07 Mon Sep 17 00:00:00 2001 From: iaforek Date: Sun, 3 Dec 2017 19:48:43 +0000 Subject: [PATCH 43/54] BAEL-1298 Dancing Links Algorithm. Smaller changes to Backtracking --- .../sudoku/BacktrackingAlgorithm.java | 32 +++-- .../algorithms/sudoku/ColumnNode.java | 33 +++++ .../algorithms/sudoku/DancingLinks.java | 134 ++++++++++++++++++ .../sudoku/DancingLinksAlgorithm.java | 102 +++++++++++++ .../algorithms/sudoku/DancingNode.java | 50 +++++++ 5 files changed, 336 insertions(+), 15 deletions(-) create mode 100644 algorithms/src/main/java/com/baeldung/algorithms/sudoku/ColumnNode.java create mode 100644 algorithms/src/main/java/com/baeldung/algorithms/sudoku/DancingLinks.java create mode 100644 algorithms/src/main/java/com/baeldung/algorithms/sudoku/DancingLinksAlgorithm.java create mode 100644 algorithms/src/main/java/com/baeldung/algorithms/sudoku/DancingNode.java diff --git a/algorithms/src/main/java/com/baeldung/algorithms/sudoku/BacktrackingAlgorithm.java b/algorithms/src/main/java/com/baeldung/algorithms/sudoku/BacktrackingAlgorithm.java index 6d41caf97e..effdcd9c04 100644 --- a/algorithms/src/main/java/com/baeldung/algorithms/sudoku/BacktrackingAlgorithm.java +++ b/algorithms/src/main/java/com/baeldung/algorithms/sudoku/BacktrackingAlgorithm.java @@ -2,23 +2,25 @@ package com.baeldung.algorithms.sudoku; public class BacktrackingAlgorithm { - public static void main(String[] args) { - - char[][] board = { - { '8', '.', '.', '.', '.', '.', '.', '.', '.' }, - { '.', '.', '3', '6', '.', '.', '.', '.', '.' }, - { '.', '7', '.', '.', '9', '.', '2', '.', '.' }, + static char[][] board = { + { '8', '.', '.', '.', '.', '.', '.', '.', '.' }, + { '.', '.', '3', '6', '.', '.', '.', '.', '.' }, + { '.', '7', '.', '.', '9', '.', '2', '.', '.' }, { '.', '5', '.', '.', '.', '7', '.', '.', '.' }, - { '.', '.', '.', '.', '4', '5', '7', '.', '.' }, - { '.', '.', '.', '1', '.', '.', '.', '3', '.' }, - { '.', '.', '1', '.', '.', '.', '.', '6', '8' }, + { '.', '.', '.', '.', '4', '5', '7', '.', '.' }, + { '.', '.', '.', '1', '.', '.', '.', '3', '.' }, + { '.', '.', '1', '.', '.', '.', '.', '6', '8' }, { '.', '.', '8', '5', '.', '.', '.', '1', '.' }, - { '.', '9', '.', '.', '.', '.', '4', '.', '.' } + { '.', '9', '.', '.', '.', '.', '4', '.', '.' } }; - + + public static void main(String[] args) { BacktrackingAlgorithm solver = new BacktrackingAlgorithm(); solver.solve(board); + solver.printBoard(); + } + public void printBoard() { for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { System.out.print(board[i][j] + " "); @@ -26,7 +28,7 @@ public class BacktrackingAlgorithm { System.out.println(); } } - + public boolean solve(char[][] board) { for (int r = 0; r < board.length; r++) { for (int c = 0; c < board[0].length; c++) { @@ -45,7 +47,7 @@ public class BacktrackingAlgorithm { } return true; } - + public boolean isValid(char[][] board, int r, int c) { boolean[] row = new boolean[9]; for (int i = 0; i < 9; i++) { @@ -68,7 +70,7 @@ public class BacktrackingAlgorithm { } } } - + boolean[] grid = new boolean[9]; for (int i = (r / 3) * 3; i < (r / 3) * 3 + 3; i++) { for (int j = (c / 3) * 3; j < (c / 3) * 3 + 3; j++) { @@ -79,7 +81,7 @@ public class BacktrackingAlgorithm { return false; } } - } + } } return true; } diff --git a/algorithms/src/main/java/com/baeldung/algorithms/sudoku/ColumnNode.java b/algorithms/src/main/java/com/baeldung/algorithms/sudoku/ColumnNode.java new file mode 100644 index 0000000000..48538344b6 --- /dev/null +++ b/algorithms/src/main/java/com/baeldung/algorithms/sudoku/ColumnNode.java @@ -0,0 +1,33 @@ +package com.baeldung.algorithms.sudoku; + +class ColumnNode extends DancingNode { + int size; + String name; + + public ColumnNode(String n) { + super(); + size = 0; + name = n; + C = this; + } + + void cover() { + unlinkLR(); + for (DancingNode i = this.D; i != this; i = i.D) { + for (DancingNode j = i.R; j != i; j = j.R) { + j.unlinkUD(); + j.C.size--; + } + } + } + + void uncover() { + for (DancingNode i = this.U; i != this; i = i.U) { + for (DancingNode j = i.L; j != i; j = j.L) { + j.C.size++; + j.relinkUD(); + } + } + relinkLR(); + } +} \ No newline at end of file diff --git a/algorithms/src/main/java/com/baeldung/algorithms/sudoku/DancingLinks.java b/algorithms/src/main/java/com/baeldung/algorithms/sudoku/DancingLinks.java new file mode 100644 index 0000000000..a30f8ecab5 --- /dev/null +++ b/algorithms/src/main/java/com/baeldung/algorithms/sudoku/DancingLinks.java @@ -0,0 +1,134 @@ +package com.baeldung.algorithms.sudoku; + +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; + +public class DancingLinks { + + private ColumnNode header; + private List answer; + + private void search(int k) { + if (header.R == header) { + handleSolution(answer); + } else { + ColumnNode c = selectColumnNodeHeuristic(); + c.cover(); + + for (DancingNode r = c.D; r != c; r = r.D) { + answer.add(r); + + for (DancingNode j = r.R; j != r; j = j.R) { + j.C.cover(); + } + + search(k + 1); + + r = answer.remove(answer.size() - 1); + c = r.C; + + for (DancingNode j = r.L; j != r; j = j.L) { + j.C.uncover(); + } + } + c.uncover(); + } + } + + private ColumnNode selectColumnNodeHeuristic() { + int min = Integer.MAX_VALUE; + ColumnNode ret = null; + for (ColumnNode c = (ColumnNode) header.R; c != header; c = (ColumnNode) c.R) { + if (c.size < min) { + min = c.size; + ret = c; + } + } + return ret; + } + + private ColumnNode makeDLXBoard(boolean[][] grid) { + final int COLS = grid[0].length; + final int ROWS = grid.length; + + ColumnNode headerNode = new ColumnNode("header"); + ArrayList columnNodes = new ArrayList(); + + for (int i = 0; i < COLS; i++) { + ColumnNode n = new ColumnNode(Integer.toString(i)); + columnNodes.add(n); + headerNode = (ColumnNode) headerNode.hookRight(n); + } + headerNode = headerNode.R.C; + + for (int i = 0; i < ROWS; i++) { + DancingNode prev = null; + for (int j = 0; j < COLS; j++) { + if (grid[i][j] == true) { + ColumnNode col = columnNodes.get(j); + DancingNode newNode = new DancingNode(col); + if (prev == null) + prev = newNode; + col.U.hookDown(newNode); + prev = prev.hookRight(newNode); + col.size++; + } + } + } + + headerNode.size = COLS; + + return headerNode; + } + + public DancingLinks(boolean[][] cover) { + header = makeDLXBoard(cover); + } + + public void runSolver() { + answer = new LinkedList(); + search(0); + } + + public void handleSolution(List answer) { + int[][] result = parseBoard(answer); + printSolution(result); + } + + int size = 9; + + private int[][] parseBoard(List answer) { + int[][] result = new int[size][size]; + for (DancingNode n : answer) { + DancingNode rcNode = n; + int min = Integer.parseInt(rcNode.C.name); + for (DancingNode tmp = n.R; tmp != n; tmp = tmp.R) { + int val = Integer.parseInt(tmp.C.name); + if (val < min) { + min = val; + rcNode = tmp; + } + } + int ans1 = Integer.parseInt(rcNode.C.name); + int ans2 = Integer.parseInt(rcNode.R.C.name); + int r = ans1 / size; + int c = ans1 % size; + int num = (ans2 % size) + 1; + result[r][c] = num; + } + return result; + } + + public static void printSolution(int[][] result) { + int N = result.length; + for (int i = 0; i < N; i++) { + String ret = ""; + for (int j = 0; j < N; j++) { + ret += result[i][j] + " "; + } + System.out.println(ret); + } + System.out.println(); + } +} diff --git a/algorithms/src/main/java/com/baeldung/algorithms/sudoku/DancingLinksAlgorithm.java b/algorithms/src/main/java/com/baeldung/algorithms/sudoku/DancingLinksAlgorithm.java new file mode 100644 index 0000000000..5cff88c644 --- /dev/null +++ b/algorithms/src/main/java/com/baeldung/algorithms/sudoku/DancingLinksAlgorithm.java @@ -0,0 +1,102 @@ +package com.baeldung.algorithms.sudoku; + +import java.util.*; + +public class DancingLinksAlgorithm { + private static int S = 9; + private static int SIDE = 3; + + static char[][] board = { + { '8', '.', '.', '.', '.', '.', '.', '.', '.' }, + { '.', '.', '3', '6', '.', '.', '.', '.', '.' }, + { '.', '7', '.', '.', '9', '.', '2', '.', '.' }, + { '.', '5', '.', '.', '.', '7', '.', '.', '.' }, + { '.', '.', '.', '.', '4', '5', '7', '.', '.' }, + { '.', '.', '.', '1', '.', '.', '.', '3', '.' }, + { '.', '.', '1', '.', '.', '.', '.', '6', '8' }, + { '.', '.', '8', '5', '.', '.', '.', '1', '.' }, + { '.', '9', '.', '.', '.', '.', '4', '.', '.' } + }; + + public static void main(String[] args) { + + DancingLinksAlgorithm solver = new DancingLinksAlgorithm(); + solver.solve(board); + } + + public boolean solve(char[][] board) { + boolean[][] cover = initializeExactCoverBoard(board); + DancingLinks dlx = new DancingLinks(cover); + dlx.runSolver(); + + return true; + } + + private int getIndex(int row, int col, int num) { + return (row - 1) * S * S + (col - 1) * S + (num - 1); + } + + private boolean[][] createExactCoverBoard() { + boolean[][] R = new boolean[9 * 9 * 9][9 * 9 * 4]; + + int hBase = 0; + + for (int r = 1; r <= S; r++) { + for (int c = 1; c <= S; c++, hBase++) { + for (int n = 1; n <= S; n++) { + int index = getIndex(r, c, n); + R[index][hBase] = true; + } + } + } + + for (int r = 1; r <= S; r++) { + for (int n = 1; n <= S; n++, hBase++) { + for (int c1 = 1; c1 <= S; c1++) { + int index = getIndex(r, c1, n); + R[index][hBase] = true; + } + } + } + + for (int c = 1; c <= S; c++) { + for (int n = 1; n <= S; n++, hBase++) { + for (int r1 = 1; r1 <= S; r1++) { + int index = getIndex(r1, c, n); + R[index][hBase] = true; + } + } + } + + for (int br = 1; br <= S; br += SIDE) { + for (int bc = 1; bc <= S; bc += SIDE) { + for (int n = 1; n <= S; n++, hBase++) { + for (int rDelta = 0; rDelta < SIDE; rDelta++) { + for (int cDelta = 0; cDelta < SIDE; cDelta++) { + int index = getIndex(br + rDelta, bc + cDelta, n); + R[index][hBase] = true; + } + } + } + } + } + return R; + } + + private boolean[][] initializeExactCoverBoard(char[][] sudoku) { + boolean[][] R = createExactCoverBoard(); + for (int i = 1; i <= S; i++) { + for (int j = 1; j <= S; j++) { + char n = sudoku[i - 1][j - 1]; + if (n != '.') { + for (int num = 1; num <= S; num++) { + if ((char) ('0' + num) != n) { + Arrays.fill(R[getIndex(i, j, num)], false); + } + } + } + } + } + return R; + } +} \ No newline at end of file diff --git a/algorithms/src/main/java/com/baeldung/algorithms/sudoku/DancingNode.java b/algorithms/src/main/java/com/baeldung/algorithms/sudoku/DancingNode.java new file mode 100644 index 0000000000..13dc3f2b57 --- /dev/null +++ b/algorithms/src/main/java/com/baeldung/algorithms/sudoku/DancingNode.java @@ -0,0 +1,50 @@ +package com.baeldung.algorithms.sudoku; + +class DancingNode { + DancingNode L, R, U, D; + ColumnNode C; + + DancingNode hookDown(DancingNode n1) { + assert (this.C == n1.C); + n1.D = this.D; + n1.D.U = n1; + n1.U = this; + this.D = n1; + return n1; + } + + DancingNode hookRight(DancingNode n1) { + n1.R = this.R; + n1.R.L = n1; + n1.L = this; + this.R = n1; + return n1; + } + + void unlinkLR() { + this.L.R = this.R; + this.R.L = this.L; + } + + void relinkLR() { + this.L.R = this.R.L = this; + } + + void unlinkUD() { + this.U.D = this.D; + this.D.U = this.U; + } + + void relinkUD() { + this.U.D = this.D.U = this; + } + + public DancingNode() { + L = R = U = D = this; + } + + public DancingNode(ColumnNode c) { + this(); + C = c; + } +} \ No newline at end of file From c2575d3b642185ad9f8e201796d0527389cdf14d Mon Sep 17 00:00:00 2001 From: iaforek Date: Mon, 4 Dec 2017 20:45:50 +0000 Subject: [PATCH 44/54] BAEL-1298 Resolve conflict - use most up-to-date POM --- core-java/pom.xml | 884 ++++++++++++++++++++++++---------------------- 1 file changed, 452 insertions(+), 432 deletions(-) diff --git a/core-java/pom.xml b/core-java/pom.xml index 0e57b35ab8..6be76cab33 100644 --- a/core-java/pom.xml +++ b/core-java/pom.xml @@ -1,476 +1,496 @@ - 4.0.0 - com.baeldung - core-java - 0.1.0-SNAPSHOT - jar + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 + com.baeldung + core-java + 0.1.0-SNAPSHOT + jar - core-java + core-java - + - - - net.sourceforge.collections - collections-generic - ${collections-generic.version} - - - com.google.guava - guava - ${guava.version} - + + + net.sourceforge.collections + collections-generic + ${collections-generic.version} + + + com.google.guava + guava + ${guava.version} + - - org.apache.commons - commons-collections4 - ${commons-collections4.version} - + + org.apache.commons + commons-collections4 + ${commons-collections4.version} + - - commons-io - commons-io - ${commons-io.version} - + + commons-io + commons-io + ${commons-io.version} + - - org.apache.commons - commons-lang3 - ${commons-lang3.version} - + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + - - org.apache.commons - commons-math3 - ${commons-math3.version} - + + org.apache.commons + commons-math3 + ${commons-math3.version} + - - org.decimal4j - decimal4j - ${decimal4j.version} - + + org.decimal4j + decimal4j + ${decimal4j.version} + - - org.bouncycastle - bcprov-jdk15on - ${bouncycastle.version} - + + org.bouncycastle + bcprov-jdk15on + ${bouncycastle.version} + - - org.unix4j - unix4j-command - ${unix4j.version} - + + org.unix4j + unix4j-command + ${unix4j.version} + - - com.googlecode.grep4j - grep4j - ${grep4j.version} - - + + com.googlecode.grep4j + grep4j + ${grep4j.version} + + - + - - com.fasterxml.jackson.core - jackson-databind - ${jackson.version} - + + com.fasterxml.jackson.core + jackson-databind + ${jackson.version} + - - - log4j - log4j - 1.2.17 - - - org.slf4j - slf4j-api - ${org.slf4j.version} - - - ch.qos.logback - logback-classic - ${logback.version} - - - - org.slf4j - jcl-over-slf4j - ${org.slf4j.version} - - - - org.slf4j - log4j-over-slf4j - ${org.slf4j.version} - - - org.projectlombok - lombok - ${lombok.version} - provided - + + + log4j + log4j + 1.2.17 + + + org.slf4j + slf4j-api + ${org.slf4j.version} + + + ch.qos.logback + logback-classic + ${logback.version} + + + + org.slf4j + jcl-over-slf4j + ${org.slf4j.version} + + + + org.slf4j + log4j-over-slf4j + ${org.slf4j.version} + + + org.projectlombok + lombok + ${lombok.version} + provided + - + - - org.hamcrest - hamcrest-all - 1.3 - test - + + org.hamcrest + hamcrest-all + 1.3 + test + - - junit - junit - ${junit.version} - test - + + junit + junit + ${junit.version} + test + - - org.hamcrest - hamcrest-core - ${org.hamcrest.version} - test - - - org.hamcrest - hamcrest-library - ${org.hamcrest.version} - test - + + org.hamcrest + hamcrest-core + ${org.hamcrest.version} + test + + + org.hamcrest + hamcrest-library + ${org.hamcrest.version} + test + - - org.assertj - assertj-core - ${assertj.version} - test - + + org.assertj + assertj-core + ${assertj.version} + test + - - org.mockito - mockito-core - ${mockito.version} - test - - - com.jayway.awaitility - awaitility - ${avaitility.version} - test - + + org.mockito + mockito-core + ${mockito.version} + test + + + com.jayway.awaitility + awaitility + ${avaitility.version} + test + - - commons-codec - commons-codec - ${commons-codec.version} - + + commons-codec + commons-codec + ${commons-codec.version} + - - org.javamoney - moneta - 1.1 - + + org.javamoney + moneta + 1.1 + - - org.owasp.esapi - esapi - 2.1.0.1 - + + org.owasp.esapi + esapi + 2.1.0.1 + + + com.h2database + h2 + 1.4.196 + runtime + + + com.sun.messaging.mq + fscontext + ${fscontext.version} + + + com.codepoetics + protonpack + ${protonpack.version} + + + one.util + streamex + ${streamex.version} + + + io.vavr + vavr + ${vavr.version} + + + org.openjdk.jmh + jmh-core + 1.19 + + + org.openjdk.jmh + jmh-generator-annprocess + 1.19 + + + org.springframework + spring-web + 4.3.4.RELEASE + - - com.sun.messaging.mq - fscontext - ${fscontext.version} - - - com.codepoetics - protonpack - ${protonpack.version} - - - one.util - streamex - ${streamex.version} - - - io.vavr - vavr - ${vavr.version} - - - org.openjdk.jmh - jmh-core - 1.19 - - - org.openjdk.jmh - jmh-generator-annprocess - 1.19 - - + + org.springframework.boot + spring-boot-starter + 1.5.8.RELEASE + - - core-java - - - src/main/resources - true - - + - + + core-java + + + src/main/resources + true + + - - org.apache.maven.plugins - maven-compiler-plugin - ${maven-compiler-plugin.version} - - 1.8 - 1.8 - - + - - org.apache.maven.plugins - maven-surefire-plugin - - - **/*IntegrationTest.java - **/*LongRunningUnitTest.java - **/*ManualTest.java - - true - - + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + 1.8 + 1.8 + + - - org.apache.maven.plugins - maven-dependency-plugin - - - copy-dependencies - prepare-package - - copy-dependencies - - - ${project.build.directory}/libs - - - - + + org.apache.maven.plugins + maven-surefire-plugin + + + **/*LiveTest.java + **/*IntegrationTest.java + **/*LongRunningUnitTest.java + **/*ManualTest.java + - - org.apache.maven.plugins - maven-jar-plugin - - - - true - libs/ - org.baeldung.executable.ExecutableMavenJar - - - - + + - - org.apache.maven.plugins - maven-assembly-plugin - - - package - - single - - - ${project.basedir} - - - org.baeldung.executable.ExecutableMavenJar - - - - jar-with-dependencies - - - - - + + org.apache.maven.plugins + maven-dependency-plugin + + + copy-dependencies + prepare-package + + copy-dependencies + + + ${project.build.directory}/libs + + + + - - org.apache.maven.plugins - maven-shade-plugin - - - - shade - - - true - - - org.baeldung.executable.ExecutableMavenJar - - - - - - + + org.apache.maven.plugins + maven-jar-plugin + + + + true + libs/ + org.baeldung.executable.ExecutableMavenJar + + + + - - com.jolira - onejar-maven-plugin - - - - org.baeldung.executable.ExecutableMavenJar - true - ${project.build.finalName}-onejar.${project.packaging} - - - one-jar - - - - + + org.apache.maven.plugins + maven-assembly-plugin + + + package + + single + + + ${project.basedir} + + + org.baeldung.executable.ExecutableMavenJar + + + + jar-with-dependencies + + + + + - - org.springframework.boot - spring-boot-maven-plugin - - - - repackage - - - spring-boot - org.baeldung.executable.ExecutableMavenJar - - - - + + org.apache.maven.plugins + maven-shade-plugin + + + + shade + + + true + + + org.baeldung.executable.ExecutableMavenJar + + + + + + - - org.codehaus.mojo - exec-maven-plugin - 1.6.0 - - java - com.baeldung.outofmemoryerror.OutOfMemoryGCLimitExceed - - -Xmx300m - -XX:+UseParallelGC - -classpath - - com.baeldung.outofmemoryerror.OutOfMemoryGCLimitExceed - - - - - - org.codehaus.mojo - exec-maven-plugin - - - - run-benchmarks - integration-test - - exec - - - test - java - - -classpath - - org.openjdk.jmh.Main - .* - - - - - - + + com.jolira + onejar-maven-plugin + + + + org.baeldung.executable.ExecutableMavenJar + true + ${project.build.finalName}-onejar.${project.packaging} + + + one-jar + + + + - + + org.springframework.boot + spring-boot-maven-plugin + + + + repackage + + + spring-boot + org.baeldung.executable.ExecutableMavenJar + + + + - - - integration - - - - org.apache.maven.plugins - maven-surefire-plugin - - - integration-test - - test - - - - **/*ManualTest.java - - - **/*IntegrationTest.java - - - - - - - json - - - - - - - + + org.codehaus.mojo + exec-maven-plugin + 1.6.0 + + java + com.baeldung.outofmemoryerror.OutOfMemoryGCLimitExceed + + -Xmx300m + -XX:+UseParallelGC + -classpath + + com.baeldung.outofmemoryerror.OutOfMemoryGCLimitExceed + + + - - - 2.8.5 - - 1.7.21 - 1.1.7 + - - 22.0 - 3.5 - 1.55 - 1.10 - 3.6.1 - 1.0.3 - 2.5 - 4.1 - 4.01 - 0.4 - 1.8.7 - 1.16.12 - 4.6-b01 - 1.13 - 0.6.5 - 0.9.0 + - - 1.3 - 4.12 - 2.8.9 - 3.6.1 - 1.7.0 + + + integration + + + + org.apache.maven.plugins + maven-surefire-plugin + + + integration-test + + test + + + + **/*ManualTest.java + + + **/*IntegrationTest.java + + + + + + + json + + + + + org.codehaus.mojo + exec-maven-plugin - - 3.6.0 - 2.19.1 - + + + run-benchmarks + + none + + exec + + + test + java + + -classpath + + org.openjdk.jmh.Main + .* + + + + + + + + + + + + + 2.8.5 + + + 1.7.21 + 1.1.7 + + + 22.0 + 3.5 + 1.55 + 1.10 + 3.6.1 + 1.0.3 + 2.5 + 4.1 + 4.01 + 0.4 + 1.8.7 + 1.16.12 + 4.6-b01 + 1.13 + 0.6.5 + 0.9.0 + + + 1.3 + 4.12 + 2.8.9 + 3.6.1 + 1.7.0 + + + 3.6.0 + 2.19.1 + \ No newline at end of file From 914abdb9a498b75e206f91f53c264e7f4d848283 Mon Sep 17 00:00:00 2001 From: iaforek Date: Sun, 28 Jan 2018 18:14:29 +0000 Subject: [PATCH 45/54] Updated code - mostly with CONSTANTS. Extracted methods. --- .../sudoku/BacktrackingAlgorithm.java | 119 ++++++++++-------- .../sudoku/DancingLinksAlgorithm.java | 86 +++++++------ 2 files changed, 114 insertions(+), 91 deletions(-) diff --git a/algorithms/src/main/java/com/baeldung/algorithms/sudoku/BacktrackingAlgorithm.java b/algorithms/src/main/java/com/baeldung/algorithms/sudoku/BacktrackingAlgorithm.java index effdcd9c04..25c8285e0e 100644 --- a/algorithms/src/main/java/com/baeldung/algorithms/sudoku/BacktrackingAlgorithm.java +++ b/algorithms/src/main/java/com/baeldung/algorithms/sudoku/BacktrackingAlgorithm.java @@ -1,18 +1,28 @@ package com.baeldung.algorithms.sudoku; -public class BacktrackingAlgorithm { +import java.util.stream.IntStream; - static char[][] board = { - { '8', '.', '.', '.', '.', '.', '.', '.', '.' }, - { '.', '.', '3', '6', '.', '.', '.', '.', '.' }, - { '.', '7', '.', '.', '9', '.', '2', '.', '.' }, - { '.', '5', '.', '.', '.', '7', '.', '.', '.' }, - { '.', '.', '.', '.', '4', '5', '7', '.', '.' }, - { '.', '.', '.', '1', '.', '.', '.', '3', '.' }, - { '.', '.', '1', '.', '.', '.', '.', '6', '8' }, - { '.', '.', '8', '5', '.', '.', '.', '1', '.' }, - { '.', '9', '.', '.', '.', '.', '4', '.', '.' } - }; +public class BacktrackingAlgorithm { + + private static int BOARD_SIZE = 9; + private static int SUBSECTION_SIZE = 3; + private static int BOARD_INDEX_START = 0; + + private static int NO_VALUE = 0; + private static int MIN_VALUE = 1; + private static int MAX_VALUE = 9; + + public static int[][] board = { + { 8, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 3, 6, 0, 0, 0, 0, 0 }, + { 0, 7, 0, 0, 9, 0, 2, 0, 0 }, + { 0, 5, 0, 0, 0, 7, 0, 0, 0 }, + { 0, 0, 0, 0, 4, 5, 7, 0, 0 }, + { 0, 0, 0, 1, 0, 0, 0, 3, 0 }, + { 0, 0, 1, 0, 0, 0, 0, 6, 8 }, + { 0, 0, 8, 5, 0, 0, 0, 1, 0 }, + { 0, 9, 0, 0, 0, 0, 4, 0, 0 } + }; public static void main(String[] args) { BacktrackingAlgorithm solver = new BacktrackingAlgorithm(); @@ -21,24 +31,24 @@ public class BacktrackingAlgorithm { } public void printBoard() { - for (int i = 0; i < 9; i++) { - for (int j = 0; j < 9; j++) { - System.out.print(board[i][j] + " "); - } + IntStream.range(BOARD_INDEX_START, BOARD_SIZE).forEach(row -> { + IntStream.range(BOARD_INDEX_START, BOARD_SIZE).forEach(column -> { + System.out.print(board[row][column] + " "); + }); System.out.println(); - } + }); } - public boolean solve(char[][] board) { - for (int r = 0; r < board.length; r++) { - for (int c = 0; c < board[0].length; c++) { - if (board[r][c] == '.') { - for (int k = 1; k <= 9; k++) { - board[r][c] = (char) ('0' + k); + public boolean solve(int[][] board) { + for (int r = BOARD_INDEX_START; r < BOARD_SIZE; r++) { + for (int c = BOARD_INDEX_START; c < BOARD_SIZE; c++) { + if (board[r][c] == NO_VALUE) { + for (int k = MIN_VALUE; k <= MAX_VALUE; k++) { + board[r][c] = k; if (isValid(board, r, c) && solve(board)) { return true; } else { - board[r][c] = '.'; + board[r][c] = NO_VALUE; } } return false; @@ -48,39 +58,44 @@ public class BacktrackingAlgorithm { return true; } - public boolean isValid(char[][] board, int r, int c) { - boolean[] row = new boolean[9]; - for (int i = 0; i < 9; i++) { - if (board[r][i] >= '1' && board[r][i] <= '9') { - if (row[board[r][i] - '1'] == false) { - row[board[r][i] - '1'] = true; - } else { - return false; - } + public boolean isValid(int[][] board, int r, int c) { + return (rowConstraint(board, r) && + columnConstraint(board, c) && + subsectionConstraint(board, r, c)); + } + + private boolean subsectionConstraint(int[][] board, int r, int c) { + boolean[] constraint = new boolean[BOARD_SIZE]; + for (int i = (r / SUBSECTION_SIZE) * SUBSECTION_SIZE; i < (r / SUBSECTION_SIZE) * SUBSECTION_SIZE + SUBSECTION_SIZE; i++) { + for (int j = (c / SUBSECTION_SIZE) * SUBSECTION_SIZE; j < (c / SUBSECTION_SIZE) * SUBSECTION_SIZE + SUBSECTION_SIZE; j++) { + if (!checkConstraint(board, i, constraint, j)) return false; } } + return true; + } - boolean[] col = new boolean[9]; - for (int i = 0; i < 9; i++) { - if (board[i][c] >= '1' && board[i][c] <= '9') { - if (col[board[i][c] - '1'] == false) { - col[board[i][c] - '1'] = true; - } else { - return false; - } - } + private boolean columnConstraint(int[][] board, int c) { + boolean[] constraint = new boolean[BOARD_SIZE]; + for (int i = BOARD_INDEX_START; i < BOARD_SIZE; i++) { + if (!checkConstraint(board, i, constraint, c)) return false; } + return true; + } - boolean[] grid = new boolean[9]; - for (int i = (r / 3) * 3; i < (r / 3) * 3 + 3; i++) { - for (int j = (c / 3) * 3; j < (c / 3) * 3 + 3; j++) { - if (board[i][j] >= '1' && board[i][j] <= '9') { - if (grid[board[i][j] - '1'] == false) { - grid[board[i][j] - '1'] = true; - } else { - return false; - } - } + private boolean rowConstraint(int[][] board, int r) { + boolean[] constraint = new boolean[BOARD_SIZE]; + for (int i = BOARD_INDEX_START; i < BOARD_SIZE; i++) { + if (!checkConstraint(board, r, constraint, i)) return false; + } + return true; + } + + private boolean checkConstraint(int[][] board, int r, boolean[] constraint, int c) { + if (board[r][c] >= MIN_VALUE && board[r][c] <= MAX_VALUE) { + if (constraint[board[r][c] - 1] == false) { + constraint[board[r][c] - 1] = true; + } else { + return false; } } return true; diff --git a/algorithms/src/main/java/com/baeldung/algorithms/sudoku/DancingLinksAlgorithm.java b/algorithms/src/main/java/com/baeldung/algorithms/sudoku/DancingLinksAlgorithm.java index 5cff88c644..057a15c594 100644 --- a/algorithms/src/main/java/com/baeldung/algorithms/sudoku/DancingLinksAlgorithm.java +++ b/algorithms/src/main/java/com/baeldung/algorithms/sudoku/DancingLinksAlgorithm.java @@ -3,28 +3,32 @@ package com.baeldung.algorithms.sudoku; import java.util.*; public class DancingLinksAlgorithm { - private static int S = 9; - private static int SIDE = 3; + private static int BOARD_SIZE = 9; + private static int SUBSECTION_SIZE = 3; + private static int NO_VALUE = 0; + private static int CONSTRAINTS = 4; + private static int MIN_VALUE = 1; + private static int MAX_VALUE = 9; + private static int COVER_START_INDEX = 1; - static char[][] board = { - { '8', '.', '.', '.', '.', '.', '.', '.', '.' }, - { '.', '.', '3', '6', '.', '.', '.', '.', '.' }, - { '.', '7', '.', '.', '9', '.', '2', '.', '.' }, - { '.', '5', '.', '.', '.', '7', '.', '.', '.' }, - { '.', '.', '.', '.', '4', '5', '7', '.', '.' }, - { '.', '.', '.', '1', '.', '.', '.', '3', '.' }, - { '.', '.', '1', '.', '.', '.', '.', '6', '8' }, - { '.', '.', '8', '5', '.', '.', '.', '1', '.' }, - { '.', '9', '.', '.', '.', '.', '4', '.', '.' } + public static int[][] board = { + { 8, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 3, 6, 0, 0, 0, 0, 0 }, + { 0, 7, 0, 0, 9, 0, 2, 0, 0 }, + { 0, 5, 0, 0, 0, 7, 0, 0, 0 }, + { 0, 0, 0, 0, 4, 5, 7, 0, 0 }, + { 0, 0, 0, 1, 0, 0, 0, 3, 0 }, + { 0, 0, 1, 0, 0, 0, 0, 6, 8 }, + { 0, 0, 8, 5, 0, 0, 0, 1, 0 }, + { 0, 9, 0, 0, 0, 0, 4, 0, 0 } }; public static void main(String[] args) { - DancingLinksAlgorithm solver = new DancingLinksAlgorithm(); solver.solve(board); } - public boolean solve(char[][] board) { + public boolean solve(int[][] board) { boolean[][] cover = initializeExactCoverBoard(board); DancingLinks dlx = new DancingLinks(cover); dlx.runSolver(); @@ -33,46 +37,50 @@ public class DancingLinksAlgorithm { } private int getIndex(int row, int col, int num) { - return (row - 1) * S * S + (col - 1) * S + (num - 1); + return (row - 1) * BOARD_SIZE * BOARD_SIZE + (col - 1) * BOARD_SIZE + (num - 1); } private boolean[][] createExactCoverBoard() { - boolean[][] R = new boolean[9 * 9 * 9][9 * 9 * 4]; + boolean[][] R = new boolean[BOARD_SIZE * BOARD_SIZE * MAX_VALUE][BOARD_SIZE * BOARD_SIZE * CONSTRAINTS]; int hBase = 0; - for (int r = 1; r <= S; r++) { - for (int c = 1; c <= S; c++, hBase++) { - for (int n = 1; n <= S; n++) { + // Cell constraint. + for (int r = COVER_START_INDEX; r <= BOARD_SIZE; r++) { + for (int c = COVER_START_INDEX; c <= BOARD_SIZE; c++, hBase++) { + for (int n = COVER_START_INDEX; n <= BOARD_SIZE; n++) { int index = getIndex(r, c, n); R[index][hBase] = true; } } } - - for (int r = 1; r <= S; r++) { - for (int n = 1; n <= S; n++, hBase++) { - for (int c1 = 1; c1 <= S; c1++) { + + // Row constrain. + for (int r = COVER_START_INDEX; r <= BOARD_SIZE; r++) { + for (int n = COVER_START_INDEX; n <= BOARD_SIZE; n++, hBase++) { + for (int c1 = COVER_START_INDEX; c1 <= BOARD_SIZE; c1++) { int index = getIndex(r, c1, n); R[index][hBase] = true; } } } - for (int c = 1; c <= S; c++) { - for (int n = 1; n <= S; n++, hBase++) { - for (int r1 = 1; r1 <= S; r1++) { + // Column constraint. + for (int c = COVER_START_INDEX; c <= BOARD_SIZE; c++) { + for (int n = COVER_START_INDEX; n <= BOARD_SIZE; n++, hBase++) { + for (int r1 = COVER_START_INDEX; r1 <= BOARD_SIZE; r1++) { int index = getIndex(r1, c, n); R[index][hBase] = true; } } } - - for (int br = 1; br <= S; br += SIDE) { - for (int bc = 1; bc <= S; bc += SIDE) { - for (int n = 1; n <= S; n++, hBase++) { - for (int rDelta = 0; rDelta < SIDE; rDelta++) { - for (int cDelta = 0; cDelta < SIDE; cDelta++) { + + // Subsection constraint + for (int br = COVER_START_INDEX; br <= BOARD_SIZE; br += SUBSECTION_SIZE) { + for (int bc = COVER_START_INDEX; bc <= BOARD_SIZE; bc += SUBSECTION_SIZE) { + for (int n = COVER_START_INDEX; n <= BOARD_SIZE; n++, hBase++) { + for (int rDelta = 0; rDelta < SUBSECTION_SIZE; rDelta++) { + for (int cDelta = 0; cDelta < SUBSECTION_SIZE; cDelta++) { int index = getIndex(br + rDelta, bc + cDelta, n); R[index][hBase] = true; } @@ -83,14 +91,14 @@ public class DancingLinksAlgorithm { return R; } - private boolean[][] initializeExactCoverBoard(char[][] sudoku) { + private boolean[][] initializeExactCoverBoard(int[][] board) { boolean[][] R = createExactCoverBoard(); - for (int i = 1; i <= S; i++) { - for (int j = 1; j <= S; j++) { - char n = sudoku[i - 1][j - 1]; - if (n != '.') { - for (int num = 1; num <= S; num++) { - if ((char) ('0' + num) != n) { + for (int i = COVER_START_INDEX; i <= BOARD_SIZE; i++) { + for (int j = COVER_START_INDEX; j <= BOARD_SIZE; j++) { + int n = board[i - 1][j - 1]; + if (n != NO_VALUE) { + for (int num = MIN_VALUE; num <= MAX_VALUE; num++) { + if (num != n) { Arrays.fill(R[getIndex(i, j, num)], false); } } From 2dbb293e669cf23c1d41a1cac120ab75f9a30045 Mon Sep 17 00:00:00 2001 From: iaforek Date: Sun, 28 Jan 2018 18:18:18 +0000 Subject: [PATCH 46/54] Removed pointless Java8 code. Renamed constant --- .../sudoku/BacktrackingAlgorithm.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/algorithms/src/main/java/com/baeldung/algorithms/sudoku/BacktrackingAlgorithm.java b/algorithms/src/main/java/com/baeldung/algorithms/sudoku/BacktrackingAlgorithm.java index 25c8285e0e..127e78900c 100644 --- a/algorithms/src/main/java/com/baeldung/algorithms/sudoku/BacktrackingAlgorithm.java +++ b/algorithms/src/main/java/com/baeldung/algorithms/sudoku/BacktrackingAlgorithm.java @@ -6,7 +6,7 @@ public class BacktrackingAlgorithm { private static int BOARD_SIZE = 9; private static int SUBSECTION_SIZE = 3; - private static int BOARD_INDEX_START = 0; + private static int BOARD_START_INDEX = 0; private static int NO_VALUE = 0; private static int MIN_VALUE = 1; @@ -31,17 +31,17 @@ public class BacktrackingAlgorithm { } public void printBoard() { - IntStream.range(BOARD_INDEX_START, BOARD_SIZE).forEach(row -> { - IntStream.range(BOARD_INDEX_START, BOARD_SIZE).forEach(column -> { + for (int row = BOARD_START_INDEX; row < BOARD_SIZE; row++) { + for (int column = BOARD_START_INDEX; column < BOARD_SIZE; column++) { System.out.print(board[row][column] + " "); - }); + } System.out.println(); - }); + } } public boolean solve(int[][] board) { - for (int r = BOARD_INDEX_START; r < BOARD_SIZE; r++) { - for (int c = BOARD_INDEX_START; c < BOARD_SIZE; c++) { + for (int r = BOARD_START_INDEX; r < BOARD_SIZE; r++) { + for (int c = BOARD_START_INDEX; c < BOARD_SIZE; c++) { if (board[r][c] == NO_VALUE) { for (int k = MIN_VALUE; k <= MAX_VALUE; k++) { board[r][c] = k; @@ -76,7 +76,7 @@ public class BacktrackingAlgorithm { private boolean columnConstraint(int[][] board, int c) { boolean[] constraint = new boolean[BOARD_SIZE]; - for (int i = BOARD_INDEX_START; i < BOARD_SIZE; i++) { + for (int i = BOARD_START_INDEX; i < BOARD_SIZE; i++) { if (!checkConstraint(board, i, constraint, c)) return false; } return true; @@ -84,7 +84,7 @@ public class BacktrackingAlgorithm { private boolean rowConstraint(int[][] board, int r) { boolean[] constraint = new boolean[BOARD_SIZE]; - for (int i = BOARD_INDEX_START; i < BOARD_SIZE; i++) { + for (int i = BOARD_START_INDEX; i < BOARD_SIZE; i++) { if (!checkConstraint(board, r, constraint, i)) return false; } return true; From 66f5474f7ffb24d3cca9a5ced245b60b17a39e4c Mon Sep 17 00:00:00 2001 From: iaforek Date: Sun, 4 Feb 2018 11:02:54 +0000 Subject: [PATCH 47/54] Extracted 'constraints' methods and renamed coverBoard variable --- .../sudoku/DancingLinksAlgorithm.java | 87 +++++++++++-------- 1 file changed, 50 insertions(+), 37 deletions(-) diff --git a/algorithms/src/main/java/com/baeldung/algorithms/sudoku/DancingLinksAlgorithm.java b/algorithms/src/main/java/com/baeldung/algorithms/sudoku/DancingLinksAlgorithm.java index 70cf5b9e11..76b686afa6 100644 --- a/algorithms/src/main/java/com/baeldung/algorithms/sudoku/DancingLinksAlgorithm.java +++ b/algorithms/src/main/java/com/baeldung/algorithms/sudoku/DancingLinksAlgorithm.java @@ -39,70 +39,83 @@ public class DancingLinksAlgorithm { } private boolean[][] createExactCoverBoard() { - boolean[][] R = new boolean[BOARD_SIZE * BOARD_SIZE * MAX_VALUE][BOARD_SIZE * BOARD_SIZE * CONSTRAINTS]; + boolean[][] coverBoard = new boolean[BOARD_SIZE * BOARD_SIZE * MAX_VALUE][BOARD_SIZE * BOARD_SIZE * CONSTRAINTS]; int hBase = 0; - - // Cell constraint. - for (int r = COVER_START_INDEX; r <= BOARD_SIZE; r++) { - for (int c = COVER_START_INDEX; c <= BOARD_SIZE; c++, hBase++) { - for (int n = COVER_START_INDEX; n <= BOARD_SIZE; n++) { - int index = getIndex(r, c, n); - R[index][hBase] = true; - } - } - } - - // Row constrain. - for (int r = COVER_START_INDEX; r <= BOARD_SIZE; r++) { - for (int n = COVER_START_INDEX; n <= BOARD_SIZE; n++, hBase++) { - for (int c1 = COVER_START_INDEX; c1 <= BOARD_SIZE; c1++) { - int index = getIndex(r, c1, n); - R[index][hBase] = true; - } - } - } - - // Column constraint. - for (int c = COVER_START_INDEX; c <= BOARD_SIZE; c++) { - for (int n = COVER_START_INDEX; n <= BOARD_SIZE; n++, hBase++) { - for (int r1 = COVER_START_INDEX; r1 <= BOARD_SIZE; r1++) { - int index = getIndex(r1, c, n); - R[index][hBase] = true; - } - } - } + hBase = checkCellConstraint(coverBoard, hBase); + hBase = checkRowConstraint(coverBoard, hBase); + hBase = checkColumnConstraint(coverBoard, hBase); + checkSubsectionConstraint(coverBoard, hBase); - // Subsection constraint + return coverBoard; + } + + private int checkSubsectionConstraint(boolean[][] coverBoard, int hBase) { for (int br = COVER_START_INDEX; br <= BOARD_SIZE; br += SUBSECTION_SIZE) { for (int bc = COVER_START_INDEX; bc <= BOARD_SIZE; bc += SUBSECTION_SIZE) { for (int n = COVER_START_INDEX; n <= BOARD_SIZE; n++, hBase++) { for (int rDelta = 0; rDelta < SUBSECTION_SIZE; rDelta++) { for (int cDelta = 0; cDelta < SUBSECTION_SIZE; cDelta++) { int index = getIndex(br + rDelta, bc + cDelta, n); - R[index][hBase] = true; + coverBoard[index][hBase] = true; } } } } } - return R; + return hBase; + } + + private int checkColumnConstraint(boolean[][] coverBoard, int hBase) { + for (int c = COVER_START_INDEX; c <= BOARD_SIZE; c++) { + for (int n = COVER_START_INDEX; n <= BOARD_SIZE; n++, hBase++) { + for (int r1 = COVER_START_INDEX; r1 <= BOARD_SIZE; r1++) { + int index = getIndex(r1, c, n); + coverBoard[index][hBase] = true; + } + } + } + return hBase; + } + + private int checkRowConstraint(boolean[][] coverBoard, int hBase) { + for (int r = COVER_START_INDEX; r <= BOARD_SIZE; r++) { + for (int n = COVER_START_INDEX; n <= BOARD_SIZE; n++, hBase++) { + for (int c1 = COVER_START_INDEX; c1 <= BOARD_SIZE; c1++) { + int index = getIndex(r, c1, n); + coverBoard[index][hBase] = true; + } + } + } + return hBase; + } + + private int checkCellConstraint(boolean[][] coverBoard, int hBase) { + for (int r = COVER_START_INDEX; r <= BOARD_SIZE; r++) { + for (int c = COVER_START_INDEX; c <= BOARD_SIZE; c++, hBase++) { + for (int n = COVER_START_INDEX; n <= BOARD_SIZE; n++) { + int index = getIndex(r, c, n); + coverBoard[index][hBase] = true; + } + } + } + return hBase; } private boolean[][] initializeExactCoverBoard(int[][] board) { - boolean[][] R = createExactCoverBoard(); + boolean[][] coverBoard = createExactCoverBoard(); for (int i = COVER_START_INDEX; i <= BOARD_SIZE; i++) { for (int j = COVER_START_INDEX; j <= BOARD_SIZE; j++) { int n = board[i - 1][j - 1]; if (n != NO_VALUE) { for (int num = MIN_VALUE; num <= MAX_VALUE; num++) { if (num != n) { - Arrays.fill(R[getIndex(i, j, num)], false); + Arrays.fill(coverBoard[getIndex(i, j, num)], false); } } } } } - return R; + return coverBoard; } } \ No newline at end of file From fb427ce68051bf011a8a4d9e44271f35c06dc792 Mon Sep 17 00:00:00 2001 From: iaforek Date: Sun, 4 Feb 2018 11:02:54 +0000 Subject: [PATCH 48/54] Extracted 'constraints' methods and renamed coverBoard variable --- .../algorithms/sudoku/DancingLinks.java | 4 +- .../sudoku/DancingLinksAlgorithm.java | 87 +++++++++++-------- 2 files changed, 52 insertions(+), 39 deletions(-) diff --git a/algorithms/src/main/java/com/baeldung/algorithms/sudoku/DancingLinks.java b/algorithms/src/main/java/com/baeldung/algorithms/sudoku/DancingLinks.java index e5a02b7c91..d3cbb2bd02 100644 --- a/algorithms/src/main/java/com/baeldung/algorithms/sudoku/DancingLinks.java +++ b/algorithms/src/main/java/com/baeldung/algorithms/sudoku/DancingLinks.java @@ -120,10 +120,10 @@ public class DancingLinks { } private static void printSolution(int[][] result) { - int N = result.length; + int size = result.length; for (int[] aResult : result) { StringBuilder ret = new StringBuilder(); - for (int j = 0; j < N; j++) { + for (int j = 0; j < size; j++) { ret.append(aResult[j]).append(" "); } System.out.println(ret); diff --git a/algorithms/src/main/java/com/baeldung/algorithms/sudoku/DancingLinksAlgorithm.java b/algorithms/src/main/java/com/baeldung/algorithms/sudoku/DancingLinksAlgorithm.java index 70cf5b9e11..76b686afa6 100644 --- a/algorithms/src/main/java/com/baeldung/algorithms/sudoku/DancingLinksAlgorithm.java +++ b/algorithms/src/main/java/com/baeldung/algorithms/sudoku/DancingLinksAlgorithm.java @@ -39,70 +39,83 @@ public class DancingLinksAlgorithm { } private boolean[][] createExactCoverBoard() { - boolean[][] R = new boolean[BOARD_SIZE * BOARD_SIZE * MAX_VALUE][BOARD_SIZE * BOARD_SIZE * CONSTRAINTS]; + boolean[][] coverBoard = new boolean[BOARD_SIZE * BOARD_SIZE * MAX_VALUE][BOARD_SIZE * BOARD_SIZE * CONSTRAINTS]; int hBase = 0; - - // Cell constraint. - for (int r = COVER_START_INDEX; r <= BOARD_SIZE; r++) { - for (int c = COVER_START_INDEX; c <= BOARD_SIZE; c++, hBase++) { - for (int n = COVER_START_INDEX; n <= BOARD_SIZE; n++) { - int index = getIndex(r, c, n); - R[index][hBase] = true; - } - } - } - - // Row constrain. - for (int r = COVER_START_INDEX; r <= BOARD_SIZE; r++) { - for (int n = COVER_START_INDEX; n <= BOARD_SIZE; n++, hBase++) { - for (int c1 = COVER_START_INDEX; c1 <= BOARD_SIZE; c1++) { - int index = getIndex(r, c1, n); - R[index][hBase] = true; - } - } - } - - // Column constraint. - for (int c = COVER_START_INDEX; c <= BOARD_SIZE; c++) { - for (int n = COVER_START_INDEX; n <= BOARD_SIZE; n++, hBase++) { - for (int r1 = COVER_START_INDEX; r1 <= BOARD_SIZE; r1++) { - int index = getIndex(r1, c, n); - R[index][hBase] = true; - } - } - } + hBase = checkCellConstraint(coverBoard, hBase); + hBase = checkRowConstraint(coverBoard, hBase); + hBase = checkColumnConstraint(coverBoard, hBase); + checkSubsectionConstraint(coverBoard, hBase); - // Subsection constraint + return coverBoard; + } + + private int checkSubsectionConstraint(boolean[][] coverBoard, int hBase) { for (int br = COVER_START_INDEX; br <= BOARD_SIZE; br += SUBSECTION_SIZE) { for (int bc = COVER_START_INDEX; bc <= BOARD_SIZE; bc += SUBSECTION_SIZE) { for (int n = COVER_START_INDEX; n <= BOARD_SIZE; n++, hBase++) { for (int rDelta = 0; rDelta < SUBSECTION_SIZE; rDelta++) { for (int cDelta = 0; cDelta < SUBSECTION_SIZE; cDelta++) { int index = getIndex(br + rDelta, bc + cDelta, n); - R[index][hBase] = true; + coverBoard[index][hBase] = true; } } } } } - return R; + return hBase; + } + + private int checkColumnConstraint(boolean[][] coverBoard, int hBase) { + for (int c = COVER_START_INDEX; c <= BOARD_SIZE; c++) { + for (int n = COVER_START_INDEX; n <= BOARD_SIZE; n++, hBase++) { + for (int r1 = COVER_START_INDEX; r1 <= BOARD_SIZE; r1++) { + int index = getIndex(r1, c, n); + coverBoard[index][hBase] = true; + } + } + } + return hBase; + } + + private int checkRowConstraint(boolean[][] coverBoard, int hBase) { + for (int r = COVER_START_INDEX; r <= BOARD_SIZE; r++) { + for (int n = COVER_START_INDEX; n <= BOARD_SIZE; n++, hBase++) { + for (int c1 = COVER_START_INDEX; c1 <= BOARD_SIZE; c1++) { + int index = getIndex(r, c1, n); + coverBoard[index][hBase] = true; + } + } + } + return hBase; + } + + private int checkCellConstraint(boolean[][] coverBoard, int hBase) { + for (int r = COVER_START_INDEX; r <= BOARD_SIZE; r++) { + for (int c = COVER_START_INDEX; c <= BOARD_SIZE; c++, hBase++) { + for (int n = COVER_START_INDEX; n <= BOARD_SIZE; n++) { + int index = getIndex(r, c, n); + coverBoard[index][hBase] = true; + } + } + } + return hBase; } private boolean[][] initializeExactCoverBoard(int[][] board) { - boolean[][] R = createExactCoverBoard(); + boolean[][] coverBoard = createExactCoverBoard(); for (int i = COVER_START_INDEX; i <= BOARD_SIZE; i++) { for (int j = COVER_START_INDEX; j <= BOARD_SIZE; j++) { int n = board[i - 1][j - 1]; if (n != NO_VALUE) { for (int num = MIN_VALUE; num <= MAX_VALUE; num++) { if (num != n) { - Arrays.fill(R[getIndex(i, j, num)], false); + Arrays.fill(coverBoard[getIndex(i, j, num)], false); } } } } } - return R; + return coverBoard; } } \ No newline at end of file From 4760816cfb2c6bde7375f5190dde90d7eb7159c0 Mon Sep 17 00:00:00 2001 From: iaforek Date: Tue, 13 Feb 2018 09:02:23 +0000 Subject: [PATCH 49/54] Renamed variables --- .../sudoku/BacktrackingAlgorithm.java | 48 +++++++++---------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/algorithms/src/main/java/com/baeldung/algorithms/sudoku/BacktrackingAlgorithm.java b/algorithms/src/main/java/com/baeldung/algorithms/sudoku/BacktrackingAlgorithm.java index ff426cbe68..4b37558aab 100644 --- a/algorithms/src/main/java/com/baeldung/algorithms/sudoku/BacktrackingAlgorithm.java +++ b/algorithms/src/main/java/com/baeldung/algorithms/sudoku/BacktrackingAlgorithm.java @@ -40,15 +40,15 @@ public class BacktrackingAlgorithm { } private boolean solve(int[][] board) { - for (int r = BOARD_START_INDEX; r < BOARD_SIZE; r++) { - for (int c = BOARD_START_INDEX; c < BOARD_SIZE; c++) { - if (board[r][c] == NO_VALUE) { + for (int row = BOARD_START_INDEX; row < BOARD_SIZE; row++) { + for (int column = BOARD_START_INDEX; column < BOARD_SIZE; column++) { + if (board[row][column] == NO_VALUE) { for (int k = MIN_VALUE; k <= MAX_VALUE; k++) { - board[r][c] = k; - if (isValid(board, r, c) && solve(board)) { + board[row][column] = k; + if (isValid(board, row, column) && solve(board)) { return true; } - board[r][c] = NO_VALUE; + board[row][column] = NO_VALUE; } return false; } @@ -57,44 +57,44 @@ public class BacktrackingAlgorithm { return true; } - private boolean isValid(int[][] board, int r, int c) { - return rowConstraint(board, r) && - columnConstraint(board, c) && - subsectionConstraint(board, r, c); + private boolean isValid(int[][] board, int row, int column) { + return rowConstraint(board, row) && + columnConstraint(board, column) && + subsectionConstraint(board, row, column); } - private boolean subsectionConstraint(int[][] board, int r, int c) { + private boolean subsectionConstraint(int[][] board, int row, int column) { boolean[] constraint = new boolean[BOARD_SIZE]; - int subsectionRowStart = (r / SUBSECTION_SIZE) * SUBSECTION_SIZE; + int subsectionRowStart = (row / SUBSECTION_SIZE) * SUBSECTION_SIZE; int subsectionRowEnd = subsectionRowStart + SUBSECTION_SIZE; - int subsectionColumnStart = (c / SUBSECTION_SIZE) * SUBSECTION_SIZE; + int subsectionColumnStart = (column / SUBSECTION_SIZE) * SUBSECTION_SIZE; int subsectionColumnEnd = subsectionColumnStart + SUBSECTION_SIZE; - for (int i = subsectionRowStart; i < subsectionRowEnd; i++) { - for (int j = subsectionColumnStart; j < subsectionColumnEnd; j++) { - if (!checkConstraint(board, i, constraint, j)) return false; + for (int r = subsectionRowStart; r < subsectionRowEnd; r++) { + for (int c = subsectionColumnStart; c < subsectionColumnEnd; c++) { + if (!checkConstraint(board, r, constraint, c)) return false; } } return true; } - private boolean columnConstraint(int[][] board, int c) { + private boolean columnConstraint(int[][] board, int column) { boolean[] constraint = new boolean[BOARD_SIZE]; return IntStream.range(BOARD_START_INDEX, BOARD_SIZE) - .allMatch(i -> checkConstraint(board, i, constraint, c)); + .allMatch(row -> checkConstraint(board, row, constraint, column)); } - private boolean rowConstraint(int[][] board, int r) { + private boolean rowConstraint(int[][] board, int row) { boolean[] constraint = new boolean[BOARD_SIZE]; return IntStream.range(BOARD_START_INDEX, BOARD_SIZE) - .allMatch(i -> checkConstraint(board, r, constraint, i)); + .allMatch(column -> checkConstraint(board, row, constraint, column)); } - private boolean checkConstraint(int[][] board, int r, boolean[] constraint, int c) { - if (board[r][c] != NO_VALUE) { - if (!constraint[board[r][c] - 1]) { - constraint[board[r][c] - 1] = true; + private boolean checkConstraint(int[][] board, int row, boolean[] constraint, int column) { + if (board[row][column] != NO_VALUE) { + if (!constraint[board[row][column] - 1]) { + constraint[board[row][column] - 1] = true; } else { return false; } From 0c6aff4c8b60f148634fe644f4a560d8a2eacae5 Mon Sep 17 00:00:00 2001 From: iaforek Date: Tue, 13 Feb 2018 09:33:02 +0000 Subject: [PATCH 50/54] More variable renames --- .../sudoku/DancingLinksAlgorithm.java | 40 +++++++++---------- .../algorithms/sudoku/DancingNode.java | 26 ++++++------ 2 files changed, 33 insertions(+), 33 deletions(-) diff --git a/algorithms/src/main/java/com/baeldung/algorithms/sudoku/DancingLinksAlgorithm.java b/algorithms/src/main/java/com/baeldung/algorithms/sudoku/DancingLinksAlgorithm.java index 76b686afa6..df02ff3d11 100644 --- a/algorithms/src/main/java/com/baeldung/algorithms/sudoku/DancingLinksAlgorithm.java +++ b/algorithms/src/main/java/com/baeldung/algorithms/sudoku/DancingLinksAlgorithm.java @@ -34,8 +34,8 @@ public class DancingLinksAlgorithm { dlx.runSolver(); } - private int getIndex(int row, int col, int num) { - return (row - 1) * BOARD_SIZE * BOARD_SIZE + (col - 1) * BOARD_SIZE + (num - 1); + private int getIndex(int row, int column, int num) { + return (row - 1) * BOARD_SIZE * BOARD_SIZE + (column - 1) * BOARD_SIZE + (num - 1); } private boolean[][] createExactCoverBoard() { @@ -51,12 +51,12 @@ public class DancingLinksAlgorithm { } private int checkSubsectionConstraint(boolean[][] coverBoard, int hBase) { - for (int br = COVER_START_INDEX; br <= BOARD_SIZE; br += SUBSECTION_SIZE) { - for (int bc = COVER_START_INDEX; bc <= BOARD_SIZE; bc += SUBSECTION_SIZE) { + for (int row = COVER_START_INDEX; row <= BOARD_SIZE; row += SUBSECTION_SIZE) { + for (int column = COVER_START_INDEX; column <= BOARD_SIZE; column += SUBSECTION_SIZE) { for (int n = COVER_START_INDEX; n <= BOARD_SIZE; n++, hBase++) { - for (int rDelta = 0; rDelta < SUBSECTION_SIZE; rDelta++) { - for (int cDelta = 0; cDelta < SUBSECTION_SIZE; cDelta++) { - int index = getIndex(br + rDelta, bc + cDelta, n); + for (int rowDelta = 0; rowDelta < SUBSECTION_SIZE; rowDelta++) { + for (int columnDelta = 0; columnDelta < SUBSECTION_SIZE; columnDelta++) { + int index = getIndex(row + rowDelta, column + columnDelta, n); coverBoard[index][hBase] = true; } } @@ -67,10 +67,10 @@ public class DancingLinksAlgorithm { } private int checkColumnConstraint(boolean[][] coverBoard, int hBase) { - for (int c = COVER_START_INDEX; c <= BOARD_SIZE; c++) { + for (int column = COVER_START_INDEX; column <= BOARD_SIZE; column++) { for (int n = COVER_START_INDEX; n <= BOARD_SIZE; n++, hBase++) { - for (int r1 = COVER_START_INDEX; r1 <= BOARD_SIZE; r1++) { - int index = getIndex(r1, c, n); + for (int row = COVER_START_INDEX; row <= BOARD_SIZE; row++) { + int index = getIndex(row, column, n); coverBoard[index][hBase] = true; } } @@ -79,10 +79,10 @@ public class DancingLinksAlgorithm { } private int checkRowConstraint(boolean[][] coverBoard, int hBase) { - for (int r = COVER_START_INDEX; r <= BOARD_SIZE; r++) { + for (int row = COVER_START_INDEX; row <= BOARD_SIZE; row++) { for (int n = COVER_START_INDEX; n <= BOARD_SIZE; n++, hBase++) { - for (int c1 = COVER_START_INDEX; c1 <= BOARD_SIZE; c1++) { - int index = getIndex(r, c1, n); + for (int column = COVER_START_INDEX; column <= BOARD_SIZE; column++) { + int index = getIndex(row, column, n); coverBoard[index][hBase] = true; } } @@ -91,10 +91,10 @@ public class DancingLinksAlgorithm { } private int checkCellConstraint(boolean[][] coverBoard, int hBase) { - for (int r = COVER_START_INDEX; r <= BOARD_SIZE; r++) { - for (int c = COVER_START_INDEX; c <= BOARD_SIZE; c++, hBase++) { + for (int row = COVER_START_INDEX; row <= BOARD_SIZE; row++) { + for (int column = COVER_START_INDEX; column <= BOARD_SIZE; column++, hBase++) { for (int n = COVER_START_INDEX; n <= BOARD_SIZE; n++) { - int index = getIndex(r, c, n); + int index = getIndex(row, column, n); coverBoard[index][hBase] = true; } } @@ -104,13 +104,13 @@ public class DancingLinksAlgorithm { private boolean[][] initializeExactCoverBoard(int[][] board) { boolean[][] coverBoard = createExactCoverBoard(); - for (int i = COVER_START_INDEX; i <= BOARD_SIZE; i++) { - for (int j = COVER_START_INDEX; j <= BOARD_SIZE; j++) { - int n = board[i - 1][j - 1]; + for (int row = COVER_START_INDEX; row <= BOARD_SIZE; row++) { + for (int column = COVER_START_INDEX; column <= BOARD_SIZE; column++) { + int n = board[row - 1][column - 1]; if (n != NO_VALUE) { for (int num = MIN_VALUE; num <= MAX_VALUE; num++) { if (num != n) { - Arrays.fill(coverBoard[getIndex(i, j, num)], false); + Arrays.fill(coverBoard[getIndex(row, column, num)], false); } } } diff --git a/algorithms/src/main/java/com/baeldung/algorithms/sudoku/DancingNode.java b/algorithms/src/main/java/com/baeldung/algorithms/sudoku/DancingNode.java index b494eba9ef..2422ff0dff 100644 --- a/algorithms/src/main/java/com/baeldung/algorithms/sudoku/DancingNode.java +++ b/algorithms/src/main/java/com/baeldung/algorithms/sudoku/DancingNode.java @@ -4,21 +4,21 @@ class DancingNode { DancingNode L, R, U, D; ColumnNode C; - DancingNode hookDown(DancingNode n1) { - assert (this.C == n1.C); - n1.D = this.D; - n1.D.U = n1; - n1.U = this; - this.D = n1; - return n1; + DancingNode hookDown(DancingNode node) { + assert (this.C == node.C); + node.D = this.D; + node.D.U = node; + node.U = this; + this.D = node; + return node; } - DancingNode hookRight(DancingNode n1) { - n1.R = this.R; - n1.R.L = n1; - n1.L = this; - this.R = n1; - return n1; + DancingNode hookRight(DancingNode node) { + node.R = this.R; + node.R.L = node; + node.L = this; + this.R = node; + return node; } void unlinkLR() { From 3c4b0fb20fbe195383753c16c8d4d53164ebdf07 Mon Sep 17 00:00:00 2001 From: iaforek Date: Tue, 13 Mar 2018 18:28:57 +0000 Subject: [PATCH 51/54] BAEL-1609 Updated guava version from 21.0 to 24.0-jre --- guava/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guava/pom.xml b/guava/pom.xml index ca9e1e528e..e2538d090b 100644 --- a/guava/pom.xml +++ b/guava/pom.xml @@ -59,7 +59,7 @@ - 21.0 + 24.0-jre 3.5 4.1 From 928755d17e2d2566fd62744e1b70801999f98763 Mon Sep 17 00:00:00 2001 From: iaforek Date: Tue, 13 Mar 2018 19:01:29 +0000 Subject: [PATCH 52/54] BAEL-1609 Added test for CountingOutputStream --- .../guava/GuavaCountingOutputStreamTest.java | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 guava/src/test/java/org/baeldung/guava/GuavaCountingOutputStreamTest.java diff --git a/guava/src/test/java/org/baeldung/guava/GuavaCountingOutputStreamTest.java b/guava/src/test/java/org/baeldung/guava/GuavaCountingOutputStreamTest.java new file mode 100644 index 0000000000..fb8ed7b7f4 --- /dev/null +++ b/guava/src/test/java/org/baeldung/guava/GuavaCountingOutputStreamTest.java @@ -0,0 +1,25 @@ +package org.baeldung.guava; + +import static org.junit.Assert.assertEquals; + +import java.io.ByteArrayOutputStream; + +import org.junit.Test; + +import com.google.common.io.CountingOutputStream; + +public class GuavaCountingOutputStreamTest { + + @Test + public void givenData_whenWrittenToStream_thenGetCorrectCount() throws Exception { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + CountingOutputStream cos = new CountingOutputStream(out); + + byte[] data = new byte[10]; + + cos.write(data); + + assertEquals(10, cos.getCount()); + + } +} From 2fe8d8810d903e276ed925d60379e2f16f551452 Mon Sep 17 00:00:00 2001 From: iaforek Date: Sun, 18 Mar 2018 13:05:54 +0000 Subject: [PATCH 53/54] BAEL-1609 Updated test to throw exception --- .../baeldung/guava/CountingByteWritter.java | 5 ++++ .../guava/GuavaCountingOutputStreamTest.java | 26 +++++++++++-------- 2 files changed, 20 insertions(+), 11 deletions(-) create mode 100644 guava/src/main/java/org/baeldung/guava/CountingByteWritter.java diff --git a/guava/src/main/java/org/baeldung/guava/CountingByteWritter.java b/guava/src/main/java/org/baeldung/guava/CountingByteWritter.java new file mode 100644 index 0000000000..02e99e7903 --- /dev/null +++ b/guava/src/main/java/org/baeldung/guava/CountingByteWritter.java @@ -0,0 +1,5 @@ +package org.baeldung.guava; + +public class CountingByteWritter { + +} diff --git a/guava/src/test/java/org/baeldung/guava/GuavaCountingOutputStreamTest.java b/guava/src/test/java/org/baeldung/guava/GuavaCountingOutputStreamTest.java index fb8ed7b7f4..b2b61d2111 100644 --- a/guava/src/test/java/org/baeldung/guava/GuavaCountingOutputStreamTest.java +++ b/guava/src/test/java/org/baeldung/guava/GuavaCountingOutputStreamTest.java @@ -1,7 +1,6 @@ package org.baeldung.guava; -import static org.junit.Assert.assertEquals; - +import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import org.junit.Test; @@ -9,17 +8,22 @@ import org.junit.Test; import com.google.common.io.CountingOutputStream; public class GuavaCountingOutputStreamTest { + public static final int MAX = 5; - @Test - public void givenData_whenWrittenToStream_thenGetCorrectCount() throws Exception { + @Test(expected = RuntimeException.class) + public void givenData_whenCountReachesLimit_thenThrowException() throws Exception { ByteArrayOutputStream out = new ByteArrayOutputStream(); CountingOutputStream cos = new CountingOutputStream(out); - - byte[] data = new byte[10]; - - cos.write(data); - - assertEquals(10, cos.getCount()); - + + byte[] data = new byte[1024]; + ByteArrayInputStream in = new ByteArrayInputStream(data); + + while (in.read() != -1) { + cos.write(data); + cos.flush(); + if (cos.getCount() >= MAX) { + throw new RuntimeException("Write limit reached"); + } + } } } From 5ce09eb2ebc20d02d96339d7f41a43b7da2442d1 Mon Sep 17 00:00:00 2001 From: Tom Hombergs Date: Sun, 18 Mar 2018 20:13:42 +0100 Subject: [PATCH 54/54] removed unnecessary class fixed test so that not all data is written at once --- .../main/java/org/baeldung/guava/CountingByteWritter.java | 5 ----- .../org/baeldung/guava/GuavaCountingOutputStreamTest.java | 6 +++--- 2 files changed, 3 insertions(+), 8 deletions(-) delete mode 100644 guava/src/main/java/org/baeldung/guava/CountingByteWritter.java diff --git a/guava/src/main/java/org/baeldung/guava/CountingByteWritter.java b/guava/src/main/java/org/baeldung/guava/CountingByteWritter.java deleted file mode 100644 index 02e99e7903..0000000000 --- a/guava/src/main/java/org/baeldung/guava/CountingByteWritter.java +++ /dev/null @@ -1,5 +0,0 @@ -package org.baeldung.guava; - -public class CountingByteWritter { - -} diff --git a/guava/src/test/java/org/baeldung/guava/GuavaCountingOutputStreamTest.java b/guava/src/test/java/org/baeldung/guava/GuavaCountingOutputStreamTest.java index b2b61d2111..5e96f3597c 100644 --- a/guava/src/test/java/org/baeldung/guava/GuavaCountingOutputStreamTest.java +++ b/guava/src/test/java/org/baeldung/guava/GuavaCountingOutputStreamTest.java @@ -18,9 +18,9 @@ public class GuavaCountingOutputStreamTest { byte[] data = new byte[1024]; ByteArrayInputStream in = new ByteArrayInputStream(data); - while (in.read() != -1) { - cos.write(data); - cos.flush(); + int b; + while ((b = in.read()) != -1) { + cos.write(b); if (cos.getCount() >= MAX) { throw new RuntimeException("Write limit reached"); }