From 00d62f516862bc51c047b79132328ddb35a9879c Mon Sep 17 00:00:00 2001 From: Neeraj Yadav Date: Wed, 11 Jul 2018 17:50:17 +0530 Subject: [PATCH 01/20] Added a POST with a request body and a DELETE method for HTTP with cURL demo --- .../web/controller/FooController.java | 111 ++++++++++-------- 1 file changed, 63 insertions(+), 48 deletions(-) diff --git a/spring-rest-simple/src/main/java/org/baeldung/web/controller/FooController.java b/spring-rest-simple/src/main/java/org/baeldung/web/controller/FooController.java index 3c7e5ed13c..31aeb0c4ae 100644 --- a/spring-rest-simple/src/main/java/org/baeldung/web/controller/FooController.java +++ b/spring-rest-simple/src/main/java/org/baeldung/web/controller/FooController.java @@ -1,48 +1,63 @@ -package org.baeldung.web.controller; - -import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic; - -import org.baeldung.web.dto.Foo; -import org.baeldung.web.dto.FooProtos; -import org.springframework.http.HttpStatus; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.bind.annotation.ResponseStatus; - -@Controller -public class FooController { - - public FooController() { - super(); - } - - // API - read - - @RequestMapping(method = RequestMethod.GET, value = "/foos/{id}") - @ResponseBody - public Foo findById(@PathVariable final long id) { - return new Foo(id, randomAlphabetic(4)); - } - - // API - write - - @RequestMapping(method = RequestMethod.PUT, value = "/foos/{id}") - @ResponseStatus(HttpStatus.OK) - @ResponseBody - public Foo updateFoo(@PathVariable("id") final String id, @RequestBody final Foo foo) { - return foo; - } - - @RequestMapping(method = RequestMethod.GET, value = "/foos/{id}", produces = { "application/x-protobuf" }) - @ResponseBody - public FooProtos.Foo findProtoById(@PathVariable final long id) { - return FooProtos.Foo.newBuilder() - .setId(1) - .setName("Foo Name") - .build(); - } -} +package org.baeldung.web.controller; + +import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic; + +import org.baeldung.web.dto.Foo; +import org.baeldung.web.dto.FooProtos; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.ResponseStatus; + +@Controller +public class FooController { + + public FooController() { + super(); + } + + // API - read + + @RequestMapping(method = RequestMethod.GET, value = "/foos/{id}") + @ResponseBody + public Foo findById(@PathVariable final long id) { + return new Foo(id, randomAlphabetic(4)); + } + + // API - write + + @RequestMapping(method = RequestMethod.PUT, value = "/foos/{id}") + @ResponseStatus(HttpStatus.OK) + @ResponseBody + public Foo updateFoo(@PathVariable("id") final String id, @RequestBody final Foo foo) { + return foo; + } + + @RequestMapping(method = RequestMethod.GET, value = "/foos/{id}", produces = { "application/x-protobuf" }) + @ResponseBody + public FooProtos.Foo findProtoById(@PathVariable final long id) { + return FooProtos.Foo.newBuilder() + .setId(1) + .setName("Foo Name") + .build(); + } + + @RequestMapping(method = RequestMethod.POST, value = "/foos/new") + @ResponseStatus(HttpStatus.OK) + @ResponseBody + public Foo createFoo(@RequestBody final Foo foo) { + return foo; + } + + @RequestMapping(method = RequestMethod.DELETE, value = "/foos/{id}") + @ResponseStatus(HttpStatus.OK) + @ResponseBody + public long deleteFoo(@PathVariable final long id) { + return id; + } + +} From 838e1c2ef0433c0f3f0878d1e2813ba3f2882725 Mon Sep 17 00:00:00 2001 From: Neeraj Yadav Date: Wed, 11 Jul 2018 18:06:34 +0530 Subject: [PATCH 02/20] fixed formatting --- .../org/baeldung/web/controller/FooController.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/spring-rest-simple/src/main/java/org/baeldung/web/controller/FooController.java b/spring-rest-simple/src/main/java/org/baeldung/web/controller/FooController.java index 3c7e5ed13c..7ea4dc6de0 100644 --- a/spring-rest-simple/src/main/java/org/baeldung/web/controller/FooController.java +++ b/spring-rest-simple/src/main/java/org/baeldung/web/controller/FooController.java @@ -45,4 +45,18 @@ public class FooController { .setName("Foo Name") .build(); } + + @RequestMapping(method = RequestMethod.POST, value = "/foos/new") + @ResponseStatus(HttpStatus.OK) + @ResponseBody + public Foo createFoo(@RequestBody final Foo foo) { + return foo; + } + + @RequestMapping(method = RequestMethod.DELETE, value = "/foos/{id}") + @ResponseStatus(HttpStatus.OK) + @ResponseBody + public long deleteFoo(@PathVariable final long id) { + return id; + } } From 225cf6d2f4453f171bfb1d43dc772441b017a8d6 Mon Sep 17 00:00:00 2001 From: priyeshmashelkar Date: Fri, 20 Jul 2018 10:45:03 +0100 Subject: [PATCH 03/20] BAEL-1907 Created new module spring-testing --- testing-modules/spring-testing/README.md | 2 + testing-modules/spring-testing/pom.xml | 75 +++++++++++++++++++ .../org/baeldung/mockito/repository/User.java | 0 .../mockito/repository/UserRepository.java | 0 .../mockito/MockAnnotationUnitTest.java | 0 .../MockBeanAnnotationIntegrationTest.java | 2 +- 6 files changed, 78 insertions(+), 1 deletion(-) create mode 100644 testing-modules/spring-testing/README.md create mode 100644 testing-modules/spring-testing/pom.xml rename testing-modules/{mockito => spring-testing}/src/main/java/org/baeldung/mockito/repository/User.java (100%) rename testing-modules/{mockito => spring-testing}/src/main/java/org/baeldung/mockito/repository/UserRepository.java (100%) rename testing-modules/{mockito => spring-testing}/src/test/java/org/baeldung/mockito/MockAnnotationUnitTest.java (100%) rename testing-modules/{mockito => spring-testing}/src/test/java/org/baeldung/mockito/MockBeanAnnotationIntegrationTest.java (90%) diff --git a/testing-modules/spring-testing/README.md b/testing-modules/spring-testing/README.md new file mode 100644 index 0000000000..a96ddccabb --- /dev/null +++ b/testing-modules/spring-testing/README.md @@ -0,0 +1,2 @@ +### Relevant Articles: + diff --git a/testing-modules/spring-testing/pom.xml b/testing-modules/spring-testing/pom.xml new file mode 100644 index 0000000000..be05373822 --- /dev/null +++ b/testing-modules/spring-testing/pom.xml @@ -0,0 +1,75 @@ + + 4.0.0 + org.baeldung + spring-testing + 0.1-SNAPSHOT + spring-testing + + + com.baeldung + parent-java + 0.0.1-SNAPSHOT + ../../parent-java + + + + + + + org.hamcrest + java-hamcrest + ${hamcrest.version} + + + + org.springframework.boot + spring-boot-starter + LATEST + test + + + org.springframework.boot + spring-boot-starter-test + LATEST + test + + + org.springframework + spring-core + LATEST + + + org.springframework + spring-context + LATEST + + + org.eclipse.persistence + javax.persistence + 2.1.1 + + + org.springframework.data + spring-data-jpa + LATEST + + + + + spring-testing + + + src/main/resources + true + + + + + + + + 2.0.0.0 + + + \ No newline at end of file diff --git a/testing-modules/mockito/src/main/java/org/baeldung/mockito/repository/User.java b/testing-modules/spring-testing/src/main/java/org/baeldung/mockito/repository/User.java similarity index 100% rename from testing-modules/mockito/src/main/java/org/baeldung/mockito/repository/User.java rename to testing-modules/spring-testing/src/main/java/org/baeldung/mockito/repository/User.java diff --git a/testing-modules/mockito/src/main/java/org/baeldung/mockito/repository/UserRepository.java b/testing-modules/spring-testing/src/main/java/org/baeldung/mockito/repository/UserRepository.java similarity index 100% rename from testing-modules/mockito/src/main/java/org/baeldung/mockito/repository/UserRepository.java rename to testing-modules/spring-testing/src/main/java/org/baeldung/mockito/repository/UserRepository.java diff --git a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockAnnotationUnitTest.java b/testing-modules/spring-testing/src/test/java/org/baeldung/mockito/MockAnnotationUnitTest.java similarity index 100% rename from testing-modules/mockito/src/test/java/org/baeldung/mockito/MockAnnotationUnitTest.java rename to testing-modules/spring-testing/src/test/java/org/baeldung/mockito/MockAnnotationUnitTest.java diff --git a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockBeanAnnotationIntegrationTest.java b/testing-modules/spring-testing/src/test/java/org/baeldung/mockito/MockBeanAnnotationIntegrationTest.java similarity index 90% rename from testing-modules/mockito/src/test/java/org/baeldung/mockito/MockBeanAnnotationIntegrationTest.java rename to testing-modules/spring-testing/src/test/java/org/baeldung/mockito/MockBeanAnnotationIntegrationTest.java index fd9236fe13..3a7e58fb48 100644 --- a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockBeanAnnotationIntegrationTest.java +++ b/testing-modules/spring-testing/src/test/java/org/baeldung/mockito/MockBeanAnnotationIntegrationTest.java @@ -20,7 +20,7 @@ public class MockBeanAnnotationIntegrationTest { ApplicationContext context; @Test - public void givenCountMethodMocked_WhenCountInvokedOnBeanFromContext_ThenMockValueReturned() { + public void givenCountMethodMocked_WhenCountInvoked_ThenMockValueReturned() { Mockito.when(mockRepository.count()).thenReturn(123L); UserRepository userRepoFromContext = context.getBean(UserRepository.class); From 76a4a86ab26f2c2dc12a9553a0eb118585bd5f8c Mon Sep 17 00:00:00 2001 From: priyeshmashelkar Date: Fri, 20 Jul 2018 11:57:31 +0100 Subject: [PATCH 04/20] BAEL-1907 Corrected formatting --- testing-modules/spring-testing/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/testing-modules/spring-testing/pom.xml b/testing-modules/spring-testing/pom.xml index be05373822..a137bc8d33 100644 --- a/testing-modules/spring-testing/pom.xml +++ b/testing-modules/spring-testing/pom.xml @@ -9,8 +9,8 @@ com.baeldung parent-java - 0.0.1-SNAPSHOT - ../../parent-java + 0.0.1-SNAPSHOT + ../../parent-java From b69cf245b1904e86434a431546ed6fc8baa6a23e Mon Sep 17 00:00:00 2001 From: amit2103 Date: Sat, 21 Jul 2018 18:54:51 +0530 Subject: [PATCH 05/20] [BAEL-7635] Removed test generated files : Will be gitignored --- xml/src/test/resources/example_dom4j_new.xml | 10 ------ .../test/resources/example_dom4j_updated.xml | 32 ------------------- xml/src/test/resources/example_jaxb_new.xml | 9 ------ 3 files changed, 51 deletions(-) delete mode 100644 xml/src/test/resources/example_dom4j_new.xml delete mode 100755 xml/src/test/resources/example_dom4j_updated.xml delete mode 100644 xml/src/test/resources/example_jaxb_new.xml diff --git a/xml/src/test/resources/example_dom4j_new.xml b/xml/src/test/resources/example_dom4j_new.xml deleted file mode 100644 index 020760fdd3..0000000000 --- a/xml/src/test/resources/example_dom4j_new.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - XML with Dom4J - XML handling with Dom4J - 14/06/2016 - Dom4J tech writer - - diff --git a/xml/src/test/resources/example_dom4j_updated.xml b/xml/src/test/resources/example_dom4j_updated.xml deleted file mode 100755 index 962ca0c889..0000000000 --- a/xml/src/test/resources/example_dom4j_updated.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - Guava updated - Introduction to Guava - 04/04/2016 - GuavaAuthor - - - XML updated - Introduction to XPath - 04/05/2016 - XMLAuthor - - - Android updated - Introduction to Android - 04/03/2016 - AndroidAuthor - - - Spring updated - Introduction to Spring - 04/02/2016 - SpringAuthor - -
Spring Core
-
Spring MVC
-
Spring Batch
-
-
-
\ No newline at end of file diff --git a/xml/src/test/resources/example_jaxb_new.xml b/xml/src/test/resources/example_jaxb_new.xml deleted file mode 100644 index 646d938869..0000000000 --- a/xml/src/test/resources/example_jaxb_new.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - Jaxb author - 04/02/2015 - XML Binding with Jaxb - XML with Jaxb - - From fadeda2fc9a522727194b411450dc8a893d5c543 Mon Sep 17 00:00:00 2001 From: amit2103 Date: Sat, 21 Jul 2018 19:41:03 +0530 Subject: [PATCH 06/20] [BAEL-7635] - Commented out sortpom-maven-plugin that changes pom.xml in every build, added new entries in .gitignore --- .gitignore | 9 +++++++++ jhipster/jhipster-monolithic/pom.xml | 4 ++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index e78c1e7e24..a0a519c8cb 100644 --- a/.gitignore +++ b/.gitignore @@ -48,3 +48,12 @@ dependency-reduced-pom.xml *.so *.dylib *.dll + +xml/src/test/resources/example_dom4j_new.xml +xml/src/test/resources/example_dom4j_updated.xml +xml/src/test/resources/example_jaxb_new.xml +core-java-io/hard_link.txt +core-java-io/target_link.txt +core-java/src/main/java/com/baeldung/manifest/MANIFEST.MF +ethereum/logs/ +jmeter/src/main/resources/*-JMeter.csv \ No newline at end of file diff --git a/jhipster/jhipster-monolithic/pom.xml b/jhipster/jhipster-monolithic/pom.xml index 0536f80ada..8b753f6f93 100644 --- a/jhipster/jhipster-monolithic/pom.xml +++ b/jhipster/jhipster-monolithic/pom.xml @@ -347,7 +347,7 @@ - + com.spotify docker-maven-plugin From c5ae8f98cfa55e35d61b4ea500d0b065a7bd3fa4 Mon Sep 17 00:00:00 2001 From: Kartik Singla Date: Sat, 21 Jul 2018 20:34:52 +0530 Subject: [PATCH 07/20] BAEL-1852 - Testing an Abstract Class with JUnit (#4773) * BAEL-1852 - Testing an Abstract Class with JUnit * Fixed test method names and class names according to naming compliances. --- pom.xml | 8 ++- testing-modules/junit-abstract/pom.xml | 59 +++++++++++++++++++ .../abstractmethod/AbstractMethodCalling.java | 17 ++++++ .../indepedentmethod/AbstractIndependent.java | 14 +++++ .../indepedentmethod/ConcreteImpl.java | 10 ++++ .../AbstractInstanceFields.java | 22 +++++++ .../privatemethod/AbstractPrivateMethods.java | 17 ++++++ .../AbstractMethodCallingUnitTest.java | 32 ++++++++++ .../AbstractIndependentUnitTest.java | 26 ++++++++ .../AbstractInstanceFieldsUnitTest.java | 40 +++++++++++++ .../AbstractPrivateMethodsUnitTest.java | 40 +++++++++++++ 11 files changed, 282 insertions(+), 3 deletions(-) create mode 100644 testing-modules/junit-abstract/pom.xml create mode 100644 testing-modules/junit-abstract/src/main/java/org/baeldung/testing/abstractclass/abstractmethod/AbstractMethodCalling.java create mode 100644 testing-modules/junit-abstract/src/main/java/org/baeldung/testing/abstractclass/indepedentmethod/AbstractIndependent.java create mode 100644 testing-modules/junit-abstract/src/main/java/org/baeldung/testing/abstractclass/indepedentmethod/ConcreteImpl.java create mode 100644 testing-modules/junit-abstract/src/main/java/org/baeldung/testing/abstractclass/instancefields/AbstractInstanceFields.java create mode 100644 testing-modules/junit-abstract/src/main/java/org/baeldung/testing/abstractclass/privatemethod/AbstractPrivateMethods.java create mode 100644 testing-modules/junit-abstract/src/test/java/org/baeldung/testing/abstractclass/abstractmethod/AbstractMethodCallingUnitTest.java create mode 100644 testing-modules/junit-abstract/src/test/java/org/baeldung/testing/abstractclass/indepedentmethod/AbstractIndependentUnitTest.java create mode 100644 testing-modules/junit-abstract/src/test/java/org/baeldung/testing/abstractclass/instancefields/AbstractInstanceFieldsUnitTest.java create mode 100644 testing-modules/junit-abstract/src/test/java/org/baeldung/testing/abstractclass/privatemethod/AbstractPrivateMethodsUnitTest.java diff --git a/pom.xml b/pom.xml index 3e0d37e19f..38812f09bf 100644 --- a/pom.xml +++ b/pom.xml @@ -545,8 +545,9 @@ antlr maven-archetype apache-meecrowave - spring-reactive-kotlin + spring-reactive-kotlin jnosql + testing-modules/junit-abstract @@ -666,6 +667,7 @@ spring-amqp-simple spring-apache-camel spring-batch + testing-modules/junit-abstract @@ -1071,7 +1073,7 @@ antlr maven-archetype apache-meecrowave - + testing-modules/junit-abstract + + org.apache.tika + tika-core + ${tika.version} + + + net.sf.jmimemagic + jmimemagic + ${jmime-magic.version} + org.apache.commons commons-dbcp2 @@ -439,6 +450,9 @@ 2.0.3.RELEASE 1.6.0 61.1 + + 1.18 + 0.1.5 diff --git a/core-java/src/main/resources/product.png b/core-java/src/main/resources/product.png new file mode 100644 index 0000000000000000000000000000000000000000..4edd01c0a1795e469b0a4e8014eda04e5509fd38 GIT binary patch literal 55272 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

!F}al|RZ5mX=N`=8o&a0fK9-gq6TJJ5(FIb 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. +# +# MIME type (lowercased) Extensions +# ============================================ ========== +# application/1d-interleaved-parityfec +# application/3gpp-ims+xml +# application/activemessage +application/andrew-inset ez +# application/applefile +application/applixware aw +application/atom+xml atom +application/atomcat+xml atomcat +# application/atomicmail +application/atomsvc+xml atomsvc +# application/auth-policy+xml +# application/batch-smtp +# application/beep+xml +# application/calendar+xml +# application/cals-1840 +# application/ccmp+xml +application/ccxml+xml ccxml +application/cdmi-capability cdmia +application/cdmi-container cdmic +application/cdmi-domain cdmid +application/cdmi-object cdmio +application/cdmi-queue cdmiq +# application/cea-2018+xml +# application/cellml+xml +# application/cfw +# application/cnrp+xml +# application/commonground +# application/conference-info+xml +# application/cpl+xml +# application/csta+xml +# application/cstadata+xml +application/cu-seeme cu +# application/cybercash +application/davmount+xml davmount +# application/dca-rft +# application/dec-dx +# application/dialog-info+xml +# application/dicom +# application/dns +application/docbook+xml dbk +# application/dskpp+xml +application/dssc+der dssc +application/dssc+xml xdssc +# application/dvcs +application/ecmascript ecma +# application/edi-consent +# application/edi-x12 +# application/edifact +application/emma+xml emma +# application/epp+xml +application/epub+zip epub +# application/eshop +# application/example +application/exi exi +# application/fastinfoset +# application/fastsoap +# application/fits +application/font-tdpfr pfr +# application/framework-attributes+xml +application/gml+xml gml +application/gpx+xml gpx +application/gxf gxf +# application/h224 +# application/held+xml +# application/http +application/hyperstudio stk +# application/ibe-key-request+xml +# application/ibe-pkg-reply+xml +# application/ibe-pp-data +# application/iges +# application/im-iscomposing+xml +# application/index +# application/index.cmd +# application/index.obj +# application/index.response +# application/index.vnd +application/inkml+xml ink inkml +# application/iotp +application/ipfix ipfix +# application/ipp +# application/isup +application/java-archive jar +application/java-serialized-object ser +application/java-vm class +application/javascript js +application/json json +application/jsonml+json jsonml +# application/kpml-request+xml +# application/kpml-response+xml +application/lost+xml lostxml +application/mac-binhex40 hqx +application/mac-compactpro cpt +# application/macwriteii +application/mads+xml mads +application/marc mrc +application/marcxml+xml mrcx +application/mathematica ma nb mb +# application/mathml-content+xml +# application/mathml-presentation+xml +application/mathml+xml mathml +# application/mbms-associated-procedure-description+xml +# application/mbms-deregister+xml +# application/mbms-envelope+xml +# application/mbms-msk+xml +# application/mbms-msk-response+xml +# application/mbms-protection-description+xml +# application/mbms-reception-report+xml +# application/mbms-register+xml +# application/mbms-register-response+xml +# application/mbms-user-service-description+xml +application/mbox mbox +# application/media_control+xml +application/mediaservercontrol+xml mscml +application/metalink+xml metalink +application/metalink4+xml meta4 +application/mets+xml mets +# application/mikey +application/mods+xml mods +# application/moss-keys +# application/moss-signature +# application/mosskey-data +# application/mosskey-request +application/mp21 m21 mp21 +application/mp4 mp4s +# application/mpeg4-generic +# application/mpeg4-iod +# application/mpeg4-iod-xmt +# application/msc-ivr+xml +# application/msc-mixer+xml +application/msword doc dot +application/mxf mxf +# application/nasdata +# application/news-checkgroups +# application/news-groupinfo +# application/news-transmission +# application/nss +# application/ocsp-request +# application/ocsp-response +application/octet-stream bin dms lrf mar so dist distz pkg bpk dump elc deploy +application/oda oda +application/oebps-package+xml opf +application/ogg ogx +application/omdoc+xml omdoc +application/onenote onetoc onetoc2 onetmp onepkg +application/oxps oxps +# application/parityfec +application/patch-ops-error+xml xer +application/pdf pdf +application/pgp-encrypted pgp +# application/pgp-keys +application/pgp-signature asc sig +application/pics-rules prf +# application/pidf+xml +# application/pidf-diff+xml +application/pkcs10 p10 +application/pkcs7-mime p7m p7c +application/pkcs7-signature p7s +application/pkcs8 p8 +application/pkix-attr-cert ac +application/pkix-cert cer +application/pkix-crl crl +application/pkix-pkipath pkipath +application/pkixcmp pki +application/pls+xml pls +# application/poc-settings+xml +application/postscript ai eps ps +# application/prs.alvestrand.titrax-sheet +application/prs.cww cww +# application/prs.nprend +# application/prs.plucker +# application/prs.rdf-xml-crypt +# application/prs.xsf+xml +application/pskc+xml pskcxml +# application/qsig +application/rdf+xml rdf +application/reginfo+xml rif +application/relax-ng-compact-syntax rnc +# application/remote-printing +application/resource-lists+xml rl +application/resource-lists-diff+xml rld +# application/riscos +# application/rlmi+xml +application/rls-services+xml rs +application/rpki-ghostbusters gbr +application/rpki-manifest mft +application/rpki-roa roa +# application/rpki-updown +application/rsd+xml rsd +application/rss+xml rss +application/rtf rtf +# application/rtx +# application/samlassertion+xml +# application/samlmetadata+xml +application/sbml+xml sbml +application/scvp-cv-request scq +application/scvp-cv-response scs +application/scvp-vp-request spq +application/scvp-vp-response spp +application/sdp sdp +# application/set-payment +application/set-payment-initiation setpay +# application/set-registration +application/set-registration-initiation setreg +# application/sgml +# application/sgml-open-catalog +application/shf+xml shf +# application/sieve +# application/simple-filter+xml +# application/simple-message-summary +# application/simplesymbolcontainer +# application/slate +# application/smil +application/smil+xml smi smil +# application/soap+fastinfoset +# application/soap+xml +application/sparql-query rq +application/sparql-results+xml srx +# application/spirits-event+xml +application/srgs gram +application/srgs+xml grxml +application/sru+xml sru +application/ssdl+xml ssdl +application/ssml+xml ssml +# application/tamp-apex-update +# application/tamp-apex-update-confirm +# application/tamp-community-update +# application/tamp-community-update-confirm +# application/tamp-error +# application/tamp-sequence-adjust +# application/tamp-sequence-adjust-confirm +# application/tamp-status-query +# application/tamp-status-response +# application/tamp-update +# application/tamp-update-confirm +application/tei+xml tei teicorpus +application/thraud+xml tfi +# application/timestamp-query +# application/timestamp-reply +application/timestamped-data tsd +# application/tve-trigger +# application/ulpfec +# application/vcard+xml +# application/vemmi +# application/vividence.scriptfile +# application/vnd.3gpp.bsf+xml +application/vnd.3gpp.pic-bw-large plb +application/vnd.3gpp.pic-bw-small psb +application/vnd.3gpp.pic-bw-var pvb +# application/vnd.3gpp.sms +# application/vnd.3gpp2.bcmcsinfo+xml +# application/vnd.3gpp2.sms +application/vnd.3gpp2.tcap tcap +application/vnd.3m.post-it-notes pwn +application/vnd.accpac.simply.aso aso +application/vnd.accpac.simply.imp imp +application/vnd.acucobol acu +application/vnd.acucorp atc acutc +application/vnd.adobe.air-application-installer-package+zip air +application/vnd.adobe.formscentral.fcdt fcdt +application/vnd.adobe.fxp fxp fxpl +# application/vnd.adobe.partial-upload +application/vnd.adobe.xdp+xml xdp +application/vnd.adobe.xfdf xfdf +# application/vnd.aether.imp +# application/vnd.ah-barcode +application/vnd.ahead.space ahead +application/vnd.airzip.filesecure.azf azf +application/vnd.airzip.filesecure.azs azs +application/vnd.amazon.ebook azw +application/vnd.americandynamics.acc acc +application/vnd.amiga.ami ami +# application/vnd.amundsen.maze+xml +application/vnd.android.package-archive apk +application/vnd.anser-web-certificate-issue-initiation cii +application/vnd.anser-web-funds-transfer-initiation fti +application/vnd.antix.game-component atx +application/vnd.apple.installer+xml mpkg +application/vnd.apple.mpegurl m3u8 +# application/vnd.arastra.swi +application/vnd.aristanetworks.swi swi +application/vnd.astraea-software.iota iota +application/vnd.audiograph aep +# application/vnd.autopackage +# application/vnd.avistar+xml +application/vnd.blueice.multipass mpm +# application/vnd.bluetooth.ep.oob +application/vnd.bmi bmi +application/vnd.businessobjects rep +# application/vnd.cab-jscript +# application/vnd.canon-cpdl +# application/vnd.canon-lips +# application/vnd.cendio.thinlinc.clientconf +application/vnd.chemdraw+xml cdxml +application/vnd.chipnuts.karaoke-mmd mmd +application/vnd.cinderella cdy +# application/vnd.cirpack.isdn-ext +application/vnd.claymore cla +application/vnd.cloanto.rp9 rp9 +application/vnd.clonk.c4group c4g c4d c4f c4p c4u +application/vnd.cluetrust.cartomobile-config c11amc +application/vnd.cluetrust.cartomobile-config-pkg c11amz +# application/vnd.collection+json +# application/vnd.commerce-battelle +application/vnd.commonspace csp +application/vnd.contact.cmsg cdbcmsg +application/vnd.cosmocaller cmc +application/vnd.crick.clicker clkx +application/vnd.crick.clicker.keyboard clkk +application/vnd.crick.clicker.palette clkp +application/vnd.crick.clicker.template clkt +application/vnd.crick.clicker.wordbank clkw +application/vnd.criticaltools.wbs+xml wbs +application/vnd.ctc-posml pml +# application/vnd.ctct.ws+xml +# application/vnd.cups-pdf +# application/vnd.cups-postscript +application/vnd.cups-ppd ppd +# application/vnd.cups-raster +# application/vnd.cups-raw +# application/vnd.curl +application/vnd.curl.car car +application/vnd.curl.pcurl pcurl +# application/vnd.cybank +application/vnd.dart dart +application/vnd.data-vision.rdz rdz +application/vnd.dece.data uvf uvvf uvd uvvd +application/vnd.dece.ttml+xml uvt uvvt +application/vnd.dece.unspecified uvx uvvx +application/vnd.dece.zip uvz uvvz +application/vnd.denovo.fcselayout-link fe_launch +# application/vnd.dir-bi.plate-dl-nosuffix +application/vnd.dna dna +application/vnd.dolby.mlp mlp +# application/vnd.dolby.mobile.1 +# application/vnd.dolby.mobile.2 +application/vnd.dpgraph dpg +application/vnd.dreamfactory dfac +application/vnd.ds-keypoint kpxx +application/vnd.dvb.ait ait +# application/vnd.dvb.dvbj +# application/vnd.dvb.esgcontainer +# application/vnd.dvb.ipdcdftnotifaccess +# application/vnd.dvb.ipdcesgaccess +# application/vnd.dvb.ipdcesgaccess2 +# application/vnd.dvb.ipdcesgpdd +# application/vnd.dvb.ipdcroaming +# application/vnd.dvb.iptv.alfec-base +# application/vnd.dvb.iptv.alfec-enhancement +# application/vnd.dvb.notif-aggregate-root+xml +# application/vnd.dvb.notif-container+xml +# application/vnd.dvb.notif-generic+xml +# application/vnd.dvb.notif-ia-msglist+xml +# application/vnd.dvb.notif-ia-registration-request+xml +# application/vnd.dvb.notif-ia-registration-response+xml +# application/vnd.dvb.notif-init+xml +# application/vnd.dvb.pfr +application/vnd.dvb.service svc +# application/vnd.dxr +application/vnd.dynageo geo +# application/vnd.easykaraoke.cdgdownload +# application/vnd.ecdis-update +application/vnd.ecowin.chart mag +# application/vnd.ecowin.filerequest +# application/vnd.ecowin.fileupdate +# application/vnd.ecowin.series +# application/vnd.ecowin.seriesrequest +# application/vnd.ecowin.seriesupdate +# application/vnd.emclient.accessrequest+xml +application/vnd.enliven nml +# application/vnd.eprints.data+xml +application/vnd.epson.esf esf +application/vnd.epson.msf msf +application/vnd.epson.quickanime qam +application/vnd.epson.salt slt +application/vnd.epson.ssf ssf +# application/vnd.ericsson.quickcall +application/vnd.eszigno3+xml es3 et3 +# application/vnd.etsi.aoc+xml +# application/vnd.etsi.cug+xml +# application/vnd.etsi.iptvcommand+xml +# application/vnd.etsi.iptvdiscovery+xml +# application/vnd.etsi.iptvprofile+xml +# application/vnd.etsi.iptvsad-bc+xml +# application/vnd.etsi.iptvsad-cod+xml +# application/vnd.etsi.iptvsad-npvr+xml +# application/vnd.etsi.iptvservice+xml +# application/vnd.etsi.iptvsync+xml +# application/vnd.etsi.iptvueprofile+xml +# application/vnd.etsi.mcid+xml +# application/vnd.etsi.overload-control-policy-dataset+xml +# application/vnd.etsi.sci+xml +# application/vnd.etsi.simservs+xml +# application/vnd.etsi.tsl+xml +# application/vnd.etsi.tsl.der +# application/vnd.eudora.data +application/vnd.ezpix-album ez2 +application/vnd.ezpix-package ez3 +# application/vnd.f-secure.mobile +application/vnd.fdf fdf +application/vnd.fdsn.mseed mseed +application/vnd.fdsn.seed seed dataless +# application/vnd.ffsns +# application/vnd.fints +application/vnd.flographit gph +application/vnd.fluxtime.clip ftc +# application/vnd.font-fontforge-sfd +application/vnd.framemaker fm frame maker book +application/vnd.frogans.fnc fnc +application/vnd.frogans.ltf ltf +application/vnd.fsc.weblaunch fsc +application/vnd.fujitsu.oasys oas +application/vnd.fujitsu.oasys2 oa2 +application/vnd.fujitsu.oasys3 oa3 +application/vnd.fujitsu.oasysgp fg5 +application/vnd.fujitsu.oasysprs bh2 +# application/vnd.fujixerox.art-ex +# application/vnd.fujixerox.art4 +# application/vnd.fujixerox.hbpl +application/vnd.fujixerox.ddd ddd +application/vnd.fujixerox.docuworks xdw +application/vnd.fujixerox.docuworks.binder xbd +# application/vnd.fut-misnet +application/vnd.fuzzysheet fzs +application/vnd.genomatix.tuxedo txd +# application/vnd.geocube+xml +application/vnd.geogebra.file ggb +application/vnd.geogebra.tool ggt +application/vnd.geometry-explorer gex gre +application/vnd.geonext gxt +application/vnd.geoplan g2w +application/vnd.geospace g3w +# application/vnd.globalplatform.card-content-mgt +# application/vnd.globalplatform.card-content-mgt-response +application/vnd.gmx gmx +application/vnd.google-earth.kml+xml kml +application/vnd.google-earth.kmz kmz +application/vnd.grafeq gqf gqs +# application/vnd.gridmp +application/vnd.groove-account gac +application/vnd.groove-help ghf +application/vnd.groove-identity-message gim +application/vnd.groove-injector grv +application/vnd.groove-tool-message gtm +application/vnd.groove-tool-template tpl +application/vnd.groove-vcard vcg +# application/vnd.hal+json +application/vnd.hal+xml hal +application/vnd.handheld-entertainment+xml zmm +application/vnd.hbci hbci +# application/vnd.hcl-bireports +application/vnd.hhe.lesson-player les +application/vnd.hp-hpgl hpgl +application/vnd.hp-hpid hpid +application/vnd.hp-hps hps +application/vnd.hp-jlyt jlt +application/vnd.hp-pcl pcl +application/vnd.hp-pclxl pclxl +# application/vnd.httphone +application/vnd.hydrostatix.sof-data sfd-hdstx +# application/vnd.hzn-3d-crossword +# application/vnd.ibm.afplinedata +# application/vnd.ibm.electronic-media +application/vnd.ibm.minipay mpy +application/vnd.ibm.modcap afp listafp list3820 +application/vnd.ibm.rights-management irm +application/vnd.ibm.secure-container sc +application/vnd.iccprofile icc icm +application/vnd.igloader igl +application/vnd.immervision-ivp ivp +application/vnd.immervision-ivu ivu +# application/vnd.informedcontrol.rms+xml +# application/vnd.informix-visionary +# application/vnd.infotech.project +# application/vnd.infotech.project+xml +# application/vnd.innopath.wamp.notification +application/vnd.insors.igm igm +application/vnd.intercon.formnet xpw xpx +application/vnd.intergeo i2g +# application/vnd.intertrust.digibox +# application/vnd.intertrust.nncp +application/vnd.intu.qbo qbo +application/vnd.intu.qfx qfx +# application/vnd.iptc.g2.conceptitem+xml +# application/vnd.iptc.g2.knowledgeitem+xml +# application/vnd.iptc.g2.newsitem+xml +# application/vnd.iptc.g2.newsmessage+xml +# application/vnd.iptc.g2.packageitem+xml +# application/vnd.iptc.g2.planningitem+xml +application/vnd.ipunplugged.rcprofile rcprofile +application/vnd.irepository.package+xml irp +application/vnd.is-xpr xpr +application/vnd.isac.fcs fcs +application/vnd.jam jam +# application/vnd.japannet-directory-service +# application/vnd.japannet-jpnstore-wakeup +# application/vnd.japannet-payment-wakeup +# application/vnd.japannet-registration +# application/vnd.japannet-registration-wakeup +# application/vnd.japannet-setstore-wakeup +# application/vnd.japannet-verification +# application/vnd.japannet-verification-wakeup +application/vnd.jcp.javame.midlet-rms rms +application/vnd.jisp jisp +application/vnd.joost.joda-archive joda +application/vnd.kahootz ktz ktr +application/vnd.kde.karbon karbon +application/vnd.kde.kchart chrt +application/vnd.kde.kformula kfo +application/vnd.kde.kivio flw +application/vnd.kde.kontour kon +application/vnd.kde.kpresenter kpr kpt +application/vnd.kde.kspread ksp +application/vnd.kde.kword kwd kwt +application/vnd.kenameaapp htke +application/vnd.kidspiration kia +application/vnd.kinar kne knp +application/vnd.koan skp skd skt skm +application/vnd.kodak-descriptor sse +application/vnd.las.las+xml lasxml +# application/vnd.liberty-request+xml +application/vnd.llamagraphics.life-balance.desktop lbd +application/vnd.llamagraphics.life-balance.exchange+xml lbe +application/vnd.lotus-1-2-3 123 +application/vnd.lotus-approach apr +application/vnd.lotus-freelance pre +application/vnd.lotus-notes nsf +application/vnd.lotus-organizer org +application/vnd.lotus-screencam scm +application/vnd.lotus-wordpro lwp +application/vnd.macports.portpkg portpkg +# application/vnd.marlin.drm.actiontoken+xml +# application/vnd.marlin.drm.conftoken+xml +# application/vnd.marlin.drm.license+xml +# application/vnd.marlin.drm.mdcf +application/vnd.mcd mcd +application/vnd.medcalcdata mc1 +application/vnd.mediastation.cdkey cdkey +# application/vnd.meridian-slingshot +application/vnd.mfer mwf +application/vnd.mfmp mfm +application/vnd.micrografx.flo flo +application/vnd.micrografx.igx igx +application/vnd.mif mif +# application/vnd.minisoft-hp3000-save +# application/vnd.mitsubishi.misty-guard.trustweb +application/vnd.mobius.daf daf +application/vnd.mobius.dis dis +application/vnd.mobius.mbk mbk +application/vnd.mobius.mqy mqy +application/vnd.mobius.msl msl +application/vnd.mobius.plc plc +application/vnd.mobius.txf txf +application/vnd.mophun.application mpn +application/vnd.mophun.certificate mpc +# application/vnd.motorola.flexsuite +# application/vnd.motorola.flexsuite.adsi +# application/vnd.motorola.flexsuite.fis +# application/vnd.motorola.flexsuite.gotap +# application/vnd.motorola.flexsuite.kmr +# application/vnd.motorola.flexsuite.ttc +# application/vnd.motorola.flexsuite.wem +# application/vnd.motorola.iprm +application/vnd.mozilla.xul+xml xul +application/vnd.ms-artgalry cil +# application/vnd.ms-asf +application/vnd.ms-cab-compressed cab +# application/vnd.ms-color.iccprofile +application/vnd.ms-excel xls xlm xla xlc xlt xlw +application/vnd.ms-excel.addin.macroenabled.12 xlam +application/vnd.ms-excel.sheet.binary.macroenabled.12 xlsb +application/vnd.ms-excel.sheet.macroenabled.12 xlsm +application/vnd.ms-excel.template.macroenabled.12 xltm +application/vnd.ms-fontobject eot +application/vnd.ms-htmlhelp chm +application/vnd.ms-ims ims +application/vnd.ms-lrm lrm +# application/vnd.ms-office.activex+xml +application/vnd.ms-officetheme thmx +# application/vnd.ms-opentype +# application/vnd.ms-package.obfuscated-opentype +application/vnd.ms-pki.seccat cat +application/vnd.ms-pki.stl stl +# application/vnd.ms-playready.initiator+xml +application/vnd.ms-powerpoint ppt pps pot +application/vnd.ms-powerpoint.addin.macroenabled.12 ppam +application/vnd.ms-powerpoint.presentation.macroenabled.12 pptm +application/vnd.ms-powerpoint.slide.macroenabled.12 sldm +application/vnd.ms-powerpoint.slideshow.macroenabled.12 ppsm +application/vnd.ms-powerpoint.template.macroenabled.12 potm +# application/vnd.ms-printing.printticket+xml +application/vnd.ms-project mpp mpt +# application/vnd.ms-tnef +# application/vnd.ms-wmdrm.lic-chlg-req +# application/vnd.ms-wmdrm.lic-resp +# application/vnd.ms-wmdrm.meter-chlg-req +# application/vnd.ms-wmdrm.meter-resp +application/vnd.ms-word.document.macroenabled.12 docm +application/vnd.ms-word.template.macroenabled.12 dotm +application/vnd.ms-works wps wks wcm wdb +application/vnd.ms-wpl wpl +application/vnd.ms-xpsdocument xps +application/vnd.mseq mseq +# application/vnd.msign +# application/vnd.multiad.creator +# application/vnd.multiad.creator.cif +# application/vnd.music-niff +application/vnd.musician mus +application/vnd.muvee.style msty +application/vnd.mynfc taglet +# application/vnd.ncd.control +# application/vnd.ncd.reference +# application/vnd.nervana +# application/vnd.netfpx +application/vnd.neurolanguage.nlu nlu +application/vnd.nitf ntf nitf +application/vnd.noblenet-directory nnd +application/vnd.noblenet-sealer nns +application/vnd.noblenet-web nnw +# application/vnd.nokia.catalogs +# application/vnd.nokia.conml+wbxml +# application/vnd.nokia.conml+xml +# application/vnd.nokia.isds-radio-presets +# application/vnd.nokia.iptv.config+xml +# application/vnd.nokia.landmark+wbxml +# application/vnd.nokia.landmark+xml +# application/vnd.nokia.landmarkcollection+xml +# application/vnd.nokia.n-gage.ac+xml +application/vnd.nokia.n-gage.data ngdat +application/vnd.nokia.n-gage.symbian.install n-gage +# application/vnd.nokia.ncd +# application/vnd.nokia.pcd+wbxml +# application/vnd.nokia.pcd+xml +application/vnd.nokia.radio-preset rpst +application/vnd.nokia.radio-presets rpss +application/vnd.novadigm.edm edm +application/vnd.novadigm.edx edx +application/vnd.novadigm.ext ext +# application/vnd.ntt-local.file-transfer +# application/vnd.ntt-local.sip-ta_remote +# application/vnd.ntt-local.sip-ta_tcp_stream +application/vnd.oasis.opendocument.chart odc +application/vnd.oasis.opendocument.chart-template otc +application/vnd.oasis.opendocument.database odb +application/vnd.oasis.opendocument.formula odf +application/vnd.oasis.opendocument.formula-template odft +application/vnd.oasis.opendocument.graphics odg +application/vnd.oasis.opendocument.graphics-template otg +application/vnd.oasis.opendocument.image odi +application/vnd.oasis.opendocument.image-template oti +application/vnd.oasis.opendocument.presentation odp +application/vnd.oasis.opendocument.presentation-template otp +application/vnd.oasis.opendocument.spreadsheet ods +application/vnd.oasis.opendocument.spreadsheet-template ots +application/vnd.oasis.opendocument.text odt +application/vnd.oasis.opendocument.text-master odm +application/vnd.oasis.opendocument.text-template ott +application/vnd.oasis.opendocument.text-web oth +# application/vnd.obn +# application/vnd.oftn.l10n+json +# application/vnd.oipf.contentaccessdownload+xml +# application/vnd.oipf.contentaccessstreaming+xml +# application/vnd.oipf.cspg-hexbinary +# application/vnd.oipf.dae.svg+xml +# application/vnd.oipf.dae.xhtml+xml +# application/vnd.oipf.mippvcontrolmessage+xml +# application/vnd.oipf.pae.gem +# application/vnd.oipf.spdiscovery+xml +# application/vnd.oipf.spdlist+xml +# application/vnd.oipf.ueprofile+xml +# application/vnd.oipf.userprofile+xml +application/vnd.olpc-sugar xo +# application/vnd.oma-scws-config +# application/vnd.oma-scws-http-request +# application/vnd.oma-scws-http-response +# application/vnd.oma.bcast.associated-procedure-parameter+xml +# application/vnd.oma.bcast.drm-trigger+xml +# application/vnd.oma.bcast.imd+xml +# application/vnd.oma.bcast.ltkm +# application/vnd.oma.bcast.notification+xml +# application/vnd.oma.bcast.provisioningtrigger +# application/vnd.oma.bcast.sgboot +# application/vnd.oma.bcast.sgdd+xml +# application/vnd.oma.bcast.sgdu +# application/vnd.oma.bcast.simple-symbol-container +# application/vnd.oma.bcast.smartcard-trigger+xml +# application/vnd.oma.bcast.sprov+xml +# application/vnd.oma.bcast.stkm +# application/vnd.oma.cab-address-book+xml +# application/vnd.oma.cab-feature-handler+xml +# application/vnd.oma.cab-pcc+xml +# application/vnd.oma.cab-user-prefs+xml +# application/vnd.oma.dcd +# application/vnd.oma.dcdc +application/vnd.oma.dd2+xml dd2 +# application/vnd.oma.drm.risd+xml +# application/vnd.oma.group-usage-list+xml +# application/vnd.oma.pal+xml +# application/vnd.oma.poc.detailed-progress-report+xml +# application/vnd.oma.poc.final-report+xml +# application/vnd.oma.poc.groups+xml +# application/vnd.oma.poc.invocation-descriptor+xml +# application/vnd.oma.poc.optimized-progress-report+xml +# application/vnd.oma.push +# application/vnd.oma.scidm.messages+xml +# application/vnd.oma.xcap-directory+xml +# application/vnd.omads-email+xml +# application/vnd.omads-file+xml +# application/vnd.omads-folder+xml +# application/vnd.omaloc-supl-init +application/vnd.openofficeorg.extension oxt +# application/vnd.openxmlformats-officedocument.custom-properties+xml +# application/vnd.openxmlformats-officedocument.customxmlproperties+xml +# application/vnd.openxmlformats-officedocument.drawing+xml +# application/vnd.openxmlformats-officedocument.drawingml.chart+xml +# application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml +# application/vnd.openxmlformats-officedocument.drawingml.diagramcolors+xml +# application/vnd.openxmlformats-officedocument.drawingml.diagramdata+xml +# application/vnd.openxmlformats-officedocument.drawingml.diagramlayout+xml +# application/vnd.openxmlformats-officedocument.drawingml.diagramstyle+xml +# application/vnd.openxmlformats-officedocument.extended-properties+xml +# application/vnd.openxmlformats-officedocument.presentationml.commentauthors+xml +# application/vnd.openxmlformats-officedocument.presentationml.comments+xml +# application/vnd.openxmlformats-officedocument.presentationml.handoutmaster+xml +# application/vnd.openxmlformats-officedocument.presentationml.notesmaster+xml +# application/vnd.openxmlformats-officedocument.presentationml.notesslide+xml +application/vnd.openxmlformats-officedocument.presentationml.presentation pptx +# application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml +# application/vnd.openxmlformats-officedocument.presentationml.presprops+xml +application/vnd.openxmlformats-officedocument.presentationml.slide sldx +# application/vnd.openxmlformats-officedocument.presentationml.slide+xml +# application/vnd.openxmlformats-officedocument.presentationml.slidelayout+xml +# application/vnd.openxmlformats-officedocument.presentationml.slidemaster+xml +application/vnd.openxmlformats-officedocument.presentationml.slideshow ppsx +# application/vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml +# application/vnd.openxmlformats-officedocument.presentationml.slideupdateinfo+xml +# application/vnd.openxmlformats-officedocument.presentationml.tablestyles+xml +# application/vnd.openxmlformats-officedocument.presentationml.tags+xml +application/vnd.openxmlformats-officedocument.presentationml.template potx +# application/vnd.openxmlformats-officedocument.presentationml.template.main+xml +# application/vnd.openxmlformats-officedocument.presentationml.viewprops+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.calcchain+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.externallink+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcachedefinition+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcacherecords+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.pivottable+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.querytable+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.revisionheaders+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.revisionlog+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.sharedstrings+xml +application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx +# application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.sheetmetadata+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.tablesinglecells+xml +application/vnd.openxmlformats-officedocument.spreadsheetml.template xltx +# application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.usernames+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.volatiledependencies+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml +# application/vnd.openxmlformats-officedocument.theme+xml +# application/vnd.openxmlformats-officedocument.themeoverride+xml +# application/vnd.openxmlformats-officedocument.vmldrawing +# application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml +application/vnd.openxmlformats-officedocument.wordprocessingml.document docx +# application/vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml +# application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml +# application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml +# application/vnd.openxmlformats-officedocument.wordprocessingml.fonttable+xml +# application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml +# application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml +# application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml +# application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml +# application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml +application/vnd.openxmlformats-officedocument.wordprocessingml.template dotx +# application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml +# application/vnd.openxmlformats-officedocument.wordprocessingml.websettings+xml +# application/vnd.openxmlformats-package.core-properties+xml +# application/vnd.openxmlformats-package.digital-signature-xmlsignature+xml +# application/vnd.openxmlformats-package.relationships+xml +# application/vnd.quobject-quoxdocument +# application/vnd.osa.netdeploy +application/vnd.osgeo.mapguide.package mgp +# application/vnd.osgi.bundle +application/vnd.osgi.dp dp +application/vnd.osgi.subsystem esa +# application/vnd.otps.ct-kip+xml +application/vnd.palm pdb pqa oprc +# application/vnd.paos.xml +application/vnd.pawaafile paw +application/vnd.pg.format str +application/vnd.pg.osasli ei6 +# application/vnd.piaccess.application-licence +application/vnd.picsel efif +application/vnd.pmi.widget wg +# application/vnd.poc.group-advertisement+xml +application/vnd.pocketlearn plf +application/vnd.powerbuilder6 pbd +# application/vnd.powerbuilder6-s +# application/vnd.powerbuilder7 +# application/vnd.powerbuilder7-s +# application/vnd.powerbuilder75 +# application/vnd.powerbuilder75-s +# application/vnd.preminet +application/vnd.previewsystems.box box +application/vnd.proteus.magazine mgz +application/vnd.publishare-delta-tree qps +application/vnd.pvi.ptid1 ptid +# application/vnd.pwg-multiplexed +# application/vnd.pwg-xhtml-print+xml +# application/vnd.qualcomm.brew-app-res +application/vnd.quark.quarkxpress qxd qxt qwd qwt qxl qxb +# application/vnd.radisys.moml+xml +# application/vnd.radisys.msml+xml +# application/vnd.radisys.msml-audit+xml +# application/vnd.radisys.msml-audit-conf+xml +# application/vnd.radisys.msml-audit-conn+xml +# application/vnd.radisys.msml-audit-dialog+xml +# application/vnd.radisys.msml-audit-stream+xml +# application/vnd.radisys.msml-conf+xml +# application/vnd.radisys.msml-dialog+xml +# application/vnd.radisys.msml-dialog-base+xml +# application/vnd.radisys.msml-dialog-fax-detect+xml +# application/vnd.radisys.msml-dialog-fax-sendrecv+xml +# application/vnd.radisys.msml-dialog-group+xml +# application/vnd.radisys.msml-dialog-speech+xml +# application/vnd.radisys.msml-dialog-transform+xml +# application/vnd.rainstor.data +# application/vnd.rapid +application/vnd.realvnc.bed bed +application/vnd.recordare.musicxml mxl +application/vnd.recordare.musicxml+xml musicxml +# application/vnd.renlearn.rlprint +application/vnd.rig.cryptonote cryptonote +application/vnd.rim.cod cod +application/vnd.rn-realmedia rm +application/vnd.rn-realmedia-vbr rmvb +application/vnd.route66.link66+xml link66 +# application/vnd.rs-274x +# application/vnd.ruckus.download +# application/vnd.s3sms +application/vnd.sailingtracker.track st +# application/vnd.sbm.cid +# application/vnd.sbm.mid2 +# application/vnd.scribus +# application/vnd.sealed.3df +# application/vnd.sealed.csf +# application/vnd.sealed.doc +# application/vnd.sealed.eml +# application/vnd.sealed.mht +# application/vnd.sealed.net +# application/vnd.sealed.ppt +# application/vnd.sealed.tiff +# application/vnd.sealed.xls +# application/vnd.sealedmedia.softseal.html +# application/vnd.sealedmedia.softseal.pdf +application/vnd.seemail see +application/vnd.sema sema +application/vnd.semd semd +application/vnd.semf semf +application/vnd.shana.informed.formdata ifm +application/vnd.shana.informed.formtemplate itp +application/vnd.shana.informed.interchange iif +application/vnd.shana.informed.package ipk +application/vnd.simtech-mindmapper twd twds +application/vnd.smaf mmf +# application/vnd.smart.notebook +application/vnd.smart.teacher teacher +# application/vnd.software602.filler.form+xml +# application/vnd.software602.filler.form-xml-zip +application/vnd.solent.sdkm+xml sdkm sdkd +application/vnd.spotfire.dxp dxp +application/vnd.spotfire.sfs sfs +# application/vnd.sss-cod +# application/vnd.sss-dtf +# application/vnd.sss-ntf +application/vnd.stardivision.calc sdc +application/vnd.stardivision.draw sda +application/vnd.stardivision.impress sdd +application/vnd.stardivision.math smf +application/vnd.stardivision.writer sdw vor +application/vnd.stardivision.writer-global sgl +application/vnd.stepmania.package smzip +application/vnd.stepmania.stepchart sm +# application/vnd.street-stream +application/vnd.sun.xml.calc sxc +application/vnd.sun.xml.calc.template stc +application/vnd.sun.xml.draw sxd +application/vnd.sun.xml.draw.template std +application/vnd.sun.xml.impress sxi +application/vnd.sun.xml.impress.template sti +application/vnd.sun.xml.math sxm +application/vnd.sun.xml.writer sxw +application/vnd.sun.xml.writer.global sxg +application/vnd.sun.xml.writer.template stw +# application/vnd.sun.wadl+xml +application/vnd.sus-calendar sus susp +application/vnd.svd svd +# application/vnd.swiftview-ics +application/vnd.symbian.install sis sisx +application/vnd.syncml+xml xsm +application/vnd.syncml.dm+wbxml bdm +application/vnd.syncml.dm+xml xdm +# application/vnd.syncml.dm.notification +# application/vnd.syncml.ds.notification +application/vnd.tao.intent-module-archive tao +application/vnd.tcpdump.pcap pcap cap dmp +application/vnd.tmobile-livetv tmo +application/vnd.trid.tpt tpt +application/vnd.triscape.mxs mxs +application/vnd.trueapp tra +# application/vnd.truedoc +# application/vnd.ubisoft.webplayer +application/vnd.ufdl ufd ufdl +application/vnd.uiq.theme utz +application/vnd.umajin umj +application/vnd.unity unityweb +application/vnd.uoml+xml uoml +# application/vnd.uplanet.alert +# application/vnd.uplanet.alert-wbxml +# application/vnd.uplanet.bearer-choice +# application/vnd.uplanet.bearer-choice-wbxml +# application/vnd.uplanet.cacheop +# application/vnd.uplanet.cacheop-wbxml +# application/vnd.uplanet.channel +# application/vnd.uplanet.channel-wbxml +# application/vnd.uplanet.list +# application/vnd.uplanet.list-wbxml +# application/vnd.uplanet.listcmd +# application/vnd.uplanet.listcmd-wbxml +# application/vnd.uplanet.signal +application/vnd.vcx vcx +# application/vnd.vd-study +# application/vnd.vectorworks +# application/vnd.verimatrix.vcas +# application/vnd.vidsoft.vidconference +application/vnd.visio vsd vst vss vsw +application/vnd.visionary vis +# application/vnd.vividence.scriptfile +application/vnd.vsf vsf +# application/vnd.wap.sic +# application/vnd.wap.slc +application/vnd.wap.wbxml wbxml +application/vnd.wap.wmlc wmlc +application/vnd.wap.wmlscriptc wmlsc +application/vnd.webturbo wtb +# application/vnd.wfa.wsc +# application/vnd.wmc +# application/vnd.wmf.bootstrap +# application/vnd.wolfram.mathematica +# application/vnd.wolfram.mathematica.package +application/vnd.wolfram.player nbp +application/vnd.wordperfect wpd +application/vnd.wqd wqd +# application/vnd.wrq-hp3000-labelled +application/vnd.wt.stf stf +# application/vnd.wv.csp+wbxml +# application/vnd.wv.csp+xml +# application/vnd.wv.ssp+xml +application/vnd.xara xar +application/vnd.xfdl xfdl +# application/vnd.xfdl.webform +# application/vnd.xmi+xml +# application/vnd.xmpie.cpkg +# application/vnd.xmpie.dpkg +# application/vnd.xmpie.plan +# application/vnd.xmpie.ppkg +# application/vnd.xmpie.xlim +application/vnd.yamaha.hv-dic hvd +application/vnd.yamaha.hv-script hvs +application/vnd.yamaha.hv-voice hvp +application/vnd.yamaha.openscoreformat osf +application/vnd.yamaha.openscoreformat.osfpvg+xml osfpvg +# application/vnd.yamaha.remote-setup +application/vnd.yamaha.smaf-audio saf +application/vnd.yamaha.smaf-phrase spf +# application/vnd.yamaha.through-ngn +# application/vnd.yamaha.tunnel-udpencap +application/vnd.yellowriver-custom-menu cmp +application/vnd.zul zir zirz +application/vnd.zzazz.deck+xml zaz +application/voicexml+xml vxml +# application/vq-rtcpxr +# application/watcherinfo+xml +# application/whoispp-query +# application/whoispp-response +application/widget wgt +application/winhlp hlp +# application/wita +# application/wordperfect5.1 +application/wsdl+xml wsdl +application/wspolicy+xml wspolicy +application/x-7z-compressed 7z +application/x-abiword abw +application/x-ace-compressed ace +# application/x-amf +application/x-apple-diskimage dmg +application/x-authorware-bin aab x32 u32 vox +application/x-authorware-map aam +application/x-authorware-seg aas +application/x-bcpio bcpio +application/x-bittorrent torrent +application/x-blorb blb blorb +application/x-bzip bz +application/x-bzip2 bz2 boz +application/x-cbr cbr cba cbt cbz cb7 +application/x-cdlink vcd +application/x-cfs-compressed cfs +application/x-chat chat +application/x-chess-pgn pgn +application/x-conference nsc +# application/x-compress +application/x-cpio cpio +application/x-csh csh +application/x-debian-package deb udeb +application/x-dgc-compressed dgc +application/x-director dir dcr dxr cst cct cxt w3d fgd swa +application/x-doom wad +application/x-dtbncx+xml ncx +application/x-dtbook+xml dtb +application/x-dtbresource+xml res +application/x-dvi dvi +application/x-envoy evy +application/x-eva eva +application/x-font-bdf bdf +# application/x-font-dos +# application/x-font-framemaker +application/x-font-ghostscript gsf +# application/x-font-libgrx +application/x-font-linux-psf psf +application/x-font-otf otf +application/x-font-pcf pcf +application/x-font-snf snf +# application/x-font-speedo +# application/x-font-sunos-news +application/x-font-ttf ttf ttc +application/x-font-type1 pfa pfb pfm afm +application/x-font-woff woff +# application/x-font-vfont +application/x-freearc arc +application/x-futuresplash spl +application/x-gca-compressed gca +application/x-glulx ulx +application/x-gnumeric gnumeric +application/x-gramps-xml gramps +application/x-gtar gtar +# application/x-gzip +application/x-hdf hdf +application/x-install-instructions install +application/x-iso9660-image iso +application/x-java-jnlp-file jnlp +application/x-latex latex +application/x-lzh-compressed lzh lha +application/x-mie mie +application/x-mobipocket-ebook prc mobi +application/x-ms-application application +application/x-ms-shortcut lnk +application/x-ms-wmd wmd +application/x-ms-wmz wmz +application/x-ms-xbap xbap +application/x-msaccess mdb +application/x-msbinder obd +application/x-mscardfile crd +application/x-msclip clp +application/x-msdownload exe dll com bat msi +application/x-msmediaview mvb m13 m14 +application/x-msmetafile wmf wmz emf emz +application/x-msmoney mny +application/x-mspublisher pub +application/x-msschedule scd +application/x-msterminal trm +application/x-mswrite wri +application/x-netcdf nc cdf +application/x-nzb nzb +application/x-pkcs12 p12 pfx +application/x-pkcs7-certificates p7b spc +application/x-pkcs7-certreqresp p7r +application/x-rar-compressed rar +application/x-research-info-systems ris +application/x-sh sh +application/x-shar shar +application/x-shockwave-flash swf +application/x-silverlight-app xap +application/x-sql sql +application/x-stuffit sit +application/x-stuffitx sitx +application/x-subrip srt +application/x-sv4cpio sv4cpio +application/x-sv4crc sv4crc +application/x-t3vm-image t3 +application/x-tads gam +application/x-tar tar +application/x-tcl tcl +application/x-tex tex +application/x-tex-tfm tfm +application/x-texinfo texinfo texi +application/x-tgif obj +application/x-ustar ustar +application/x-wais-source src +application/x-x509-ca-cert der crt +application/x-xfig fig +application/x-xliff+xml xlf +application/x-xpinstall xpi +application/x-xz xz +application/x-zmachine z1 z2 z3 z4 z5 z6 z7 z8 +# application/x400-bp +application/xaml+xml xaml +# application/xcap-att+xml +# application/xcap-caps+xml +application/xcap-diff+xml xdf +# application/xcap-el+xml +# application/xcap-error+xml +# application/xcap-ns+xml +# application/xcon-conference-info-diff+xml +# application/xcon-conference-info+xml +application/xenc+xml xenc +application/xhtml+xml xhtml xht +# application/xhtml-voice+xml +application/xml xml xsl +application/xml-dtd dtd +# application/xml-external-parsed-entity +# application/xmpp+xml +application/xop+xml xop +application/xproc+xml xpl +application/xslt+xml xslt +application/xspf+xml xspf +application/xv+xml mxml xhvml xvml xvm +application/yang yang +application/yin+xml yin +application/zip zip +# audio/1d-interleaved-parityfec +# audio/32kadpcm +# audio/3gpp +# audio/3gpp2 +# audio/ac3 +audio/adpcm adp +# audio/amr +# audio/amr-wb +# audio/amr-wb+ +# audio/asc +# audio/atrac-advanced-lossless +# audio/atrac-x +# audio/atrac3 +audio/basic au snd +# audio/bv16 +# audio/bv32 +# audio/clearmode +# audio/cn +# audio/dat12 +# audio/dls +# audio/dsr-es201108 +# audio/dsr-es202050 +# audio/dsr-es202211 +# audio/dsr-es202212 +# audio/dv +# audio/dvi4 +# audio/eac3 +# audio/evrc +# audio/evrc-qcp +# audio/evrc0 +# audio/evrc1 +# audio/evrcb +# audio/evrcb0 +# audio/evrcb1 +# audio/evrcwb +# audio/evrcwb0 +# audio/evrcwb1 +# audio/example +# audio/fwdred +# audio/g719 +# audio/g722 +# audio/g7221 +# audio/g723 +# audio/g726-16 +# audio/g726-24 +# audio/g726-32 +# audio/g726-40 +# audio/g728 +# audio/g729 +# audio/g7291 +# audio/g729d +# audio/g729e +# audio/gsm +# audio/gsm-efr +# audio/gsm-hr-08 +# audio/ilbc +# audio/ip-mr_v2.5 +# audio/isac +# audio/l16 +# audio/l20 +# audio/l24 +# audio/l8 +# audio/lpc +audio/midi mid midi kar rmi +# audio/mobile-xmf +audio/mp4 m4a mp4a +# audio/mp4a-latm +# audio/mpa +# audio/mpa-robust +audio/mpeg mpga mp2 mp2a mp3 m2a m3a +# audio/mpeg4-generic +# audio/musepack +audio/ogg oga ogg spx +# audio/opus +# audio/parityfec +# audio/pcma +# audio/pcma-wb +# audio/pcmu-wb +# audio/pcmu +# audio/prs.sid +# audio/qcelp +# audio/red +# audio/rtp-enc-aescm128 +# audio/rtp-midi +# audio/rtx +audio/s3m s3m +audio/silk sil +# audio/smv +# audio/smv0 +# audio/smv-qcp +# audio/sp-midi +# audio/speex +# audio/t140c +# audio/t38 +# audio/telephone-event +# audio/tone +# audio/uemclip +# audio/ulpfec +# audio/vdvi +# audio/vmr-wb +# audio/vnd.3gpp.iufp +# audio/vnd.4sb +# audio/vnd.audiokoz +# audio/vnd.celp +# audio/vnd.cisco.nse +# audio/vnd.cmles.radio-events +# audio/vnd.cns.anp1 +# audio/vnd.cns.inf1 +audio/vnd.dece.audio uva uvva +audio/vnd.digital-winds eol +# audio/vnd.dlna.adts +# audio/vnd.dolby.heaac.1 +# audio/vnd.dolby.heaac.2 +# audio/vnd.dolby.mlp +# audio/vnd.dolby.mps +# audio/vnd.dolby.pl2 +# audio/vnd.dolby.pl2x +# audio/vnd.dolby.pl2z +# audio/vnd.dolby.pulse.1 +audio/vnd.dra dra +audio/vnd.dts dts +audio/vnd.dts.hd dtshd +# audio/vnd.dvb.file +# audio/vnd.everad.plj +# audio/vnd.hns.audio +audio/vnd.lucent.voice lvp +audio/vnd.ms-playready.media.pya pya +# audio/vnd.nokia.mobile-xmf +# audio/vnd.nortel.vbk +audio/vnd.nuera.ecelp4800 ecelp4800 +audio/vnd.nuera.ecelp7470 ecelp7470 +audio/vnd.nuera.ecelp9600 ecelp9600 +# audio/vnd.octel.sbc +# audio/vnd.qcelp +# audio/vnd.rhetorex.32kadpcm +audio/vnd.rip rip +# audio/vnd.sealedmedia.softseal.mpeg +# audio/vnd.vmx.cvsd +# audio/vorbis +# audio/vorbis-config +audio/webm weba +audio/x-aac aac +audio/x-aiff aif aiff aifc +audio/x-caf caf +audio/x-flac flac +audio/x-matroska mka +audio/x-mpegurl m3u +audio/x-ms-wax wax +audio/x-ms-wma wma +audio/x-pn-realaudio ram ra +audio/x-pn-realaudio-plugin rmp +# audio/x-tta +audio/x-wav wav +audio/xm xm +chemical/x-cdx cdx +chemical/x-cif cif +chemical/x-cmdf cmdf +chemical/x-cml cml +chemical/x-csml csml +# chemical/x-pdb +chemical/x-xyz xyz +image/bmp bmp +image/cgm cgm +# image/example +# image/fits +image/g3fax g3 +image/gif gif +image/ief ief +# image/jp2 +image/jpeg jpeg jpg jpe +# image/jpm +# image/jpx +image/ktx ktx +# image/naplps +image/png png +image/prs.btif btif +# image/prs.pti +image/sgi sgi +image/svg+xml svg svgz +# image/t38 +image/tiff tiff tif +# image/tiff-fx +image/vnd.adobe.photoshop psd +# image/vnd.cns.inf2 +image/vnd.dece.graphic uvi uvvi uvg uvvg +image/vnd.dvb.subtitle sub +image/vnd.djvu djvu djv +image/vnd.dwg dwg +image/vnd.dxf dxf +image/vnd.fastbidsheet fbs +image/vnd.fpx fpx +image/vnd.fst fst +image/vnd.fujixerox.edmics-mmr mmr +image/vnd.fujixerox.edmics-rlc rlc +# image/vnd.globalgraphics.pgb +# image/vnd.microsoft.icon +# image/vnd.mix +image/vnd.ms-modi mdi +image/vnd.ms-photo wdp +image/vnd.net-fpx npx +# image/vnd.radiance +# image/vnd.sealed.png +# image/vnd.sealedmedia.softseal.gif +# image/vnd.sealedmedia.softseal.jpg +# image/vnd.svf +image/vnd.wap.wbmp wbmp +image/vnd.xiff xif +image/webp webp +image/x-3ds 3ds +image/x-cmu-raster ras +image/x-cmx cmx +image/x-freehand fh fhc fh4 fh5 fh7 +image/x-icon ico +image/x-mrsid-image sid +image/x-pcx pcx +image/x-pict pic pct +image/x-portable-anymap pnm +image/x-portable-bitmap pbm +image/x-portable-graymap pgm +image/x-portable-pixmap ppm +image/x-rgb rgb +image/x-tga tga +image/x-xbitmap xbm +image/x-xpixmap xpm +image/x-xwindowdump xwd +# message/cpim +# message/delivery-status +# message/disposition-notification +# message/example +# message/external-body +# message/feedback-report +# message/global +# message/global-delivery-status +# message/global-disposition-notification +# message/global-headers +# message/http +# message/imdn+xml +# message/news +# message/partial +message/rfc822 eml mime +# message/s-http +# message/sip +# message/sipfrag +# message/tracking-status +# message/vnd.si.simp +# model/example +model/iges igs iges +model/mesh msh mesh silo +model/vnd.collada+xml dae +model/vnd.dwf dwf +# model/vnd.flatland.3dml +model/vnd.gdl gdl +# model/vnd.gs-gdl +# model/vnd.gs.gdl +model/vnd.gtw gtw +# model/vnd.moml+xml +model/vnd.mts mts +# model/vnd.parasolid.transmit.binary +# model/vnd.parasolid.transmit.text +model/vnd.vtu vtu +model/vrml wrl vrml +model/x3d+binary x3db x3dbz +model/x3d+vrml x3dv x3dvz +model/x3d+xml x3d x3dz +# multipart/alternative +# multipart/appledouble +# multipart/byteranges +# multipart/digest +# multipart/encrypted +# multipart/example +# multipart/form-data +# multipart/header-set +# multipart/mixed +# multipart/parallel +# multipart/related +# multipart/report +# multipart/signed +# multipart/voice-message +# text/1d-interleaved-parityfec +text/cache-manifest appcache +text/calendar ics ifb +text/css css +text/csv csv +# text/directory +# text/dns +# text/ecmascript +# text/enriched +# text/example +# text/fwdred +text/html html htm +# text/javascript +text/n3 n3 +# text/parityfec +text/plain txt text conf def list log in +# text/prs.fallenstein.rst +text/prs.lines.tag dsc +# text/vnd.radisys.msml-basic-layout +# text/red +# text/rfc822-headers +text/richtext rtx +# text/rtf +# text/rtp-enc-aescm128 +# text/rtx +text/sgml sgml sgm +# text/t140 +text/tab-separated-values tsv +text/troff t tr roff man me ms +text/turtle ttl +# text/ulpfec +text/uri-list uri uris urls +text/vcard vcard +# text/vnd.abc +text/vnd.curl curl +text/vnd.curl.dcurl dcurl +text/vnd.curl.scurl scurl +text/vnd.curl.mcurl mcurl +# text/vnd.dmclientscript +text/vnd.dvb.subtitle sub +# text/vnd.esmertec.theme-descriptor +text/vnd.fly fly +text/vnd.fmi.flexstor flx +text/vnd.graphviz gv +text/vnd.in3d.3dml 3dml +text/vnd.in3d.spot spot +# text/vnd.iptc.newsml +# text/vnd.iptc.nitf +# text/vnd.latex-z +# text/vnd.motorola.reflex +# text/vnd.ms-mediapackage +# text/vnd.net2phone.commcenter.command +# text/vnd.si.uricatalogue +text/vnd.sun.j2me.app-descriptor jad +# text/vnd.trolltech.linguist +# text/vnd.wap.si +# text/vnd.wap.sl +text/vnd.wap.wml wml +text/vnd.wap.wmlscript wmls +text/x-asm s asm +text/x-c c cc cxx cpp h hh dic +text/x-fortran f for f77 f90 +text/x-java-source java +text/x-opml opml +text/x-pascal p pas +text/x-nfo nfo +text/x-setext etx +text/x-sfv sfv +text/x-uuencode uu +text/x-vcalendar vcs +text/x-vcard vcf +# text/xml +# text/xml-external-parsed-entity +# video/1d-interleaved-parityfec +video/3gpp 3gp +# video/3gpp-tt +video/3gpp2 3g2 +# video/bmpeg +# video/bt656 +# video/celb +# video/dv +# video/example +video/h261 h261 +video/h263 h263 +# video/h263-1998 +# video/h263-2000 +video/h264 h264 +# video/h264-rcdo +# video/h264-svc +video/jpeg jpgv +# video/jpeg2000 +video/jpm jpm jpgm +video/mj2 mj2 mjp2 +# video/mp1s +# video/mp2p +# video/mp2t +video/mp4 mp4 mp4v mpg4 +# video/mp4v-es +video/mpeg mpeg mpg mpe m1v m2v +# video/mpeg4-generic +# video/mpv +# video/nv +video/ogg ogv +# video/parityfec +# video/pointer +video/quicktime qt mov +# video/raw +# video/rtp-enc-aescm128 +# video/rtx +# video/smpte292m +# video/ulpfec +# video/vc1 +# video/vnd.cctv +video/vnd.dece.hd uvh uvvh +video/vnd.dece.mobile uvm uvvm +# video/vnd.dece.mp4 +video/vnd.dece.pd uvp uvvp +video/vnd.dece.sd uvs uvvs +video/vnd.dece.video uvv uvvv +# video/vnd.directv.mpeg +# video/vnd.directv.mpeg-tts +# video/vnd.dlna.mpeg-tts +video/vnd.dvb.file dvb +video/vnd.fvt fvt +# video/vnd.hns.video +# video/vnd.iptvforum.1dparityfec-1010 +# video/vnd.iptvforum.1dparityfec-2005 +# video/vnd.iptvforum.2dparityfec-1010 +# video/vnd.iptvforum.2dparityfec-2005 +# video/vnd.iptvforum.ttsavc +# video/vnd.iptvforum.ttsmpeg2 +# video/vnd.motorola.video +# video/vnd.motorola.videop +video/vnd.mpegurl mxu m4u +video/vnd.ms-playready.media.pyv pyv +# video/vnd.nokia.interleaved-multimedia +# video/vnd.nokia.videovoip +# video/vnd.objectvideo +# video/vnd.sealed.mpeg1 +# video/vnd.sealed.mpeg4 +# video/vnd.sealed.swf +# video/vnd.sealedmedia.softseal.mov +video/vnd.uvvu.mp4 uvu uvvu +video/vnd.vivo viv +video/webm webm +video/x-f4v f4v +video/x-fli fli +video/x-flv flv +video/x-m4v m4v +video/x-matroska mkv mk3d mks +video/x-mng mng +video/x-ms-asf asf asx +video/x-ms-vob vob +video/x-ms-wm wm +video/x-ms-wmv wmv +video/x-ms-wmx wmx +video/x-ms-wvx wvx +video/x-msvideo avi +video/x-sgi-movie movie +video/x-smv smv +x-conference/x-cooltalk ice diff --git a/core-java/src/test/resources/product.png b/core-java/src/test/resources/product.png new file mode 100644 index 0000000000000000000000000000000000000000..4edd01c0a1795e469b0a4e8014eda04e5509fd38 GIT binary patch literal 55272 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

!F}al|RZ5mX=N`=8o&a0fK9-gq6TJJ5(FIb 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 Date: Sat, 21 Jul 2018 19:01:22 +0300 Subject: [PATCH 09/20] update to spring 5 --- spring-security-rest-basic-auth/pom.xml | 13 +++++-------- .../filter/CustomWebSecurityConfigurerAdapter.java | 10 +++++++++- .../main/java/org/baeldung/spring/WebConfig.java | 4 ++-- .../src/main/resources/webSecurityConfig.xml | 10 ++++++---- .../src/main/webapp/WEB-INF/api-servlet.xml | 2 +- 5 files changed, 23 insertions(+), 16 deletions(-) diff --git a/spring-security-rest-basic-auth/pom.xml b/spring-security-rest-basic-auth/pom.xml index be351870cd..61a144db0c 100644 --- a/spring-security-rest-basic-auth/pom.xml +++ b/spring-security-rest-basic-auth/pom.xml @@ -10,9 +10,9 @@ com.baeldung - parent-spring-4 + parent-spring-5 0.0.1-SNAPSHOT - ../parent-spring-4 + ../parent-spring-5 @@ -22,12 +22,12 @@ org.springframework.security spring-security-web - ${org.springframework.security.version} + ${spring.version} org.springframework.security spring-security-config - ${org.springframework.security.version} + ${spring.version} @@ -96,7 +96,7 @@ com.fasterxml.jackson.core jackson-databind - ${jackson.version} + ${jackson-databind.version} @@ -270,8 +270,6 @@ - - 4.2.6.RELEASE 4.4.5 @@ -280,7 +278,6 @@ 1.2 3.1.0 - 2.8.5 19.0 diff --git a/spring-security-rest-basic-auth/src/main/java/org/baeldung/filter/CustomWebSecurityConfigurerAdapter.java b/spring-security-rest-basic-auth/src/main/java/org/baeldung/filter/CustomWebSecurityConfigurerAdapter.java index 2ff0e30f94..7ca2a80c52 100644 --- a/spring-security-rest-basic-auth/src/main/java/org/baeldung/filter/CustomWebSecurityConfigurerAdapter.java +++ b/spring-security-rest-basic-auth/src/main/java/org/baeldung/filter/CustomWebSecurityConfigurerAdapter.java @@ -2,11 +2,14 @@ package org.baeldung.filter; import org.baeldung.security.RestAuthenticationEntryPoint; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.web.authentication.www.BasicAuthenticationFilter; @Configuration @@ -20,7 +23,7 @@ public class CustomWebSecurityConfigurerAdapter extends WebSecurityConfigurerAda auth .inMemoryAuthentication() .withUser("user1") - .password("user1Pass") + .password(passwordEncoder().encode("user1Pass")) .authorities("ROLE_USER"); } @@ -38,4 +41,9 @@ public class CustomWebSecurityConfigurerAdapter extends WebSecurityConfigurerAda http.addFilterAfter(new CustomFilter(), BasicAuthenticationFilter.class); } + + @Bean + public PasswordEncoder passwordEncoder() { + return new BCryptPasswordEncoder(); + } } diff --git a/spring-security-rest-basic-auth/src/main/java/org/baeldung/spring/WebConfig.java b/spring-security-rest-basic-auth/src/main/java/org/baeldung/spring/WebConfig.java index 8c3d677af6..2305a7b6c2 100644 --- a/spring-security-rest-basic-auth/src/main/java/org/baeldung/spring/WebConfig.java +++ b/spring-security-rest-basic-auth/src/main/java/org/baeldung/spring/WebConfig.java @@ -7,12 +7,13 @@ import org.springframework.context.annotation.Configuration; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import org.springframework.web.servlet.config.annotation.EnableWebMvc; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; @Configuration @EnableWebMvc @ComponentScan("org.baeldung.web") -public class WebConfig extends WebMvcConfigurerAdapter { +public class WebConfig implements WebMvcConfigurer { public WebConfig() { super(); @@ -22,7 +23,6 @@ public class WebConfig extends WebMvcConfigurerAdapter { @Override public void configureMessageConverters(final List> converters) { - super.configureMessageConverters(converters); converters.add(new MappingJackson2HttpMessageConverter()); } diff --git a/spring-security-rest-basic-auth/src/main/resources/webSecurityConfig.xml b/spring-security-rest-basic-auth/src/main/resources/webSecurityConfig.xml index 6dea965d8b..a93dc841b6 100644 --- a/spring-security-rest-basic-auth/src/main/resources/webSecurityConfig.xml +++ b/spring-security-rest-basic-auth/src/main/resources/webSecurityConfig.xml @@ -2,25 +2,27 @@ - + - + + + \ No newline at end of file diff --git a/spring-security-rest-basic-auth/src/main/webapp/WEB-INF/api-servlet.xml b/spring-security-rest-basic-auth/src/main/webapp/WEB-INF/api-servlet.xml index 4ba9642448..1dbff70b83 100644 --- a/spring-security-rest-basic-auth/src/main/webapp/WEB-INF/api-servlet.xml +++ b/spring-security-rest-basic-auth/src/main/webapp/WEB-INF/api-servlet.xml @@ -1,6 +1,6 @@ + xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd" > \ No newline at end of file From 8f52c3f6d3c84cd9d63b51aa45f283c2b727086f Mon Sep 17 00:00:00 2001 From: myluckagain Date: Sat, 21 Jul 2018 21:23:02 +0500 Subject: [PATCH 10/20] Bael 2018 (#4774) * BAEL-2018 * Update Animal.java * rename * tests added * generic type shorten --- .../ConvertListToMapService.java | 20 ++---- .../ConvertListToMapServiceUnitTest.java | 12 +--- ...tWithDiplicatedIdToMapServiceUnitTest.java | 68 +++++++++++++++++++ 3 files changed, 76 insertions(+), 24 deletions(-) create mode 100644 core-java-8/src/test/java/com/baeldung/convertlisttomap/ConvertListWithDiplicatedIdToMapServiceUnitTest.java diff --git a/core-java-8/src/main/java/com/baeldung/convertlisttomap/ConvertListToMapService.java b/core-java-8/src/main/java/com/baeldung/convertlisttomap/ConvertListToMapService.java index 679e753c56..88fc175f38 100644 --- a/core-java-8/src/main/java/com/baeldung/convertlisttomap/ConvertListToMapService.java +++ b/core-java-8/src/main/java/com/baeldung/convertlisttomap/ConvertListToMapService.java @@ -5,14 +5,15 @@ import java.util.List; import java.util.Map; import java.util.stream.Collectors; -import org.apache.commons.collections4.IterableUtils; import org.apache.commons.collections4.MapUtils; import com.google.common.collect.Maps; public class ConvertListToMapService { public Map convertListBeforeJava8(List list) { - Map map = new HashMap(); + + Map map = new HashMap<>(); + for (Animal animal : list) { map.put(animal.getId(), animal); } @@ -30,20 +31,9 @@ public class ConvertListToMapService { return map; } - public Map convertListWithApacheCommons1(List list) { + public Map convertListWithApacheCommons(List list) { - Map map = new HashMap(); - - IterableUtils.forEach(list, animal -> { - map.put(animal.getId(), animal); - }); - - return map; - } - - public Map convertListWithApacheCommons2(List list) { - - Map map = new HashMap(); + Map map = new HashMap<>(); MapUtils.populateMap(map, list, Animal::getId); diff --git a/core-java-8/src/test/java/com/baeldung/convertlisttomap/ConvertListToMapServiceUnitTest.java b/core-java-8/src/test/java/com/baeldung/convertlisttomap/ConvertListToMapServiceUnitTest.java index 4e78af08cd..a4234d2af4 100644 --- a/core-java-8/src/test/java/com/baeldung/convertlisttomap/ConvertListToMapServiceUnitTest.java +++ b/core-java-8/src/test/java/com/baeldung/convertlisttomap/ConvertListToMapServiceUnitTest.java @@ -29,6 +29,7 @@ public class ConvertListToMapServiceUnitTest { list.add(cow); Animal goat = new Animal(5, "Goat"); list.add(goat); + } @Test @@ -56,18 +57,11 @@ public class ConvertListToMapServiceUnitTest { } @Test - public void givenAList_whenConvertWithApacheCommons1_thenReturnMapWithTheSameElements() { + public void givenAList_whenConvertWithApacheCommons_thenReturnMapWithTheSameElements() { - Map map = convertListService.convertListWithApacheCommons1(list); + Map map = convertListService.convertListWithApacheCommons(list); assertThat(map.values(), containsInAnyOrder(list.toArray())); } - @Test - public void givenAList_whenConvertWithApacheCommons2_thenReturnMapWithTheSameElements() { - - Map map = convertListService.convertListWithApacheCommons2(list); - - assertThat(map.values(), containsInAnyOrder(list.toArray())); - } } diff --git a/core-java-8/src/test/java/com/baeldung/convertlisttomap/ConvertListWithDiplicatedIdToMapServiceUnitTest.java b/core-java-8/src/test/java/com/baeldung/convertlisttomap/ConvertListWithDiplicatedIdToMapServiceUnitTest.java new file mode 100644 index 0000000000..6d3ad9e76e --- /dev/null +++ b/core-java-8/src/test/java/com/baeldung/convertlisttomap/ConvertListWithDiplicatedIdToMapServiceUnitTest.java @@ -0,0 +1,68 @@ +package com.baeldung.convertlisttomap; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.hasItem; +import static org.hamcrest.Matchers.hasSize; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.junit.Before; +import org.junit.Test; + +public class ConvertListWithDiplicatedIdToMapServiceUnitTest { + List duplicatedIdList; + + private ConvertListToMapService convertListService = new ConvertListToMapService(); + + @Before + public void init() { + + this.duplicatedIdList = new ArrayList<>(); + + Animal cat = new Animal(1, "Cat"); + duplicatedIdList.add(cat); + Animal dog = new Animal(2, "Dog"); + duplicatedIdList.add(dog); + Animal pig = new Animal(3, "Pig"); + duplicatedIdList.add(pig); + Animal cow = new Animal(4, "Cow"); + duplicatedIdList.add(cow); + Animal goat = new Animal(4, "Goat"); + duplicatedIdList.add(goat); + + } + + @Test + public void givenADupIdList_whenConvertBeforeJava8_thenReturnMapWithRewrittenElement() { + + Map map = convertListService.convertListBeforeJava8(duplicatedIdList); + + assertThat(map.values(), hasSize(4)); + assertThat(map.values(), hasItem(duplicatedIdList.get(4))); + } + + @Test + public void givenADupIdList_whenConvertWithApacheCommons_thenReturnMapWithRewrittenElement() { + + Map map = convertListService.convertListWithApacheCommons(duplicatedIdList); + + assertThat(map.values(), hasSize(4)); + assertThat(map.values(), hasItem(duplicatedIdList.get(4))); + } + + @Test(expected = IllegalStateException.class) + public void givenADupIdList_whenConvertAfterJava8_thenException() { + + convertListService.convertListAfterJava8(duplicatedIdList); + } + + @Test(expected = IllegalArgumentException.class) + public void givenADupIdList_whenConvertWithGuava_thenException() { + + convertListService.convertListWithGuava(duplicatedIdList); + + } + +} From 9bda433a5a708354870d1da1f1e61ba21b7f4cb4 Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Sun, 22 Jul 2018 11:38:26 +0300 Subject: [PATCH 11/20] update test --- .../java/org/baeldung/client/RestClientLiveManualTest.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/spring-security-rest-basic-auth/src/test/java/org/baeldung/client/RestClientLiveManualTest.java b/spring-security-rest-basic-auth/src/test/java/org/baeldung/client/RestClientLiveManualTest.java index c27e306c08..104129b663 100644 --- a/spring-security-rest-basic-auth/src/test/java/org/baeldung/client/RestClientLiveManualTest.java +++ b/spring-security-rest-basic-auth/src/test/java/org/baeldung/client/RestClientLiveManualTest.java @@ -8,6 +8,9 @@ import java.io.IOException; import java.security.GeneralSecurityException; import java.security.cert.X509Certificate; +import javax.net.ssl.SSLException; +import javax.net.ssl.SSLPeerUnverifiedException; + import org.apache.http.HttpResponse; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.methods.HttpGet; @@ -16,6 +19,7 @@ import org.apache.http.conn.ssl.NoopHostnameVerifier; import org.apache.http.conn.ssl.SSLSocketFactory; import org.apache.http.conn.ssl.TrustStrategy; import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.impl.client.HttpClients; import org.junit.Ignore; import org.junit.Test; From a030afa5eaa0600f6dd9d8ea1b947707e868f101 Mon Sep 17 00:00:00 2001 From: Aravind Ranganathan Date: Sun, 22 Jul 2018 10:21:12 -0400 Subject: [PATCH 12/20] BAEL-1911 - Fixing author's review comments (#4782) * Strange git issue with README.MD, wouldn't revert the file * Fixing review comments * BAEL-1911 Refactored SQL code, fixed formatting --- spring-session/spring-session-jdbc/pom.xml | 23 ++--- .../SpringSessionJdbcApplication.java | 6 +- .../SpringSessionJdbcController.java | 11 +-- .../src/main/resources/application.properties | 6 -- .../src/main/resources/templates/index.html | 17 ---- .../SpringSessionJdbcApplicationTests.java | 16 ---- .../SpringSessionJdbcIntegrationTest.java | 91 +++++++++++++++++++ 7 files changed, 105 insertions(+), 65 deletions(-) delete mode 100644 spring-session/spring-session-jdbc/src/main/resources/templates/index.html delete mode 100644 spring-session/spring-session-jdbc/src/test/java/com/baeldung/springsessionjdbc/SpringSessionJdbcApplicationTests.java create mode 100644 spring-session/spring-session-jdbc/src/test/java/com/baeldung/springsessionjdbc/SpringSessionJdbcIntegrationTest.java diff --git a/spring-session/spring-session-jdbc/pom.xml b/spring-session/spring-session-jdbc/pom.xml index ce119b3c74..ce6b5f5908 100644 --- a/spring-session/spring-session-jdbc/pom.xml +++ b/spring-session/spring-session-jdbc/pom.xml @@ -10,6 +10,10 @@ spring-session-jdbc Spring Session with JDBC tutorial + + 1.4.197 + + parent-boot-2 com.baeldung @@ -18,25 +22,18 @@ - - org.springframework.boot - spring-boot-starter-data-jpa - - - org.springframework.boot - spring-boot-starter-thymeleaf - org.springframework.boot spring-boot-starter-web org.springframework.session - spring-session-core + spring-session-jdbc com.h2database h2 + ${h2.version} runtime @@ -44,14 +41,6 @@ spring-boot-starter-test test - - org.springframework.session - spring-session-jdbc - - - - - diff --git a/spring-session/spring-session-jdbc/src/main/java/com/baeldung/springsessionjdbc/SpringSessionJdbcApplication.java b/spring-session/spring-session-jdbc/src/main/java/com/baeldung/springsessionjdbc/SpringSessionJdbcApplication.java index 727fa653ff..a3bc17aa49 100644 --- a/spring-session/spring-session-jdbc/src/main/java/com/baeldung/springsessionjdbc/SpringSessionJdbcApplication.java +++ b/spring-session/spring-session-jdbc/src/main/java/com/baeldung/springsessionjdbc/SpringSessionJdbcApplication.java @@ -6,7 +6,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class SpringSessionJdbcApplication { - public static void main(String[] args) { - SpringApplication.run(SpringSessionJdbcApplication.class, args); - } + public static void main(String[] args) { + SpringApplication.run(SpringSessionJdbcApplication.class, args); + } } diff --git a/spring-session/spring-session-jdbc/src/main/java/com/baeldung/springsessionjdbc/controller/SpringSessionJdbcController.java b/spring-session/spring-session-jdbc/src/main/java/com/baeldung/springsessionjdbc/controller/SpringSessionJdbcController.java index 0a68bbbfba..509a5f292b 100644 --- a/spring-session/spring-session-jdbc/src/main/java/com/baeldung/springsessionjdbc/controller/SpringSessionJdbcController.java +++ b/spring-session/spring-session-jdbc/src/main/java/com/baeldung/springsessionjdbc/controller/SpringSessionJdbcController.java @@ -24,20 +24,19 @@ public class SpringSessionJdbcController { } @PostMapping("/saveColor") - public String saveMessage(@RequestParam("color") String color, - HttpServletRequest request) { + public String saveMessage(@RequestParam("color") String color, HttpServletRequest request) { List favoriteColors = getFavColors(request.getSession()); if (!StringUtils.isEmpty(color)) { favoriteColors.add(color); - request.getSession(). - setAttribute("favoriteColors", favoriteColors); + request + .getSession() + .setAttribute("favoriteColors", favoriteColors); } return "redirect:/"; } private List getFavColors(HttpSession session) { - List favoriteColors = (List) session. - getAttribute("favoriteColors"); + List favoriteColors = (List) session.getAttribute("favoriteColors"); if (favoriteColors == null) { favoriteColors = new ArrayList<>(); } diff --git a/spring-session/spring-session-jdbc/src/main/resources/application.properties b/spring-session/spring-session-jdbc/src/main/resources/application.properties index 95f14559ce..119638de31 100644 --- a/spring-session/spring-session-jdbc/src/main/resources/application.properties +++ b/spring-session/spring-session-jdbc/src/main/resources/application.properties @@ -1,9 +1,3 @@ spring.session.store-type=jdbc -#spring.session.jdbc.initialize-schema=embedded -#spring.session.jdbc.table-name=SPRING_SESSION -#server.servlet.session.timeout=60s -#spring.datasource.url=jdbc:h2:mem:AZ -#spring.security.user.name=admin -#spring.security.user.password=secret spring.h2.console.enabled=true spring.h2.console.path=/h2-console \ No newline at end of file diff --git a/spring-session/spring-session-jdbc/src/main/resources/templates/index.html b/spring-session/spring-session-jdbc/src/main/resources/templates/index.html deleted file mode 100644 index 51f6bbee2f..0000000000 --- a/spring-session/spring-session-jdbc/src/main/resources/templates/index.html +++ /dev/null @@ -1,17 +0,0 @@ - - - - - Spring Session JDBC - - -

-
- - -
-
-

Session ID -

-

My favorite color(s) -

- - \ No newline at end of file diff --git a/spring-session/spring-session-jdbc/src/test/java/com/baeldung/springsessionjdbc/SpringSessionJdbcApplicationTests.java b/spring-session/spring-session-jdbc/src/test/java/com/baeldung/springsessionjdbc/SpringSessionJdbcApplicationTests.java deleted file mode 100644 index 9975e51784..0000000000 --- a/spring-session/spring-session-jdbc/src/test/java/com/baeldung/springsessionjdbc/SpringSessionJdbcApplicationTests.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.baeldung.springsessionjdbc; - -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 SpringSessionJdbcApplicationTests { - - @Test - public void contextLoads() { - } - -} diff --git a/spring-session/spring-session-jdbc/src/test/java/com/baeldung/springsessionjdbc/SpringSessionJdbcIntegrationTest.java b/spring-session/spring-session-jdbc/src/test/java/com/baeldung/springsessionjdbc/SpringSessionJdbcIntegrationTest.java new file mode 100644 index 0000000000..2dcc0b3af8 --- /dev/null +++ b/spring-session/spring-session-jdbc/src/test/java/com/baeldung/springsessionjdbc/SpringSessionJdbcIntegrationTest.java @@ -0,0 +1,91 @@ +package com.baeldung.springsessionjdbc; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.FixMethodOrder; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.MethodSorters; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.web.client.TestRestTemplate; +import org.springframework.boot.web.server.LocalServerPort; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.ObjectInput; +import java.io.ObjectInputStream; +import java.sql.*; +import java.util.ArrayList; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +@RunWith(SpringRunner.class) +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +@FixMethodOrder(MethodSorters.NAME_ASCENDING) +public class SpringSessionJdbcIntegrationTest { + + @LocalServerPort + private int port; + + @Autowired + private TestRestTemplate testRestTemplate; + + @Before + public void setup() throws ClassNotFoundException { + Class.forName("org.h2.Driver"); + } + + @Test + public void givenApiHasStarted_whenH2DbIsQueried_thenSessionTablesAreEmpty() throws SQLException { + Assert.assertEquals(0, getSessionIdsFromDatabase().size()); + Assert.assertEquals(0, getSessionAttributeBytesFromDatabase().size()); + } + + @Test + public void givenGetInvoked_whenH2DbIsQueried_thenOneSessionIsCreated() throws SQLException { + assertThat(this.testRestTemplate.getForObject("http://localhost:" + port + "/", String.class)).isNotEmpty(); + Assert.assertEquals(1, getSessionIdsFromDatabase().size()); + } + + @Test + public void givenPostInvoked_whenH2DbIsQueried_thenSessionAttributeIsRetrieved() throws ClassNotFoundException, SQLException, IOException { + MultiValueMap map = new LinkedMultiValueMap<>(); + map.add("color", "red"); + this.testRestTemplate.postForObject("http://localhost:" + port + "/saveColor", map, String.class); + List queryResponse = getSessionAttributeBytesFromDatabase(); + Assert.assertEquals(1, queryResponse.size()); + ObjectInput in = new ObjectInputStream(new ByteArrayInputStream(queryResponse.get(0))); + List obj = (List) in.readObject(); //Deserialize byte[] to object + Assert.assertEquals("red", obj.get(0)); + } + + private List getSessionIdsFromDatabase() throws SQLException { + List result = new ArrayList<>(); + ResultSet rs = getResultSet("SELECT * FROM SPRING_SESSION"); + while (rs.next()) { + result.add(rs.getString("SESSION_ID")); + } + return result; + } + + private List getSessionAttributeBytesFromDatabase() throws SQLException { + List result = new ArrayList<>(); + ResultSet rs = getResultSet("SELECT * FROM SPRING_SESSION_ATTRIBUTES"); + while (rs.next()) { + result.add(rs.getBytes("ATTRIBUTE_BYTES")); + } + return result; + } + + private ResultSet getResultSet(String sql) throws SQLException { + Connection conn = DriverManager.getConnection("jdbc:h2:mem:testdb", "sa", ""); + Statement stat = conn.createStatement(); + return stat.executeQuery(sql); + } + +} From c0525c53c45a9269f2f8617f854822ad4095ccb2 Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Sun, 22 Jul 2018 21:46:45 +0300 Subject: [PATCH 13/20] fix swagger parent --- .../spring-swagger-codegen-api-client/pom.xml | 1 + .../spring-swagger-codegen-app/pom.xml | 11 +++++++---- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/spring-swagger-codegen/spring-swagger-codegen-api-client/pom.xml b/spring-swagger-codegen/spring-swagger-codegen-api-client/pom.xml index d5162e78ba..aac6fe9843 100644 --- a/spring-swagger-codegen/spring-swagger-codegen-api-client/pom.xml +++ b/spring-swagger-codegen/spring-swagger-codegen-api-client/pom.xml @@ -37,6 +37,7 @@ com.baeldung spring-swagger-codegen 0.0.1-SNAPSHOT + ../../spring-swagger-codegen diff --git a/spring-swagger-codegen/spring-swagger-codegen-app/pom.xml b/spring-swagger-codegen/spring-swagger-codegen-app/pom.xml index dca3832438..ece534dc74 100644 --- a/spring-swagger-codegen/spring-swagger-codegen-app/pom.xml +++ b/spring-swagger-codegen/spring-swagger-codegen-app/pom.xml @@ -5,11 +5,12 @@ com.baeldung spring-swagger-codegen-app 0.0.1-SNAPSHOT - + - org.springframework.boot - spring-boot-starter-parent - 1.5.10.RELEASE + com.baeldung + spring-swagger-codegen + 0.0.1-SNAPSHOT + ../../spring-swagger-codegen @@ -21,6 +22,7 @@ org.springframework.boot spring-boot-starter-web + ${spring.version} @@ -36,6 +38,7 @@ 1.8 0.0.1-SNAPSHOT + 1.5.10.RELEASE \ No newline at end of file From 3ab10f18f9003f449f69e046b059e113d084c8f3 Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Sun, 22 Jul 2018 22:09:26 +0300 Subject: [PATCH 14/20] Update pom.xml --- spring-swagger-codegen/spring-swagger-codegen-api-client/pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-swagger-codegen/spring-swagger-codegen-api-client/pom.xml b/spring-swagger-codegen/spring-swagger-codegen-api-client/pom.xml index aac6fe9843..8815e9bbe1 100644 --- a/spring-swagger-codegen/spring-swagger-codegen-api-client/pom.xml +++ b/spring-swagger-codegen/spring-swagger-codegen-api-client/pom.xml @@ -233,3 +233,4 @@ 1.10 + From c6f052ecf357fc2c9a64f5047489313e18a20c83 Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Sun, 22 Jul 2018 22:36:07 +0300 Subject: [PATCH 15/20] Update pom.xml --- spring-swagger-codegen/spring-swagger-codegen-api-client/pom.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/spring-swagger-codegen/spring-swagger-codegen-api-client/pom.xml b/spring-swagger-codegen/spring-swagger-codegen-api-client/pom.xml index 8815e9bbe1..aac6fe9843 100644 --- a/spring-swagger-codegen/spring-swagger-codegen-api-client/pom.xml +++ b/spring-swagger-codegen/spring-swagger-codegen-api-client/pom.xml @@ -233,4 +233,3 @@ 1.10 - From 2fec9da2d5dd5955e0d1bd1e09873636132c1a70 Mon Sep 17 00:00:00 2001 From: Felipe Santiago Corro Date: Sun, 22 Jul 2018 17:36:51 -0300 Subject: [PATCH 16/20] Overriding System time for testing (#4779) * Overriding System time for testing * Remove Joda Date Time examples --- core-java-8/pom.xml | 11 +++++++++++ .../aspect/ChangeCallsToCurrentTimeInMillisMethod.aj | 9 +++++++++ .../com/baeldung/util/CurrentDateTimeUnitTest.java | 4 +++- 3 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 core-java-8/src/main/java/com/baeldung/aspect/ChangeCallsToCurrentTimeInMillisMethod.aj diff --git a/core-java-8/pom.xml b/core-java-8/pom.xml index dee0634951..7e3b8cb280 100644 --- a/core-java-8/pom.xml +++ b/core-java-8/pom.xml @@ -99,6 +99,16 @@ joda-time ${joda.version}
+ + org.aspectj + aspectjrt + ${asspectj.version} + + + org.aspectj + aspectjweaver + ${asspectj.version} +
@@ -170,6 +180,7 @@ 2.10 3.6.1 + 1.8.9 1.7.0 1.19 1.19 diff --git a/core-java-8/src/main/java/com/baeldung/aspect/ChangeCallsToCurrentTimeInMillisMethod.aj b/core-java-8/src/main/java/com/baeldung/aspect/ChangeCallsToCurrentTimeInMillisMethod.aj new file mode 100644 index 0000000000..b28bebfdaf --- /dev/null +++ b/core-java-8/src/main/java/com/baeldung/aspect/ChangeCallsToCurrentTimeInMillisMethod.aj @@ -0,0 +1,9 @@ +package com.baeldung.aspect; + +public aspect ChangeCallsToCurrentTimeInMillisMethod { + long around(): + call(public static native long java.lang.System.currentTimeMillis()) + && within(user.code.base.pckg.*) { + return 0; + } +} diff --git a/core-java-8/src/test/java/com/baeldung/util/CurrentDateTimeUnitTest.java b/core-java-8/src/test/java/com/baeldung/util/CurrentDateTimeUnitTest.java index 3ad3deb548..1689a5054d 100644 --- a/core-java-8/src/test/java/com/baeldung/util/CurrentDateTimeUnitTest.java +++ b/core-java-8/src/test/java/com/baeldung/util/CurrentDateTimeUnitTest.java @@ -1,6 +1,7 @@ package com.baeldung.util; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; import java.time.Clock; import java.time.Instant; @@ -9,6 +10,8 @@ import java.time.LocalTime; import java.time.ZoneId; import java.time.temporal.ChronoField; +import org.joda.time.DateTime; +import org.joda.time.DateTimeUtils; import org.junit.Test; public class CurrentDateTimeUnitTest { @@ -39,5 +42,4 @@ public class CurrentDateTimeUnitTest { assertEquals(clock.instant().getEpochSecond(), now.getEpochSecond()); } - } From ecb14dd83486138717305d5d2b04732ae79bb959 Mon Sep 17 00:00:00 2001 From: Adi Date: Sun, 22 Jul 2018 00:11:46 +0300 Subject: [PATCH 17/20] BAEL-1728: add java instrumentation --- core-java/pom.xml | 120 ++++++++++++++++++ .../instrumentation/agent/AtmTransformer.java | 70 ++++++++++ .../agent/MyInstrumentationAgent.java | 59 +++++++++ .../application/AgentLoader.java | 46 +++++++ .../instrumentation/application/Launcher.java | 14 ++ .../instrumentation/application/MyAtm.java | 19 +++ .../application/MyAtmApplication.java | 19 +++ .../src/main/resources/META-INF/MANIFEST.MF | 5 + core-java/src/main/resources/log4j2.xml | 13 ++ 9 files changed, 365 insertions(+) create mode 100644 core-java/src/main/java/com/baeldung/instrumentation/agent/AtmTransformer.java create mode 100644 core-java/src/main/java/com/baeldung/instrumentation/agent/MyInstrumentationAgent.java create mode 100644 core-java/src/main/java/com/baeldung/instrumentation/application/AgentLoader.java create mode 100644 core-java/src/main/java/com/baeldung/instrumentation/application/Launcher.java create mode 100644 core-java/src/main/java/com/baeldung/instrumentation/application/MyAtm.java create mode 100644 core-java/src/main/java/com/baeldung/instrumentation/application/MyAtmApplication.java create mode 100644 core-java/src/main/resources/META-INF/MANIFEST.MF create mode 100644 core-java/src/main/resources/log4j2.xml diff --git a/core-java/pom.xml b/core-java/pom.xml index 42e3219ac3..0b69685e14 100644 --- a/core-java/pom.xml +++ b/core-java/pom.xml @@ -173,6 +173,19 @@ c3p0 ${c3p0.version} + + + org.javassist + javassist + ${javaassist.version} + + + com.sun + tools + 1.8.0 + system + ${java.home}/../lib/tools.jar + @@ -400,6 +413,111 @@ + + + + buildAgentLoader + + + + org.apache.maven.plugins + maven-jar-plugin + + + package + + jar + + + agentLoader + target/classes + + + true + + ${project.build.outputDirectory}/META-INF/MANIFEST.MF + + + + com/baeldung/instrumentation/application/AgentLoader.class + com/baeldung/instrumentation/application/Launcher.class + + + + + + + + + + buildApplication + + + + org.apache.maven.plugins + maven-jar-plugin + + + package + + jar + + + application + target/classes + + + true + + ${project.build.outputDirectory}/META-INF/MANIFEST.MF + + + + com/baeldung/instrumentation/application/MyAtm.class + com/baeldung/instrumentation/application/MyAtmApplication.class + com/baeldung/instrumentation/application/Launcher.class + + + + + + + + + + buildAgent + + + + org.apache.maven.plugins + maven-jar-plugin + + + package + + jar + + + agent + target/classes + + + true + + ${project.build.outputDirectory}/META-INF/MANIFEST.MF + + + + com/baeldung/instrumentation/agent/AtmTransformer.class + com/baeldung/instrumentation/agent/MyInstrumentationAgent.class + + + + + + + + @@ -453,6 +571,8 @@ 1.18 0.1.5 + + 3.21.0-GA diff --git a/core-java/src/main/java/com/baeldung/instrumentation/agent/AtmTransformer.java b/core-java/src/main/java/com/baeldung/instrumentation/agent/AtmTransformer.java new file mode 100644 index 0000000000..3c83912f54 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/instrumentation/agent/AtmTransformer.java @@ -0,0 +1,70 @@ +package com.baeldung.instrumentation.agent; + +import javassist.CannotCompileException; +import javassist.ClassPool; +import javassist.CtClass; +import javassist.CtMethod; +import javassist.NotFoundException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.lang.instrument.ClassFileTransformer; +import java.lang.instrument.IllegalClassFormatException; +import java.security.ProtectionDomain; + +public class AtmTransformer implements ClassFileTransformer { + + private static Logger LOGGER = LoggerFactory.getLogger(AtmTransformer.class); + + private static final String WITHDRAW_MONEY_METHOD = "withdrawMoney"; + + /** The internal form class name of the class to transform */ + private String targetClassName; + /** The class loader of the class we want to transform */ + private ClassLoader targetClassLoader; + + public AtmTransformer(String targetClassName, ClassLoader targetClassLoader) { + this.targetClassName = targetClassName; + this.targetClassLoader = targetClassLoader; + } + + @Override + public byte[] transform(ClassLoader loader, String className, Class classBeingRedefined, + ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException { + byte[] byteCode = classfileBuffer; + + String finalTargetClassName = this.targetClassName.replaceAll("\\.", "/"); //replace . with / + if (!className.equals(finalTargetClassName)) { + return byteCode; + } + + if (className.equals(finalTargetClassName) && loader.equals(targetClassLoader)) { + LOGGER.info("[Agent] Transforming class MyAtm"); + try { + ClassPool cp = ClassPool.getDefault(); + CtClass cc = cp.get(targetClassName); + CtMethod m = cc.getDeclaredMethod(WITHDRAW_MONEY_METHOD); + m.addLocalVariable("startTime", CtClass.longType); + m.insertBefore("startTime = System.currentTimeMillis();"); + + StringBuilder endBlock = new StringBuilder(); + + m.addLocalVariable("endTime", CtClass.longType); + m.addLocalVariable("opTime", CtClass.longType); + endBlock.append("endTime = System.currentTimeMillis();"); + endBlock.append("opTime = (endTime-startTime)/1000;"); + + endBlock.append("LOGGER.info(\"[Application] Withdrawal operation completed in:\" + opTime + \" seconds!\");"); + + m.insertAfter(endBlock.toString()); + + byteCode = cc.toBytecode(); + cc.detach(); + } catch (NotFoundException | CannotCompileException | IOException e) { + LOGGER.error("Exception", e); + } + } + return byteCode; + } +} diff --git a/core-java/src/main/java/com/baeldung/instrumentation/agent/MyInstrumentationAgent.java b/core-java/src/main/java/com/baeldung/instrumentation/agent/MyInstrumentationAgent.java new file mode 100644 index 0000000000..685520276e --- /dev/null +++ b/core-java/src/main/java/com/baeldung/instrumentation/agent/MyInstrumentationAgent.java @@ -0,0 +1,59 @@ +package com.baeldung.instrumentation.agent; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.lang.instrument.Instrumentation; + +public class MyInstrumentationAgent { + private static Logger LOGGER = LoggerFactory.getLogger(MyInstrumentationAgent.class); + + public static void premain(String agentArgs, Instrumentation inst) { + LOGGER.info("[Agent] In premain method"); + + String className = "com.baeldung.instrumentation.application.MyAtm"; + transformClass(className,inst); + } + + public static void agentmain(String agentArgs, Instrumentation inst) { + LOGGER.info("[Agent] In agentmain method"); + + String className = "com.baeldung.instrumentation.application.MyAtm"; + transformClass(className,inst); + } + + private static void transformClass(String className, Instrumentation instrumentation) { + Class targetCls = null; + ClassLoader targetClassLoader = null; + // see if we can get the class using forName + try { + targetCls = Class.forName(className); + targetClassLoader = targetCls.getClassLoader(); + transform(targetCls, targetClassLoader, instrumentation); + return; + } catch (Exception ex) { + LOGGER.error("Class [{}] not found with Class.forName"); + } + // otherwise iterate all loaded classes and find what we want + for(Class clazz: instrumentation.getAllLoadedClasses()) { + if(clazz.getName().equals(className)) { + targetCls = clazz; + targetClassLoader = targetCls.getClassLoader(); + transform(targetCls, targetClassLoader, instrumentation); + return; + } + } + throw new RuntimeException("Failed to find class [" + className + "]"); + } + + private static void transform(Class clazz, ClassLoader classLoader, Instrumentation instrumentation) { + AtmTransformer dt = new AtmTransformer(clazz.getName(), classLoader); + instrumentation.addTransformer(dt, true); + try { + instrumentation.retransformClasses(clazz); + } catch (Exception ex) { + throw new RuntimeException("Transform failed for class: [" + clazz.getName() + "]", ex); + } + } + +} diff --git a/core-java/src/main/java/com/baeldung/instrumentation/application/AgentLoader.java b/core-java/src/main/java/com/baeldung/instrumentation/application/AgentLoader.java new file mode 100644 index 0000000000..2c1cd759a5 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/instrumentation/application/AgentLoader.java @@ -0,0 +1,46 @@ +package com.baeldung.instrumentation.application; + +import com.sun.tools.attach.VirtualMachine; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.File; +import java.util.Optional; + +/** + * Created by adi on 6/10/18. + */ +public class AgentLoader { + private static Logger LOGGER = LoggerFactory.getLogger(AgentLoader.class); + + public static void run(String[] args) { + String agentFilePath = "/home/adi/Desktop/agent-1.0.0-jar-with-dependencies.jar"; + String applicationName = "MyAtmApplication"; + + //iterate all jvms and get the first one that matches our application name + Optional jvmProcessOpt = Optional.ofNullable(VirtualMachine.list() + .stream() + .filter(jvm -> { + LOGGER.info("jvm:{}", jvm.displayName()); + return jvm.displayName().contains(applicationName); + }) + .findFirst().get().id()); + + if(!jvmProcessOpt.isPresent()) { + LOGGER.error("Target Application not found"); + return; + } + File agentFile = new File(agentFilePath); + try { + String jvmPid = jvmProcessOpt.get(); + LOGGER.info("Attaching to target JVM with PID: " + jvmPid); + VirtualMachine jvm = VirtualMachine.attach(jvmPid); + jvm.loadAgent(agentFile.getAbsolutePath()); + jvm.detach(); + LOGGER.info("Attached to target JVM and loaded Java agent successfully"); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + +} diff --git a/core-java/src/main/java/com/baeldung/instrumentation/application/Launcher.java b/core-java/src/main/java/com/baeldung/instrumentation/application/Launcher.java new file mode 100644 index 0000000000..87e494baab --- /dev/null +++ b/core-java/src/main/java/com/baeldung/instrumentation/application/Launcher.java @@ -0,0 +1,14 @@ +package com.baeldung.instrumentation.application; + +/** + * Created by adi on 6/14/18. + */ +public class Launcher { + public static void main(String[] args) throws Exception { + if(args[0].equals("StartMyAtmApplication")) { + new MyAtmApplication().run(args); + } else if(args[0].equals("LoadAgent")) { + new AgentLoader().run(args); + } + } +} diff --git a/core-java/src/main/java/com/baeldung/instrumentation/application/MyAtm.java b/core-java/src/main/java/com/baeldung/instrumentation/application/MyAtm.java new file mode 100644 index 0000000000..f826e82975 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/instrumentation/application/MyAtm.java @@ -0,0 +1,19 @@ +package com.baeldung.instrumentation.application; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Created by adi on 6/11/18. + */ +public class MyAtm { + private static Logger LOGGER = LoggerFactory.getLogger(MyAtm.class); + + private static final int account = 10; + + public static void withdrawMoney(int amount) throws InterruptedException { + Thread.sleep(2000l); //processing going on here + LOGGER.info("[Application] Successful Withdrawal of [{}] units!", amount); + + } +} diff --git a/core-java/src/main/java/com/baeldung/instrumentation/application/MyAtmApplication.java b/core-java/src/main/java/com/baeldung/instrumentation/application/MyAtmApplication.java new file mode 100644 index 0000000000..425511285e --- /dev/null +++ b/core-java/src/main/java/com/baeldung/instrumentation/application/MyAtmApplication.java @@ -0,0 +1,19 @@ +package com.baeldung.instrumentation.application; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class MyAtmApplication { + + private static Logger LOGGER = LoggerFactory.getLogger(MyAtmApplication.class); + + public static void run(String[] args) throws Exception { + LOGGER.info("[Application] Starting ATM application"); + MyAtm.withdrawMoney(Integer.parseInt(args[2])); + + Thread.sleep(Long.valueOf(args[1])); + + MyAtm.withdrawMoney(Integer.parseInt(args[3])); + } + +} diff --git a/core-java/src/main/resources/META-INF/MANIFEST.MF b/core-java/src/main/resources/META-INF/MANIFEST.MF new file mode 100644 index 0000000000..988de3193d --- /dev/null +++ b/core-java/src/main/resources/META-INF/MANIFEST.MF @@ -0,0 +1,5 @@ +Agent-Class: com.baeldung.instrumentation.agent.MyInstrumentationAgent +Can-Redefine-Classes: true +Can-Retransform-Classes: true +Premain-Class: com.baeldung.instrumentation.agent.MyInstrumentationAgent +Main-Class: com.baeldung.instrumentation.application.Launcher diff --git a/core-java/src/main/resources/log4j2.xml b/core-java/src/main/resources/log4j2.xml new file mode 100644 index 0000000000..a824bef9b0 --- /dev/null +++ b/core-java/src/main/resources/log4j2.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file From 0be7aa087f1ce1db4edc2f4fddc077c213cf8c25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Dupire?= Date: Mon, 23 Jul 2018 06:49:25 +0200 Subject: [PATCH 18/20] dupirefr/dupire.francois+pro@gmail.com [BAEL-1981] Spring data jpa dates (#4795) * [BAEL-1981] Article entity and repository + tests * [BAEL-1981] Removing unnecessary fields * [BAEL-1981] spring-data-jpa module creation --- pom.xml | 1 + spring-data-jpa/pom.xml | 26 +++++++++++++++++++ .../main/java/com/baeldung/Application.java | 14 ++++++++++ .../java/com/baeldung/domain/Article.java | 0 .../repository/ArticleRepository.java | 0 .../ArticleRepositoryIntegrationTest.java | 1 + .../src/test/resources/application.properties | 15 +++++++++++ .../src/test/resources/import_articles.sql | 0 8 files changed, 57 insertions(+) create mode 100644 spring-data-jpa/pom.xml create mode 100644 spring-data-jpa/src/main/java/com/baeldung/Application.java rename {spring-boot-persistence => spring-data-jpa}/src/main/java/com/baeldung/domain/Article.java (100%) rename {spring-boot-persistence => spring-data-jpa}/src/main/java/com/baeldung/repository/ArticleRepository.java (100%) rename {spring-boot-persistence => spring-data-jpa}/src/test/java/com/baeldung/repository/ArticleRepositoryIntegrationTest.java (97%) create mode 100644 spring-data-jpa/src/test/resources/application.properties rename {spring-boot-persistence => spring-data-jpa}/src/test/resources/import_articles.sql (100%) diff --git a/pom.xml b/pom.xml index 38812f09bf..f608f5cded 100644 --- a/pom.xml +++ b/pom.xml @@ -433,6 +433,7 @@ spring-data-couchbase-2 persistence-modules/spring-data-dynamodb spring-data-elasticsearch + spring-data-jpa spring-data-keyvalue spring-data-mongodb persistence-modules/spring-data-neo4j diff --git a/spring-data-jpa/pom.xml b/spring-data-jpa/pom.xml new file mode 100644 index 0000000000..517d43bd0e --- /dev/null +++ b/spring-data-jpa/pom.xml @@ -0,0 +1,26 @@ + + + + parent-boot-2 + com.baeldung + 0.0.1-SNAPSHOT + ../parent-boot-2 + + 4.0.0 + + spring-data-jpa + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + com.h2database + h2 + + + + \ No newline at end of file diff --git a/spring-data-jpa/src/main/java/com/baeldung/Application.java b/spring-data-jpa/src/main/java/com/baeldung/Application.java new file mode 100644 index 0000000000..43888c2d67 --- /dev/null +++ b/spring-data-jpa/src/main/java/com/baeldung/Application.java @@ -0,0 +1,14 @@ +package com.baeldung; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.ApplicationContext; + +@SpringBootApplication +public class Application { + private static ApplicationContext applicationContext; + + public static void main(String[] args) { + applicationContext = SpringApplication.run(Application.class, args); + } +} diff --git a/spring-boot-persistence/src/main/java/com/baeldung/domain/Article.java b/spring-data-jpa/src/main/java/com/baeldung/domain/Article.java similarity index 100% rename from spring-boot-persistence/src/main/java/com/baeldung/domain/Article.java rename to spring-data-jpa/src/main/java/com/baeldung/domain/Article.java diff --git a/spring-boot-persistence/src/main/java/com/baeldung/repository/ArticleRepository.java b/spring-data-jpa/src/main/java/com/baeldung/repository/ArticleRepository.java similarity index 100% rename from spring-boot-persistence/src/main/java/com/baeldung/repository/ArticleRepository.java rename to spring-data-jpa/src/main/java/com/baeldung/repository/ArticleRepository.java diff --git a/spring-boot-persistence/src/test/java/com/baeldung/repository/ArticleRepositoryIntegrationTest.java b/spring-data-jpa/src/test/java/com/baeldung/repository/ArticleRepositoryIntegrationTest.java similarity index 97% rename from spring-boot-persistence/src/test/java/com/baeldung/repository/ArticleRepositoryIntegrationTest.java rename to spring-data-jpa/src/test/java/com/baeldung/repository/ArticleRepositoryIntegrationTest.java index 7d531d1461..dd1fe66a0d 100644 --- a/spring-boot-persistence/src/test/java/com/baeldung/repository/ArticleRepositoryIntegrationTest.java +++ b/spring-data-jpa/src/test/java/com/baeldung/repository/ArticleRepositoryIntegrationTest.java @@ -1,6 +1,7 @@ package com.baeldung.repository; import com.baeldung.domain.Article; +import com.baeldung.repository.ArticleRepository; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; diff --git a/spring-data-jpa/src/test/resources/application.properties b/spring-data-jpa/src/test/resources/application.properties new file mode 100644 index 0000000000..de6ee2e6b5 --- /dev/null +++ b/spring-data-jpa/src/test/resources/application.properties @@ -0,0 +1,15 @@ +# spring.datasource.x +spring.datasource.driver-class-name=org.h2.Driver +spring.datasource.url=jdbc:h2:mem:db;DB_CLOSE_DELAY=-1 +spring.datasource.username=sa +spring.datasource.password=sa + +# hibernate.X +hibernate.dialect=org.hibernate.dialect.H2Dialect +hibernate.show_sql=true +hibernate.hbm2ddl.auto=create-drop +hibernate.cache.use_second_level_cache=true +hibernate.cache.use_query_cache=true +hibernate.cache.region.factory_class=org.hibernate.cache.ehcache.EhCacheRegionFactory + +spring.datasource.data=import_articles.sql \ No newline at end of file diff --git a/spring-boot-persistence/src/test/resources/import_articles.sql b/spring-data-jpa/src/test/resources/import_articles.sql similarity index 100% rename from spring-boot-persistence/src/test/resources/import_articles.sql rename to spring-data-jpa/src/test/resources/import_articles.sql From e14abbfb581cd4176efaee56d270238d8ab5a55b Mon Sep 17 00:00:00 2001 From: Predrag Maric Date: Mon, 23 Jul 2018 07:41:59 +0200 Subject: [PATCH 19/20] BAEL-1818 lamdba instead of loop; isEmpty() instead of == 0 (#4791) --- .../connectionpool/connectionpools/BasicConnectionPool.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/core-java/src/main/java/com/baeldung/connectionpool/connectionpools/BasicConnectionPool.java b/core-java/src/main/java/com/baeldung/connectionpool/connectionpools/BasicConnectionPool.java index 243ec88eb5..1934d0cfc2 100644 --- a/core-java/src/main/java/com/baeldung/connectionpool/connectionpools/BasicConnectionPool.java +++ b/core-java/src/main/java/com/baeldung/connectionpool/connectionpools/BasicConnectionPool.java @@ -33,7 +33,7 @@ public class BasicConnectionPool implements ConnectionPool { @Override public Connection getConnection() throws SQLException { - if (connectionPool.size() == 0) { + if (connectionPool.isEmpty()) { if (usedConnections.size() < MAX_POOL_SIZE) { connectionPool.add(createConnection(url, user, password)); } else { @@ -76,9 +76,7 @@ public class BasicConnectionPool implements ConnectionPool { } public void shutdown() throws SQLException { - for (Connection c : usedConnections) { - this.releaseConnection(c); - } + usedConnections.forEach(this::releaseConnection); for (Connection c : connectionPool) { c.close(); } From 717bd1d48d556eb33b17c8f0ad031af436d0720c Mon Sep 17 00:00:00 2001 From: Predrag Maric Date: Mon, 23 Jul 2018 09:02:10 +0200 Subject: [PATCH 20/20] BAEL-2018 Moved to core-java-collections (#4796) --- .../java/com/baeldung/convertlisttomap/Animal.java | 0 .../convertlisttomap/ConvertListToMapService.java | 6 +++--- .../ConvertListToMapServiceUnitTest.java | 9 +++++---- ...onvertListWithDiplicatedIdToMapServiceUnitTest.java | 10 +++++----- 4 files changed, 13 insertions(+), 12 deletions(-) rename {core-java-8 => core-java-collections}/src/main/java/com/baeldung/convertlisttomap/Animal.java (100%) rename {core-java-8 => core-java-collections}/src/main/java/com/baeldung/convertlisttomap/ConvertListToMapService.java (100%) rename {core-java-8 => core-java-collections}/src/test/java/com/baeldung/convertlisttomap/ConvertListToMapServiceUnitTest.java (97%) rename {core-java-8 => core-java-collections}/src/test/java/com/baeldung/convertlisttomap/ConvertListWithDiplicatedIdToMapServiceUnitTest.java (100%) diff --git a/core-java-8/src/main/java/com/baeldung/convertlisttomap/Animal.java b/core-java-collections/src/main/java/com/baeldung/convertlisttomap/Animal.java similarity index 100% rename from core-java-8/src/main/java/com/baeldung/convertlisttomap/Animal.java rename to core-java-collections/src/main/java/com/baeldung/convertlisttomap/Animal.java diff --git a/core-java-8/src/main/java/com/baeldung/convertlisttomap/ConvertListToMapService.java b/core-java-collections/src/main/java/com/baeldung/convertlisttomap/ConvertListToMapService.java similarity index 100% rename from core-java-8/src/main/java/com/baeldung/convertlisttomap/ConvertListToMapService.java rename to core-java-collections/src/main/java/com/baeldung/convertlisttomap/ConvertListToMapService.java index 88fc175f38..6527d35742 100644 --- a/core-java-8/src/main/java/com/baeldung/convertlisttomap/ConvertListToMapService.java +++ b/core-java-collections/src/main/java/com/baeldung/convertlisttomap/ConvertListToMapService.java @@ -1,13 +1,13 @@ package com.baeldung.convertlisttomap; +import com.google.common.collect.Maps; +import org.apache.commons.collections4.MapUtils; + import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -import org.apache.commons.collections4.MapUtils; -import com.google.common.collect.Maps; - public class ConvertListToMapService { public Map convertListBeforeJava8(List list) { diff --git a/core-java-8/src/test/java/com/baeldung/convertlisttomap/ConvertListToMapServiceUnitTest.java b/core-java-collections/src/test/java/com/baeldung/convertlisttomap/ConvertListToMapServiceUnitTest.java similarity index 97% rename from core-java-8/src/test/java/com/baeldung/convertlisttomap/ConvertListToMapServiceUnitTest.java rename to core-java-collections/src/test/java/com/baeldung/convertlisttomap/ConvertListToMapServiceUnitTest.java index a4234d2af4..4d783f4525 100644 --- a/core-java-8/src/test/java/com/baeldung/convertlisttomap/ConvertListToMapServiceUnitTest.java +++ b/core-java-collections/src/test/java/com/baeldung/convertlisttomap/ConvertListToMapServiceUnitTest.java @@ -1,13 +1,14 @@ package com.baeldung.convertlisttomap; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.*; +import org.junit.Before; +import org.junit.Test; + import java.util.ArrayList; import java.util.List; import java.util.Map; -import org.junit.Before; -import org.junit.Test; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.containsInAnyOrder; public class ConvertListToMapServiceUnitTest { List list; diff --git a/core-java-8/src/test/java/com/baeldung/convertlisttomap/ConvertListWithDiplicatedIdToMapServiceUnitTest.java b/core-java-collections/src/test/java/com/baeldung/convertlisttomap/ConvertListWithDiplicatedIdToMapServiceUnitTest.java similarity index 100% rename from core-java-8/src/test/java/com/baeldung/convertlisttomap/ConvertListWithDiplicatedIdToMapServiceUnitTest.java rename to core-java-collections/src/test/java/com/baeldung/convertlisttomap/ConvertListWithDiplicatedIdToMapServiceUnitTest.java index 6d3ad9e76e..6e766433d1 100644 --- a/core-java-8/src/test/java/com/baeldung/convertlisttomap/ConvertListWithDiplicatedIdToMapServiceUnitTest.java +++ b/core-java-collections/src/test/java/com/baeldung/convertlisttomap/ConvertListWithDiplicatedIdToMapServiceUnitTest.java @@ -1,15 +1,15 @@ package com.baeldung.convertlisttomap; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.hasItem; -import static org.hamcrest.Matchers.hasSize; +import org.junit.Before; +import org.junit.Test; import java.util.ArrayList; import java.util.List; import java.util.Map; -import org.junit.Before; -import org.junit.Test; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.hasItem; +import static org.hamcrest.Matchers.hasSize; public class ConvertListWithDiplicatedIdToMapServiceUnitTest { List duplicatedIdList;