From a623ddbf45f4410a4a9e7275c20a519a00b2ae8f Mon Sep 17 00:00:00 2001 From: Mateusz Mrozewski Date: Thu, 4 May 2017 00:47:34 +0400 Subject: [PATCH 1/6] BAEL-642 ClassToInstanceMap example (#1767) * BAEL-642 ClassToInstanceMap example added * BAEL-642 Improved example for ClassToInstanceMap * Reverted change in pom.xml * BAEL-642 Move the ClassToInstanceMap examples to guava module as unit tests --- .../guava/ClassToInstanceMapTests.java | 70 +++++++++++++++++++ ...reamsTests.java => GuavaStreamsTests.java} | 2 +- 2 files changed, 71 insertions(+), 1 deletion(-) create mode 100644 guava/src/test/java/org/baeldung/guava/ClassToInstanceMapTests.java rename guava21/src/test/java/{GauavaStreamsTests.java => GuavaStreamsTests.java} (99%) diff --git a/guava/src/test/java/org/baeldung/guava/ClassToInstanceMapTests.java b/guava/src/test/java/org/baeldung/guava/ClassToInstanceMapTests.java new file mode 100644 index 0000000000..c8db9e573e --- /dev/null +++ b/guava/src/test/java/org/baeldung/guava/ClassToInstanceMapTests.java @@ -0,0 +1,70 @@ +package org.baeldung.guava; +import com.google.common.collect.ClassToInstanceMap; +import com.google.common.collect.ImmutableClassToInstanceMap; +import com.google.common.collect.MutableClassToInstanceMap; +import org.junit.Test; + +import static org.junit.Assert.*; + +public class ClassToInstanceMapTests { + @Test + public void createEmptyImmutableMap() { + ClassToInstanceMap map = ImmutableClassToInstanceMap.of(); + assertTrue(map.isEmpty()); + } + + @Test + public void createEmptyMutableMap() { + ClassToInstanceMap map = MutableClassToInstanceMap.create(); + assertTrue(map.isEmpty()); + } + + @Test + public void createSingleEntryMap() { + ClassToInstanceMap map = ImmutableClassToInstanceMap.of(Save.class, new Save()); + assertEquals(1, map.size()); + } + + @Test + public void createMapWithBuilder() { + ClassToInstanceMap map = ImmutableClassToInstanceMap.builder() + .put(Save.class, new Save()) + .put(Open.class, new Open()) + .build(); + assertEquals(2, map.size()); + } + + @Test + public void shouldReturnElement() { + ClassToInstanceMap map = ImmutableClassToInstanceMap.of(Save.class, new Save()); + Action action = map.get(Save.class); + assertTrue(action instanceof Save); + + // Use getInstance to avoid casting + Save save = map.getInstance(Save.class); + } + + @Test + public void shouldPutElement() { + ClassToInstanceMap map = MutableClassToInstanceMap.create(); + map.put(Save.class, new Save()); + // Put again to get previous value returned + Action action = map.put(Save.class, new Save()); + assertTrue(action instanceof Save); + + // Use putInstance to avoid casting + Save save = map.putInstance(Save.class, new Save()); + } +} + +abstract class Action { +} + +class Save extends Action { +} + +class Open extends Action { +} + +class Delete extends Action { +} diff --git a/guava21/src/test/java/GauavaStreamsTests.java b/guava21/src/test/java/GuavaStreamsTests.java similarity index 99% rename from guava21/src/test/java/GauavaStreamsTests.java rename to guava21/src/test/java/GuavaStreamsTests.java index 1482d685cf..cc5fcff229 100644 --- a/guava21/src/test/java/GauavaStreamsTests.java +++ b/guava21/src/test/java/GuavaStreamsTests.java @@ -9,7 +9,7 @@ import java.util.stream.IntStream; import java.util.stream.LongStream; import java.util.stream.Stream; -public class GauavaStreamsTests { +public class GuavaStreamsTests { List numbers; From 223cc5357f1f7e9e76310cad4e5b5b246b4175b1 Mon Sep 17 00:00:00 2001 From: Alexandre Lombard Date: Thu, 4 May 2017 12:20:03 +0200 Subject: [PATCH 2/6] BAEL-874 - How to convert stacktrace to String in Java? (#1771) --- .../exceptions/StackTraceToString.java | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 core-java/src/main/java/com/baeldung/exceptions/StackTraceToString.java diff --git a/core-java/src/main/java/com/baeldung/exceptions/StackTraceToString.java b/core-java/src/main/java/com/baeldung/exceptions/StackTraceToString.java new file mode 100644 index 0000000000..c6bf915996 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/exceptions/StackTraceToString.java @@ -0,0 +1,30 @@ +package com.baeldung.exceptions; + +import org.apache.commons.lang3.exception.ExceptionUtils; + +import java.io.PrintWriter; +import java.io.StringWriter; + +public class StackTraceToString { + + public static void main(String[] args) { + // Convert a StackTrace to String using core java + try { + throw new NullPointerException(); + } catch (Exception e) { + StringWriter sw = new StringWriter(); + PrintWriter pw = new PrintWriter(sw); + e.printStackTrace(pw); + + System.out.println(sw.toString()); + } + + // Convert a StackTrace to String using Apache Commons + try { + throw new IndexOutOfBoundsException(); + } catch (Exception e) { + System.out.println(ExceptionUtils.getStackTrace(e)); + } + } + +} From 5f02c64c950e64964a5070a2679201543701ee91 Mon Sep 17 00:00:00 2001 From: baljeet20 Date: Thu, 4 May 2017 15:50:55 +0530 Subject: [PATCH 3/6] BAEL-804 A guide to Spring Drools (#1776) * BAEL-804 A guide to Spring Drools * BAEL-804 A guide to Spring Drools * BAEL-804 A guide to Spring Drools --- pom.xml | 1 + spring-drools/pom.xml | 130 ++++++++++++++++++ .../baeldung/spring/drools/Application.java | 30 ++++ .../spring/drools/DroolConfiguration.java | 83 +++++++++++ .../spring/drools/model/Applicant.java | 48 +++++++ .../baeldung/spring/drools/model/Product.java | 38 +++++ .../spring/drools/model/SuggestedRole.java | 14 ++ .../drools/service/ApplicantService.java | 25 ++++ .../spring/drools/service/ProductService.java | 24 ++++ .../spring/drools/rules/Product_rules.xls | Bin 0 -> 27648 bytes .../spring/drools/rules/SuggestApplicant.drl | 31 +++++ .../ApplicantServiceIntegrationTest.java | 52 +++++++ .../ProductServiceIntegrationTest.java | 34 +++++ 13 files changed, 510 insertions(+) create mode 100644 spring-drools/pom.xml create mode 100644 spring-drools/src/main/java/com/baeldung/spring/drools/Application.java create mode 100644 spring-drools/src/main/java/com/baeldung/spring/drools/DroolConfiguration.java create mode 100644 spring-drools/src/main/java/com/baeldung/spring/drools/model/Applicant.java create mode 100644 spring-drools/src/main/java/com/baeldung/spring/drools/model/Product.java create mode 100644 spring-drools/src/main/java/com/baeldung/spring/drools/model/SuggestedRole.java create mode 100644 spring-drools/src/main/java/com/baeldung/spring/drools/service/ApplicantService.java create mode 100644 spring-drools/src/main/java/com/baeldung/spring/drools/service/ProductService.java create mode 100644 spring-drools/src/main/resources/com/baeldung/spring/drools/rules/Product_rules.xls create mode 100644 spring-drools/src/main/resources/com/baeldung/spring/drools/rules/SuggestApplicant.drl create mode 100644 spring-drools/src/test/java/com/baeldung/spring/drools/service/ApplicantServiceIntegrationTest.java create mode 100644 spring-drools/src/test/java/com/baeldung/spring/drools/service/ProductServiceIntegrationTest.java diff --git a/pom.xml b/pom.xml index 3b4b5f847c..3f8eeb6264 100644 --- a/pom.xml +++ b/pom.xml @@ -212,6 +212,7 @@ spring-data-gemfire cucumber mybatis + spring-drools diff --git a/spring-drools/pom.xml b/spring-drools/pom.xml new file mode 100644 index 0000000000..8afdae0d84 --- /dev/null +++ b/spring-drools/pom.xml @@ -0,0 +1,130 @@ + + + 4.0.0 + + com.baeldung + spring-drools + 1.0.0-SNAPSHOT + + 1.1.1.RELEASE + 4.0-alpha6 + 7.0.0.CR1 + 3.13 + 2.19.1 + + + + + io.spring.platform + platform-bom + ${spring-boot-version} + pom + import + + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-test + test + + + org.springframework.boot + spring-boot-starter-actuator + + + org.apache.httpcomponents + httpcore + ${http-component-version} + + + + org.kie + kie-ci + ${drools-version} + + + org.drools + drools-decisiontables + ${drools-version} + + + + org.drools + drools-core + ${drools-version} + + + org.drools + drools-compiler + ${drools-version} + + + org.apache.poi + poi + ${apache-poi-version} + + + + org.apache.poi + poi-ooxml + ${apache-poi-version} + + + org.kie + kie-spring + 6.4.0.Final + + + org.springframework + spring-tx + + + org.springframework + spring-beans + + + org.springframework + spring-core + + + org.springframework + spring-context + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + repackage + + + + + + org.apache.maven.plugins + maven-surefire-plugin + ${surefire-plugin-version} + + + **/*IntegrationTest.java + + + + + + \ No newline at end of file diff --git a/spring-drools/src/main/java/com/baeldung/spring/drools/Application.java b/spring-drools/src/main/java/com/baeldung/spring/drools/Application.java new file mode 100644 index 0000000000..8f5b915f88 --- /dev/null +++ b/spring-drools/src/main/java/com/baeldung/spring/drools/Application.java @@ -0,0 +1,30 @@ +package com.baeldung.spring.drools; + + +import com.baeldung.spring.drools.model.Applicant; +import com.baeldung.spring.drools.model.Product; +import com.baeldung.spring.drools.model.SuggestedRole; +import com.baeldung.spring.drools.service.ApplicantService; +import com.baeldung.spring.drools.service.ProductService; +import org.kie.api.KieServices; +import org.kie.api.runtime.KieContainer; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Import; + +@SpringBootApplication +@Import(DroolConfiguration.class) +public class Application { + + public static void main(String[] args) { + ApplicationContext ctx = SpringApplication.run(Application.class, args); + ApplicantService applicantService=(ApplicantService)ctx.getBean("applicantService"); + applicantService.suggestARoleForApplicant(new Applicant("Baljeet",37,1200000.0,8),new SuggestedRole()); + + ProductService productService=(ProductService)ctx.getBean("productService"); + Product returnedProduct=productService.applyLabelToProduct(new Product("Microwave","Book")); + } + +} diff --git a/spring-drools/src/main/java/com/baeldung/spring/drools/DroolConfiguration.java b/spring-drools/src/main/java/com/baeldung/spring/drools/DroolConfiguration.java new file mode 100644 index 0000000000..7a5e833ed5 --- /dev/null +++ b/spring-drools/src/main/java/com/baeldung/spring/drools/DroolConfiguration.java @@ -0,0 +1,83 @@ +package com.baeldung.spring.drools; + +import com.baeldung.spring.drools.service.ApplicantService; +import com.baeldung.spring.drools.service.ProductService; +import org.kie.api.KieBase; +import org.kie.api.KieServices; +import org.kie.api.builder.*; +import org.kie.api.runtime.KieContainer; +import org.kie.api.runtime.KieSession; +import org.kie.internal.io.ResourceFactory; +import org.kie.spring.KModuleBeanFactoryPostProcessor; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.io.Resource; +import org.springframework.core.io.support.PathMatchingResourcePatternResolver; +import org.springframework.core.io.support.ResourcePatternResolver; + +import java.io.IOException; + +@Configuration +public class DroolConfiguration { + + private static final String RULES_PATH = "com/baeldung/spring/drools/rules/"; + + @Bean + public KieFileSystem kieFileSystem() throws IOException { + KieFileSystem kieFileSystem = getKieServices().newKieFileSystem(); + for (Resource file : getRuleFiles()) { + kieFileSystem.write(ResourceFactory.newClassPathResource(RULES_PATH + file.getFilename(), "UTF-8")); + } + return kieFileSystem; + } + + private Resource[] getRuleFiles() throws IOException { + ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver(); + return resourcePatternResolver.getResources("classpath*:" + RULES_PATH + "**/*.*"); + } + + @Bean + public KieContainer kieContainer() throws IOException { + final KieRepository kieRepository = getKieServices().getRepository(); + + kieRepository.addKieModule(new KieModule() { + public ReleaseId getReleaseId() { + return kieRepository.getDefaultReleaseId(); + } + }); + + KieBuilder kieBuilder = getKieServices().newKieBuilder(kieFileSystem()); + kieBuilder.buildAll(); + + return getKieServices().newKieContainer(kieRepository.getDefaultReleaseId()); + } + + private KieServices getKieServices() { + return KieServices.Factory.get(); + } + + @Bean + public KieBase kieBase() throws IOException { + return kieContainer().getKieBase(); + } + + @Bean + public KieSession kieSession() throws IOException { + return kieContainer().newKieSession(); + } + + @Bean + public ApplicantService getApplicantService(){ + return new ApplicantService(); + } + + @Bean + public ProductService getProductService(KieContainer kieContainer){ + return new ProductService(); + } + + @Bean + public KModuleBeanFactoryPostProcessor kiePostProcessor() { + return new KModuleBeanFactoryPostProcessor(); + } +} \ No newline at end of file diff --git a/spring-drools/src/main/java/com/baeldung/spring/drools/model/Applicant.java b/spring-drools/src/main/java/com/baeldung/spring/drools/model/Applicant.java new file mode 100644 index 0000000000..f28d0fcab7 --- /dev/null +++ b/spring-drools/src/main/java/com/baeldung/spring/drools/model/Applicant.java @@ -0,0 +1,48 @@ +package com.baeldung.spring.drools.model; + +public class Applicant { + + private String name; + private int age; + private double currentSalary; + private int experienceInYears; + + public Applicant(String name, int age, Double currentSalary, int experienceInYears) { + this.name = name; + this.age = age; + this.currentSalary = currentSalary; + this.experienceInYears = experienceInYears; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getAge() { + return age; + } + + public void setAge(int age) { + this.age = age; + } + + public Double getCurrentSalary() { + return currentSalary; + } + + public void setCurrentSalary(Double currentSalary) { + this.currentSalary = currentSalary; + } + + public int getExperienceInYears() { + return experienceInYears; + } + + public void setExperienceInYears(int experienceInYears) { + this.experienceInYears = experienceInYears; + } +} diff --git a/spring-drools/src/main/java/com/baeldung/spring/drools/model/Product.java b/spring-drools/src/main/java/com/baeldung/spring/drools/model/Product.java new file mode 100644 index 0000000000..a861df5834 --- /dev/null +++ b/spring-drools/src/main/java/com/baeldung/spring/drools/model/Product.java @@ -0,0 +1,38 @@ +package com.baeldung.spring.drools.model; + +public class Product { + private String name; + private String type; + + private String label; + + public Product(String name, String type) { + this.name = name; + this.type = type; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getLabel() { + return label; + } + + public void setLabel(String label) { + this.label = label; + } + +} diff --git a/spring-drools/src/main/java/com/baeldung/spring/drools/model/SuggestedRole.java b/spring-drools/src/main/java/com/baeldung/spring/drools/model/SuggestedRole.java new file mode 100644 index 0000000000..1ace5aa4ae --- /dev/null +++ b/spring-drools/src/main/java/com/baeldung/spring/drools/model/SuggestedRole.java @@ -0,0 +1,14 @@ +package com.baeldung.spring.drools.model; + +public class SuggestedRole { + + private String role; + + public String getRole() { + return role; + } + + public void setRole(String role) { + this.role = role; + } +} diff --git a/spring-drools/src/main/java/com/baeldung/spring/drools/service/ApplicantService.java b/spring-drools/src/main/java/com/baeldung/spring/drools/service/ApplicantService.java new file mode 100644 index 0000000000..f78ffe668b --- /dev/null +++ b/spring-drools/src/main/java/com/baeldung/spring/drools/service/ApplicantService.java @@ -0,0 +1,25 @@ +package com.baeldung.spring.drools.service; + +import com.baeldung.spring.drools.model.Applicant; +import com.baeldung.spring.drools.model.SuggestedRole; +import org.kie.api.runtime.KieContainer; +import org.kie.api.runtime.KieSession; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class ApplicantService { + + @Autowired + private KieContainer kieContainer; + + public SuggestedRole suggestARoleForApplicant(Applicant applicant,SuggestedRole suggestedRole){ + KieSession kieSession = kieContainer.newKieSession(); + kieSession.insert(applicant); + kieSession.setGlobal("suggestedRole",suggestedRole); + kieSession.fireAllRules(); + System.out.println(suggestedRole.getRole()); + return suggestedRole; + + } +} diff --git a/spring-drools/src/main/java/com/baeldung/spring/drools/service/ProductService.java b/spring-drools/src/main/java/com/baeldung/spring/drools/service/ProductService.java new file mode 100644 index 0000000000..21ca9c9730 --- /dev/null +++ b/spring-drools/src/main/java/com/baeldung/spring/drools/service/ProductService.java @@ -0,0 +1,24 @@ +package com.baeldung.spring.drools.service; + +import com.baeldung.spring.drools.model.Product; +import org.kie.api.runtime.KieContainer; +import org.kie.api.runtime.KieSession; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class ProductService { + + @Autowired + private KieContainer kieContainer; + + public Product applyLabelToProduct(Product product){ + KieSession kieSession = kieContainer.newKieSession(); + kieSession.insert(product); + kieSession.fireAllRules(); + System.out.println(product.getLabel()); + return product; + + } + +} diff --git a/spring-drools/src/main/resources/com/baeldung/spring/drools/rules/Product_rules.xls b/spring-drools/src/main/resources/com/baeldung/spring/drools/rules/Product_rules.xls new file mode 100644 index 0000000000000000000000000000000000000000..24caaf24707c1c8df2934def23897f213b30a990 GIT binary patch literal 27648 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 literal 0 HcmV?d00001 diff --git a/spring-drools/src/main/resources/com/baeldung/spring/drools/rules/SuggestApplicant.drl b/spring-drools/src/main/resources/com/baeldung/spring/drools/rules/SuggestApplicant.drl new file mode 100644 index 0000000000..baaf29d0b4 --- /dev/null +++ b/spring-drools/src/main/resources/com/baeldung/spring/drools/rules/SuggestApplicant.drl @@ -0,0 +1,31 @@ +package com.baeldung.spring.drools.rules; + +import com.baeldung.spring.drools.model.Applicant; + +global com.baeldung.spring.drools.model.SuggestedRole suggestedRole; + +dialect "mvel" + +rule "Suggest Manager Role" + when + Applicant(experienceInYears > 10) + Applicant(currentSalary > 1000000 && currentSalary <= 2500000) + then + suggestedRole.setRole("Manager"); +end + +rule "Suggest Senior developer Role" + when + Applicant(experienceInYears > 5 && experienceInYears <= 10) + Applicant(currentSalary > 500000 && currentSalary <= 1500000) + then + suggestedRole.setRole("Senior developer"); +end + +rule "Suggest Developer Role" + when + Applicant(experienceInYears > 0 && experienceInYears <= 5) + Applicant(currentSalary > 200000 && currentSalary <= 1000000) + then + suggestedRole.setRole("Developer"); +end diff --git a/spring-drools/src/test/java/com/baeldung/spring/drools/service/ApplicantServiceIntegrationTest.java b/spring-drools/src/test/java/com/baeldung/spring/drools/service/ApplicantServiceIntegrationTest.java new file mode 100644 index 0000000000..d7e7634c00 --- /dev/null +++ b/spring-drools/src/test/java/com/baeldung/spring/drools/service/ApplicantServiceIntegrationTest.java @@ -0,0 +1,52 @@ +package com.baeldung.spring.drools.service; + +import com.baeldung.spring.drools.Application; +import com.baeldung.spring.drools.DroolConfiguration; +import com.baeldung.spring.drools.model.Applicant; +import com.baeldung.spring.drools.model.SuggestedRole; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import static junit.framework.Assert.assertNull; +import static junit.framework.TestCase.assertEquals; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = {DroolConfiguration.class}) +public class ApplicantServiceIntegrationTest { + + @Autowired + ApplicantService applicantService; + + @Test + public void whenCriteriaMatching_ThenSuggestManagerRole(){ + Applicant applicant=new Applicant("Davis",37,1600000.0,11); + SuggestedRole suggestedRole=new SuggestedRole(); + applicantService.suggestARoleForApplicant(applicant,suggestedRole); + assertEquals("Manager",suggestedRole.getRole()); + } + + @Test + public void whenCriteriaMatching_ThenSuggestSeniorDeveloperRole(){ + Applicant applicant=new Applicant("John",37,1200000.0,8); + SuggestedRole suggestedRole=new SuggestedRole(); + applicantService.suggestARoleForApplicant(applicant,suggestedRole); + assertEquals("Senior developer",suggestedRole.getRole()); + } + @Test + public void whenCriteriaMatching_ThenSuggestDeveloperRole(){ + Applicant applicant=new Applicant("Davis",37,800000.0,3); + SuggestedRole suggestedRole=new SuggestedRole(); + applicantService.suggestARoleForApplicant(applicant,suggestedRole); + assertEquals("Developer",suggestedRole.getRole()); + } + @Test + public void whenCriteriaNotMatching_ThenNoRole(){ + Applicant applicant=new Applicant("John",37,1200000.0,5); + SuggestedRole suggestedRole=new SuggestedRole(); + applicantService.suggestARoleForApplicant(applicant,suggestedRole); + assertNull(suggestedRole.getRole()); + } +} diff --git a/spring-drools/src/test/java/com/baeldung/spring/drools/service/ProductServiceIntegrationTest.java b/spring-drools/src/test/java/com/baeldung/spring/drools/service/ProductServiceIntegrationTest.java new file mode 100644 index 0000000000..7a442e48fd --- /dev/null +++ b/spring-drools/src/test/java/com/baeldung/spring/drools/service/ProductServiceIntegrationTest.java @@ -0,0 +1,34 @@ +package com.baeldung.spring.drools.service; + +import com.baeldung.spring.drools.Application; +import com.baeldung.spring.drools.DroolConfiguration; +import com.baeldung.spring.drools.model.Product; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import static junit.framework.TestCase.assertEquals; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = {DroolConfiguration.class}) +public class ProductServiceIntegrationTest { + + @Autowired + ProductService productService; + + @Test + public void whenProductTypeElectronic_ThenLabelBarcode(){ + Product product=new Product("Microwave","Electronic"); + product=productService.applyLabelToProduct(product); + assertEquals("BarCode",product.getLabel()); + } + + @Test + public void whenProductTypeBook_ThenLabelIsbn(){ + Product product=new Product("AutoBiography","Book"); + product=productService.applyLabelToProduct(product); + assertEquals("ISBN",product.getLabel()); + } +} From 3e50b39fed393fa532c6c523048ac8b8bde0326e Mon Sep 17 00:00:00 2001 From: Jesus Boadas Date: Thu, 4 May 2017 06:22:25 -0400 Subject: [PATCH 4/6] uncomment classes in core-java (#1777) * uncomment classes in core-java * Add content to guide to JDO --- .../baeldung/java8/comparator/Employee.java | 3 - .../java8/comparator/Java8ComparatorTest.java | 3 - libraries/myPersistence.xml | 26 +++ libraries/pom.xml | 5 + .../java/com/baeldung/jdo/GuideToJDO.java | 160 +++++++++++++++++- .../java/com/baeldung/jdo/ProductXML.java | 44 +++++ 6 files changed, 233 insertions(+), 8 deletions(-) create mode 100644 libraries/myPersistence.xml create mode 100644 libraries/src/main/java/com/baeldung/jdo/ProductXML.java diff --git a/core-java/src/test/java/com/baeldung/java8/comparator/Employee.java b/core-java/src/test/java/com/baeldung/java8/comparator/Employee.java index 0ef10410a9..bec0c37880 100644 --- a/core-java/src/test/java/com/baeldung/java8/comparator/Employee.java +++ b/core-java/src/test/java/com/baeldung/java8/comparator/Employee.java @@ -1,6 +1,4 @@ package com.baeldung.java8.comparator; -/* - import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; @@ -22,4 +20,3 @@ public class Employee implements Comparable{ } } -*/ \ No newline at end of file diff --git a/core-java/src/test/java/com/baeldung/java8/comparator/Java8ComparatorTest.java b/core-java/src/test/java/com/baeldung/java8/comparator/Java8ComparatorTest.java index 8e1cfa67af..62dd18972e 100644 --- a/core-java/src/test/java/com/baeldung/java8/comparator/Java8ComparatorTest.java +++ b/core-java/src/test/java/com/baeldung/java8/comparator/Java8ComparatorTest.java @@ -1,5 +1,4 @@ package com.baeldung.java8.comparator; -/* import java.util.Arrays; import java.util.Comparator; @@ -164,5 +163,3 @@ public class Java8ComparatorTest { } - -*/ \ No newline at end of file diff --git a/libraries/myPersistence.xml b/libraries/myPersistence.xml new file mode 100644 index 0000000000..de2c250957 --- /dev/null +++ b/libraries/myPersistence.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/libraries/pom.xml b/libraries/pom.xml index e329eac44d..445a238540 100644 --- a/libraries/pom.xml +++ b/libraries/pom.xml @@ -251,6 +251,11 @@ h2 1.4.194 + + org.datanucleus + datanucleus-xml + 5.0.0-release + diff --git a/libraries/src/main/java/com/baeldung/jdo/GuideToJDO.java b/libraries/src/main/java/com/baeldung/jdo/GuideToJDO.java index fb7bd184ee..387c8c4e00 100644 --- a/libraries/src/main/java/com/baeldung/jdo/GuideToJDO.java +++ b/libraries/src/main/java/com/baeldung/jdo/GuideToJDO.java @@ -20,22 +20,29 @@ public class GuideToJDO { private static final Logger LOGGER = Logger.getLogger(GuideToJDO.class.getName()); private Random rnd = new Random(); private PersistenceUnitMetaData pumd; + private PersistenceUnitMetaData pumdXML; public static void main(String[] args) { new GuideToJDO(); } public GuideToJDO() { - CreateProperties(); + CreateH2Properties(); + CreateXMLProperties(); CreateProducts(); ListProducts(); + QueryJDOQL(); + QuerySQL(); + QueryJPQL(); UpdateProducts(); ListProducts(); DeleteProducts(); ListProducts(); + persistXML(); + listXMLProducts(); } - public void CreateProperties(){ + public void CreateH2Properties(){ pumd = new PersistenceUnitMetaData("dynamic-unit", "RESOURCE_LOCAL", null); pumd.addClassName("com.baeldung.jdo.Product"); @@ -48,6 +55,14 @@ public class GuideToJDO { } + public void CreateXMLProperties(){ + pumdXML = new PersistenceUnitMetaData("dynamic-unit", "RESOURCE_LOCAL", null); + pumdXML.addClassName("com.baeldung.jdo.ProductXML"); + pumdXML.setExcludeUnlistedClasses(); + pumdXML.addProperty("javax.jdo.option.ConnectionURL", "xml:file:myPersistence.xml"); + pumdXML.addProperty("datanucleus.autoCreateSchema", "true"); + } + public void CreateProducts() { PersistenceManagerFactory pmf = new JDOPersistenceManagerFactory(pumd, null); PersistenceManager pm = pmf.getPersistenceManager(); @@ -140,4 +155,145 @@ public class GuideToJDO { pm.close(); } } + + @SuppressWarnings({ "rawtypes", "unchecked" }) + public void QueryJDOQL (){ + PersistenceManagerFactory pmf = new JDOPersistenceManagerFactory(pumd, null); + PersistenceManager pm = pmf.getPersistenceManager(); + Transaction tx = pm.currentTransaction(); + try { + tx.begin(); + + // Declarative JDOQL : + LOGGER.log(Level.INFO, "Declarative JDOQL --------------------------------------------------------------"); + Query qDJDOQL = pm.newQuery(Product.class); + qDJDOQL.setFilter("name == 'Tablet' && price == price_value"); + qDJDOQL.declareParameters("double price_value"); + List resultsqDJDOQL = qDJDOQL.setParameters(80.0).executeList(); + + Iterator iterDJDOQL = resultsqDJDOQL.iterator(); + while (iterDJDOQL.hasNext()) { + Product p = iterDJDOQL.next(); + LOGGER.log(Level.WARNING, "Product name: {0} - Price: {1}", new Object[] { p.name, p.price }); + } + LOGGER.log(Level.INFO, "--------------------------------------------------------------"); + + tx.commit(); + } finally { + if (tx.isActive()) { + tx.rollback(); + } + + pm.close(); + } + } + + @SuppressWarnings({ "rawtypes", "unchecked" }) + public void QuerySQL (){ + PersistenceManagerFactory pmf = new JDOPersistenceManagerFactory(pumd, null); + PersistenceManager pm = pmf.getPersistenceManager(); + Transaction tx = pm.currentTransaction(); + try { + tx.begin(); + + //SQL : + LOGGER.log(Level.INFO, "SQL --------------------------------------------------------------"); + Query query = pm.newQuery("javax.jdo.query.SQL", "SELECT * FROM PRODUCT"); + query.setClass(Product.class); + List results = query.executeList(); + + Iterator iter = results.iterator(); + while (iter.hasNext()) { + Product p = iter.next(); + LOGGER.log(Level.WARNING, "Product name: {0} - Price: {1}", new Object[] { p.name, p.price }); + } + LOGGER.log(Level.INFO, "--------------------------------------------------------------"); + + tx.commit(); + } finally { + if (tx.isActive()) { + tx.rollback(); + } + + pm.close(); + } + } + + @SuppressWarnings({ "rawtypes", "unchecked" }) + public void QueryJPQL (){ + PersistenceManagerFactory pmf = new JDOPersistenceManagerFactory(pumd, null); + PersistenceManager pm = pmf.getPersistenceManager(); + Transaction tx = pm.currentTransaction(); + try { + tx.begin(); + + //JPQL : + LOGGER.log(Level.INFO, "JPQL --------------------------------------------------------------"); + Query q = pm.newQuery("JPQL", "SELECT p FROM "+Product.class.getName()+" p WHERE p.name = 'Laptop'"); + List results = (List)q.execute(); + + Iterator iter = results.iterator(); + while (iter.hasNext()) { + Product p = iter.next(); + LOGGER.log(Level.WARNING, "Product name: {0} - Price: {1}", new Object[] { p.name, p.price }); + } + LOGGER.log(Level.INFO, "--------------------------------------------------------------"); + + tx.commit(); + } finally { + if (tx.isActive()) { + tx.rollback(); + } + + pm.close(); + } + } + + public void persistXML(){ + PersistenceManagerFactory pmf = new JDOPersistenceManagerFactory(pumdXML, null); + PersistenceManager pm = pmf.getPersistenceManager(); + Transaction tx = pm.currentTransaction(); + try { + tx.begin(); + ProductXML productXML = new ProductXML(0,"Tablet", 80.0); + pm.makePersistent(productXML); + ProductXML productXML2 = new ProductXML(1,"Phone", 20.0); + pm.makePersistent(productXML2); + ProductXML productXML3 = new ProductXML(2,"Laptop", 200.0); + pm.makePersistent(productXML3); + tx.commit(); + } finally { + if (tx.isActive()) { + tx.rollback(); + } + pm.close(); + } + } + + @SuppressWarnings({ "rawtypes", "unchecked" }) + public void listXMLProducts(){ + PersistenceManagerFactory pmf = new JDOPersistenceManagerFactory(pumdXML, null); + PersistenceManager pm = pmf.getPersistenceManager(); + Transaction tx = pm.currentTransaction(); + try { + tx.begin(); + + Query q = pm.newQuery("SELECT FROM " + ProductXML.class.getName()); + List products = (List) q.execute(); + Iterator iter = products.iterator(); + while (iter.hasNext()) { + ProductXML p = iter.next(); + LOGGER.log(Level.WARNING, "Product name: {0} - Price: {1}", new Object[] { p.getName(), p.getPrice() }); + pm.deletePersistent(p); + } + LOGGER.log(Level.INFO, "--------------------------------------------------------------"); + tx.commit(); + } finally { + if (tx.isActive()) { + tx.rollback(); + } + + pm.close(); + } + } } \ No newline at end of file diff --git a/libraries/src/main/java/com/baeldung/jdo/ProductXML.java b/libraries/src/main/java/com/baeldung/jdo/ProductXML.java new file mode 100644 index 0000000000..d702a8ac90 --- /dev/null +++ b/libraries/src/main/java/com/baeldung/jdo/ProductXML.java @@ -0,0 +1,44 @@ +package com.baeldung.jdo; + +import javax.jdo.annotations.PersistenceCapable; +import javax.jdo.annotations.PrimaryKey; +import javax.xml.bind.annotation.XmlAttribute; + +@PersistenceCapable() +public class ProductXML { + + @XmlAttribute + private long productNumber = 0; + @PrimaryKey + private String name = null; + private Double price = 0.0; + + public ProductXML() { + this.productNumber = 0; + this.name = null; + this.price = 0.0; + } + + public ProductXML(long productNumber, String name, Double price) { + this.productNumber = productNumber; + this.name = name; + this.price = price; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Double getPrice() { + return price; + } + + public void setPrice(Double price) { + this.price = price; + } + +} \ No newline at end of file From 670ab882a7aff31c11efd4d0e383bbe3e2d13332 Mon Sep 17 00:00:00 2001 From: Alexandre Lombard Date: Thu, 4 May 2017 14:08:27 +0200 Subject: [PATCH 5/6] BAEL-874 - How to convert stacktrace to String in Java? (#1778) From 874ff5aacb7d58db64d804fdd396e6fbde3907d0 Mon Sep 17 00:00:00 2001 From: Jesus Boadas Date: Thu, 4 May 2017 08:08:56 -0400 Subject: [PATCH 6/6] Add content to JDO (#1780) * uncomment classes in core-java * Add content to guide to JDO