parent-boot-2
@@ -127,7 +127,6 @@
${azure.containerRegistry}.azurecr.io
1.1.0
1.1.0
- 1.8
diff --git a/blade/README.md b/blade/README.md
new file mode 100644
index 0000000000..d823de775f
--- /dev/null
+++ b/blade/README.md
@@ -0,0 +1,5 @@
+### Relevant Articles:
+
+- [Blade - A Complete GuideBook](http://www.baeldung.com/blade)
+
+Run Integration Tests with `mvn integration-test`
\ No newline at end of file
diff --git a/blade/pom.xml b/blade/pom.xml
new file mode 100644
index 0000000000..37615bed01
--- /dev/null
+++ b/blade/pom.xml
@@ -0,0 +1,205 @@
+
+
+ 4.0.0
+
+ com.baeldung
+ blade
+ 1.0.0-SNAPSHOT
+ blade
+
+
+
+
+
+
+
+
+
+
+
+ com.bladejava
+ blade-mvc
+ ${blade-mvc.version}
+
+
+
+ org.webjars
+ bootstrap
+ ${bootstrap.version}
+
+
+
+ org.apache.commons
+ commons-lang3
+ ${commons-lang3.version}
+
+
+
+
+ org.projectlombok
+ lombok
+ ${lombok.version}
+ provided
+
+
+
+
+ junit
+ junit
+ ${junit.version}
+ test
+
+
+ org.assertj
+ assertj-core
+ ${assertj-core.version}
+ test
+
+
+ org.apache.httpcomponents
+ httpclient
+ ${httpclient.version}
+ test
+
+
+ org.apache.httpcomponents
+ httpmime
+ ${httpmime.version}
+ test
+
+
+ org.apache.httpcomponents
+ httpcore
+ ${httpcore.version}
+ test
+
+
+
+ sample-blade-app
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+ ${maven-surefire-plugin.version}
+
+ 3
+ true
+
+ **/*LiveTest.java
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-failsafe-plugin
+ ${maven-failsafe-plugin.version}
+
+
+ **/*LiveTest.java
+
+
+
+
+
+ integration-test
+ verify
+
+
+
+
+
+
+ com.bazaarvoice.maven.plugins
+ process-exec-maven-plugin
+ ${process-exec-maven-plugin.version}
+
+
+
+ blade-process
+ pre-integration-test
+
+ start
+
+
+ Blade
+ false
+
+ java
+ -jar
+ sample-blade-app.jar
+
+
+
+
+
+
+ stop-all
+ post-integration-test
+
+ stop-all
+
+
+
+
+
+
+
+ maven-assembly-plugin
+ 3.1.0
+
+ ${project.build.finalName}
+ false
+
+
+ com.baeldung.blade.sample.App
+
+
+
+ jar-with-dependencies
+
+
+
+
+ make-assembly
+ package
+
+ single
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ ${maven-compiler-plugin.version}
+
+ ${maven.compiler.source}
+ ${maven.compiler.target}
+ UTF-8
+
+
+
+
+
+
+ 1.8
+ 1.8
+ 2.0.14.RELEASE
+ 4.2.1
+ 3.8.1
+ 1.18.4
+ 4.12
+ 4.5.6
+ 4.5.6
+ 4.4.10
+ 3.11.1
+ 3.0.0-M3
+ 0.7
+ 2.21.0
+ 3.7.0
+
+
diff --git a/blade/src/main/java/com/baeldung/blade/sample/App.java b/blade/src/main/java/com/baeldung/blade/sample/App.java
new file mode 100644
index 0000000000..f3f3d4aebd
--- /dev/null
+++ b/blade/src/main/java/com/baeldung/blade/sample/App.java
@@ -0,0 +1,38 @@
+package com.baeldung.blade.sample;
+
+import com.baeldung.blade.sample.interceptors.BaeldungMiddleware;
+import com.blade.Blade;
+import com.blade.event.EventType;
+import com.blade.mvc.WebContext;
+import com.blade.mvc.http.Session;
+
+public class App {
+
+ private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(App.class);
+
+ public static void main(String[] args) {
+
+ Blade.of()
+ .get("/", ctx -> ctx.render("index.html"))
+ .get("/basic-route-example", ctx -> ctx.text("GET called"))
+ .post("/basic-route-example", ctx -> ctx.text("POST called"))
+ .put("/basic-route-example", ctx -> ctx.text("PUT called"))
+ .delete("/basic-route-example", ctx -> ctx.text("DELETE called"))
+ .addStatics("/custom-static")
+ // .showFileList(true)
+ .enableCors(true)
+ .before("/user/*", ctx -> log.info("[NarrowedHook] Before '/user/*', URL called: " + ctx.uri()))
+ .on(EventType.SERVER_STARTED, e -> {
+ String version = WebContext.blade()
+ .env("app.version")
+ .orElse("N/D");
+ log.info("[Event::serverStarted] Loading 'app.version' from configuration, value: " + version);
+ })
+ .on(EventType.SESSION_CREATED, e -> {
+ Session session = (Session) e.attribute("session");
+ session.attribute("mySessionValue", "Baeldung");
+ })
+ .use(new BaeldungMiddleware())
+ .start(App.class, args);
+ }
+}
diff --git a/blade/src/main/java/com/baeldung/blade/sample/AttributesExampleController.java b/blade/src/main/java/com/baeldung/blade/sample/AttributesExampleController.java
new file mode 100644
index 0000000000..339ba701f7
--- /dev/null
+++ b/blade/src/main/java/com/baeldung/blade/sample/AttributesExampleController.java
@@ -0,0 +1,37 @@
+package com.baeldung.blade.sample;
+
+import com.blade.mvc.annotation.GetRoute;
+import com.blade.mvc.annotation.Path;
+import com.blade.mvc.http.Request;
+import com.blade.mvc.http.Response;
+import com.blade.mvc.http.Session;
+
+@Path
+public class AttributesExampleController {
+
+ public final static String REQUEST_VALUE = "Some Request value";
+ public final static String SESSION_VALUE = "1337";
+ public final static String HEADER = "Some Header";
+
+ @GetRoute("/request-attribute-example")
+ public void getRequestAttribute(Request request, Response response) {
+ request.attribute("request-val", REQUEST_VALUE);
+ String requestVal = request.attribute("request-val");
+ response.text(requestVal);
+ }
+
+ @GetRoute("/session-attribute-example")
+ public void getSessionAttribute(Request request, Response response) {
+ Session session = request.session();
+ session.attribute("session-val", SESSION_VALUE);
+ String sessionVal = session.attribute("session-val");
+ response.text(sessionVal);
+ }
+
+ @GetRoute("/header-example")
+ public void getHeader(Request request, Response response) {
+ String headerVal = request.header("a-header", HEADER);
+ response.header("a-header", headerVal);
+ }
+
+}
diff --git a/blade/src/main/java/com/baeldung/blade/sample/LogExampleController.java b/blade/src/main/java/com/baeldung/blade/sample/LogExampleController.java
new file mode 100644
index 0000000000..f0c22c70dd
--- /dev/null
+++ b/blade/src/main/java/com/baeldung/blade/sample/LogExampleController.java
@@ -0,0 +1,22 @@
+package com.baeldung.blade.sample;
+
+import com.blade.mvc.annotation.Path;
+import com.blade.mvc.annotation.Route;
+import com.blade.mvc.http.Response;
+
+@Path
+public class LogExampleController {
+
+ private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LogExampleController.class);
+
+ @Route(value = "/test-logs")
+ public void testLogs(Response response) {
+ log.trace("This is a TRACE Message");
+ log.debug("This is a DEBUG Message");
+ log.info("This is an INFO Message");
+ log.warn("This is a WARN Message");
+ log.error("This is an ERROR Message");
+ response.text("Check in ./logs");
+ }
+
+}
diff --git a/blade/src/main/java/com/baeldung/blade/sample/ParameterInjectionExampleController.java b/blade/src/main/java/com/baeldung/blade/sample/ParameterInjectionExampleController.java
new file mode 100644
index 0000000000..bc28244022
--- /dev/null
+++ b/blade/src/main/java/com/baeldung/blade/sample/ParameterInjectionExampleController.java
@@ -0,0 +1,71 @@
+package com.baeldung.blade.sample;
+
+import java.nio.file.Files;
+import java.nio.file.StandardOpenOption;
+
+import com.baeldung.blade.sample.vo.User;
+import com.blade.mvc.annotation.CookieParam;
+import com.blade.mvc.annotation.GetRoute;
+import com.blade.mvc.annotation.HeaderParam;
+import com.blade.mvc.annotation.JSON;
+import com.blade.mvc.annotation.MultipartParam;
+import com.blade.mvc.annotation.Param;
+import com.blade.mvc.annotation.Path;
+import com.blade.mvc.annotation.PathParam;
+import com.blade.mvc.annotation.PostRoute;
+import com.blade.mvc.http.Response;
+import com.blade.mvc.multipart.FileItem;
+import com.blade.mvc.ui.RestResponse;
+
+@Path
+public class ParameterInjectionExampleController {
+
+ private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(ParameterInjectionExampleController.class);
+
+ @GetRoute("/params/form")
+ public void formParam(@Param String name, Response response) {
+ log.info("name: " + name);
+ response.text(name);
+ }
+
+ @GetRoute("/params/path/:uid")
+ public void restfulParam(@PathParam Integer uid, Response response) {
+ log.info("uid: " + uid);
+ response.text(String.valueOf(uid));
+ }
+
+ @PostRoute("/params-file") // DO NOT USE A SLASH WITHIN THE ROUTE OR IT WILL BREAK (?)
+ @JSON
+ public RestResponse> fileParam(@MultipartParam FileItem fileItem) throws Exception {
+ try {
+ byte[] fileContent = fileItem.getData();
+
+ log.debug("Saving the uploaded file");
+ java.nio.file.Path tempFile = Files.createTempFile("baeldung_tempfiles", ".tmp");
+ Files.write(tempFile, fileContent, StandardOpenOption.WRITE);
+
+ return RestResponse.ok();
+ } catch (Exception e) {
+ log.error(e.getMessage(), e);
+ return RestResponse.fail(e.getMessage());
+ }
+ }
+
+ @GetRoute("/params/header")
+ public void headerParam(@HeaderParam String customheader, Response response) {
+ log.info("Custom header: " + customheader);
+ response.text(customheader);
+ }
+
+ @GetRoute("/params/cookie")
+ public void cookieParam(@CookieParam(defaultValue = "default value") String myCookie, Response response) {
+ log.info("myCookie: " + myCookie);
+ response.text(myCookie);
+ }
+
+ @PostRoute("/params/vo")
+ public void voParam(@Param User user, Response response) {
+ log.info("user as voParam: " + user.toString());
+ response.html(user.toString() + "Back ");
+ }
+}
\ No newline at end of file
diff --git a/blade/src/main/java/com/baeldung/blade/sample/RouteExampleController.java b/blade/src/main/java/com/baeldung/blade/sample/RouteExampleController.java
new file mode 100644
index 0000000000..7ba2a270a9
--- /dev/null
+++ b/blade/src/main/java/com/baeldung/blade/sample/RouteExampleController.java
@@ -0,0 +1,78 @@
+package com.baeldung.blade.sample;
+
+import com.baeldung.blade.sample.configuration.BaeldungException;
+import com.blade.mvc.WebContext;
+import com.blade.mvc.annotation.DeleteRoute;
+import com.blade.mvc.annotation.GetRoute;
+import com.blade.mvc.annotation.Path;
+import com.blade.mvc.annotation.PostRoute;
+import com.blade.mvc.annotation.PutRoute;
+import com.blade.mvc.annotation.Route;
+import com.blade.mvc.http.HttpMethod;
+import com.blade.mvc.http.Request;
+import com.blade.mvc.http.Response;
+
+@Path
+public class RouteExampleController {
+
+ private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(RouteExampleController.class);
+
+ @GetRoute("/route-example")
+ public String get() {
+ return "get.html";
+ }
+
+ @PostRoute("/route-example")
+ public String post() {
+ return "post.html";
+ }
+
+ @PutRoute("/route-example")
+ public String put() {
+ return "put.html";
+ }
+
+ @DeleteRoute("/route-example")
+ public String delete() {
+ return "delete.html";
+ }
+
+ @Route(value = "/another-route-example", method = HttpMethod.GET)
+ public String anotherGet() {
+ return "get.html";
+ }
+
+ @Route(value = "/allmatch-route-example")
+ public String allmatch() {
+ return "allmatch.html";
+ }
+
+ @Route(value = "/triggerInternalServerError")
+ public void triggerInternalServerError() {
+ int x = 1 / 0;
+ }
+
+ @Route(value = "/triggerBaeldungException")
+ public void triggerBaeldungException() throws BaeldungException {
+ throw new BaeldungException("Foobar Exception to threat differently");
+ }
+
+ @Route(value = "/user/foo")
+ public void urlCoveredByNarrowedWebhook(Response response) {
+ response.text("Check out for the WebHook covering '/user/*' in the logs");
+ }
+
+ @GetRoute("/load-configuration-in-a-route")
+ public void loadConfigurationInARoute(Response response) {
+ String authors = WebContext.blade()
+ .env("app.authors", "Unknown authors");
+ log.info("[/load-configuration-in-a-route] Loading 'app.authors' from configuration, value: " + authors);
+ response.render("index.html");
+ }
+
+ @GetRoute("/template-output-test")
+ public void templateOutputTest(Request request, Response response) {
+ request.attribute("name", "Blade");
+ response.render("template-output-test.html");
+ }
+}
diff --git a/blade/src/main/java/com/baeldung/blade/sample/configuration/BaeldungException.java b/blade/src/main/java/com/baeldung/blade/sample/configuration/BaeldungException.java
new file mode 100644
index 0000000000..01a030b7e7
--- /dev/null
+++ b/blade/src/main/java/com/baeldung/blade/sample/configuration/BaeldungException.java
@@ -0,0 +1,9 @@
+package com.baeldung.blade.sample.configuration;
+
+public class BaeldungException extends RuntimeException {
+
+ public BaeldungException(String message) {
+ super(message);
+ }
+
+}
\ No newline at end of file
diff --git a/blade/src/main/java/com/baeldung/blade/sample/configuration/GlobalExceptionHandler.java b/blade/src/main/java/com/baeldung/blade/sample/configuration/GlobalExceptionHandler.java
new file mode 100644
index 0000000000..ab7b81c0dc
--- /dev/null
+++ b/blade/src/main/java/com/baeldung/blade/sample/configuration/GlobalExceptionHandler.java
@@ -0,0 +1,25 @@
+package com.baeldung.blade.sample.configuration;
+
+import com.blade.ioc.annotation.Bean;
+import com.blade.mvc.WebContext;
+import com.blade.mvc.handler.DefaultExceptionHandler;
+
+@Bean
+public class GlobalExceptionHandler extends DefaultExceptionHandler {
+
+ private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(GlobalExceptionHandler.class);
+
+ @Override
+ public void handle(Exception e) {
+ if (e instanceof BaeldungException) {
+ Exception baeldungException = (BaeldungException) e;
+ String msg = baeldungException.getMessage();
+ log.error("[GlobalExceptionHandler] Intercepted an exception to threat with additional logic. Error message: " + msg);
+ WebContext.response()
+ .render("index.html");
+
+ } else {
+ super.handle(e);
+ }
+ }
+}
\ No newline at end of file
diff --git a/blade/src/main/java/com/baeldung/blade/sample/configuration/LoadConfig.java b/blade/src/main/java/com/baeldung/blade/sample/configuration/LoadConfig.java
new file mode 100644
index 0000000000..0f1aab1b52
--- /dev/null
+++ b/blade/src/main/java/com/baeldung/blade/sample/configuration/LoadConfig.java
@@ -0,0 +1,23 @@
+package com.baeldung.blade.sample.configuration;
+
+import com.blade.Blade;
+import com.blade.ioc.annotation.Bean;
+import com.blade.loader.BladeLoader;
+import com.blade.mvc.WebContext;
+
+@Bean
+public class LoadConfig implements BladeLoader {
+
+ private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LoadConfig.class);
+
+ @Override
+ public void load(Blade blade) {
+ String version = WebContext.blade()
+ .env("app.version")
+ .orElse("N/D");
+ String authors = WebContext.blade()
+ .env("app.authors", "Unknown authors");
+
+ log.info("[LoadConfig] loaded 'app.version' (" + version + ") and 'app.authors' (" + authors + ") in a configuration bean");
+ }
+}
\ No newline at end of file
diff --git a/blade/src/main/java/com/baeldung/blade/sample/configuration/ScheduleExample.java b/blade/src/main/java/com/baeldung/blade/sample/configuration/ScheduleExample.java
new file mode 100644
index 0000000000..c170975818
--- /dev/null
+++ b/blade/src/main/java/com/baeldung/blade/sample/configuration/ScheduleExample.java
@@ -0,0 +1,15 @@
+package com.baeldung.blade.sample.configuration;
+
+import com.blade.ioc.annotation.Bean;
+import com.blade.task.annotation.Schedule;
+
+@Bean
+public class ScheduleExample {
+
+ private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(ScheduleExample.class);
+
+ @Schedule(name = "baeldungTask", cron = "0 */1 * * * ?")
+ public void runScheduledTask() {
+ log.info("[ScheduleExample] This is a scheduled Task running once per minute.");
+ }
+}
diff --git a/blade/src/main/java/com/baeldung/blade/sample/interceptors/BaeldungHook.java b/blade/src/main/java/com/baeldung/blade/sample/interceptors/BaeldungHook.java
new file mode 100644
index 0000000000..4d0d178b0d
--- /dev/null
+++ b/blade/src/main/java/com/baeldung/blade/sample/interceptors/BaeldungHook.java
@@ -0,0 +1,17 @@
+package com.baeldung.blade.sample.interceptors;
+
+import com.blade.ioc.annotation.Bean;
+import com.blade.mvc.RouteContext;
+import com.blade.mvc.hook.WebHook;
+
+@Bean
+public class BaeldungHook implements WebHook {
+
+ private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(BaeldungHook.class);
+
+ @Override
+ public boolean before(RouteContext ctx) {
+ log.info("[BaeldungHook] called before Route method");
+ return true;
+ }
+}
\ No newline at end of file
diff --git a/blade/src/main/java/com/baeldung/blade/sample/interceptors/BaeldungMiddleware.java b/blade/src/main/java/com/baeldung/blade/sample/interceptors/BaeldungMiddleware.java
new file mode 100644
index 0000000000..3342cd8b01
--- /dev/null
+++ b/blade/src/main/java/com/baeldung/blade/sample/interceptors/BaeldungMiddleware.java
@@ -0,0 +1,15 @@
+package com.baeldung.blade.sample.interceptors;
+
+import com.blade.mvc.RouteContext;
+import com.blade.mvc.hook.WebHook;
+
+public class BaeldungMiddleware implements WebHook {
+
+ private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(BaeldungMiddleware.class);
+
+ @Override
+ public boolean before(RouteContext context) {
+ log.info("[BaeldungMiddleware] called before Route method and other WebHooks");
+ return true;
+ }
+}
\ No newline at end of file
diff --git a/blade/src/main/java/com/baeldung/blade/sample/vo/User.java b/blade/src/main/java/com/baeldung/blade/sample/vo/User.java
new file mode 100644
index 0000000000..b493dc3663
--- /dev/null
+++ b/blade/src/main/java/com/baeldung/blade/sample/vo/User.java
@@ -0,0 +1,16 @@
+package com.baeldung.blade.sample.vo;
+
+import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
+
+import lombok.Getter;
+import lombok.Setter;
+
+public class User {
+ @Getter @Setter private String name;
+ @Getter @Setter private String site;
+
+ @Override
+ public String toString() {
+ return ReflectionToStringBuilder.toString(this);
+ }
+}
\ No newline at end of file
diff --git a/blade/src/main/resources/application.properties b/blade/src/main/resources/application.properties
new file mode 100644
index 0000000000..ebf365406a
--- /dev/null
+++ b/blade/src/main/resources/application.properties
@@ -0,0 +1,5 @@
+mvc.statics.show-list=true
+mvc.view.404=my-404.html
+mvc.view.500=my-500.html
+app.version=0.0.1
+app.authors=Andrea Ligios
diff --git a/blade/src/main/resources/custom-static/icon.png b/blade/src/main/resources/custom-static/icon.png
new file mode 100644
index 0000000000..59af395afc
Binary files /dev/null and b/blade/src/main/resources/custom-static/icon.png differ
diff --git a/blade/src/main/resources/favicon.ico b/blade/src/main/resources/favicon.ico
new file mode 100644
index 0000000000..ca63a6a890
Binary files /dev/null and b/blade/src/main/resources/favicon.ico differ
diff --git a/blade/src/main/resources/static/app.css b/blade/src/main/resources/static/app.css
new file mode 100644
index 0000000000..9fff13d9b6
--- /dev/null
+++ b/blade/src/main/resources/static/app.css
@@ -0,0 +1 @@
+/* App CSS */
\ No newline at end of file
diff --git a/persistence-modules/hibernate5/transaction.log b/blade/src/main/resources/static/app.js
similarity index 100%
rename from persistence-modules/hibernate5/transaction.log
rename to blade/src/main/resources/static/app.js
diff --git a/blade/src/main/resources/static/file-upload.html b/blade/src/main/resources/static/file-upload.html
new file mode 100644
index 0000000000..b805be81b1
--- /dev/null
+++ b/blade/src/main/resources/static/file-upload.html
@@ -0,0 +1,43 @@
+
+
+
+
+Title
+
+
+
+
+
+ File Upload and download test
+
+
+
+ Back
+
+
+
+
\ No newline at end of file
diff --git a/blade/src/main/resources/static/user-post.html b/blade/src/main/resources/static/user-post.html
new file mode 100644
index 0000000000..ccfc4e8d0b
--- /dev/null
+++ b/blade/src/main/resources/static/user-post.html
@@ -0,0 +1,25 @@
+
+
+
+
+Title
+
+
+
+
+
+ User POJO post test
+
+
+
+
+
+ Back
+
+
+
\ No newline at end of file
diff --git a/blade/src/main/resources/templates/allmatch.html b/blade/src/main/resources/templates/allmatch.html
new file mode 100644
index 0000000000..7a4bfa070f
--- /dev/null
+++ b/blade/src/main/resources/templates/allmatch.html
@@ -0,0 +1 @@
+ALLMATCH called
\ No newline at end of file
diff --git a/blade/src/main/resources/templates/delete.html b/blade/src/main/resources/templates/delete.html
new file mode 100644
index 0000000000..1acb4b0b62
--- /dev/null
+++ b/blade/src/main/resources/templates/delete.html
@@ -0,0 +1 @@
+DELETE called
\ No newline at end of file
diff --git a/blade/src/main/resources/templates/get.html b/blade/src/main/resources/templates/get.html
new file mode 100644
index 0000000000..2c37aa1058
--- /dev/null
+++ b/blade/src/main/resources/templates/get.html
@@ -0,0 +1 @@
+GET called
\ No newline at end of file
diff --git a/blade/src/main/resources/templates/index.html b/blade/src/main/resources/templates/index.html
new file mode 100644
index 0000000000..6b7c2e77ad
--- /dev/null
+++ b/blade/src/main/resources/templates/index.html
@@ -0,0 +1,30 @@
+
+
+
+
+Baeldung Blade App • Written by Andrea Ligios
+
+
+
+ Baeldung Blade App - Showcase
+
+ Manual tests
+ The following are tests which are not covered by integration tests, but that can be run manually in order to check the functionality, either in the browser or in the logs, depending on the case.
+
+
+
+
+ Session value created in App.java
+ mySessionValue = ${mySessionValue}
+
+
+
+
+
\ No newline at end of file
diff --git a/blade/src/main/resources/templates/my-404.html b/blade/src/main/resources/templates/my-404.html
new file mode 100644
index 0000000000..0fa694f241
--- /dev/null
+++ b/blade/src/main/resources/templates/my-404.html
@@ -0,0 +1,10 @@
+
+
+
+
+ 404 Not found
+
+
+ Custom Error 404 Page
+
+
\ No newline at end of file
diff --git a/blade/src/main/resources/templates/my-500.html b/blade/src/main/resources/templates/my-500.html
new file mode 100644
index 0000000000..cc8438bfd6
--- /dev/null
+++ b/blade/src/main/resources/templates/my-500.html
@@ -0,0 +1,12 @@
+
+
+
+
+ 500 Internal Server Error
+
+
+ Custom Error 500 Page
+ The following error occurred: "${message} "
+ ${stackTrace}
+
+
\ No newline at end of file
diff --git a/blade/src/main/resources/templates/post.html b/blade/src/main/resources/templates/post.html
new file mode 100644
index 0000000000..b7a8a931cd
--- /dev/null
+++ b/blade/src/main/resources/templates/post.html
@@ -0,0 +1 @@
+POST called
\ No newline at end of file
diff --git a/blade/src/main/resources/templates/put.html b/blade/src/main/resources/templates/put.html
new file mode 100644
index 0000000000..bdbe6d3285
--- /dev/null
+++ b/blade/src/main/resources/templates/put.html
@@ -0,0 +1 @@
+PUT called
\ No newline at end of file
diff --git a/blade/src/main/resources/templates/template-output-test.html b/blade/src/main/resources/templates/template-output-test.html
new file mode 100644
index 0000000000..233b12fb88
--- /dev/null
+++ b/blade/src/main/resources/templates/template-output-test.html
@@ -0,0 +1 @@
+Hello, ${name}!
\ No newline at end of file
diff --git a/blade/src/test/java/com/baeldung/blade/sample/AppLiveTest.java b/blade/src/test/java/com/baeldung/blade/sample/AppLiveTest.java
new file mode 100644
index 0000000000..1172e6755f
--- /dev/null
+++ b/blade/src/test/java/com/baeldung/blade/sample/AppLiveTest.java
@@ -0,0 +1,56 @@
+package com.baeldung.blade.sample;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpDelete;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.client.methods.HttpPut;
+import org.apache.http.client.methods.HttpUriRequest;
+import org.apache.http.impl.client.HttpClientBuilder;
+import org.apache.http.util.EntityUtils;
+import org.junit.Test;
+
+public class AppLiveTest {
+
+ @Test
+ public void givenBasicRoute_whenGet_thenCorrectOutput() throws Exception {
+ final HttpUriRequest request = new HttpGet("http://localhost:9000/basic-route-example");
+ try (final CloseableHttpResponse httpResponse = HttpClientBuilder.create()
+ .build()
+ .execute(request);) {
+ assertThat(EntityUtils.toString(httpResponse.getEntity())).isEqualTo("GET called");
+ }
+ }
+
+ @Test
+ public void givenBasicRoute_whenPost_thenCorrectOutput() throws Exception {
+ final HttpUriRequest request = new HttpPost("http://localhost:9000/basic-route-example");
+ try (final CloseableHttpResponse httpResponse = HttpClientBuilder.create()
+ .build()
+ .execute(request);) {
+ assertThat(EntityUtils.toString(httpResponse.getEntity())).isEqualTo("POST called");
+ }
+ }
+
+ @Test
+ public void givenBasicRoute_whenPut_thenCorrectOutput() throws Exception {
+ final HttpUriRequest request = new HttpPut("http://localhost:9000/basic-route-example");
+ try (final CloseableHttpResponse httpResponse = HttpClientBuilder.create()
+ .build()
+ .execute(request);) {
+ assertThat(EntityUtils.toString(httpResponse.getEntity())).isEqualTo("PUT called");
+ }
+ }
+
+ @Test
+ public void givenBasicRoute_whenDelete_thenCorrectOutput() throws Exception {
+ final HttpUriRequest request = new HttpDelete("http://localhost:9000/basic-route-example");
+ try (final CloseableHttpResponse httpResponse = HttpClientBuilder.create()
+ .build()
+ .execute(request);) {
+ assertThat(EntityUtils.toString(httpResponse.getEntity())).isEqualTo("DELETE called");
+ }
+ }
+}
diff --git a/blade/src/test/java/com/baeldung/blade/sample/AttributesExampleControllerLiveTest.java b/blade/src/test/java/com/baeldung/blade/sample/AttributesExampleControllerLiveTest.java
new file mode 100644
index 0000000000..7cf00c2d4b
--- /dev/null
+++ b/blade/src/test/java/com/baeldung/blade/sample/AttributesExampleControllerLiveTest.java
@@ -0,0 +1,55 @@
+package com.baeldung.blade.sample;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpUriRequest;
+import org.apache.http.impl.client.HttpClientBuilder;
+import org.apache.http.util.EntityUtils;
+import org.junit.Test;
+
+public class AttributesExampleControllerLiveTest {
+
+ @Test
+ public void givenRequestAttribute_whenSet_thenRetrieveWithGet() throws Exception {
+ final HttpUriRequest request = new HttpGet("http://localhost:9000/request-attribute-example");
+ try (final CloseableHttpResponse httpResponse = HttpClientBuilder.create()
+ .build()
+ .execute(request);) {
+ assertThat(EntityUtils.toString(httpResponse.getEntity())).isEqualTo(AttributesExampleController.REQUEST_VALUE);
+ }
+ }
+
+ @Test
+ public void givenSessionAttribute_whenSet_thenRetrieveWithGet() throws Exception {
+ final HttpUriRequest request = new HttpGet("http://localhost:9000/session-attribute-example");
+ try (final CloseableHttpResponse httpResponse = HttpClientBuilder.create()
+ .build()
+ .execute(request);) {
+ assertThat(EntityUtils.toString(httpResponse.getEntity())).isEqualTo(AttributesExampleController.SESSION_VALUE);
+ }
+ }
+
+ @Test
+ public void givenHeader_whenSet_thenRetrieveWithGet() throws Exception {
+ final HttpUriRequest request = new HttpGet("http://localhost:9000/header-example");
+ request.addHeader("a-header","foobar");
+ try (final CloseableHttpResponse httpResponse = HttpClientBuilder.create()
+ .build()
+ .execute(request);) {
+ assertThat(httpResponse.getHeaders("a-header")[0].getValue()).isEqualTo("foobar");
+ }
+ }
+
+ @Test
+ public void givenNoHeader_whenSet_thenRetrieveDefaultValueWithGet() throws Exception {
+ final HttpUriRequest request = new HttpGet("http://localhost:9000/header-example");
+ try (final CloseableHttpResponse httpResponse = HttpClientBuilder.create()
+ .build()
+ .execute(request);) {
+ assertThat(httpResponse.getHeaders("a-header")[0].getValue()).isEqualTo(AttributesExampleController.HEADER);
+ }
+ }
+
+}
diff --git a/blade/src/test/java/com/baeldung/blade/sample/ParameterInjectionExampleControllerLiveTest.java b/blade/src/test/java/com/baeldung/blade/sample/ParameterInjectionExampleControllerLiveTest.java
new file mode 100644
index 0000000000..fbd5280116
--- /dev/null
+++ b/blade/src/test/java/com/baeldung/blade/sample/ParameterInjectionExampleControllerLiveTest.java
@@ -0,0 +1,82 @@
+package com.baeldung.blade.sample;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpUriRequest;
+import org.apache.http.client.utils.URIBuilder;
+import org.apache.http.impl.client.HttpClientBuilder;
+import org.apache.http.util.EntityUtils;
+import org.junit.Test;
+
+public class ParameterInjectionExampleControllerLiveTest {
+
+ @Test
+ public void givenFormParam_whenSet_thenRetrieveWithGet() throws Exception {
+ URIBuilder builder = new URIBuilder("http://localhost:9000/params/form");
+ builder.setParameter("name", "Andrea Ligios");
+
+ final HttpUriRequest request = new HttpGet(builder.build());
+
+ try (final CloseableHttpResponse httpResponse = HttpClientBuilder.create()
+ .build()
+ .execute(request);) {
+ assertThat(EntityUtils.toString(httpResponse.getEntity())).isEqualTo("Andrea Ligios");
+ }
+ }
+
+ @Test
+ public void givenPathParam_whenSet_thenRetrieveWithGet() throws Exception {
+ final HttpUriRequest request = new HttpGet("http://localhost:9000/params/path/1337");
+
+ try (final CloseableHttpResponse httpResponse = HttpClientBuilder.create()
+ .build()
+ .execute(request);) {
+ assertThat(EntityUtils.toString(httpResponse.getEntity())).isEqualTo("1337");
+ }
+ }
+
+ // @Test
+ // public void givenFileParam_whenSet_thenRetrieveWithGet() throws Exception {
+ //
+ // byte[] data = "this is some temp file content".getBytes("UTF-8");
+ // java.nio.file.Path tempFile = Files.createTempFile("baeldung_test_tempfiles", ".tmp");
+ // Files.write(tempFile, data, StandardOpenOption.WRITE);
+ //
+ // //HttpEntity entity = MultipartEntityBuilder.create().addPart("file", new FileBody(tempFile.toFile())).build();
+ // HttpEntity entity = MultipartEntityBuilder.create().addTextBody("field1", "value1")
+ // .addBinaryBody("fileItem", tempFile.toFile(), ContentType.create("application/octet-stream"), "file1.txt").build();
+ //
+ // final HttpPost post = new HttpPost("http://localhost:9000/params-file");
+ // post.setEntity(entity);
+ //
+ // try (final CloseableHttpResponse httpResponse = HttpClientBuilder.create().build().execute(post);) {
+ // assertThat(EntityUtils.toString(httpResponse.getEntity())).isEqualTo("file1.txt");
+ // }
+ // }
+
+ @Test
+ public void givenHeader_whenSet_thenRetrieveWithGet() throws Exception {
+ final HttpUriRequest request = new HttpGet("http://localhost:9000/params/header");
+ request.addHeader("customheader", "foobar");
+ try (final CloseableHttpResponse httpResponse = HttpClientBuilder.create()
+ .build()
+ .execute(request);) {
+ assertThat(EntityUtils.toString(httpResponse.getEntity())).isEqualTo("foobar");
+ }
+ }
+
+ @Test
+ public void givenNoCookie_whenCalled_thenReadDefaultValue() throws Exception {
+
+ final HttpUriRequest request = new HttpGet("http://localhost:9000/params/cookie");
+ try (final CloseableHttpResponse httpResponse = HttpClientBuilder.create()
+ .build()
+ .execute(request);) {
+ assertThat(EntityUtils.toString(httpResponse.getEntity())).isEqualTo("default value");
+ }
+
+ }
+
+}
diff --git a/blade/src/test/java/com/baeldung/blade/sample/RouteExampleControllerLiveTest.java b/blade/src/test/java/com/baeldung/blade/sample/RouteExampleControllerLiveTest.java
new file mode 100644
index 0000000000..df8e70c461
--- /dev/null
+++ b/blade/src/test/java/com/baeldung/blade/sample/RouteExampleControllerLiveTest.java
@@ -0,0 +1,117 @@
+package com.baeldung.blade.sample;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpDelete;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.client.methods.HttpPut;
+import org.apache.http.client.methods.HttpUriRequest;
+import org.apache.http.impl.client.HttpClientBuilder;
+import org.apache.http.util.EntityUtils;
+import org.junit.Test;
+
+public class RouteExampleControllerLiveTest {
+
+ @Test
+ public void givenRoute_whenGet_thenCorrectOutput() throws Exception {
+ final HttpUriRequest request = new HttpGet("http://localhost:9000/route-example");
+ try (final CloseableHttpResponse httpResponse = HttpClientBuilder.create()
+ .build()
+ .execute(request);) {
+ assertThat(EntityUtils.toString(httpResponse.getEntity())).isEqualTo("GET called");
+ }
+ }
+
+ @Test
+ public void givenRoute_whenPost_thenCorrectOutput() throws Exception {
+ final HttpUriRequest request = new HttpPost("http://localhost:9000/route-example");
+ try (final CloseableHttpResponse httpResponse = HttpClientBuilder.create()
+ .build()
+ .execute(request);) {
+ assertThat(EntityUtils.toString(httpResponse.getEntity())).isEqualTo("POST called");
+ }
+ }
+
+ @Test
+ public void givenRoute_whenPut_thenCorrectOutput() throws Exception {
+ final HttpUriRequest request = new HttpPut("http://localhost:9000/route-example");
+ try (final CloseableHttpResponse httpResponse = HttpClientBuilder.create()
+ .build()
+ .execute(request);) {
+ assertThat(EntityUtils.toString(httpResponse.getEntity())).isEqualTo("PUT called");
+ }
+ }
+
+ @Test
+ public void givenRoute_whenDelete_thenCorrectOutput() throws Exception {
+ final HttpUriRequest request = new HttpDelete("http://localhost:9000/route-example");
+ try (final CloseableHttpResponse httpResponse = HttpClientBuilder.create()
+ .build()
+ .execute(request);) {
+ assertThat(EntityUtils.toString(httpResponse.getEntity())).isEqualTo("DELETE called");
+ }
+ }
+
+ @Test
+ public void givenAnotherRoute_whenGet_thenCorrectOutput() throws Exception {
+ final HttpUriRequest request = new HttpGet("http://localhost:9000/another-route-example");
+ try (final CloseableHttpResponse httpResponse = HttpClientBuilder.create()
+ .build()
+ .execute(request);) {
+ assertThat(EntityUtils.toString(httpResponse.getEntity())).isEqualTo("GET called");
+ }
+ }
+
+ @Test
+ public void givenAllMatchRoute_whenGet_thenCorrectOutput() throws Exception {
+ final HttpUriRequest request = new HttpGet("http://localhost:9000/allmatch-route-example");
+ try (final CloseableHttpResponse httpResponse = HttpClientBuilder.create()
+ .build()
+ .execute(request);) {
+ assertThat(EntityUtils.toString(httpResponse.getEntity())).isEqualTo("ALLMATCH called");
+ }
+ }
+
+ @Test
+ public void givenAllMatchRoute_whenPost_thenCorrectOutput() throws Exception {
+ final HttpUriRequest request = new HttpPost("http://localhost:9000/allmatch-route-example");
+ try (final CloseableHttpResponse httpResponse = HttpClientBuilder.create()
+ .build()
+ .execute(request);) {
+ assertThat(EntityUtils.toString(httpResponse.getEntity())).isEqualTo("ALLMATCH called");
+ }
+ }
+
+ @Test
+ public void givenAllMatchRoute_whenPut_thenCorrectOutput() throws Exception {
+ final HttpUriRequest request = new HttpPut("http://localhost:9000/allmatch-route-example");
+ try (final CloseableHttpResponse httpResponse = HttpClientBuilder.create()
+ .build()
+ .execute(request);) {
+ assertThat(EntityUtils.toString(httpResponse.getEntity())).isEqualTo("ALLMATCH called");
+ }
+ }
+
+ @Test
+ public void givenAllMatchRoute_whenDelete_thenCorrectOutput() throws Exception {
+ final HttpUriRequest request = new HttpDelete("http://localhost:9000/allmatch-route-example");
+ try (final CloseableHttpResponse httpResponse = HttpClientBuilder.create()
+ .build()
+ .execute(request);) {
+ assertThat(EntityUtils.toString(httpResponse.getEntity())).isEqualTo("ALLMATCH called");
+ }
+ }
+
+ @Test
+ public void givenRequestAttribute_whenRenderedWithTemplate_thenCorrectlyEvaluateIt() throws Exception {
+ final HttpUriRequest request = new HttpGet("http://localhost:9000/template-output-test");
+ try (final CloseableHttpResponse httpResponse = HttpClientBuilder.create()
+ .build()
+ .execute(request);) {
+ assertThat(EntityUtils.toString(httpResponse.getEntity())).isEqualTo("Hello, Blade! ");
+ }
+ }
+
+}
diff --git a/bootique/pom.xml b/bootique/pom.xml
index 880b9a516f..4ae8703074 100644
--- a/bootique/pom.xml
+++ b/bootique/pom.xml
@@ -3,9 +3,9 @@
4.0.0
com.baeldung.bootique
bootique
- jar
1.0-SNAPSHOT
bootique
+ jar
http://maven.apache.org
diff --git a/cas/cas-secured-app/pom.xml b/cas/cas-secured-app/pom.xml
index 2291da9084..338a9e5653 100644
--- a/cas/cas-secured-app/pom.xml
+++ b/cas/cas-secured-app/pom.xml
@@ -3,9 +3,9 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
cas-secured-app
- jar
cas-secured-app
Demo project for CAS
+ jar
parent-boot-1
diff --git a/cas/pom.xml b/cas/pom.xml
new file mode 100644
index 0000000000..6d141277c5
--- /dev/null
+++ b/cas/pom.xml
@@ -0,0 +1,21 @@
+
+
+ 4.0.0
+ cas
+ cas
+ pom
+
+
+ com.baeldung
+ parent-modules
+ 1.0.0-SNAPSHOT
+ ..
+
+
+
+ cas-secured-app
+ cas-server
+
+
+
diff --git a/cdi/pom.xml b/cdi/pom.xml
index 0cf5062ccc..85da8518d0 100644
--- a/cdi/pom.xml
+++ b/cdi/pom.xml
@@ -59,13 +59,13 @@
test
+
2.0.SP1
3.0.5.Final
1.9.2
1.3
3.10.0
- 4.12
5.1.2.RELEASE
diff --git a/checker-plugin/pom.xml b/checker-plugin/pom.xml
index 45f0939e77..08408366a4 100644
--- a/checker-plugin/pom.xml
+++ b/checker-plugin/pom.xml
@@ -3,9 +3,9 @@
4.0.0
com.baeldung
checker-plugin
- jar
1.0-SNAPSHOT
checker-plugin
+ jar
http://maven.apache.org
diff --git a/core-groovy/README.md b/core-groovy/README.md
index 71788acdb7..ec2fcfa574 100644
--- a/core-groovy/README.md
+++ b/core-groovy/README.md
@@ -4,3 +4,7 @@
- [JDBC with Groovy](http://www.baeldung.com/jdbc-groovy)
- [Working with JSON in Groovy](http://www.baeldung.com/groovy-json)
+- [Reading a File in Groovy](https://www.baeldung.com/groovy-file-read)
+- [Types of Strings in Groovy](https://www.baeldung.com/groovy-strings)
+- [A Quick Guide to Iterating a Map in Groovy](https://www.baeldung.com/groovy-map-iterating)
+- [An Introduction to Traits in Groovy](https://www.baeldung.com/groovy-traits)
diff --git a/core-groovy/pom.xml b/core-groovy/pom.xml
index e54c766280..029e5460ab 100644
--- a/core-groovy/pom.xml
+++ b/core-groovy/pom.xml
@@ -23,6 +23,12 @@
org.codehaus.groovy
groovy-all
${groovy-all.version}
+ pom
+
+
+ org.codehaus.groovy
+ groovy-dateutil
+ ${groovy.version}
org.codehaus.groovy
@@ -103,9 +109,12 @@
1.0.0
- 2.4.13
- 2.4.13
- 2.4.13
+
+
+
+ 2.5.6
+ 2.5.6
+ 2.5.6
2.4.0
1.1-groovy-2.4
1.6
diff --git a/core-groovy/src/main/groovy/com/baeldung/file/ReadFile.groovy b/core-groovy/src/main/groovy/com/baeldung/file/ReadFile.groovy
new file mode 100644
index 0000000000..4239fa534c
--- /dev/null
+++ b/core-groovy/src/main/groovy/com/baeldung/file/ReadFile.groovy
@@ -0,0 +1,107 @@
+package com.baeldung.file
+
+class ReadFile {
+
+ /**
+ * reads file content line by line using withReader and reader.readLine
+ * @param filePath
+ * @return
+ */
+ int readFileLineByLine(String filePath) {
+ File file = new File(filePath)
+ def line, noOfLines = 0;
+ file.withReader { reader ->
+ while ((line = reader.readLine())!=null)
+ {
+ println "${line}"
+ noOfLines++
+ }
+ }
+ return noOfLines
+ }
+
+ /**
+ * reads file content in list of lines
+ * @param filePath
+ * @return
+ */
+ List readFileInList(String filePath) {
+ File file = new File(filePath)
+ def lines = file.readLines()
+ return lines
+ }
+
+ /**
+ * reads file content in string using File.text
+ * @param filePath
+ * @return
+ */
+ String readFileString(String filePath) {
+ File file = new File(filePath)
+ String fileContent = file.text
+ return fileContent
+ }
+
+ /**
+ * reads file content in string with encoding using File.getText
+ * @param filePath
+ * @return
+ */
+ String readFileStringWithCharset(String filePath) {
+ File file = new File(filePath)
+ String utf8Content = file.getText("UTF-8")
+ return utf8Content
+ }
+
+ /**
+ * reads content of binary file and returns byte array
+ * @param filePath
+ * @return
+ */
+ byte[] readBinaryFile(String filePath) {
+ File file = new File(filePath)
+ byte[] binaryContent = file.bytes
+ return binaryContent
+ }
+
+ /**
+ * More Examples of reading a file
+ * @return
+ */
+ def moreExamples() {
+
+ //with reader with utf-8
+ new File("src/main/resources/utf8Content.html").withReader('UTF-8') { reader ->
+ def line
+ while ((line = reader.readLine())!=null) {
+ println "${line}"
+ }
+ }
+
+ //collect api
+ def list = new File("src/main/resources/fileContent.txt").collect {it}
+
+ //as operator
+ def array = new File("src/main/resources/fileContent.txt") as String[]
+
+ //eachline
+ new File("src/main/resources/fileContent.txt").eachLine { line ->
+ println line
+ }
+
+ //newInputStream with eachLine
+ def is = new File("src/main/resources/fileContent.txt").newInputStream()
+ is.eachLine {
+ println it
+ }
+ is.close()
+
+ //withInputStream
+ new File("src/main/resources/fileContent.txt").withInputStream { stream ->
+ stream.eachLine { line ->
+ println line
+ }
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/core-groovy/src/main/groovy/com/baeldung/io/Task.groovy b/core-groovy/src/main/groovy/com/baeldung/io/Task.groovy
new file mode 100644
index 0000000000..8a3bedc048
--- /dev/null
+++ b/core-groovy/src/main/groovy/com/baeldung/io/Task.groovy
@@ -0,0 +1,8 @@
+package com.baeldung.io
+
+class Task implements Serializable {
+ String description
+ Date startDate
+ Date dueDate
+ int status
+}
diff --git a/core-groovy/src/main/groovy/com/baeldung/strings/Concatenate.groovy b/core-groovy/src/main/groovy/com/baeldung/strings/Concatenate.groovy
new file mode 100644
index 0000000000..b3a0852a0b
--- /dev/null
+++ b/core-groovy/src/main/groovy/com/baeldung/strings/Concatenate.groovy
@@ -0,0 +1,43 @@
+package com.baeldung.strings;
+
+class Concatenate {
+ String first = 'Hello'
+ String last = 'Groovy'
+
+ String doSimpleConcat() {
+ return 'My name is ' + first + ' ' + last
+ }
+
+ String doConcatUsingGString() {
+ return "My name is $first $last"
+ }
+
+ String doConcatUsingGStringClosures() {
+ return "My name is ${-> first} ${-> last}"
+ }
+
+ String doConcatUsingStringConcatMethod() {
+ return 'My name is '.concat(first).concat(' ').concat(last)
+ }
+
+ String doConcatUsingLeftShiftOperator() {
+ return 'My name is ' << first << ' ' << last
+ }
+
+ String doConcatUsingArrayJoinMethod() {
+ return ['My name is', first, last].join(' ')
+ }
+
+ String doConcatUsingArrayInjectMethod() {
+ return [first,' ', last]
+ .inject(new StringBuffer('My name is '), { initial, name -> initial.append(name); return initial }).toString()
+ }
+
+ String doConcatUsingStringBuilder() {
+ return new StringBuilder().append('My name is ').append(first).append(' ').append(last)
+ }
+
+ String doConcatUsingStringBuffer() {
+ return new StringBuffer().append('My name is ').append(first).append(' ').append(last)
+ }
+}
\ No newline at end of file
diff --git a/core-groovy/src/main/groovy/com/baeldung/traits/AnimalTrait.groovy b/core-groovy/src/main/groovy/com/baeldung/traits/AnimalTrait.groovy
new file mode 100644
index 0000000000..6ec5cda571
--- /dev/null
+++ b/core-groovy/src/main/groovy/com/baeldung/traits/AnimalTrait.groovy
@@ -0,0 +1,8 @@
+package com.baeldung.traits
+
+trait AnimalTrait {
+
+ String basicBehavior() {
+ return "Animalistic!!"
+ }
+}
\ No newline at end of file
diff --git a/core-groovy/src/main/groovy/com/baeldung/traits/Car.groovy b/core-groovy/src/main/groovy/com/baeldung/traits/Car.groovy
new file mode 100644
index 0000000000..eb4d1f7f87
--- /dev/null
+++ b/core-groovy/src/main/groovy/com/baeldung/traits/Car.groovy
@@ -0,0 +1,3 @@
+package com.baeldung
+
+class Car implements VehicleTrait {}
\ No newline at end of file
diff --git a/core-groovy/src/main/groovy/com/baeldung/traits/Dog.groovy b/core-groovy/src/main/groovy/com/baeldung/traits/Dog.groovy
new file mode 100644
index 0000000000..3e0677ba18
--- /dev/null
+++ b/core-groovy/src/main/groovy/com/baeldung/traits/Dog.groovy
@@ -0,0 +1,9 @@
+package com.baeldung.traits
+
+class Dog implements WalkingTrait, SpeakingTrait {
+
+ String speakAndWalk() {
+ WalkingTrait.super.speakAndWalk()
+ }
+
+}
\ No newline at end of file
diff --git a/core-groovy/src/main/groovy/com/baeldung/traits/Employee.groovy b/core-groovy/src/main/groovy/com/baeldung/traits/Employee.groovy
new file mode 100644
index 0000000000..b3e4285476
--- /dev/null
+++ b/core-groovy/src/main/groovy/com/baeldung/traits/Employee.groovy
@@ -0,0 +1,12 @@
+package com.baeldung.traits
+
+class Employee implements UserTrait {
+
+ String name() {
+ return 'Bob'
+ }
+
+ String lastName() {
+ return "Marley"
+ }
+}
\ No newline at end of file
diff --git a/core-groovy/src/main/groovy/com/baeldung/traits/Human.groovy b/core-groovy/src/main/groovy/com/baeldung/traits/Human.groovy
new file mode 100644
index 0000000000..e78d59bbfd
--- /dev/null
+++ b/core-groovy/src/main/groovy/com/baeldung/traits/Human.groovy
@@ -0,0 +1,6 @@
+package com.baeldung.traits
+
+interface Human {
+
+ String lastName()
+}
\ No newline at end of file
diff --git a/core-groovy/src/main/groovy/com/baeldung/traits/SpeakingTrait.groovy b/core-groovy/src/main/groovy/com/baeldung/traits/SpeakingTrait.groovy
new file mode 100644
index 0000000000..f437a94bd9
--- /dev/null
+++ b/core-groovy/src/main/groovy/com/baeldung/traits/SpeakingTrait.groovy
@@ -0,0 +1,13 @@
+package com.baeldung.traits
+
+trait SpeakingTrait {
+
+ String basicAbility() {
+ return "Speaking!!"
+ }
+
+ String speakAndWalk() {
+ return "Speak and walk!!"
+ }
+
+}
\ No newline at end of file
diff --git a/core-groovy/src/main/groovy/com/baeldung/traits/UserTrait.groovy b/core-groovy/src/main/groovy/com/baeldung/traits/UserTrait.groovy
new file mode 100644
index 0000000000..0d395bffcd
--- /dev/null
+++ b/core-groovy/src/main/groovy/com/baeldung/traits/UserTrait.groovy
@@ -0,0 +1,36 @@
+package com.baeldung.traits
+
+trait UserTrait implements Human {
+
+ String sayHello() {
+ return "Hello!"
+ }
+
+ abstract String name()
+
+ String showName() {
+ return "Hello, ${name()}!"
+ }
+
+ private String greetingMessage() {
+ return 'Hello, from a private method!'
+ }
+
+ String greet() {
+ def msg = greetingMessage()
+ println msg
+ msg
+ }
+
+ def self() {
+ return this
+ }
+
+ String showLastName() {
+ return "Hello, ${lastName()}!"
+ }
+
+ String email
+ String address
+}
+
\ No newline at end of file
diff --git a/core-groovy/src/main/groovy/com/baeldung/traits/VehicleTrait.groovy b/core-groovy/src/main/groovy/com/baeldung/traits/VehicleTrait.groovy
new file mode 100644
index 0000000000..f5ae8fab30
--- /dev/null
+++ b/core-groovy/src/main/groovy/com/baeldung/traits/VehicleTrait.groovy
@@ -0,0 +1,9 @@
+package com.baeldung
+
+trait VehicleTrait extends WheelTrait {
+
+ String showWheels() {
+ return "Num of Wheels $noOfWheels"
+ }
+
+}
\ No newline at end of file
diff --git a/core-groovy/src/main/groovy/com/baeldung/traits/WalkingTrait.groovy b/core-groovy/src/main/groovy/com/baeldung/traits/WalkingTrait.groovy
new file mode 100644
index 0000000000..66cff8809f
--- /dev/null
+++ b/core-groovy/src/main/groovy/com/baeldung/traits/WalkingTrait.groovy
@@ -0,0 +1,13 @@
+package com.baeldung.traits
+
+trait WalkingTrait {
+
+ String basicAbility() {
+ return "Walking!!"
+ }
+
+ String speakAndWalk() {
+ return "Walk and speak!!"
+ }
+
+}
\ No newline at end of file
diff --git a/core-groovy/src/main/groovy/com/baeldung/traits/WheelTrait.groovy b/core-groovy/src/main/groovy/com/baeldung/traits/WheelTrait.groovy
new file mode 100644
index 0000000000..364d5b883e
--- /dev/null
+++ b/core-groovy/src/main/groovy/com/baeldung/traits/WheelTrait.groovy
@@ -0,0 +1,7 @@
+package com.baeldung
+
+trait WheelTrait {
+
+ int noOfWheels
+
+}
\ No newline at end of file
diff --git a/core-groovy/src/main/resources/binaryExample.jpg b/core-groovy/src/main/resources/binaryExample.jpg
new file mode 100644
index 0000000000..4b32645ac9
Binary files /dev/null and b/core-groovy/src/main/resources/binaryExample.jpg differ
diff --git a/core-groovy/src/main/resources/fileContent.txt b/core-groovy/src/main/resources/fileContent.txt
new file mode 100644
index 0000000000..643e4af3de
--- /dev/null
+++ b/core-groovy/src/main/resources/fileContent.txt
@@ -0,0 +1,3 @@
+Line 1 : Hello World!!!
+Line 2 : This is a file content.
+Line 3 : String content
diff --git a/core-groovy/src/main/resources/ioData.txt b/core-groovy/src/main/resources/ioData.txt
new file mode 100644
index 0000000000..d2741339d1
Binary files /dev/null and b/core-groovy/src/main/resources/ioData.txt differ
diff --git a/core-groovy/src/main/resources/ioInput.txt b/core-groovy/src/main/resources/ioInput.txt
new file mode 100644
index 0000000000..b180256dd5
--- /dev/null
+++ b/core-groovy/src/main/resources/ioInput.txt
@@ -0,0 +1,4 @@
+First line of text
+Second line of text
+Third line of text
+Fourth line of text
\ No newline at end of file
diff --git a/core-groovy/src/main/resources/ioOutput.txt b/core-groovy/src/main/resources/ioOutput.txt
new file mode 100644
index 0000000000..bcf76c43d8
--- /dev/null
+++ b/core-groovy/src/main/resources/ioOutput.txt
@@ -0,0 +1,3 @@
+Line one of output example
+Line two of output example
+Line three of output example
\ No newline at end of file
diff --git a/core-groovy/src/main/resources/ioSerializedObject.txt b/core-groovy/src/main/resources/ioSerializedObject.txt
new file mode 100644
index 0000000000..833ed32bf1
Binary files /dev/null and b/core-groovy/src/main/resources/ioSerializedObject.txt differ
diff --git a/core-groovy/src/main/resources/sample.png b/core-groovy/src/main/resources/sample.png
new file mode 100644
index 0000000000..7d473430b7
Binary files /dev/null and b/core-groovy/src/main/resources/sample.png differ
diff --git a/core-groovy/src/main/resources/utf8Content.html b/core-groovy/src/main/resources/utf8Content.html
new file mode 100644
index 0000000000..61ff338f6c
--- /dev/null
+++ b/core-groovy/src/main/resources/utf8Content.html
@@ -0,0 +1,12 @@
+
+
+
+
+
+ᚠᛇᚻ᛫ᛒᛦᚦ᛫ᚠᚱᚩᚠᚢᚱ᛫ᚠᛁᚱᚪ᛫ᚷᛖᚻᚹᛦᛚᚳᚢᛗ
+ᛋᚳᛖᚪᛚ᛫ᚦᛖᚪᚻ᛫ᛗᚪᚾᚾᚪ᛫ᚷᛖᚻᚹᛦᛚᚳ᛫ᛗᛁᚳᛚᚢᚾ᛫ᚻᛦᛏ᛫ᛞᚫᛚᚪᚾ
+ᚷᛁᚠ᛫ᚻᛖ᛫ᚹᛁᛚᛖ᛫ᚠᚩᚱ᛫ᛞᚱᛁᚻᛏᚾᛖ᛫ᛞᚩᛗᛖᛋ᛫ᚻᛚᛇᛏᚪᚾ
+
+
+
\ No newline at end of file
diff --git a/core-groovy/src/test/groovy/com/baeldung/date/DateTest.groovy b/core-groovy/src/test/groovy/com/baeldung/date/DateTest.groovy
new file mode 100644
index 0000000000..4e7a7189a6
--- /dev/null
+++ b/core-groovy/src/test/groovy/com/baeldung/date/DateTest.groovy
@@ -0,0 +1,57 @@
+package com.baeldung.groovy.sql
+
+import static org.junit.Assert.*
+import java.util.Calendar.*
+import java.time.LocalDate
+import java.text.SimpleDateFormat
+import org.junit.Test
+
+
+class DateTest {
+
+ def dateStr = "2019-02-28"
+ def pattern = "yyyy-MM-dd"
+
+ @Test
+ void whenGetStringRepresentation_thenCorrectlyConvertIntoDate() {
+ def dateFormat = new SimpleDateFormat(pattern)
+ def date = dateFormat.parse(dateStr)
+
+ println(" String to Date with DateFormatter : " + date)
+
+ def cal = new GregorianCalendar();
+ cal.setTime(date);
+
+ assertEquals(cal.get(Calendar.YEAR),2019)
+ assertEquals(cal.get(Calendar.DAY_OF_MONTH),28)
+ assertEquals(cal.get(Calendar.MONTH),java.util.Calendar.FEBRUARY)
+ }
+
+ @Test
+ void whenGetStringRepresentation_thenCorrectlyConvertWithDateUtilsExtension() {
+
+ def date = Date.parse(pattern, dateStr)
+
+ println(" String to Date with Date.parse : " + date)
+
+ def cal = new GregorianCalendar();
+ cal.setTime(date);
+
+ assertEquals(cal.get(Calendar.YEAR),2019)
+ assertEquals(cal.get(Calendar.DAY_OF_MONTH),28)
+ assertEquals(cal.get(Calendar.MONTH),java.util.Calendar.FEBRUARY)
+ }
+
+ @Test
+ void whenGetStringRepresentation_thenCorrectlyConvertIntoDateWithLocalDate() {
+ def date = LocalDate.parse(dateStr, pattern)
+
+ println(" String to Date with LocalDate : " + date)
+
+ assertEquals(date.getYear(),2019)
+ assertEquals(date.getMonth(),java.time.Month.FEBRUARY)
+ assertEquals(date.getDayOfMonth(),28)
+ }
+
+
+}
diff --git a/core-groovy/src/test/groovy/com/baeldung/file/ReadFileUnitTest.groovy b/core-groovy/src/test/groovy/com/baeldung/file/ReadFileUnitTest.groovy
new file mode 100644
index 0000000000..a479c265c4
--- /dev/null
+++ b/core-groovy/src/test/groovy/com/baeldung/file/ReadFileUnitTest.groovy
@@ -0,0 +1,70 @@
+package com.baeldung.file
+
+import spock.lang.Specification
+
+class ReadFileUnitTest extends Specification {
+
+ ReadFile readFile
+
+ void setup () {
+ readFile = new ReadFile()
+ }
+
+ def 'Should return number of lines in File using ReadFile.readFileLineByLine given filePath' () {
+ given:
+ def filePath = "src/main/resources/fileContent.txt"
+ when:
+ def noOfLines = readFile.readFileLineByLine(filePath)
+ then:
+ noOfLines
+ noOfLines instanceof Integer
+ assert noOfLines, 3
+ }
+
+ def 'Should return File Content in list of lines using ReadFile.readFileInList given filePath' () {
+ given:
+ def filePath = "src/main/resources/fileContent.txt"
+ when:
+ def lines = readFile.readFileInList(filePath)
+ then:
+ lines
+ lines instanceof List
+ assert lines.size(), 3
+ }
+
+ def 'Should return file content in string using ReadFile.readFileString given filePath' () {
+ given:
+ def filePath = "src/main/resources/fileContent.txt"
+ when:
+ def fileContent = readFile.readFileString(filePath)
+ then:
+ fileContent
+ fileContent instanceof String
+ fileContent.contains("""Line 1 : Hello World!!!
+Line 2 : This is a file content.
+Line 3 : String content""")
+
+ }
+
+ def 'Should return UTF-8 encoded file content in string using ReadFile.readFileStringWithCharset given filePath' () {
+ given:
+ def filePath = "src/main/resources/utf8Content.html"
+ when:
+ def encodedContent = readFile.readFileStringWithCharset(filePath)
+ then:
+ encodedContent
+ encodedContent instanceof String
+ }
+
+ def 'Should return binary file content in byte array using ReadFile.readBinaryFile given filePath' () {
+ given:
+ def filePath = "src/main/resources/sample.png"
+ when:
+ def binaryContent = readFile.readBinaryFile(filePath)
+ then:
+ binaryContent
+ binaryContent instanceof byte[]
+ binaryContent.length == 329
+ }
+
+}
\ No newline at end of file
diff --git a/core-groovy/src/test/groovy/com/baeldung/io/DataAndObjectsUnitTest.groovy b/core-groovy/src/test/groovy/com/baeldung/io/DataAndObjectsUnitTest.groovy
new file mode 100644
index 0000000000..0b413cf76c
--- /dev/null
+++ b/core-groovy/src/test/groovy/com/baeldung/io/DataAndObjectsUnitTest.groovy
@@ -0,0 +1,51 @@
+package com.baeldung.io
+
+import static org.junit.Assert.*
+
+import org.junit.Test
+
+class DataAndObjectsUnitTest {
+ @Test
+ void whenUsingWithDataOutputStream_thenDataIsSerializedToAFile() {
+ String message = 'This is a serialized string'
+ int length = message.length()
+ boolean valid = true
+ new File('src/main/resources/ioData.txt').withDataOutputStream { out ->
+ out.writeUTF(message)
+ out.writeInt(length)
+ out.writeBoolean(valid)
+ }
+
+ String loadedMessage = ""
+ int loadedLength
+ boolean loadedValid
+
+ new File('src/main/resources/ioData.txt').withDataInputStream { is ->
+ loadedMessage = is.readUTF()
+ loadedLength = is.readInt()
+ loadedValid = is.readBoolean()
+ }
+
+ assertEquals(message, loadedMessage)
+ assertEquals(length, loadedLength)
+ assertEquals(valid, loadedValid)
+ }
+
+ @Test
+ void whenUsingWithObjectOutputStream_thenObjectIsSerializedToFile() {
+ Task task = new Task(description:'Take out the trash', startDate:new Date(), status:0)
+ new File('src/main/resources/ioSerializedObject.txt').withObjectOutputStream { out ->
+ out.writeObject(task)
+ }
+
+ Task taskRead
+
+ new File('src/main/resources/ioSerializedObject.txt').withObjectInputStream { is ->
+ taskRead = is.readObject()
+ }
+
+ assertEquals(task.description, taskRead.description)
+ assertEquals(task.startDate, taskRead.startDate)
+ assertEquals(task.status, taskRead.status)
+ }
+}
diff --git a/core-groovy/src/test/groovy/com/baeldung/io/ReadExampleUnitTest.groovy b/core-groovy/src/test/groovy/com/baeldung/io/ReadExampleUnitTest.groovy
new file mode 100644
index 0000000000..bed77b4d81
--- /dev/null
+++ b/core-groovy/src/test/groovy/com/baeldung/io/ReadExampleUnitTest.groovy
@@ -0,0 +1,134 @@
+package com.baeldung.io
+
+import static org.junit.Assert.*
+import org.junit.Test
+
+class ReadExampleUnitTest {
+
+ @Test
+ void whenUsingEachLine_thenCorrectLinesReturned() {
+ def expectedList = [
+ 'First line of text',
+ 'Second line of text',
+ 'Third line of text',
+ 'Fourth line of text']
+
+ def lines = []
+
+ new File('src/main/resources/ioInput.txt').eachLine { line ->
+ lines.add(line)
+ }
+ assertEquals(expectedList, lines)
+ }
+
+ @Test
+ void whenUsingReadEachLineWithLineNumber_thenCorrectLinesReturned() {
+ def expectedList = [
+ 'Second line of text',
+ 'Third line of text',
+ 'Fourth line of text']
+
+ def lineNoRange = 2..4
+ def lines = []
+
+ new File('src/main/resources/ioInput.txt').eachLine { line, lineNo ->
+ if (lineNoRange.contains(lineNo)) {
+ lines.add(line)
+ }
+ }
+ assertEquals(expectedList, lines)
+ }
+
+ @Test
+ void whenUsingReadEachLineWithLineNumberStartAtZero_thenCorrectLinesReturned() {
+ def expectedList = [
+ 'Second line of text',
+ 'Third line of text',
+ 'Fourth line of text']
+
+ def lineNoRange = 1..3
+ def lines = []
+
+ new File('src/main/resources/ioInput.txt').eachLine(0, { line, lineNo ->
+ if (lineNoRange.contains(lineNo)) {
+ lines.add(line)
+ }
+ })
+ assertEquals(expectedList, lines)
+ }
+
+ @Test
+ void whenUsingWithReader_thenLineCountReturned() {
+ def expectedCount = 4
+ def actualCount = 0
+ new File('src/main/resources/ioInput.txt').withReader { reader ->
+ while(reader.readLine()) {
+ actualCount++
+ }
+ }
+ assertEquals(expectedCount, actualCount)
+ }
+
+ @Test
+ void whenUsingNewReader_thenOutputFileCreated() {
+ def outputPath = 'src/main/resources/ioOut.txt'
+ def reader = new File('src/main/resources/ioInput.txt').newReader()
+ new File(outputPath).append(reader)
+ reader.close()
+ def ioOut = new File(outputPath)
+ assertTrue(ioOut.exists())
+ ioOut.delete()
+ }
+
+ @Test
+ void whenUsingWithInputStream_thenCorrectBytesAreReturned() {
+ def expectedLength = 1139
+ byte[] data = []
+ new File("src/main/resources/binaryExample.jpg").withInputStream { stream ->
+ data = stream.getBytes()
+ }
+ assertEquals(expectedLength, data.length)
+ }
+
+ @Test
+ void whenUsingNewInputStream_thenOutputFileCreated() {
+ def outputPath = 'src/main/resources/binaryOut.jpg'
+ def is = new File('src/main/resources/binaryExample.jpg').newInputStream()
+ new File(outputPath).append(is)
+ is.close()
+ def ioOut = new File(outputPath)
+ assertTrue(ioOut.exists())
+ ioOut.delete()
+ }
+
+ @Test
+ void whenUsingCollect_thenCorrectListIsReturned() {
+ def expectedList = ['First line of text', 'Second line of text', 'Third line of text', 'Fourth line of text']
+
+ def actualList = new File('src/main/resources/ioInput.txt').collect {it}
+ assertEquals(expectedList, actualList)
+ }
+
+ @Test
+ void whenUsingAsStringArray_thenCorrectArrayIsReturned() {
+ String[] expectedArray = ['First line of text', 'Second line of text', 'Third line of text', 'Fourth line of text']
+
+ def actualArray = new File('src/main/resources/ioInput.txt') as String[]
+ assertArrayEquals(expectedArray, actualArray)
+ }
+
+ @Test
+ void whenUsingText_thenCorrectStringIsReturned() {
+ def ln = System.getProperty('line.separator')
+ def expectedString = "First line of text${ln}Second line of text${ln}Third line of text${ln}Fourth line of text"
+ def actualString = new File('src/main/resources/ioInput.txt').text
+ assertEquals(expectedString.toString(), actualString)
+ }
+
+ @Test
+ void whenUsingBytes_thenByteArrayIsReturned() {
+ def expectedLength = 1139
+ def contents = new File('src/main/resources/binaryExample.jpg').bytes
+ assertEquals(expectedLength, contents.length)
+ }
+}
diff --git a/core-groovy/src/test/groovy/com/baeldung/io/TraverseFileTreeUnitTest.groovy b/core-groovy/src/test/groovy/com/baeldung/io/TraverseFileTreeUnitTest.groovy
new file mode 100644
index 0000000000..dac0189fb9
--- /dev/null
+++ b/core-groovy/src/test/groovy/com/baeldung/io/TraverseFileTreeUnitTest.groovy
@@ -0,0 +1,61 @@
+package com.baeldung.io
+
+import org.junit.Test
+
+import groovy.io.FileType
+import groovy.io.FileVisitResult
+
+class TraverseFileTreeUnitTest {
+ @Test
+ void whenUsingEachFile_filesAreListed() {
+ new File('src/main/resources').eachFile { file ->
+ println file.name
+ }
+ }
+
+ @Test(expected = IllegalArgumentException)
+ void whenUsingEachFileOnAFile_anErrorOccurs() {
+ new File('src/main/resources/ioInput.txt').eachFile { file ->
+ println file.name
+ }
+ }
+
+ @Test
+ void whenUsingEachFileMatch_filesAreListed() {
+ new File('src/main/resources').eachFileMatch(~/io.*\.txt/) { file ->
+ println file.name
+ }
+ }
+
+ @Test
+ void whenUsingEachFileRecurse_thenFilesInSubfoldersAreListed() {
+ new File('src/main').eachFileRecurse(FileType.FILES) { file ->
+ println "$file.parent $file.name"
+ }
+ }
+
+ @Test
+ void whenUsingEachFileRecurse_thenDirsInSubfoldersAreListed() {
+ new File('src/main').eachFileRecurse(FileType.DIRECTORIES) { file ->
+ println "$file.parent $file.name"
+ }
+ }
+
+ @Test
+ void whenUsingEachDirRecurse_thenDirsAndSubDirsAreListed() {
+ new File('src/main').eachDirRecurse { dir ->
+ println "$dir.parent $dir.name"
+ }
+ }
+
+ @Test
+ void whenUsingTraverse_thenDirectoryIsTraversed() {
+ new File('src/main').traverse { file ->
+ if (file.directory && file.name == 'groovy') {
+ FileVisitResult.SKIP_SUBTREE
+ } else {
+ println "$file.parent - $file.name"
+ }
+ }
+ }
+}
diff --git a/core-groovy/src/test/groovy/com/baeldung/io/WriteExampleUnitTest.groovy b/core-groovy/src/test/groovy/com/baeldung/io/WriteExampleUnitTest.groovy
new file mode 100644
index 0000000000..81758b430a
--- /dev/null
+++ b/core-groovy/src/test/groovy/com/baeldung/io/WriteExampleUnitTest.groovy
@@ -0,0 +1,96 @@
+package com.baeldung.io
+
+import static org.junit.Assert.*
+
+import org.junit.Before
+import org.junit.Test
+
+class WriteExampleUnitTest {
+ @Before
+ void clearOutputFile() {
+ new File('src/main/resources/ioOutput.txt').text = ''
+ new File('src/main/resources/ioBinaryOutput.bin').delete()
+ }
+
+ @Test
+ void whenUsingWithWriter_thenFileCreated() {
+ def outputLines = [
+ 'Line one of output example',
+ 'Line two of output example',
+ 'Line three of output example'
+ ]
+
+ def outputFileName = 'src/main/resources/ioOutput.txt'
+ new File(outputFileName).withWriter { writer ->
+ outputLines.each { line ->
+ writer.writeLine line
+ }
+ }
+ def writtenLines = new File(outputFileName).collect {it}
+ assertEquals(outputLines, writtenLines)
+ }
+
+ @Test
+ void whenUsingNewWriter_thenFileCreated() {
+ def outputLines = [
+ 'Line one of output example',
+ 'Line two of output example',
+ 'Line three of output example'
+ ]
+
+ def outputFileName = 'src/main/resources/ioOutput.txt'
+ def writer = new File(outputFileName).newWriter()
+ outputLines.forEach {line ->
+ writer.writeLine line
+ }
+ writer.flush()
+ writer.close()
+
+ def writtenLines = new File(outputFileName).collect {it}
+ assertEquals(outputLines, writtenLines)
+ }
+
+ @Test
+ void whenUsingDoubleLessThanOperator_thenFileCreated() {
+ def outputLines = [
+ 'Line one of output example',
+ 'Line two of output example',
+ 'Line three of output example'
+ ]
+
+ def ln = System.getProperty('line.separator')
+ def outputFileName = 'src/main/resources/ioOutput.txt'
+ new File(outputFileName) << "Line one of output example${ln}Line two of output example${ln}Line three of output example"
+ def writtenLines = new File(outputFileName).collect {it}
+ assertEquals(outputLines.size(), writtenLines.size())
+ }
+
+ @Test
+ void whenUsingBytes_thenBinaryFileCreated() {
+ def outputFileName = 'src/main/resources/ioBinaryOutput.bin'
+ def outputFile = new File(outputFileName)
+ byte[] outBytes = [44, 88, 22]
+ outputFile.bytes = outBytes
+ assertEquals(3, new File(outputFileName).size())
+ }
+
+ @Test
+ void whenUsingWithOutputStream_thenBinaryFileCreated() {
+ def outputFileName = 'src/main/resources/ioBinaryOutput.bin'
+ byte[] outBytes = [44, 88, 22]
+ new File(outputFileName).withOutputStream { stream ->
+ stream.write(outBytes)
+ }
+ assertEquals(3, new File(outputFileName).size())
+ }
+
+ @Test
+ void whenUsingNewOutputStream_thenBinaryFileCreated() {
+ def outputFileName = 'src/main/resources/ioBinaryOutput.bin'
+ byte[] outBytes = [44, 88, 22]
+ def os = new File(outputFileName).newOutputStream()
+ os.write(outBytes)
+ os.close()
+ assertEquals(3, new File(outputFileName).size())
+ }
+}
diff --git a/core-groovy/src/test/groovy/com/baeldung/lists/ListTest.groovy b/core-groovy/src/test/groovy/com/baeldung/lists/ListTest.groovy
new file mode 100644
index 0000000000..f682503ed4
--- /dev/null
+++ b/core-groovy/src/test/groovy/com/baeldung/lists/ListTest.groovy
@@ -0,0 +1,173 @@
+package com.baeldung.groovy.lists
+
+import static groovy.test.GroovyAssert.*
+import org.junit.Test
+
+class ListTest{
+
+ @Test
+ void testCreateList() {
+
+ def list = [1, 2, 3]
+ assertNotNull(list)
+
+ def listMix = ['A', "b", 1, true]
+ assertTrue(listMix == ['A', "b", 1, true])
+
+ def linkedList = [1, 2, 3] as LinkedList
+ assertTrue(linkedList instanceof LinkedList)
+
+ ArrayList arrList = [1, 2, 3]
+ assertTrue(arrList.class == ArrayList)
+
+ def copyList = new ArrayList(arrList)
+ assertTrue(copyList == arrList)
+
+ def cloneList = arrList.clone()
+ assertTrue(cloneList == arrList)
+ }
+
+ @Test
+ void testCreateEmptyList() {
+
+ def emptyList = []
+ assertTrue(emptyList.size() == 0)
+ }
+
+ @Test
+ void testCompareTwoLists() {
+
+ def list1 = [5, 6.0, 'p']
+ def list2 = [5, 6.0, 'p']
+ assertTrue(list1 == list2)
+ }
+
+ @Test
+ void testGetItemsFromList(){
+
+ def list = ["Hello", "World"]
+
+ assertTrue(list.get(1) == "World")
+ assertTrue(list[1] == "World")
+ assertTrue(list[-1] == "World")
+ assertTrue(list.getAt(1) == "World")
+ assertTrue(list.getAt(-2) == "Hello")
+ }
+
+ @Test
+ void testAddItemsToList() {
+
+ def list = []
+
+ list << 1
+ list.add("Apple")
+ assertTrue(list == [1, "Apple"])
+
+ list[2] = "Box"
+ list[4] = true
+ assertTrue(list == [1, "Apple", "Box", null, true])
+
+ list.add(1, 6.0)
+ assertTrue(list == [1, 6.0, "Apple", "Box", null, true])
+
+ def list2 = [1, 2]
+ list += list2
+ list += 12
+ assertTrue(list == [1, 6.0, "Apple", "Box", null, true, 1, 2, 12])
+ }
+
+ @Test
+ void testUpdateItemsInList() {
+
+ def list =[1, "Apple", 80, "App"]
+ list[1] = "Box"
+ list.set(2,90)
+ assertTrue(list == [1, "Box", 90, "App"])
+ }
+
+ @Test
+ void testRemoveItemsFromList(){
+
+ def list = [1, 2, 3, 4, 5, 5, 6, 6, 7]
+
+ list.remove(3)
+ assertTrue(list == [1, 2, 3, 5, 5, 6, 6, 7])
+
+ list.removeElement(5)
+ assertTrue(list == [1, 2, 3, 5, 6, 6, 7])
+
+ assertTrue(list - 6 == [1, 2, 3, 5, 7])
+ }
+
+ @Test
+ void testIteratingOnAList(){
+
+ def list = [1, "App", 3, 4]
+ list.each{ println it * 2}
+
+ list.eachWithIndex{ it, i -> println "$i : $it" }
+ }
+
+ @Test
+ void testCollectingToAnotherList(){
+
+ def list = ["Kay", "Henry", "Justin", "Tom"]
+ assertTrue(list.collect{"Hi " + it} == ["Hi Kay", "Hi Henry", "Hi Justin", "Hi Tom"])
+ }
+
+ @Test
+ void testJoinItemsInAList(){
+ assertTrue(["One", "Two", "Three"].join(",") == "One,Two,Three")
+ }
+
+ @Test
+ void testFilteringOnLists(){
+ def filterList = [2, 1, 3, 4, 5, 6, 76]
+
+ assertTrue(filterList.find{it > 3} == 4)
+
+ assertTrue(filterList.findAll{it > 3} == [4, 5, 6, 76])
+
+ assertTrue(filterList.findAll{ it instanceof Number} == [2, 1, 3, 4, 5, 6, 76])
+
+ assertTrue(filterList.grep( Number )== [2, 1, 3, 4, 5, 6, 76])
+
+ assertTrue(filterList.grep{ it> 6 }== [76])
+
+ def conditionList = [2, 1, 3, 4, 5, 6, 76]
+
+ assertFalse(conditionList.every{ it < 6})
+
+ assertTrue(conditionList.any{ it%2 == 0})
+
+ }
+
+ @Test
+ void testGetUniqueItemsInAList(){
+ assertTrue([1, 3, 3, 4].toUnique() == [1, 3, 4])
+
+ def uniqueList = [1, 3, 3, 4]
+ uniqueList.unique()
+ assertTrue(uniqueList == [1, 3, 4])
+
+ assertTrue(["A", "B", "Ba", "Bat", "Cat"].toUnique{ it.size()} == ["A", "Ba", "Bat"])
+ }
+
+ @Test
+ void testSorting(){
+
+ assertTrue([1, 2, 1, 0].sort() == [0, 1, 1, 2])
+ Comparator mc = {a,b -> a == b? 0: a < b? 1 : -1}
+
+ def list = [1, 2, 1, 0]
+ list.sort(mc)
+ assertTrue(list == [2, 1, 1, 0])
+
+ def strList = ["na", "ppp", "as"]
+ assertTrue(strList.max() == "ppp")
+
+ Comparator minc = {a,b -> a == b? 0: a < b? -1 : 1}
+ def numberList = [3, 2, 0, 7]
+ assertTrue(numberList.min(minc) == 0)
+ }
+}
\ No newline at end of file
diff --git a/core-groovy/src/test/groovy/com/baeldung/map/MapUnitTest.groovy b/core-groovy/src/test/groovy/com/baeldung/map/MapUnitTest.groovy
new file mode 100644
index 0000000000..97ffc50c76
--- /dev/null
+++ b/core-groovy/src/test/groovy/com/baeldung/map/MapUnitTest.groovy
@@ -0,0 +1,85 @@
+package com.baeldung.map
+
+import static org.junit.Assert.*
+import org.junit.Test
+
+class MapUnitTest {
+
+ @Test
+ void whenUsingEach_thenMapIsIterated() {
+ def map = [
+ 'FF0000' : 'Red',
+ '00FF00' : 'Lime',
+ '0000FF' : 'Blue',
+ 'FFFF00' : 'Yellow'
+ ]
+
+ map.each { println "Hex Code: $it.key = Color Name: $it.value" }
+ }
+
+ @Test
+ void whenUsingEachWithEntry_thenMapIsIterated() {
+ def map = [
+ 'E6E6FA' : 'Lavender',
+ 'D8BFD8' : 'Thistle',
+ 'DDA0DD' : 'Plum',
+ ]
+
+ map.each { entry -> println "Hex Code: $entry.key = Color Name: $entry.value" }
+ }
+
+ @Test
+ void whenUsingEachWithKeyAndValue_thenMapIsIterated() {
+ def map = [
+ '000000' : 'Black',
+ 'FFFFFF' : 'White',
+ '808080' : 'Gray'
+ ]
+
+ map.each { key, val ->
+ println "Hex Code: $key = Color Name $val"
+ }
+ }
+
+ @Test
+ void whenUsingEachWithIndexAndEntry_thenMapIsIterated() {
+ def map = [
+ '800080' : 'Purple',
+ '4B0082' : 'Indigo',
+ '6A5ACD' : 'Slate Blue'
+ ]
+
+ map.eachWithIndex { entry, index ->
+ def indent = ((index == 0 || index % 2 == 0) ? " " : "")
+ println "$indent Hex Code: $entry.key = Color Name: $entry.value"
+ }
+ }
+
+ @Test
+ void whenUsingEachWithIndexAndKeyAndValue_thenMapIsIterated() {
+ def map = [
+ 'FFA07A' : 'Light Salmon',
+ 'FF7F50' : 'Coral',
+ 'FF6347' : 'Tomato',
+ 'FF4500' : 'Orange Red'
+ ]
+
+ map.eachWithIndex { key, val, index ->
+ def indent = ((index == 0 || index % 2 == 0) ? " " : "")
+ println "$indent Hex Code: $key = Color Name: $val"
+ }
+ }
+
+ @Test
+ void whenUsingForLoop_thenMapIsIterated() {
+ def map = [
+ '2E8B57' : 'Seagreen',
+ '228B22' : 'Forest Green',
+ '008000' : 'Green'
+ ]
+
+ for (entry in map) {
+ println "Hex Code: $entry.key = Color Name: $entry.value"
+ }
+ }
+}
diff --git a/core-groovy/src/test/groovy/com/baeldung/strings/ConcatenateTest.groovy b/core-groovy/src/test/groovy/com/baeldung/strings/ConcatenateTest.groovy
new file mode 100644
index 0000000000..3ef4a5d460
--- /dev/null
+++ b/core-groovy/src/test/groovy/com/baeldung/strings/ConcatenateTest.groovy
@@ -0,0 +1,101 @@
+import com.baeldung.strings.Concatenate;
+
+class ConcatenateTest extends GroovyTestCase {
+
+ void testSimpleConcat() {
+ def name = new Concatenate()
+ name.first = 'Joe';
+ name.last = 'Smith';
+ def expected = 'My name is Joe Smith'
+ assertToString(name.doSimpleConcat(), expected)
+ }
+
+ void testConcatUsingGString() {
+ def name = new Concatenate()
+ name.first = "Joe";
+ name.last = "Smith";
+ def expected = "My name is Joe Smith"
+ assertToString(name.doConcatUsingGString(), expected)
+ }
+
+ void testConcatUsingGStringClosures() {
+ def name = new Concatenate()
+ name.first = "Joe";
+ name.last = "Smith";
+ def expected = "My name is Joe Smith"
+ assertToString(name.doConcatUsingGStringClosures(), expected)
+ }
+
+ void testConcatUsingStringConcatMethod() {
+ def name = new Concatenate()
+ name.first = "Joe";
+ name.last = "Smith";
+ def expected = "My name is Joe Smith"
+ assertToString(name.doConcatUsingStringConcatMethod(), expected)
+ }
+
+ void testConcatUsingLeftShiftOperator() {
+ def name = new Concatenate()
+ name.first = "Joe";
+ name.last = "Smith";
+ def expected = "My name is Joe Smith"
+ assertToString(name.doConcatUsingLeftShiftOperator(), expected)
+ }
+
+ void testConcatUsingArrayJoinMethod() {
+ def name = new Concatenate()
+ name.first = "Joe";
+ name.last = "Smith";
+ def expected = "My name is Joe Smith"
+ assertToString(name.doConcatUsingArrayJoinMethod(), expected)
+ }
+
+ void testConcatUsingArrayInjectMethod() {
+ def name = new Concatenate()
+ name.first = "Joe";
+ name.last = "Smith";
+ def expected = "My name is Joe Smith"
+ assertToString(name.doConcatUsingArrayInjectMethod(), expected)
+ }
+
+ void testConcatUsingStringBuilder() {
+ def name = new Concatenate()
+ name.first = "Joe";
+ name.last = "Smith";
+ def expected = "My name is Joe Smith"
+ assertToString(name.doConcatUsingStringBuilder(), expected)
+ }
+
+ void testConcatUsingStringBuffer() {
+ def name = new Concatenate()
+ name.first = "Joe";
+ name.last = "Smith";
+ def expected = "My name is Joe Smith"
+ assertToString(name.doConcatUsingStringBuffer(), expected)
+ }
+
+ void testConcatMultilineUsingStringConcatMethod() {
+ def name = new Concatenate()
+ name.first = '''Joe
+ Smith
+ ''';
+ name.last = 'Junior';
+ def expected = '''My name is Joe
+ Smith
+ Junior''';
+ assertToString(name.doConcatUsingStringConcatMethod(), expected)
+ }
+
+ void testGStringvsClosure(){
+ def first = "Joe";
+ def last = "Smith";
+ def eagerGString = "My name is $first $last"
+ def lazyGString = "My name is ${-> first} ${-> last}"
+
+ assert eagerGString == "My name is Joe Smith"
+ assert lazyGString == "My name is Joe Smith"
+ first = "David";
+ assert eagerGString == "My name is Joe Smith"
+ assert lazyGString == "My name is David Smith"
+ }
+}
diff --git a/core-groovy/src/test/groovy/com/baeldung/stringtypes/CharacterInGroovy.groovy b/core-groovy/src/test/groovy/com/baeldung/stringtypes/CharacterInGroovy.groovy
new file mode 100644
index 0000000000..c043723d95
--- /dev/null
+++ b/core-groovy/src/test/groovy/com/baeldung/stringtypes/CharacterInGroovy.groovy
@@ -0,0 +1,19 @@
+package groovy.com.baeldung.stringtypes
+
+import org.junit.Assert
+import org.junit.Test
+
+class CharacterInGroovy {
+
+ @Test
+ void 'character'() {
+ char a = 'A' as char
+ char b = 'B' as char
+ char c = (char) 'C'
+
+ Assert.assertTrue(a instanceof Character)
+ Assert.assertTrue(b instanceof Character)
+ Assert.assertTrue(c instanceof Character)
+ }
+
+}
diff --git a/core-groovy/src/test/groovy/com/baeldung/stringtypes/DollarSlashyString.groovy b/core-groovy/src/test/groovy/com/baeldung/stringtypes/DollarSlashyString.groovy
new file mode 100644
index 0000000000..db8ba68c8f
--- /dev/null
+++ b/core-groovy/src/test/groovy/com/baeldung/stringtypes/DollarSlashyString.groovy
@@ -0,0 +1,24 @@
+package groovy.com.baeldung.stringtypes
+
+import org.junit.Test
+
+class DollarSlashyString {
+
+ @Test
+ void 'dollar slashy string'() {
+ def name = "John"
+
+ def dollarSlashy = $/
+ Hello $name!,
+
+ I can show you $ sign or escaped dollar sign: $$
+ Both slashes works: \ or /, but we can still escape it: $/
+
+ We have to escape opening and closing delimiter:
+ - $$$/
+ - $/$$
+ /$
+
+ print(dollarSlashy)
+ }
+}
diff --git a/core-groovy/src/test/groovy/com/baeldung/stringtypes/DoubleQuotedString.groovy b/core-groovy/src/test/groovy/com/baeldung/stringtypes/DoubleQuotedString.groovy
new file mode 100644
index 0000000000..a730244d0a
--- /dev/null
+++ b/core-groovy/src/test/groovy/com/baeldung/stringtypes/DoubleQuotedString.groovy
@@ -0,0 +1,67 @@
+package groovy.com.baeldung.stringtypes
+
+import org.junit.Assert
+import org.junit.Test
+
+class DoubleQuotedString {
+
+ @Test
+ void 'escape double quoted string'() {
+ def example = "Hello \"world\"!"
+
+ println(example)
+ }
+
+ @Test
+ void 'String ang GString'() {
+ def string = "example"
+ def stringWithExpression = "example${2}"
+
+ Assert.assertTrue(string instanceof String)
+ Assert.assertTrue(stringWithExpression instanceof GString)
+ Assert.assertTrue(stringWithExpression.toString() instanceof String)
+ }
+
+ @Test
+ void 'placeholder with variable'() {
+ def name = "John"
+ def helloName = "Hello $name!".toString()
+
+ Assert.assertEquals("Hello John!", helloName)
+ }
+
+ @Test
+ void 'placeholder with expression'() {
+ def result = "result is ${2 * 2}".toString()
+
+ Assert.assertEquals("result is 4", result)
+ }
+
+ @Test
+ void 'placeholder with dotted access'() {
+ def person = [name: 'John']
+
+ def myNameIs = "I'm $person.name, and you?".toString()
+
+ Assert.assertEquals("I'm John, and you?", myNameIs)
+ }
+
+ @Test
+ void 'placeholder with method call'() {
+ def name = 'John'
+
+ def result = "Uppercase name: ${name.toUpperCase()}".toString()
+
+ Assert.assertEquals("Uppercase name: JOHN", result)
+ }
+
+
+ @Test
+ void 'GString and String hashcode'() {
+ def string = "2+2 is 4"
+ def gstring = "2+2 is ${4}"
+
+ Assert.assertTrue(string.hashCode() != gstring.hashCode())
+ }
+
+}
diff --git a/core-groovy/src/test/groovy/com/baeldung/stringtypes/SingleQuotedString.groovy b/core-groovy/src/test/groovy/com/baeldung/stringtypes/SingleQuotedString.groovy
new file mode 100644
index 0000000000..569991b788
--- /dev/null
+++ b/core-groovy/src/test/groovy/com/baeldung/stringtypes/SingleQuotedString.groovy
@@ -0,0 +1,15 @@
+package groovy.com.baeldung.stringtypes
+
+import org.junit.Assert
+import org.junit.Test
+
+class SingleQuotedString {
+
+ @Test
+ void 'single quoted string'() {
+ def example = 'Hello world'
+
+ Assert.assertEquals('Hello world!', 'Hello' + ' world!')
+ }
+
+}
diff --git a/core-groovy/src/test/groovy/com/baeldung/stringtypes/SlashyString.groovy b/core-groovy/src/test/groovy/com/baeldung/stringtypes/SlashyString.groovy
new file mode 100644
index 0000000000..09ba35e17e
--- /dev/null
+++ b/core-groovy/src/test/groovy/com/baeldung/stringtypes/SlashyString.groovy
@@ -0,0 +1,31 @@
+package groovy.com.baeldung.stringtypes
+
+import org.junit.Assert
+import org.junit.Test
+
+class SlashyString {
+
+ @Test
+ void 'slashy string'() {
+ def pattern = /.*foobar.*\/hello.*/
+
+ Assert.assertTrue("I'm matching foobar /hello regexp pattern".matches(pattern))
+ }
+
+ void 'wont compile'() {
+// if ('' == //) {
+// println("I can't compile")
+// }
+ }
+
+ @Test
+ void 'interpolate and multiline'() {
+ def name = 'John'
+
+ def example = /
+ Hello $name
+ second line
+ /
+ }
+
+}
diff --git a/core-groovy/src/test/groovy/com/baeldung/stringtypes/Strings.groovy b/core-groovy/src/test/groovy/com/baeldung/stringtypes/Strings.groovy
new file mode 100644
index 0000000000..e45f352285
--- /dev/null
+++ b/core-groovy/src/test/groovy/com/baeldung/stringtypes/Strings.groovy
@@ -0,0 +1,26 @@
+package groovy.com.baeldung.stringtypes
+
+import org.junit.Assert
+import org.junit.Test
+
+class Strings {
+
+ @Test
+ void 'string interpolation '() {
+ def name = "Kacper"
+
+ def result = "Hello ${name}!"
+
+ Assert.assertEquals("Hello Kacper!", result.toString())
+ }
+
+ @Test
+ void 'string concatenation'() {
+ def first = "first"
+ def second = "second"
+
+ def concatenation = first + second
+
+ Assert.assertEquals("firstsecond", concatenation)
+ }
+}
diff --git a/core-groovy/src/test/groovy/com/baeldung/stringtypes/TripleDoubleQuotedString.groovy b/core-groovy/src/test/groovy/com/baeldung/stringtypes/TripleDoubleQuotedString.groovy
new file mode 100644
index 0000000000..cbbb1a4665
--- /dev/null
+++ b/core-groovy/src/test/groovy/com/baeldung/stringtypes/TripleDoubleQuotedString.groovy
@@ -0,0 +1,19 @@
+package groovy.com.baeldung.stringtypes
+
+import org.junit.Test
+
+class TripleDoubleQuotedString {
+
+ @Test
+ void 'triple-quoted strings with interpolation'() {
+ def name = "John"
+
+ def multiLine = """
+ I'm $name.
+ "This is quotation"
+ """
+
+ println(multiLine)
+ }
+
+}
diff --git a/core-groovy/src/test/groovy/com/baeldung/stringtypes/TripleSingleQuotedString.groovy b/core-groovy/src/test/groovy/com/baeldung/stringtypes/TripleSingleQuotedString.groovy
new file mode 100644
index 0000000000..24d55b8a2a
--- /dev/null
+++ b/core-groovy/src/test/groovy/com/baeldung/stringtypes/TripleSingleQuotedString.groovy
@@ -0,0 +1,67 @@
+package groovy.com.baeldung.stringtypes
+
+import org.junit.Assert
+import org.junit.Test
+
+class TripleSingleQuotedString {
+
+ def 'formatted json'() {
+ def jsonContent = '''
+ {
+ "name": "John",
+ "age": 20,
+ "birthDate": null
+ }
+ '''
+ }
+
+ def 'triple single quoted'() {
+ def triple = '''im triple single quoted string'''
+ }
+
+ @Test
+ void 'triple single quoted with multiline string'() {
+ def triple = '''
+ firstline
+ secondline
+ '''
+
+ Assert.assertTrue(triple.startsWith("\n"))
+ }
+
+ @Test
+ void 'triple single quoted with multiline string with stripIndent() and removing newline characters'() {
+ def triple = '''\
+ firstline
+ secondline'''.stripIndent()
+
+ Assert.assertEquals("firstline\nsecondline", triple)
+ }
+
+ @Test
+ void 'triple single quoted with multiline string with last line with only whitespaces'() {
+ def triple = '''\
+ firstline
+ secondline\
+ '''.stripIndent()
+
+ println(triple)
+ }
+
+ @Test
+ void 'triple single quoted with multiline string with stripMargin(Character) and removing newline characters'() {
+ def triple = '''\
+ |firstline
+ |secondline'''.stripMargin()
+
+ println(triple)
+ }
+
+ @Test
+ void 'striple single quoted with special characters'() {
+ def specialCharacters = '''hello \'John\'. This is backslash - \\. \nSecond line starts here'''
+
+ println(specialCharacters)
+ }
+
+}
diff --git a/core-groovy/src/test/groovy/com/baeldung/traits/TraitsUnitTest.groovy b/core-groovy/src/test/groovy/com/baeldung/traits/TraitsUnitTest.groovy
new file mode 100644
index 0000000000..85130e8f07
--- /dev/null
+++ b/core-groovy/src/test/groovy/com/baeldung/traits/TraitsUnitTest.groovy
@@ -0,0 +1,114 @@
+package com.baeldung.traits
+
+import spock.lang.Specification
+
+class TraitsUnitTest extends Specification {
+
+ Employee employee
+ Dog dog
+
+ void setup () {
+ employee = new Employee()
+ dog = new Dog()
+ }
+
+ def 'Should return msg string when using Employee.sayHello method provided by UserTrait' () {
+ when:
+ def msg = employee.sayHello()
+ then:
+ msg
+ msg instanceof String
+ assert msg == "Hello!"
+ }
+
+ def 'Should return displayMsg string when using Employee.showName method' () {
+ when:
+ def displayMsg = employee.showName()
+ then:
+ displayMsg
+ displayMsg instanceof String
+ assert displayMsg == "Hello, Bob!"
+ }
+
+ def 'Should return greetMsg string when using Employee.greet method' () {
+ when:
+ def greetMsg = employee.greet()
+ then:
+ greetMsg
+ greetMsg instanceof String
+ assert greetMsg == "Hello, from a private method!"
+ }
+
+ def 'Should return MissingMethodException when using Employee.greetingMessage method' () {
+ when:
+ def exception
+ try {
+ employee.greetingMessage()
+ }catch(Exception e) {
+ exception = e
+ }
+
+ then:
+ exception
+ exception instanceof groovy.lang.MissingMethodException
+ assert exception.message == "No signature of method: com.baeldung.traits.Employee.greetingMessage()"+
+ " is applicable for argument types: () values: []"
+ }
+
+ def 'Should return employee instance when using Employee.whoAmI method' () {
+ when:
+ def emp = employee.self()
+ then:
+ emp
+ emp instanceof Employee
+ assert emp.is(employee)
+ }
+
+ def 'Should display lastName when using Employee.showLastName method' () {
+ when:
+ def lastNameMsg = employee.showLastName()
+ then:
+ lastNameMsg
+ lastNameMsg instanceof String
+ assert lastNameMsg == "Hello, Marley!"
+ }
+
+ def 'Should be able to define properties of UserTrait in Employee instance' () {
+ when:
+ employee = new Employee(email: "a@e.com", address: "baeldung.com")
+ then:
+ employee
+ employee instanceof Employee
+ assert employee.email == "a@e.com"
+ assert employee.address == "baeldung.com"
+ }
+
+ def 'Should execute basicAbility method from SpeakingTrait and return msg string' () {
+ when:
+ def speakMsg = dog.basicAbility()
+ then:
+ speakMsg
+ speakMsg instanceof String
+ assert speakMsg == "Speaking!!"
+ }
+
+ def 'Should verify multiple inheritance with traits and execute overridden traits method' () {
+ when:
+ def walkSpeakMsg = dog.speakAndWalk()
+ println walkSpeakMsg
+ then:
+ walkSpeakMsg
+ walkSpeakMsg instanceof String
+ assert walkSpeakMsg == "Walk and speak!!"
+ }
+
+ def 'Should implement AnimalTrait at runtime and access basicBehavior method' () {
+ when:
+ def dogInstance = new Dog() as AnimalTrait
+ def basicBehaviorMsg = dogInstance.basicBehavior()
+ then:
+ basicBehaviorMsg
+ basicBehaviorMsg instanceof String
+ assert basicBehaviorMsg == "Animalistic!!"
+ }
+}
\ No newline at end of file
diff --git a/core-java-10/pom.xml b/core-java-10/pom.xml
index 9fcdd9a162..b15f8b5d63 100644
--- a/core-java-10/pom.xml
+++ b/core-java-10/pom.xml
@@ -3,9 +3,9 @@
4.0.0
com.baeldung
core-java-10
- jar
0.1.0-SNAPSHOT
core-java-10
+ jar
http://maven.apache.org
diff --git a/core-java-11/README.md b/core-java-11/README.md
index c8039f4bc5..3c8b94fa28 100644
--- a/core-java-11/README.md
+++ b/core-java-11/README.md
@@ -3,3 +3,4 @@
- [Java 11 Single File Source Code](https://www.baeldung.com/java-single-file-source-code)
- [Java 11 Local Variable Syntax for Lambda Parameters](https://www.baeldung.com/java-var-lambda-params)
- [Java 11 String API Additions](https://www.baeldung.com/java-11-string-api)
+- [Java 11 Nest Based Access Control](https://www.baeldung.com/java-nest-based-access-control)
diff --git a/core-java-11/pom.xml b/core-java-11/pom.xml
index 4dcab49867..a9776d8f3b 100644
--- a/core-java-11/pom.xml
+++ b/core-java-11/pom.xml
@@ -3,9 +3,9 @@
4.0.0
com.baeldung
core-java-11
- jar
0.1.0-SNAPSHOT
core-java-11
+ jar
http://maven.apache.org
diff --git a/core-java-11/src/main/java/com/baeldung/epsilongc/MemoryPolluter.java b/core-java-11/src/main/java/com/baeldung/epsilongc/MemoryPolluter.java
new file mode 100644
index 0000000000..97e216513b
--- /dev/null
+++ b/core-java-11/src/main/java/com/baeldung/epsilongc/MemoryPolluter.java
@@ -0,0 +1,18 @@
+package com.baeldung.epsilongc;
+
+public class MemoryPolluter {
+
+ private static final int MEGABYTE_IN_BYTES = 1024 * 1024;
+ private static final int ITERATION_COUNT = 1024 * 10;
+
+ public static void main(String[] args) {
+ System.out.println("Starting pollution");
+
+ for (int i = 0; i < ITERATION_COUNT; i++) {
+ byte[] array = new byte[MEGABYTE_IN_BYTES];
+ }
+
+ System.out.println("Terminating");
+ }
+
+}
diff --git a/core-java-11/src/main/java/com/baeldung/java11/httpclient/HttpClientExample.java b/core-java-11/src/main/java/com/baeldung/java11/httpclient/HttpClientExample.java
new file mode 100644
index 0000000000..fb4abd3bb6
--- /dev/null
+++ b/core-java-11/src/main/java/com/baeldung/java11/httpclient/HttpClientExample.java
@@ -0,0 +1,132 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package com.baeldung.java11.httpclient;
+
+import java.io.IOException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.http.HttpClient;
+import java.net.http.HttpClient.Version;
+import java.net.http.HttpRequest;
+import java.net.http.HttpRequest.BodyPublishers;
+import java.net.http.HttpResponse;
+import java.net.http.HttpResponse.BodyHandlers;
+import java.net.http.HttpResponse.PushPromiseHandler;
+import java.util.Arrays;
+import java.util.List;
+import java.util.concurrent.CompletableFuture;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+public class HttpClientExample {
+
+ public static void main(String[] args) throws Exception {
+ httpGetRequest();
+ httpPostRequest();
+ asynchronousGetRequest();
+ asynchronousMultipleRequests();
+ pushRequest();
+ }
+
+ public static void httpGetRequest() throws URISyntaxException, IOException, InterruptedException {
+ HttpClient client = HttpClient.newHttpClient();
+ HttpRequest request = HttpRequest.newBuilder()
+ .version(HttpClient.Version.HTTP_2)
+ .uri(URI.create("http://jsonplaceholder.typicode.com/posts/1"))
+ .headers("Accept-Enconding", "gzip, deflate")
+ .build();
+ HttpResponse response = client.send(request, BodyHandlers.ofString());
+
+ String responseBody = response.body();
+ int responseStatusCode = response.statusCode();
+
+ System.out.println("httpGetRequest: " + responseBody);
+ System.out.println("httpGetRequest status code: " + responseStatusCode);
+ }
+
+ public static void httpPostRequest() throws URISyntaxException, IOException, InterruptedException {
+ HttpClient client = HttpClient.newBuilder()
+ .version(HttpClient.Version.HTTP_2)
+ .build();
+ HttpRequest request = HttpRequest.newBuilder(new URI("http://jsonplaceholder.typicode.com/posts"))
+ .version(HttpClient.Version.HTTP_2)
+ .POST(BodyPublishers.ofString("Sample Post Request"))
+ .build();
+ HttpResponse response = client.send(request, BodyHandlers.ofString());
+ String responseBody = response.body();
+ System.out.println("httpPostRequest : " + responseBody);
+ }
+
+ public static void asynchronousGetRequest() throws URISyntaxException {
+ HttpClient client = HttpClient.newHttpClient();
+ URI httpURI = new URI("http://jsonplaceholder.typicode.com/posts/1");
+ HttpRequest request = HttpRequest.newBuilder(httpURI)
+ .version(HttpClient.Version.HTTP_2)
+ .build();
+ CompletableFuture futureResponse = client.sendAsync(request, HttpResponse.BodyHandlers.ofString())
+ .thenAccept(resp -> {
+ System.out.println("Got pushed response " + resp.uri());
+ System.out.println("Response statuscode: " + resp.statusCode());
+ System.out.println("Response body: " + resp.body());
+ });
+ System.out.println("futureResponse" + futureResponse);
+
+ }
+
+ public static void asynchronousMultipleRequests() throws URISyntaxException {
+ HttpClient client = HttpClient.newHttpClient();
+ List uris = Arrays.asList(new URI("http://jsonplaceholder.typicode.com/posts/1"), new URI("http://jsonplaceholder.typicode.com/posts/2"));
+ List requests = uris.stream()
+ .map(HttpRequest::newBuilder)
+ .map(reqBuilder -> reqBuilder.build())
+ .collect(Collectors.toList());
+ System.out.println("Got pushed response1 " + requests);
+ CompletableFuture.allOf(requests.stream()
+ .map(request -> client.sendAsync(request, BodyHandlers.ofString()))
+ .toArray(CompletableFuture>[]::new))
+ .thenAccept(System.out::println)
+ .join();
+ }
+
+ public static void pushRequest() throws URISyntaxException, InterruptedException {
+ System.out.println("Running HTTP/2 Server Push example...");
+
+ HttpClient httpClient = HttpClient.newBuilder()
+ .version(Version.HTTP_2)
+ .build();
+
+ HttpRequest pageRequest = HttpRequest.newBuilder()
+ .uri(URI.create("https://http2.golang.org/serverpush"))
+ .build();
+
+ // Interface HttpResponse.PushPromiseHandler
+ // void applyPushPromise(HttpRequest initiatingRequest, HttpRequest pushPromiseRequest, Function,CompletableFuture>> acceptor)
+ httpClient.sendAsync(pageRequest, BodyHandlers.ofString(), pushPromiseHandler())
+ .thenAccept(pageResponse -> {
+ System.out.println("Page response status code: " + pageResponse.statusCode());
+ System.out.println("Page response headers: " + pageResponse.headers());
+ String responseBody = pageResponse.body();
+ System.out.println(responseBody);
+ }).join();
+
+ Thread.sleep(1000); // waiting for full response
+ }
+
+ private static PushPromiseHandler pushPromiseHandler() {
+ return (HttpRequest initiatingRequest,
+ HttpRequest pushPromiseRequest,
+ Function,
+ CompletableFuture>> acceptor) -> {
+ acceptor.apply(BodyHandlers.ofString())
+ .thenAccept(resp -> {
+ System.out.println(" Pushed response: " + resp.uri() + ", headers: " + resp.headers());
+ });
+ System.out.println("Promise request: " + pushPromiseRequest.uri());
+ System.out.println("Promise request: " + pushPromiseRequest.headers());
+ };
+ }
+
+}
diff --git a/core-java-11/src/test/java/com/baeldung/java11/httpclient/test/HttpClientTest.java b/core-java-11/src/test/java/com/baeldung/java11/httpclient/test/HttpClientTest.java
new file mode 100644
index 0000000000..bade666636
--- /dev/null
+++ b/core-java-11/src/test/java/com/baeldung/java11/httpclient/test/HttpClientTest.java
@@ -0,0 +1,240 @@
+package com.baeldung.java11.httpclient.test;
+
+import static org.hamcrest.CoreMatchers.containsString;
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.io.IOException;
+import java.net.Authenticator;
+import java.net.CookieManager;
+import java.net.CookiePolicy;
+import java.net.HttpURLConnection;
+import java.net.PasswordAuthentication;
+import java.net.ProxySelector;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.http.HttpClient;
+import java.net.http.HttpRequest;
+import java.net.http.HttpResponse;
+import java.net.http.HttpResponse.BodyHandlers;
+import java.util.Arrays;
+import java.util.List;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.CompletionException;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
+
+import org.junit.jupiter.api.Test;
+
+public class HttpClientTest {
+
+ @Test
+ public void shouldReturnSampleDataContentWhenConnectViaSystemProxy() throws IOException, InterruptedException, URISyntaxException {
+ HttpRequest request = HttpRequest.newBuilder()
+ .uri(new URI("https://postman-echo.com/post"))
+ .headers("Content-Type", "text/plain;charset=UTF-8")
+ .POST(HttpRequest.BodyPublishers.ofString("Sample body"))
+ .build();
+
+
+ HttpResponse response = HttpClient.newBuilder()
+ .proxy(ProxySelector.getDefault())
+ .build()
+ .send(request, HttpResponse.BodyHandlers.ofString());
+
+ assertThat(response.statusCode(), equalTo(HttpURLConnection.HTTP_OK));
+ assertThat(response.body(), containsString("Sample body"));
+ }
+
+ @Test
+ public void shouldNotFollowRedirectWhenSetToDefaultNever() throws IOException, InterruptedException, URISyntaxException {
+ HttpRequest request = HttpRequest.newBuilder()
+ .uri(new URI("http://stackoverflow.com"))
+ .version(HttpClient.Version.HTTP_1_1)
+ .GET()
+ .build();
+ HttpResponse response = HttpClient.newBuilder()
+ .build()
+ .send(request, HttpResponse.BodyHandlers.ofString());
+
+ assertThat(response.statusCode(), equalTo(HttpURLConnection.HTTP_MOVED_PERM));
+ assertThat(response.body(), containsString("https://stackoverflow.com/"));
+ }
+
+ @Test
+ public void shouldFollowRedirectWhenSetToAlways() throws IOException, InterruptedException, URISyntaxException {
+ HttpRequest request = HttpRequest.newBuilder()
+ .uri(new URI("http://stackoverflow.com"))
+ .version(HttpClient.Version.HTTP_1_1)
+ .GET()
+ .build();
+ HttpResponse response = HttpClient.newBuilder()
+ .followRedirects(HttpClient.Redirect.ALWAYS)
+ .build()
+ .send(request, HttpResponse.BodyHandlers.ofString());
+
+ assertThat(response.statusCode(), equalTo(HttpURLConnection.HTTP_OK));
+ assertThat(response.request()
+ .uri()
+ .toString(), equalTo("https://stackoverflow.com/"));
+ }
+
+ @Test
+ public void shouldReturnOKStatusForAuthenticatedAccess() throws URISyntaxException, IOException, InterruptedException {
+ HttpRequest request = HttpRequest.newBuilder()
+ .uri(new URI("https://postman-echo.com/basic-auth"))
+ .GET()
+ .build();
+ HttpResponse response = HttpClient.newBuilder()
+ .authenticator(new Authenticator() {
+ @Override
+ protected PasswordAuthentication getPasswordAuthentication() {
+ return new PasswordAuthentication("postman", "password".toCharArray());
+ }
+ })
+ .build()
+ .send(request, HttpResponse.BodyHandlers.ofString());
+
+ assertThat(response.statusCode(), equalTo(HttpURLConnection.HTTP_OK));
+ }
+
+ @Test
+ public void shouldSendRequestAsync() throws URISyntaxException, InterruptedException, ExecutionException {
+ HttpRequest request = HttpRequest.newBuilder()
+ .uri(new URI("https://postman-echo.com/post"))
+ .headers("Content-Type", "text/plain;charset=UTF-8")
+ .POST(HttpRequest.BodyPublishers.ofString("Sample body"))
+ .build();
+ CompletableFuture> response = HttpClient.newBuilder()
+ .build()
+ .sendAsync(request, HttpResponse.BodyHandlers.ofString());
+
+ assertThat(response.get()
+ .statusCode(), equalTo(HttpURLConnection.HTTP_OK));
+ }
+
+ @Test
+ public void shouldUseJustTwoThreadWhenProcessingSendAsyncRequest() throws URISyntaxException, InterruptedException, ExecutionException {
+ HttpRequest request = HttpRequest.newBuilder()
+ .uri(new URI("https://postman-echo.com/get"))
+ .GET()
+ .build();
+
+ ExecutorService executorService = Executors.newFixedThreadPool(2);
+
+ CompletableFuture> response1 = HttpClient.newBuilder()
+ .executor(executorService)
+ .build()
+ .sendAsync(request, HttpResponse.BodyHandlers.ofString());
+
+ CompletableFuture> response2 = HttpClient.newBuilder()
+ .executor(executorService)
+ .build()
+ .sendAsync(request, HttpResponse.BodyHandlers.ofString());
+
+ CompletableFuture> response3 = HttpClient.newBuilder()
+ .executor(executorService)
+ .build()
+ .sendAsync(request, HttpResponse.BodyHandlers.ofString());
+
+ CompletableFuture.allOf(response1, response2, response3)
+ .join();
+
+ assertThat(response1.get()
+ .statusCode(), equalTo(HttpURLConnection.HTTP_OK));
+ assertThat(response2.get()
+ .statusCode(), equalTo(HttpURLConnection.HTTP_OK));
+ assertThat(response3.get()
+ .statusCode(), equalTo(HttpURLConnection.HTTP_OK));
+ }
+
+ @Test
+ public void shouldNotStoreCookieWhenPolicyAcceptNone() throws URISyntaxException, IOException, InterruptedException {
+ HttpRequest request = HttpRequest.newBuilder()
+ .uri(new URI("https://postman-echo.com/get"))
+ .GET()
+ .build();
+
+ HttpClient httpClient = HttpClient.newBuilder()
+ .cookieHandler(new CookieManager(null, CookiePolicy.ACCEPT_NONE))
+ .build();
+
+ httpClient.send(request, HttpResponse.BodyHandlers.ofString());
+
+ assertTrue(httpClient.cookieHandler()
+ .isPresent());
+ }
+
+ @Test
+ public void shouldStoreCookieWhenPolicyAcceptAll() throws URISyntaxException, IOException, InterruptedException {
+ HttpRequest request = HttpRequest.newBuilder()
+ .uri(new URI("https://postman-echo.com/get"))
+ .GET()
+ .build();
+
+ HttpClient httpClient = HttpClient.newBuilder()
+ .cookieHandler(new CookieManager(null, CookiePolicy.ACCEPT_ALL))
+ .build();
+
+ httpClient.send(request, HttpResponse.BodyHandlers.ofString());
+
+ assertTrue(httpClient.cookieHandler()
+ .isPresent());
+ }
+
+ @Test
+ public void shouldProcessMultipleRequestViaStream() throws URISyntaxException, ExecutionException, InterruptedException {
+ List targets = Arrays.asList(new URI("https://postman-echo.com/get?foo1=bar1"), new URI("https://postman-echo.com/get?foo2=bar2"));
+
+ HttpClient client = HttpClient.newHttpClient();
+
+ List> futures = targets.stream()
+ .map(target -> client.sendAsync(HttpRequest.newBuilder(target)
+ .GET()
+ .build(), HttpResponse.BodyHandlers.ofString())
+ .thenApply(response -> response.body()))
+ .collect(Collectors.toList());
+
+ CompletableFuture.allOf(futures.toArray(new CompletableFuture[0]))
+ .join();
+
+ if (futures.get(0)
+ .get()
+ .contains("foo1")) {
+ assertThat(futures.get(0)
+ .get(), containsString("bar1"));
+ assertThat(futures.get(1)
+ .get(), containsString("bar2"));
+ } else {
+ assertThat(futures.get(1)
+ .get(), containsString("bar2"));
+ assertThat(futures.get(1)
+ .get(), containsString("bar1"));
+ }
+
+ }
+
+ @Test
+ public void completeExceptionallyExample() {
+ CompletableFuture cf = CompletableFuture.completedFuture("message").thenApplyAsync(String::toUpperCase,
+ CompletableFuture.delayedExecutor(1, TimeUnit.SECONDS));
+ CompletableFuture exceptionHandler = cf.handle((s, th) -> { return (th != null) ? "message upon cancel" : ""; });
+ cf.completeExceptionally(new RuntimeException("completed exceptionally"));
+ assertTrue("Was not completed exceptionally", cf.isCompletedExceptionally());
+ try {
+ cf.join();
+ fail("Should have thrown an exception");
+ } catch (CompletionException ex) { // just for testing
+ assertEquals("completed exceptionally", ex.getCause().getMessage());
+ }
+
+ assertEquals("message upon cancel", exceptionHandler.join());
+ }
+
+}
diff --git a/core-java-11/src/test/java/com/baeldung/java11/httpclient/test/HttpRequestTest.java b/core-java-11/src/test/java/com/baeldung/java11/httpclient/test/HttpRequestTest.java
new file mode 100644
index 0000000000..7d138bd8d5
--- /dev/null
+++ b/core-java-11/src/test/java/com/baeldung/java11/httpclient/test/HttpRequestTest.java
@@ -0,0 +1,168 @@
+package com.baeldung.java11.httpclient.test;
+
+import static java.time.temporal.ChronoUnit.SECONDS;
+import static org.hamcrest.CoreMatchers.containsString;
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.junit.Assert.assertThat;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.net.HttpURLConnection;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.http.HttpClient;
+import java.net.http.HttpRequest;
+import java.net.http.HttpResponse;
+import java.nio.file.Paths;
+import java.security.NoSuchAlgorithmException;
+import java.time.Duration;
+
+import org.junit.Test;
+
+public class HttpRequestTest {
+
+ @Test
+ public void shouldReturnStatusOKWhenSendGetRequest() throws IOException, InterruptedException, URISyntaxException {
+ HttpRequest request = HttpRequest.newBuilder()
+ .uri(new URI("https://postman-echo.com/get"))
+ .GET()
+ .build();
+
+ HttpResponse response = HttpClient.newHttpClient()
+ .send(request, HttpResponse.BodyHandlers.ofString());
+
+ assertThat(response.statusCode(), equalTo(HttpURLConnection.HTTP_OK));
+ }
+
+ @Test
+ public void shouldUseHttp2WhenWebsiteUsesHttp2() throws IOException, InterruptedException, URISyntaxException {
+ HttpRequest request = HttpRequest.newBuilder()
+ .uri(new URI("https://stackoverflow.com"))
+ .version(HttpClient.Version.HTTP_2)
+ .GET()
+ .build();
+ HttpResponse response = HttpClient.newHttpClient()
+ .send(request, HttpResponse.BodyHandlers.ofString());
+
+ assertThat(response.statusCode(), equalTo(HttpURLConnection.HTTP_OK));
+ assertThat(response.version(), equalTo(HttpClient.Version.HTTP_2));
+ }
+
+ @Test
+ public void shouldFallbackToHttp1_1WhenWebsiteDoesNotUseHttp2() throws IOException, InterruptedException, URISyntaxException, NoSuchAlgorithmException {
+ HttpRequest request = HttpRequest.newBuilder()
+ .uri(new URI("https://postman-echo.com/get"))
+ .version(HttpClient.Version.HTTP_2)
+ .GET()
+ .build();
+
+ HttpResponse response = HttpClient.newHttpClient()
+ .send(request, HttpResponse.BodyHandlers.ofString());
+
+ assertThat(response.version(), equalTo(HttpClient.Version.HTTP_1_1));
+ }
+
+ @Test
+ public void shouldReturnStatusOKWhenSendGetRequestWithDummyHeaders() throws IOException, InterruptedException, URISyntaxException {
+ HttpRequest request = HttpRequest.newBuilder()
+ .uri(new URI("https://postman-echo.com/get"))
+ .headers("key1", "value1", "key2", "value2")
+ .GET()
+ .build();
+
+ HttpResponse response = HttpClient.newHttpClient()
+ .send(request, HttpResponse.BodyHandlers.ofString());
+
+ assertThat(response.statusCode(), equalTo(HttpURLConnection.HTTP_OK));
+ }
+
+ @Test
+ public void shouldReturnStatusOKWhenSendGetRequestTimeoutSet() throws IOException, InterruptedException, URISyntaxException {
+ HttpRequest request = HttpRequest.newBuilder()
+ .uri(new URI("https://postman-echo.com/get"))
+ .timeout(Duration.of(10, SECONDS))
+ .GET()
+ .build();
+
+ HttpResponse response = HttpClient.newHttpClient()
+ .send(request, HttpResponse.BodyHandlers.ofString());
+
+ assertThat(response.statusCode(), equalTo(HttpURLConnection.HTTP_OK));
+ }
+
+ @Test
+ public void shouldReturnNoContentWhenPostWithNoBody() throws IOException, InterruptedException, URISyntaxException {
+ HttpRequest request = HttpRequest.newBuilder()
+ .uri(new URI("https://postman-echo.com/post"))
+ .POST(HttpRequest.BodyPublishers.noBody())
+ .build();
+
+ HttpResponse response = HttpClient.newHttpClient()
+ .send(request, HttpResponse.BodyHandlers.ofString());
+
+ assertThat(response.statusCode(), equalTo(HttpURLConnection.HTTP_OK));
+ }
+
+ @Test
+ public void shouldReturnSampleDataContentWhenPostWithBodyText() throws IOException, InterruptedException, URISyntaxException {
+ HttpRequest request = HttpRequest.newBuilder()
+ .uri(new URI("https://postman-echo.com/post"))
+ .headers("Content-Type", "text/plain;charset=UTF-8")
+ .POST(HttpRequest.BodyPublishers.ofString("Sample request body"))
+ .build();
+
+ HttpResponse response = HttpClient.newHttpClient()
+ .send(request, HttpResponse.BodyHandlers.ofString());
+
+ assertThat(response.statusCode(), equalTo(HttpURLConnection.HTTP_OK));
+ assertThat(response.body(), containsString("Sample request body"));
+ }
+
+ @Test
+ public void shouldReturnSampleDataContentWhenPostWithInputStream() throws IOException, InterruptedException, URISyntaxException {
+ byte[] sampleData = "Sample request body".getBytes();
+ HttpRequest request = HttpRequest.newBuilder()
+ .uri(new URI("https://postman-echo.com/post"))
+ .headers("Content-Type", "text/plain;charset=UTF-8")
+ .POST(HttpRequest.BodyPublishers.ofInputStream(() -> new ByteArrayInputStream(sampleData)))
+ .build();
+
+ HttpResponse response = HttpClient.newHttpClient()
+ .send(request, HttpResponse.BodyHandlers.ofString());
+
+ assertThat(response.statusCode(), equalTo(HttpURLConnection.HTTP_OK));
+ assertThat(response.body(), containsString("Sample request body"));
+ }
+
+ @Test
+ public void shouldReturnSampleDataContentWhenPostWithByteArrayProcessorStream() throws IOException, InterruptedException, URISyntaxException {
+ byte[] sampleData = "Sample request body".getBytes();
+ HttpRequest request = HttpRequest.newBuilder()
+ .uri(new URI("https://postman-echo.com/post"))
+ .headers("Content-Type", "text/plain;charset=UTF-8")
+ .POST(HttpRequest.BodyPublishers.ofByteArray(sampleData))
+ .build();
+
+ HttpResponse response = HttpClient.newHttpClient()
+ .send(request, HttpResponse.BodyHandlers.ofString());
+
+ assertThat(response.statusCode(), equalTo(HttpURLConnection.HTTP_OK));
+ assertThat(response.body(), containsString("Sample request body"));
+ }
+
+ @Test
+ public void shouldReturnSampleDataContentWhenPostWithFileProcessorStream() throws IOException, InterruptedException, URISyntaxException {
+ HttpRequest request = HttpRequest.newBuilder()
+ .uri(new URI("https://postman-echo.com/post"))
+ .headers("Content-Type", "text/plain;charset=UTF-8")
+ .POST(HttpRequest.BodyPublishers.ofFile(Paths.get("src/test/resources/sample.txt")))
+ .build();
+
+ HttpResponse response = HttpClient.newHttpClient()
+ .send(request, HttpResponse.BodyHandlers.ofString());
+
+ assertThat(response.statusCode(), equalTo(HttpURLConnection.HTTP_OK));
+ assertThat(response.body(), containsString("Sample file content"));
+ }
+
+}
diff --git a/core-java-11/src/test/java/com/baeldung/java11/httpclient/test/HttpResponseTest.java b/core-java-11/src/test/java/com/baeldung/java11/httpclient/test/HttpResponseTest.java
new file mode 100644
index 0000000000..78d86fbf4e
--- /dev/null
+++ b/core-java-11/src/test/java/com/baeldung/java11/httpclient/test/HttpResponseTest.java
@@ -0,0 +1,54 @@
+package com.baeldung.java11.httpclient.test;
+
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertThat;
+
+import java.io.IOException;
+import java.net.HttpURLConnection;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.http.HttpClient;
+import java.net.http.HttpRequest;
+import java.net.http.HttpResponse;
+
+import org.junit.Test;
+
+public class HttpResponseTest {
+
+ @Test
+ public void shouldReturnStatusOKWhenSendGetRequest() throws IOException, InterruptedException, URISyntaxException {
+ HttpRequest request = HttpRequest.newBuilder()
+ .uri(new URI("https://postman-echo.com/get"))
+ .version(HttpClient.Version.HTTP_2)
+ .GET()
+ .build();
+
+ HttpResponse response = HttpClient.newBuilder()
+ .followRedirects(HttpClient.Redirect.NORMAL)
+ .build()
+ .send(request, HttpResponse.BodyHandlers.ofString());
+
+ assertThat(response.statusCode(), equalTo(HttpURLConnection.HTTP_OK));
+ assertNotNull(response.body());
+ }
+
+ @Test
+ public void shouldResponseURIDifferentThanRequestUIRWhenRedirect() throws IOException, InterruptedException, URISyntaxException {
+ HttpRequest request = HttpRequest.newBuilder()
+ .uri(new URI("http://stackoverflow.com"))
+ .version(HttpClient.Version.HTTP_2)
+ .GET()
+ .build();
+ HttpResponse response = HttpClient.newBuilder()
+ .followRedirects(HttpClient.Redirect.NORMAL)
+ .build()
+ .send(request, HttpResponse.BodyHandlers.ofString());
+
+ assertThat(request.uri()
+ .toString(), equalTo("http://stackoverflow.com"));
+ assertThat(response.uri()
+ .toString(), equalTo("https://stackoverflow.com/"));
+ }
+
+}
diff --git a/core-java-8/README.md b/core-java-8/README.md
index 892dc71f76..99182da390 100644
--- a/core-java-8/README.md
+++ b/core-java-8/README.md
@@ -4,9 +4,9 @@
### Relevant Articles:
- [Java 8 Collectors](http://www.baeldung.com/java-8-collectors)
-- [Guide to Java 8’s Functional Interfaces](http://www.baeldung.com/java-8-functional-interfaces)
+- [Functional Interfaces in Java 8](http://www.baeldung.com/java-8-functional-interfaces)
- [Java 8 – Powerful Comparison with Lambdas](http://www.baeldung.com/java-8-sort-lambda)
-- [Java 8 New Features](http://www.baeldung.com/java-8-new-features)
+- [New Features in Java 8](http://www.baeldung.com/java-8-new-features)
- [Lambda Expressions and Functional Interfaces: Tips and Best Practices](http://www.baeldung.com/java-8-lambda-expressions-tips)
- [The Double Colon Operator in Java 8](http://www.baeldung.com/java-8-double-colon-operator)
- [Guide to Java 8 groupingBy Collector](http://www.baeldung.com/java-groupingby-collector)
@@ -38,3 +38,5 @@
- [Java @SafeVarargs Annotation](https://www.baeldung.com/java-safevarargs)
- [Java @Deprecated Annotation](https://www.baeldung.com/java-deprecated)
- [Java 8 Predicate Chain](https://www.baeldung.com/java-predicate-chain)
+- [Method References in Java](https://www.baeldung.com/java-method-references)
+- [Creating a Custom Annotation in Java](https://www.baeldung.com/java-custom-annotation)
diff --git a/core-java-8/pom.xml b/core-java-8/pom.xml
index 112e8b764d..b63afef7d4 100644
--- a/core-java-8/pom.xml
+++ b/core-java-8/pom.xml
@@ -4,8 +4,8 @@
com.baeldung
core-java-8
0.1.0-SNAPSHOT
- jar
core-java-8
+ jar
com.baeldung
@@ -180,7 +180,6 @@
4.1
4.01
1.10
- 1.16.12
0.9.0
1.13
2.10
diff --git a/core-java-8/src/main/java/com/baeldung/customannotations/Init.java b/core-java-8/src/main/java/com/baeldung/customannotations/Init.java
new file mode 100644
index 0000000000..265e7ba1d6
--- /dev/null
+++ b/core-java-8/src/main/java/com/baeldung/customannotations/Init.java
@@ -0,0 +1,13 @@
+package com.baeldung.customannotations;
+
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+@Retention(RUNTIME)
+@Target(METHOD)
+public @interface Init {
+
+}
diff --git a/core-java-8/src/main/java/com/baeldung/customannotations/JsonElement.java b/core-java-8/src/main/java/com/baeldung/customannotations/JsonElement.java
new file mode 100644
index 0000000000..e41a5b1e30
--- /dev/null
+++ b/core-java-8/src/main/java/com/baeldung/customannotations/JsonElement.java
@@ -0,0 +1,13 @@
+package com.baeldung.customannotations;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+@Retention(RUNTIME)
+@Target({ FIELD })
+public @interface JsonElement {
+ public String key() default "";
+}
diff --git a/core-java-8/src/main/java/com/baeldung/customannotations/JsonSerializable.java b/core-java-8/src/main/java/com/baeldung/customannotations/JsonSerializable.java
new file mode 100644
index 0000000000..48eeb09a1b
--- /dev/null
+++ b/core-java-8/src/main/java/com/baeldung/customannotations/JsonSerializable.java
@@ -0,0 +1,13 @@
+package com.baeldung.customannotations;
+
+import static java.lang.annotation.ElementType.TYPE;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+@Retention(RUNTIME)
+@Target(TYPE)
+public @interface JsonSerializable {
+
+}
diff --git a/core-java-8/src/main/java/com/baeldung/customannotations/JsonSerializationException.java b/core-java-8/src/main/java/com/baeldung/customannotations/JsonSerializationException.java
new file mode 100644
index 0000000000..f2c29855ac
--- /dev/null
+++ b/core-java-8/src/main/java/com/baeldung/customannotations/JsonSerializationException.java
@@ -0,0 +1,10 @@
+package com.baeldung.customannotations;
+
+public class JsonSerializationException extends RuntimeException {
+
+ private static final long serialVersionUID = 1L;
+
+ public JsonSerializationException(String message) {
+ super(message);
+ }
+}
diff --git a/core-java-8/src/main/java/com/baeldung/customannotations/ObjectToJsonConverter.java b/core-java-8/src/main/java/com/baeldung/customannotations/ObjectToJsonConverter.java
new file mode 100644
index 0000000000..dd126be8ed
--- /dev/null
+++ b/core-java-8/src/main/java/com/baeldung/customannotations/ObjectToJsonConverter.java
@@ -0,0 +1,67 @@
+package com.baeldung.customannotations;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+public class ObjectToJsonConverter {
+ public String convertToJson(Object object) throws JsonSerializationException {
+ try {
+
+ checkIfSerializable(object);
+ initializeObject(object);
+ return getJsonString(object);
+
+ } catch (Exception e) {
+ throw new JsonSerializationException(e.getMessage());
+ }
+ }
+
+ private void checkIfSerializable(Object object) {
+ if (Objects.isNull(object)) {
+ throw new JsonSerializationException("Can't serialize a null object");
+ }
+
+ Class> clazz = object.getClass();
+ if (!clazz.isAnnotationPresent(JsonSerializable.class)) {
+ throw new JsonSerializationException("The class " + clazz.getSimpleName() + " is not annotated with JsonSerializable");
+ }
+ }
+
+ private void initializeObject(Object object) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException {
+ Class> clazz = object.getClass();
+ for (Method method : clazz.getDeclaredMethods()) {
+ if (method.isAnnotationPresent(Init.class)) {
+ method.setAccessible(true);
+ method.invoke(object);
+ }
+ }
+ }
+
+ private String getJsonString(Object object) throws IllegalArgumentException, IllegalAccessException {
+ Class> clazz = object.getClass();
+ Map jsonElementsMap = new HashMap<>();
+ for (Field field : clazz.getDeclaredFields()) {
+ field.setAccessible(true);
+ if (field.isAnnotationPresent(JsonElement.class)) {
+ jsonElementsMap.put(getKey(field), (String) field.get(object));
+ }
+ }
+
+ String jsonString = jsonElementsMap.entrySet()
+ .stream()
+ .map(entry -> "\"" + entry.getKey() + "\":\"" + entry.getValue() + "\"")
+ .collect(Collectors.joining(","));
+ return "{" + jsonString + "}";
+ }
+
+ private String getKey(Field field) {
+ String value = field.getAnnotation(JsonElement.class)
+ .key();
+ return value.isEmpty() ? field.getName() : value;
+ }
+}
diff --git a/core-java-8/src/main/java/com/baeldung/customannotations/Person.java b/core-java-8/src/main/java/com/baeldung/customannotations/Person.java
new file mode 100644
index 0000000000..5db1a7f279
--- /dev/null
+++ b/core-java-8/src/main/java/com/baeldung/customannotations/Person.java
@@ -0,0 +1,66 @@
+package com.baeldung.customannotations;
+
+@JsonSerializable
+public class Person {
+ @JsonElement
+ private String firstName;
+ @JsonElement
+ private String lastName;
+ @JsonElement(key = "personAge")
+ private String age;
+
+ private String address;
+
+ public Person(String firstName, String lastName) {
+ super();
+ this.firstName = firstName;
+ this.lastName = lastName;
+ }
+
+ public Person(String firstName, String lastName, String age) {
+ this.firstName = firstName;
+ this.lastName = lastName;
+ this.age = age;
+ }
+
+ @Init
+ private void initNames() {
+ this.firstName = this.firstName.substring(0, 1)
+ .toUpperCase() + this.firstName.substring(1);
+ this.lastName = this.lastName.substring(0, 1)
+ .toUpperCase() + this.lastName.substring(1);
+ }
+
+ public String getFirstName() {
+ return firstName;
+ }
+
+ public void setFirstName(String firstName) {
+ this.firstName = firstName;
+ }
+
+ public String getLastName() {
+ return lastName;
+ }
+
+ public void setLastName(String lastName) {
+ this.lastName = lastName;
+ }
+
+ public String getAge() {
+ return age;
+ }
+
+ public void setAge(String age) {
+ this.age = age;
+ }
+
+ public String getAddress() {
+ return address;
+ }
+
+ public void setAddress(String address) {
+ this.address = address;
+ }
+
+}
diff --git a/core-java-8/src/main/java/com/baeldung/streamreduce/application/Application.java b/core-java-8/src/main/java/com/baeldung/streamreduce/application/Application.java
new file mode 100644
index 0000000000..0b1dd952dc
--- /dev/null
+++ b/core-java-8/src/main/java/com/baeldung/streamreduce/application/Application.java
@@ -0,0 +1,62 @@
+package com.baeldung.streamreduce.application;
+
+import com.baeldung.streamreduce.entities.User;
+import com.baeldung.streamreduce.utilities.NumberUtils;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+public class Application {
+
+ public static void main(String[] args) {
+ List numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
+ int result1 = numbers.stream().reduce(0, (a, b) -> a + b);
+ System.out.println(result1);
+
+ int result2 = numbers.stream().reduce(0, Integer::sum);
+ System.out.println(result2);
+
+ List letters = Arrays.asList("a", "b", "c", "d", "e");
+ String result3 = letters.stream().reduce("", (a, b) -> a + b);
+ System.out.println(result3);
+
+ String result4 = letters.stream().reduce("", String::concat);
+ System.out.println(result4);
+
+ String result5 = letters.stream().reduce("", (a, b) -> a.toUpperCase() + b.toUpperCase());
+ System.out.println(result5);
+
+ List users = Arrays.asList(new User("John", 30), new User("Julie", 35));
+ int result6 = users.stream().reduce(0, (partialAgeResult, user) -> partialAgeResult + user.getAge(), Integer::sum);
+ System.out.println(result6);
+
+ String result7 = letters.parallelStream().reduce("", String::concat);
+ System.out.println(result7);
+
+ int result8 = users.parallelStream().reduce(0, (partialAgeResult, user) -> partialAgeResult + user.getAge(), Integer::sum);
+ System.out.println(result8);
+
+ List userList = new ArrayList<>();
+ for (int i = 0; i <= 1000000; i++) {
+ userList.add(new User("John" + i, i));
+ }
+
+ long t1 = System.currentTimeMillis();
+ int result9 = userList.stream().reduce(0, (partialAgeResult, user) -> partialAgeResult + user.getAge(), Integer::sum);
+ long t2 = System.currentTimeMillis();
+ System.out.println(result9);
+ System.out.println("Sequential stream time: " + (t2 - t1) + "ms");
+
+ long t3 = System.currentTimeMillis();
+ int result10 = userList.parallelStream().reduce(0, (partialAgeResult, user) -> partialAgeResult + user.getAge(), Integer::sum);
+ long t4 = System.currentTimeMillis();
+ System.out.println(result10);
+ System.out.println("Parallel stream time: " + (t4 - t3) + "ms");
+
+ int result11 = NumberUtils.divideListElements(numbers, 1);
+ System.out.println(result11);
+
+ int result12 = NumberUtils.divideListElementsWithExtractedTryCatchBlock(numbers, 0);
+ System.out.println(result12);
+ }
+}
diff --git a/core-java-8/src/main/java/com/baeldung/streamreduce/entities/User.java b/core-java-8/src/main/java/com/baeldung/streamreduce/entities/User.java
new file mode 100644
index 0000000000..bc13a8cde6
--- /dev/null
+++ b/core-java-8/src/main/java/com/baeldung/streamreduce/entities/User.java
@@ -0,0 +1,25 @@
+package com.baeldung.streamreduce.entities;
+
+public class User {
+
+ private final String name;
+ private final int age;
+
+ public User(String name, int age) {
+ this.name = name;
+ this.age = age;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public int getAge() {
+ return age;
+ }
+
+ @Override
+ public String toString() {
+ return "User{" + "name=" + name + ", age=" + age + '}';
+ }
+}
diff --git a/core-java-8/src/main/java/com/baeldung/streamreduce/utilities/NumberUtils.java b/core-java-8/src/main/java/com/baeldung/streamreduce/utilities/NumberUtils.java
new file mode 100644
index 0000000000..7a6a85e6c4
--- /dev/null
+++ b/core-java-8/src/main/java/com/baeldung/streamreduce/utilities/NumberUtils.java
@@ -0,0 +1,52 @@
+package com.baeldung.streamreduce.utilities;
+
+import java.util.List;
+import java.util.function.BiFunction;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+public abstract class NumberUtils {
+
+ private static final Logger LOGGER = Logger.getLogger(NumberUtils.class.getName());
+
+ public static int divideListElements(List values, Integer divider) {
+ return values.stream()
+ .reduce(0, (a, b) -> {
+ try {
+ return a / divider + b / divider;
+ } catch (ArithmeticException e) {
+ LOGGER.log(Level.INFO, "Arithmetic Exception: Division by Zero");
+ }
+ return 0;
+ });
+ }
+
+ public static int divideListElementsWithExtractedTryCatchBlock(List values, int divider) {
+ return values.stream().reduce(0, (a, b) -> divide(a, divider) + divide(b, divider));
+ }
+
+ public static int divideListElementsWithApplyFunctionMethod(List values, int divider) {
+ BiFunction division = (a, b) -> a / b;
+ return values.stream().reduce(0, (a, b) -> applyFunction(division, a, divider) + applyFunction(division, b, divider));
+ }
+
+ private static int divide(int value, int factor) {
+ int result = 0;
+ try {
+ result = value / factor;
+ } catch (ArithmeticException e) {
+ LOGGER.log(Level.INFO, "Arithmetic Exception: Division by Zero");
+ }
+ return result;
+ }
+
+ private static int applyFunction(BiFunction function, int a, int b) {
+ try {
+ return function.apply(a, b);
+ }
+ catch(Exception e) {
+ LOGGER.log(Level.INFO, "Exception occurred!");
+ }
+ return 0;
+ }
+}
diff --git a/core-java-8/src/test/java/com/baeldung/collectors/Java8CollectorsUnitTest.java b/core-java-8/src/test/java/com/baeldung/collectors/Java8CollectorsUnitTest.java
index bad1c32e4a..e742635758 100644
--- a/core-java-8/src/test/java/com/baeldung/collectors/Java8CollectorsUnitTest.java
+++ b/core-java-8/src/test/java/com/baeldung/collectors/Java8CollectorsUnitTest.java
@@ -39,6 +39,7 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy;
public class Java8CollectorsUnitTest {
private final List givenList = Arrays.asList("a", "bb", "ccc", "dd");
+ private final List listWithDuplicates = Arrays.asList("a", "bb", "c", "d", "bb");
@Test
public void whenCollectingToList_shouldCollectToList() throws Exception {
@@ -48,12 +49,19 @@ public class Java8CollectorsUnitTest {
}
@Test
- public void whenCollectingToList_shouldCollectToSet() throws Exception {
+ public void whenCollectingToSet_shouldCollectToSet() throws Exception {
final Set result = givenList.stream().collect(toSet());
assertThat(result).containsAll(givenList);
}
+ @Test
+ public void givenContainsDuplicateElements_whenCollectingToSet_shouldAddDuplicateElementsOnlyOnce() throws Exception {
+ final Set result = listWithDuplicates.stream().collect(toSet());
+
+ assertThat(result).hasSize(4);
+ }
+
@Test
public void whenCollectingToCollection_shouldCollectToCollection() throws Exception {
final List result = givenList.stream().collect(toCollection(LinkedList::new));
@@ -77,10 +85,23 @@ public class Java8CollectorsUnitTest {
}
@Test
- public void whenCollectingToMap_shouldCollectToMapMerging() throws Exception {
- final Map result = givenList.stream().collect(toMap(Function.identity(), String::length, (i1, i2) -> i1));
+ public void whenCollectingToMapwWithDuplicates_shouldCollectToMapMergingTheIdenticalItems() throws Exception {
+ final Map result = listWithDuplicates.stream().collect(
+ toMap(
+ Function.identity(),
+ String::length,
+ (item, identicalItem) -> item
+ )
+ );
- assertThat(result).containsEntry("a", 1).containsEntry("bb", 2).containsEntry("ccc", 3).containsEntry("dd", 2);
+ assertThat(result).containsEntry("a", 1).containsEntry("bb", 2).containsEntry("c", 1).containsEntry("d", 1);
+ }
+
+ @Test
+ public void givenContainsDuplicateElements_whenCollectingToMap_shouldThrowException() throws Exception {
+ assertThatThrownBy(() -> {
+ listWithDuplicates.stream().collect(toMap(Function.identity(), String::length));
+ }).isInstanceOf(IllegalStateException.class);
}
@Test
diff --git a/core-java-8/src/test/java/com/baeldung/customannotations/JsonSerializerUnitTest.java b/core-java-8/src/test/java/com/baeldung/customannotations/JsonSerializerUnitTest.java
new file mode 100644
index 0000000000..f24b37aef7
--- /dev/null
+++ b/core-java-8/src/test/java/com/baeldung/customannotations/JsonSerializerUnitTest.java
@@ -0,0 +1,26 @@
+package com.baeldung.customannotations;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+import org.junit.jupiter.api.Test;
+
+public class JsonSerializerUnitTest {
+
+ @Test
+ public void givenObjectNotSerializedThenExceptionThrown() throws JsonSerializationException {
+ Object object = new Object();
+ ObjectToJsonConverter serializer = new ObjectToJsonConverter();
+ assertThrows(JsonSerializationException.class, () -> {
+ serializer.convertToJson(object);
+ });
+ }
+
+ @Test
+ public void givenObjectSerializedThenTrueReturned() throws JsonSerializationException {
+ Person person = new Person("soufiane", "cheouati", "34");
+ ObjectToJsonConverter serializer = new ObjectToJsonConverter();
+ String jsonString = serializer.convertToJson(person);
+ assertEquals("{\"personAge\":\"34\",\"firstName\":\"Soufiane\",\"lastName\":\"Cheouati\"}", jsonString);
+ }
+}
diff --git a/core-java-8/src/test/java/com/baeldung/java8/lambda/methodreference/Bicycle.java b/core-java-8/src/test/java/com/baeldung/java8/lambda/methodreference/Bicycle.java
new file mode 100644
index 0000000000..26f9f8bc46
--- /dev/null
+++ b/core-java-8/src/test/java/com/baeldung/java8/lambda/methodreference/Bicycle.java
@@ -0,0 +1,34 @@
+package com.baeldung.java8.lambda.methodreference;
+
+public class Bicycle {
+
+ private String brand;
+ private Integer frameSize;
+
+ public Bicycle(String brand) {
+ this.brand = brand;
+ this.frameSize = 0;
+ }
+
+ public Bicycle(String brand, Integer frameSize) {
+ this.brand = brand;
+ this.frameSize = frameSize;
+ }
+
+ public String getBrand() {
+ return brand;
+ }
+
+ public void setBrand(String brand) {
+ this.brand = brand;
+ }
+
+ public Integer getFrameSize() {
+ return frameSize;
+ }
+
+ public void setFrameSize(Integer frameSize) {
+ this.frameSize = frameSize;
+ }
+
+}
diff --git a/core-java-8/src/test/java/com/baeldung/java8/lambda/methodreference/BicycleComparator.java b/core-java-8/src/test/java/com/baeldung/java8/lambda/methodreference/BicycleComparator.java
new file mode 100644
index 0000000000..153a7d105a
--- /dev/null
+++ b/core-java-8/src/test/java/com/baeldung/java8/lambda/methodreference/BicycleComparator.java
@@ -0,0 +1,13 @@
+package com.baeldung.java8.lambda.methodreference;
+
+import java.util.Comparator;
+
+public class BicycleComparator implements Comparator {
+
+ @Override
+ public int compare(Bicycle a, Bicycle b) {
+ return a.getFrameSize()
+ .compareTo(b.getFrameSize());
+ }
+
+}
diff --git a/core-java-8/src/test/java/com/baeldung/java8/lambda/methodreference/MethodReferenceUnitTest.java b/core-java-8/src/test/java/com/baeldung/java8/lambda/methodreference/MethodReferenceUnitTest.java
new file mode 100644
index 0000000000..835815aecd
--- /dev/null
+++ b/core-java-8/src/test/java/com/baeldung/java8/lambda/methodreference/MethodReferenceUnitTest.java
@@ -0,0 +1,77 @@
+package com.baeldung.java8.lambda.methodreference;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.function.BiFunction;
+
+import org.apache.commons.lang3.StringUtils;
+import org.junit.Test;
+
+public class MethodReferenceUnitTest {
+
+ private static void doNothingAtAll(Object... o) {
+ }
+
+ ;
+
+ @Test
+ public void referenceToStaticMethod() {
+ List messages = Arrays.asList("Hello", "Baeldung", "readers!");
+ messages.forEach(word -> StringUtils.capitalize(word));
+ messages.forEach(StringUtils::capitalize);
+ }
+
+ @Test
+ public void referenceToInstanceMethodOfParticularObject() {
+ BicycleComparator bikeFrameSizeComparator = new BicycleComparator();
+ createBicyclesList().stream()
+ .sorted((a, b) -> bikeFrameSizeComparator.compare(a, b));
+ createBicyclesList().stream()
+ .sorted(bikeFrameSizeComparator::compare);
+ }
+
+ @Test
+ public void referenceToInstanceMethodOfArbitratyObjectOfParticularType() {
+ List numbers = Arrays.asList(5, 3, 50, 24, 40, 2, 9, 18);
+ numbers.stream()
+ .sorted((a, b) -> Integer.compare(a, b));
+ numbers.stream()
+ .sorted(Integer::compare);
+ }
+
+ @Test
+ public void referenceToConstructor() {
+ BiFunction bikeCreator = (brand, frameSize) -> new Bicycle(brand, frameSize);
+ BiFunction bikeCreatorMethodReference = Bicycle::new;
+ List bikes = new ArrayList<>();
+ bikes.add(bikeCreator.apply("Giant", 50));
+ bikes.add(bikeCreator.apply("Scott", 20));
+ bikes.add(bikeCreatorMethodReference.apply("Trek", 35));
+ bikes.add(bikeCreatorMethodReference.apply("GT", 40));
+ }
+
+ @Test
+ public void referenceToConstructorSimpleExample() {
+ List bikeBrands = Arrays.asList("Giant", "Scott", "Trek", "GT");
+ bikeBrands.stream()
+ .map(Bicycle::new)
+ .toArray(Bicycle[]::new);
+ }
+
+ @Test
+ public void limitationsAndAdditionalExamples() {
+ createBicyclesList().forEach(b -> System.out.printf("Bike brand is '%s' and frame size is '%d'%n", b.getBrand(), b.getFrameSize()));
+ createBicyclesList().forEach((o) -> MethodReferenceUnitTest.doNothingAtAll(o));
+ }
+
+ private List createBicyclesList() {
+ List bikes = new ArrayList<>();
+ bikes.add(new Bicycle("Giant", 50));
+ bikes.add(new Bicycle("Scott", 20));
+ bikes.add(new Bicycle("Trek", 35));
+ bikes.add(new Bicycle("GT", 40));
+ return bikes;
+ }
+
+}
diff --git a/core-java-8/src/test/java/com/baeldung/streamreduce/tests/StreamReduceManualTest.java b/core-java-8/src/test/java/com/baeldung/streamreduce/tests/StreamReduceManualTest.java
new file mode 100644
index 0000000000..9222cbb689
--- /dev/null
+++ b/core-java-8/src/test/java/com/baeldung/streamreduce/tests/StreamReduceManualTest.java
@@ -0,0 +1,126 @@
+package com.baeldung.streamreduce.tests;
+
+import com.baeldung.streamreduce.entities.User;
+import com.baeldung.streamreduce.utilities.NumberUtils;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import static org.assertj.core.api.Assertions.assertThat;
+import org.junit.Test;
+
+public class StreamReduceManualTest {
+
+ @Test
+ public void givenIntegerList_whenReduceWithSumAccumulatorLambda_thenCorrect() {
+ List numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
+
+ int result = numbers.stream().reduce(0, (a, b) -> a + b);
+
+ assertThat(result).isEqualTo(21);
+ }
+
+ @Test
+ public void givenIntegerList_whenReduceWithSumAccumulatorMethodReference_thenCorrect() {
+ List numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
+
+ int result = numbers.stream().reduce(0, Integer::sum);
+
+ assertThat(result).isEqualTo(21);
+ }
+
+ @Test
+ public void givenStringList_whenReduceWithConcatenatorAccumulatorLambda_thenCorrect() {
+ List letters = Arrays.asList("a", "b", "c", "d", "e");
+
+ String result = letters.stream().reduce("", (a, b) -> a + b);
+
+ assertThat(result).isEqualTo("abcde");
+ }
+
+ @Test
+ public void givenStringList_whenReduceWithConcatenatorAccumulatorMethodReference_thenCorrect() {
+ List letters = Arrays.asList("a", "b", "c", "d", "e");
+
+ String result = letters.stream().reduce("", String::concat);
+
+ assertThat(result).isEqualTo("abcde");
+ }
+
+ @Test
+ public void givenStringList_whenReduceWithUppercaseConcatenatorAccumulator_thenCorrect() {
+ List letters = Arrays.asList("a", "b", "c", "d", "e");
+
+ String result = letters.stream().reduce("", (a, b) -> a.toUpperCase() + b.toUpperCase());
+
+ assertThat(result).isEqualTo("ABCDE");
+ }
+
+ @Test
+ public void givenUserList_whenReduceWithAgeAccumulatorAndSumCombiner_thenCorrect() {
+ List users = Arrays.asList(new User("John", 30), new User("Julie", 35));
+
+ int result = users.stream().reduce(0, (partialAgeResult, user) -> partialAgeResult + user.getAge(), Integer::sum);
+
+ assertThat(result).isEqualTo(65);
+ }
+
+ @Test
+ public void givenStringList_whenReduceWithParallelStream_thenCorrect() {
+ List letters = Arrays.asList("a", "b", "c", "d", "e");
+
+ String result = letters.parallelStream().reduce("", String::concat);
+
+ assertThat(result).isEqualTo("abcde");
+ }
+
+ @Test
+ public void givenNumberUtilsClass_whenCalledDivideListElements_thenCorrect() {
+ List numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
+
+ assertThat(NumberUtils.divideListElements(numbers, 1)).isEqualTo(21);
+ }
+
+ @Test
+ public void givenNumberUtilsClass_whenCalledDivideListElementsWithExtractedTryCatchBlock_thenCorrect() {
+ List numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
+
+ assertThat(NumberUtils.divideListElementsWithExtractedTryCatchBlock(numbers, 1)).isEqualTo(21);
+ }
+
+ @Test
+ public void givenNumberUtilsClass_whenCalledDivideListElementsWithExtractedTryCatchBlockAndListContainsZero_thenCorrect() {
+ List numbers = Arrays.asList(0, 1, 2, 3, 4, 5, 6);
+
+ assertThat(NumberUtils.divideListElementsWithExtractedTryCatchBlock(numbers, 1)).isEqualTo(21);
+ }
+
+ @Test
+ public void givenNumberUtilsClass_whenCalledDivideListElementsWithExtractedTryCatchBlockAndDividerIsZero_thenCorrect() {
+ List numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
+
+ assertThat(NumberUtils.divideListElementsWithExtractedTryCatchBlock(numbers, 0)).isEqualTo(0);
+ }
+
+ @Test
+ public void givenStream_whneCalleddivideListElementsWithApplyFunctionMethod_thenCorrect() {
+ List numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
+
+ assertThat(NumberUtils.divideListElementsWithApplyFunctionMethod(numbers, 1)).isEqualTo(21);
+ }
+
+ @Test
+ public void givenTwoStreams_whenCalledReduceOnParallelizedStream_thenFasterExecutionTime() {
+ List userList = new ArrayList<>();
+ for (int i = 0; i <= 1000000; i++) {
+ userList.add(new User("John" + i, i));
+ }
+ long currentTime1 = System.currentTimeMillis();
+ userList.stream().reduce(0, (partialAgeResult, user) -> partialAgeResult + user.getAge(), Integer::sum);
+ long sequentialExecutionTime = System.currentTimeMillis() -currentTime1;
+ long currentTime2 = System.currentTimeMillis();
+ userList.parallelStream().reduce(0, (partialAgeResult, user) -> partialAgeResult + user.getAge(), Integer::sum);
+ long parallelizedExecutionTime = System.currentTimeMillis() - currentTime2;
+
+ assertThat(parallelizedExecutionTime).isLessThan(sequentialExecutionTime);
+ }
+}
diff --git a/core-java-9/README.md b/core-java-9/README.md
index c96267dc95..224306db19 100644
--- a/core-java-9/README.md
+++ b/core-java-9/README.md
@@ -16,7 +16,7 @@
- [Java 9 Reactive Streams](http://www.baeldung.com/java-9-reactive-streams)
- [Java 9 java.util.Objects Additions](http://www.baeldung.com/java-9-objects-new)
- [Java 9 Variable Handles Demistyfied](http://www.baeldung.com/java-variable-handles)
-- [Exploring the New HTTP Client in Java 9](http://www.baeldung.com/java-9-http-client)
+- [Exploring the New HTTP Client in Java 9 and 11](http://www.baeldung.com/java-9-http-client)
- [Method Handles in Java](http://www.baeldung.com/java-method-handles)
- [Introduction to Chronicle Queue](http://www.baeldung.com/java-chronicle-queue)
- [A Guide to Java 9 Modularity](http://www.baeldung.com/java-9-modularity)
@@ -26,3 +26,6 @@
- [Initialize a HashMap in Java](https://www.baeldung.com/java-initialize-hashmap)
- [Java 9 Platform Logging API](https://www.baeldung.com/java-9-logging-api)
- [Guide to java.lang.Process API](https://www.baeldung.com/java-process-api)
+- [Immutable Set in Java](https://www.baeldung.com/java-immutable-set)
+- [Multi-Release Jar Files](https://www.baeldung.com/java-multi-release-jar)
+- [Ahead of Time Compilation (AoT)](https://www.baeldung.com/ahead-of-time-compilation)
diff --git a/core-java-9/compile-aot.sh b/core-java-9/compile-aot.sh
new file mode 100755
index 0000000000..c3a39b0196
--- /dev/null
+++ b/core-java-9/compile-aot.sh
@@ -0,0 +1,5 @@
+#!/usr/bin/env bash
+cd src/main/java
+javac com/baeldung/java9/aot/JaotCompilation.java
+jaotc --output jaotCompilation.so com/baeldung/java9/aot/JaotCompilation.class
+
diff --git a/core-java-9/run-aot.sh b/core-java-9/run-aot.sh
new file mode 100755
index 0000000000..89fc616469
--- /dev/null
+++ b/core-java-9/run-aot.sh
@@ -0,0 +1,3 @@
+#!/usr/bin/env bash
+cd src/main/java
+java -XX:AOTLibrary=./jaotCompilation.so com/baeldung/java9/aot/JaotCompilation
\ No newline at end of file
diff --git a/core-java-9/src/main/java/com/baeldung/java9/aot/JaotCompilation.java b/core-java-9/src/main/java/com/baeldung/java9/aot/JaotCompilation.java
new file mode 100644
index 0000000000..4d8a018d6b
--- /dev/null
+++ b/core-java-9/src/main/java/com/baeldung/java9/aot/JaotCompilation.java
@@ -0,0 +1,12 @@
+package com.baeldung.java9.aot;
+
+public class JaotCompilation {
+
+ public static void main(String[] argv) {
+ System.out.println(message());
+ }
+
+ public static String message() {
+ return "The JAOT compiler says 'Hello'";
+ }
+}
\ No newline at end of file
diff --git a/core-java-9/src/main/java/com/baeldung/multireleaseapp/App.java b/core-java-9/src/main/java/com/baeldung/multireleaseapp/App.java
new file mode 100644
index 0000000000..21bbcc01d4
--- /dev/null
+++ b/core-java-9/src/main/java/com/baeldung/multireleaseapp/App.java
@@ -0,0 +1,16 @@
+package com.baeldung.multireleaseapp;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class App {
+
+ private static final Logger logger = LoggerFactory.getLogger(App.class);
+
+ public static void main(String[] args) throws Exception {
+ String dateToCheck = args[0];
+ boolean isLeapYear = DateHelper.checkIfLeapYear(dateToCheck);
+ logger.info("Date given " + dateToCheck + " is leap year: " + isLeapYear);
+ }
+
+}
diff --git a/core-java-9/src/main/java/com/baeldung/multireleaseapp/DateHelper.java b/core-java-9/src/main/java/com/baeldung/multireleaseapp/DateHelper.java
new file mode 100644
index 0000000000..4d943db30b
--- /dev/null
+++ b/core-java-9/src/main/java/com/baeldung/multireleaseapp/DateHelper.java
@@ -0,0 +1,22 @@
+package com.baeldung.multireleaseapp;
+
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.GregorianCalendar;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class DateHelper {
+
+ private static final Logger logger = LoggerFactory.getLogger(DateHelper.class);
+
+ public static boolean checkIfLeapYear(String dateStr) throws Exception {
+ logger.info("Checking for leap year using Java 1 calendar API");
+ Calendar cal = Calendar.getInstance();
+ cal.setTime(new SimpleDateFormat("yyyy-MM-dd").parse(dateStr));
+ int year = cal.get(Calendar.YEAR);
+ return (new GregorianCalendar()).isLeapYear(year);
+ }
+
+}
diff --git a/core-java-9/src/main/java9/com/baeldung/multireleaseapp/DateHelper.java b/core-java-9/src/main/java9/com/baeldung/multireleaseapp/DateHelper.java
new file mode 100644
index 0000000000..35fb0ada1e
--- /dev/null
+++ b/core-java-9/src/main/java9/com/baeldung/multireleaseapp/DateHelper.java
@@ -0,0 +1,18 @@
+package com.baeldung.multireleaseapp;
+
+import java.time.LocalDate;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class DateHelper {
+
+ private static final Logger logger = LoggerFactory.getLogger(DateHelper.class);
+
+ public static boolean checkIfLeapYear(String dateStr) throws Exception {
+ logger.info("Checking for leap year using Java 9 Date Api");
+ return LocalDate.parse(dateStr)
+ .isLeapYear();
+ }
+
+}
diff --git a/core-java-9/src/test/java/com/baeldung/processbuilder/ProcessBuilderUnitTest.java b/core-java-9/src/test/java/com/baeldung/processbuilder/ProcessBuilderUnitTest.java
new file mode 100644
index 0000000000..0458383e99
--- /dev/null
+++ b/core-java-9/src/test/java/com/baeldung/processbuilder/ProcessBuilderUnitTest.java
@@ -0,0 +1,182 @@
+package com.baeldung.processbuilder;
+
+import static org.hamcrest.Matchers.containsString;
+import static org.hamcrest.Matchers.empty;
+import static org.hamcrest.Matchers.hasItem;
+import static org.hamcrest.Matchers.hasItems;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.not;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertThat;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.lang.ProcessBuilder.Redirect;
+import java.nio.file.Files;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ExecutionException;
+import java.util.stream.Collectors;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
+
+public class ProcessBuilderUnitTest {
+
+ @Rule
+ public TemporaryFolder tempFolder = new TemporaryFolder();
+
+ @Test
+ public void givenProcessBuilder_whenInvokeStart_thenSuccess() throws IOException, InterruptedException, ExecutionException {
+ ProcessBuilder processBuilder = new ProcessBuilder("java", "-version");
+ processBuilder.redirectErrorStream(true);
+
+ Process process = processBuilder.start();
+
+ List results = readOutput(process.getInputStream());
+ assertThat("Results should not be empty", results, is(not(empty())));
+ assertThat("Results should contain java version: ", results, hasItem(containsString("java version")));
+
+ int exitCode = process.waitFor();
+ assertEquals("No errors should be detected", 0, exitCode);
+ }
+
+ @Test
+ public void givenProcessBuilder_whenModifyEnvironment_thenSuccess() throws IOException, InterruptedException {
+ ProcessBuilder processBuilder = new ProcessBuilder();
+ Map environment = processBuilder.environment();
+ environment.forEach((key, value) -> System.out.println(key + value));
+
+ environment.put("GREETING", "Hola Mundo");
+
+ List command = getGreetingCommand();
+ processBuilder.command(command);
+ Process process = processBuilder.start();
+
+ List results = readOutput(process.getInputStream());
+ assertThat("Results should not be empty", results, is(not(empty())));
+ assertThat("Results should contain a greeting ", results, hasItem(containsString("Hola Mundo")));
+
+ int exitCode = process.waitFor();
+ assertEquals("No errors should be detected", 0, exitCode);
+ }
+
+ @Test
+ public void givenProcessBuilder_whenModifyWorkingDir_thenSuccess() throws IOException, InterruptedException {
+ List command = getDirectoryListingCommand();
+ ProcessBuilder processBuilder = new ProcessBuilder(command);
+
+ processBuilder.directory(new File("src"));
+ Process process = processBuilder.start();
+
+ List results = readOutput(process.getInputStream());
+ assertThat("Results should not be empty", results, is(not(empty())));
+ assertThat("Results should contain directory listing: ", results, hasItems(containsString("main"), containsString("test")));
+
+ int exitCode = process.waitFor();
+ assertEquals("No errors should be detected", 0, exitCode);
+ }
+
+ @Test
+ public void givenProcessBuilder_whenRedirectStandardOutput_thenSuccessWriting() throws IOException, InterruptedException {
+ ProcessBuilder processBuilder = new ProcessBuilder("java", "-version");
+
+ processBuilder.redirectErrorStream(true);
+ File log = tempFolder.newFile("java-version.log");
+ processBuilder.redirectOutput(log);
+
+ Process process = processBuilder.start();
+
+ assertEquals("If redirected, should be -1 ", -1, process.getInputStream()
+ .read());
+ int exitCode = process.waitFor();
+ assertEquals("No errors should be detected", 0, exitCode);
+
+ List lines = Files.lines(log.toPath())
+ .collect(Collectors.toList());
+
+ assertThat("Results should not be empty", lines, is(not(empty())));
+ assertThat("Results should contain java version: ", lines, hasItem(containsString("java version")));
+ }
+
+ @Test
+ public void givenProcessBuilder_whenRedirectStandardOutput_thenSuccessAppending() throws IOException, InterruptedException {
+ ProcessBuilder processBuilder = new ProcessBuilder("java", "-version");
+
+ File log = tempFolder.newFile("java-version-append.log");
+ processBuilder.redirectErrorStream(true);
+ processBuilder.redirectOutput(Redirect.appendTo(log));
+
+ Process process = processBuilder.start();
+
+ assertEquals("If redirected output, should be -1 ", -1, process.getInputStream()
+ .read());
+
+ int exitCode = process.waitFor();
+ assertEquals("No errors should be detected", 0, exitCode);
+
+ List lines = Files.lines(log.toPath())
+ .collect(Collectors.toList());
+
+ assertThat("Results should not be empty", lines, is(not(empty())));
+ assertThat("Results should contain java version: ", lines, hasItem(containsString("java version")));
+ }
+
+ @Test
+ public void givenProcessBuilder_whenStartingPipeline_thenSuccess() throws IOException, InterruptedException {
+ if (!isWindows()) {
+ List builders = Arrays.asList(
+ new ProcessBuilder("find", "src", "-name", "*.java", "-type", "f"),
+ new ProcessBuilder("wc", "-l"));
+
+ List processes = ProcessBuilder.startPipeline(builders);
+ Process last = processes.get(processes.size() - 1);
+
+ List output = readOutput(last.getInputStream());
+ assertThat("Results should not be empty", output, is(not(empty())));
+ }
+ }
+
+ @Test
+ public void givenProcessBuilder_whenInheritIO_thenSuccess() throws IOException, InterruptedException {
+ List command = getEchoCommand();
+ ProcessBuilder processBuilder = new ProcessBuilder(command);
+
+ processBuilder.inheritIO();
+ Process process = processBuilder.start();
+
+ int exitCode = process.waitFor();
+ assertEquals("No errors should be detected", 0, exitCode);
+ }
+
+ private List readOutput(InputStream inputStream) throws IOException {
+ try (BufferedReader output = new BufferedReader(new InputStreamReader(inputStream))) {
+ return output.lines()
+ .collect(Collectors.toList());
+ }
+ }
+
+ private List getDirectoryListingCommand() {
+ return isWindows() ? Arrays.asList("cmd.exe", "/c", "dir") : Arrays.asList("/bin/sh", "-c", "ls");
+ }
+
+ private List getGreetingCommand() {
+ return isWindows() ? Arrays.asList("cmd.exe", "/c", "echo %GREETING%") : Arrays.asList("/bin/bash", "-c", "echo $GREETING");
+ }
+
+ private List getEchoCommand() {
+ return isWindows() ? Arrays.asList("cmd.exe", "/c", "echo hello") : Arrays.asList("/bin/sh", "-c", "echo hello");
+ }
+
+ private boolean isWindows() {
+ return System.getProperty("os.name")
+ .toLowerCase()
+ .startsWith("windows");
+ }
+
+}
diff --git a/core-java-arrays/README.md b/core-java-arrays/README.md
index 400dd7793c..ed8221ebe4 100644
--- a/core-java-arrays/README.md
+++ b/core-java-arrays/README.md
@@ -14,3 +14,4 @@
- [Array Operations in Java](http://www.baeldung.com/java-common-array-operations)
- [Intersection Between two Integer Arrays](https://www.baeldung.com/java-array-intersection)
- [Sorting Arrays in Java](https://www.baeldung.com/java-sorting-arrays)
+- [Convert a Float to a Byte Array in Java](https://www.baeldung.com/java-convert-float-to-byte-array)
diff --git a/core-java-arrays/pom.xml b/core-java-arrays/pom.xml
index d2d0453e87..ac9f7d08f0 100644
--- a/core-java-arrays/pom.xml
+++ b/core-java-arrays/pom.xml
@@ -4,8 +4,8 @@
com.baeldung
core-java-arrays
0.1.0-SNAPSHOT
- jar
core-java-arrays
+ jar
com.baeldung
@@ -390,7 +390,6 @@
3.8.1
- 1.16.12
1.19
1.19
diff --git a/core-java-arrays/src/main/java/com/baeldung/array/conversions/FloatToByteArray.java b/core-java-arrays/src/main/java/com/baeldung/array/conversions/FloatToByteArray.java
new file mode 100644
index 0000000000..b831e436a5
--- /dev/null
+++ b/core-java-arrays/src/main/java/com/baeldung/array/conversions/FloatToByteArray.java
@@ -0,0 +1,44 @@
+package com.baeldung.array.conversions;
+
+import java.nio.ByteBuffer;
+
+public class FloatToByteArray {
+
+ /**
+ * convert float into byte array using Float API floatToIntBits
+ * @param value
+ * @return byte[]
+ */
+ public static byte[] floatToByteArray(float value) {
+ int intBits = Float.floatToIntBits(value);
+ return new byte[] {(byte) (intBits >> 24), (byte) (intBits >> 16), (byte) (intBits >> 8), (byte) (intBits) };
+ }
+
+ /**
+ * convert byte array into float using Float API intBitsToFloat
+ * @param bytes
+ * @return float
+ */
+ public static float byteArrayToFloat(byte[] bytes) {
+ int intBits = bytes[0] << 24 | (bytes[1] & 0xFF) << 16 | (bytes[2] & 0xFF) << 8 | (bytes[3] & 0xFF);
+ return Float.intBitsToFloat(intBits);
+ }
+
+ /**
+ * convert float into byte array using ByteBuffer
+ * @param value
+ * @return byte[]
+ */
+ public static byte[] floatToByteArrayWithByteBuffer(float value) {
+ return ByteBuffer.allocate(4).putFloat(value).array();
+ }
+
+ /**
+ * convert byte array into float using ByteBuffer
+ * @param bytes
+ * @return float
+ */
+ public static float byteArrayToFloatWithByteBuffer(byte[] bytes) {
+ return ByteBuffer.wrap(bytes).getFloat();
+ }
+}
diff --git a/core-java-arrays/src/main/java/com/baeldung/arrays/ParallelPrefixBenchmark.java b/core-java-arrays/src/main/java/com/baeldung/arrays/ParallelPrefixBenchmark.java
new file mode 100644
index 0000000000..ac54aea402
--- /dev/null
+++ b/core-java-arrays/src/main/java/com/baeldung/arrays/ParallelPrefixBenchmark.java
@@ -0,0 +1,44 @@
+package com.baeldung.arrays;
+
+import org.openjdk.jmh.annotations.*;
+import org.openjdk.jmh.infra.Blackhole;
+
+import java.util.Arrays;
+
+public class ParallelPrefixBenchmark {
+ private static final int ARRAY_SIZE = 200_000_000;
+
+ @State(Scope.Benchmark)
+ public static class BigArray {
+
+ int[] data;
+
+ @Setup(Level.Iteration)
+ public void prepare() {
+ data = new int[ARRAY_SIZE];
+ for(int j = 0; j< ARRAY_SIZE; j++) {
+ data[j] = 1;
+ }
+ }
+
+ @TearDown(Level.Iteration)
+ public void destroy() {
+ data = null;
+ }
+
+ }
+
+ @Benchmark
+ public void largeArrayLoopSum(BigArray bigArray, Blackhole blackhole) {
+ for (int i = 0; i < ARRAY_SIZE - 1; i++) {
+ bigArray.data[i + 1] += bigArray.data[i];
+ }
+ blackhole.consume(bigArray.data);
+ }
+
+ @Benchmark
+ public void largeArrayParallelPrefixSum(BigArray bigArray, Blackhole blackhole) {
+ Arrays.parallelPrefix(bigArray.data, (left, right) -> left + right);
+ blackhole.consume(bigArray.data);
+ }
+}
diff --git a/core-java-arrays/src/test/java/com/baeldung/array/conversions/FloatToByteArrayUnitTest.java b/core-java-arrays/src/test/java/com/baeldung/array/conversions/FloatToByteArrayUnitTest.java
new file mode 100644
index 0000000000..a2cd273f21
--- /dev/null
+++ b/core-java-arrays/src/test/java/com/baeldung/array/conversions/FloatToByteArrayUnitTest.java
@@ -0,0 +1,46 @@
+package com.baeldung.array.conversions;
+
+import static com.baeldung.array.conversions.FloatToByteArray.byteArrayToFloat;
+import static com.baeldung.array.conversions.FloatToByteArray.byteArrayToFloatWithByteBuffer;
+import static com.baeldung.array.conversions.FloatToByteArray.floatToByteArray;
+import static com.baeldung.array.conversions.FloatToByteArray.floatToByteArrayWithByteBuffer;
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+import org.junit.Test;
+
+public class FloatToByteArrayUnitTest {
+
+ @Test
+ public void givenAFloat_thenConvertToByteArray() {
+ assertArrayEquals(new byte[] { 63, -116, -52, -51}, floatToByteArray(1.1f));
+ }
+
+ @Test
+ public void givenAByteArray_thenConvertToFloat() {
+ assertEquals(1.1f, byteArrayToFloat(new byte[] { 63, -116, -52, -51}), 0);
+ }
+
+ @Test
+ public void givenAFloat_thenConvertToByteArrayUsingByteBuffer() {
+ assertArrayEquals(new byte[] { 63, -116, -52, -51}, floatToByteArrayWithByteBuffer(1.1f));
+ }
+
+ @Test
+ public void givenAByteArray_thenConvertToFloatUsingByteBuffer() {
+ assertEquals(1.1f, byteArrayToFloatWithByteBuffer(new byte[] { 63, -116, -52, -51}), 0);
+ }
+
+ @Test
+ public void givenAFloat_thenConvertToByteArray_thenConvertToFloat() {
+ float floatToConvert = 200.12f;
+ byte[] byteArray = floatToByteArray(floatToConvert);
+ assertEquals(200.12f, byteArrayToFloat(byteArray), 0);
+ }
+
+ @Test
+ public void givenAFloat_thenConvertToByteArrayWithByteBuffer_thenConvertToFloatWithByteBuffer() {
+ float floatToConvert = 30100.42f;
+ byte[] byteArray = floatToByteArrayWithByteBuffer(floatToConvert);
+ assertEquals(30100.42f, byteArrayToFloatWithByteBuffer(byteArray), 0);
+ }
+}
diff --git a/core-java-arrays/src/test/java/com/baeldung/arrays/ArraysUnitTest.java b/core-java-arrays/src/test/java/com/baeldung/arrays/ArraysUnitTest.java
index 9e6d3d6131..b6801612b9 100644
--- a/core-java-arrays/src/test/java/com/baeldung/arrays/ArraysUnitTest.java
+++ b/core-java-arrays/src/test/java/com/baeldung/arrays/ArraysUnitTest.java
@@ -1,5 +1,7 @@
package com.baeldung.arrays;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
import static org.junit.Assert.*;
import org.junit.Before;
@@ -9,6 +11,7 @@ import org.junit.rules.ExpectedException;
import java.util.Arrays;
import java.util.List;
+import java.util.Random;
import java.util.stream.Stream;
public class ArraysUnitTest {
@@ -150,4 +153,52 @@ public class ArraysUnitTest {
exception.expect(UnsupportedOperationException.class);
rets.add("the");
}
+
+ @Test
+ public void givenIntArray_whenPrefixAdd_thenAllAccumulated() {
+ int[] arri = new int[] { 1, 2, 3, 4};
+ Arrays.parallelPrefix(arri, (left, right) -> left + right);
+ assertThat(arri, is(new int[] { 1, 3, 6, 10}));
+ }
+
+ @Test
+ public void givenStringArray_whenPrefixConcat_thenAllMerged() {
+ String[] arrs = new String[] { "1", "2", "3" };
+ Arrays.parallelPrefix(arrs, (left, right) -> left + right);
+ assertThat(arrs, is(new String[] { "1", "12", "123" }));
+ }
+
+ @Test
+ public void whenPrefixAddWithRange_thenRangeAdded() {
+ int[] arri = new int[] { 1, 2, 3, 4, 5 };
+ Arrays.parallelPrefix(arri, 1, 4, (left, right) -> left + right);
+ assertThat(arri, is(new int[] { 1, 2, 5, 9, 5 }));
+ }
+
+ @Test
+ public void whenPrefixNonAssociative_thenError() {
+ boolean consistent = true;
+ Random r = new Random();
+ for (int k = 0; k < 100_000; k++) {
+ int[] arrA = r.ints(100, 1, 5).toArray();
+ int[] arrB = Arrays.copyOf(arrA, arrA.length);
+
+ Arrays.parallelPrefix(arrA, this::nonassociativeFunc);
+
+ for (int i = 1; i < arrB.length; i++) {
+ arrB[i] = nonassociativeFunc(arrB[i - 1], arrB[i]);
+ }
+ consistent = Arrays.equals(arrA, arrB);
+ if(!consistent) break;
+ }
+ assertFalse(consistent);
+ }
+
+ /**
+ * non-associative int binary operator
+ */
+ private int nonassociativeFunc(int left, int right) {
+ return left + right*left;
+ }
+
}
diff --git a/core-java-collections-list/README.md b/core-java-collections-list/README.md
index a35e714006..c5139074e9 100644
--- a/core-java-collections-list/README.md
+++ b/core-java-collections-list/README.md
@@ -5,7 +5,7 @@
### Relevant Articles:
- [Immutable ArrayList in Java](http://www.baeldung.com/java-immutable-list)
- [Guide to the Java ArrayList](http://www.baeldung.com/java-arraylist)
-- [Random List Element](http://www.baeldung.com/java-random-list-element)
+- [Java – Get Random Item/Element From a List](http://www.baeldung.com/java-random-list-element)
- [Removing all nulls from a List in Java](http://www.baeldung.com/java-remove-nulls-from-list)
- [Removing all duplicates from a List in Java](http://www.baeldung.com/java-remove-duplicates-from-list)
- [How to TDD a List Implementation in Java](http://www.baeldung.com/java-test-driven-list)
@@ -26,3 +26,7 @@
- [ClassCastException: Arrays$ArrayList cannot be cast to ArrayList](https://www.baeldung.com/java-classcastexception-arrays-arraylist)
- [Flattening Nested Collections in Java](http://www.baeldung.com/java-flatten-nested-collections)
- [Intersection of Two Lists in Java](https://www.baeldung.com/java-lists-intersection)
+- [Multi Dimensional ArrayList in Java](https://www.baeldung.com/java-multi-dimensional-arraylist)
+- [Determine If All Elements Are the Same in a Java List](https://www.baeldung.com/java-list-all-equal)
+- [List of Primitive Integer Values in Java](https://www.baeldung.com/java-list-primitive-int)
+- [Performance Comparison of Primitive Lists in Java](https://www.baeldung.com/java-list-primitive-performance)
diff --git a/core-java-collections-list/pom.xml b/core-java-collections-list/pom.xml
index ee99e470d0..217278bdf6 100644
--- a/core-java-collections-list/pom.xml
+++ b/core-java-collections-list/pom.xml
@@ -3,8 +3,8 @@
4.0.0
core-java-collections-list
0.1.0-SNAPSHOT
- jar
core-java-collections-list
+ jar
com.baeldung
@@ -36,6 +36,33 @@
${lombok.version}
provided
+
+
+ net.sf.trove4j
+ trove4j
+ ${trove4j.version}
+
+
+ it.unimi.dsi
+ fastutil
+ ${fastutil.version}
+
+
+ colt
+ colt
+ ${colt.version}
+
+
+
+ org.openjdk.jmh
+ jmh-core
+ ${jmh-core.version}
+
+
+ org.openjdk.jmh
+ jmh-generator-annprocess
+ ${jmh-core.version}
+
@@ -43,6 +70,8 @@
3.8.1
1.7.0
3.11.1
- 1.16.12
+ 3.0.2
+ 8.1.0
+ 1.2.0
diff --git a/core-java-collections-list/src/main/java/com/baeldung/allequalelements/VerifyAllEqualListElements.java b/core-java-collections-list/src/main/java/com/baeldung/allequalelements/VerifyAllEqualListElements.java
new file mode 100644
index 0000000000..936e89893c
--- /dev/null
+++ b/core-java-collections-list/src/main/java/com/baeldung/allequalelements/VerifyAllEqualListElements.java
@@ -0,0 +1,55 @@
+package com.baeldung.allequalelements;
+
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import org.apache.commons.collections4.IterableUtils;
+import com.google.common.base.Predicate;
+import com.google.common.collect.Iterables;
+
+public class VerifyAllEqualListElements {
+
+ public boolean verifyAllEqualUsingALoop(List list) {
+ for (String s : list) {
+ if (!s.equals(list.get(0)))
+ return false;
+ }
+ return true;
+ }
+
+ public boolean verifyAllEqualUsingHashSet(List list) {
+ return new HashSet(list).size() <= 1;
+ }
+
+ public boolean verifyAllEqualUsingFrequency(List list) {
+ return list.isEmpty() || Collections.frequency(list, list.get(0)) == list.size();
+ }
+
+ public boolean verifyAllEqualUsingStream(List list) {
+ return list.stream()
+ .distinct()
+ .count() <= 1;
+ }
+
+ public boolean verifyAllEqualAnotherUsingStream(List list) {
+ return list.isEmpty() || list.stream()
+ .allMatch(list.get(0)::equals);
+ }
+
+ public boolean verifyAllEqualUsingGuava(List list) {
+ return Iterables.all(list, new Predicate() {
+ public boolean apply(String s) {
+ return s.equals(list.get(0));
+ }
+ });
+ }
+
+ public boolean verifyAllEqualUsingApacheCommon(List list) {
+ return IterableUtils.matchesAll(list, new org.apache.commons.collections4.Predicate() {
+ public boolean evaluate(String s) {
+ return s.equals(list.get(0));
+ }
+ });
+ }
+
+}
\ No newline at end of file
diff --git a/core-java-collections-list/src/main/java/com/baeldung/collection/filtering/Employee.java b/core-java-collections-list/src/main/java/com/baeldung/collection/filtering/Employee.java
new file mode 100644
index 0000000000..2aa267b4dc
--- /dev/null
+++ b/core-java-collections-list/src/main/java/com/baeldung/collection/filtering/Employee.java
@@ -0,0 +1,44 @@
+package com.baeldung.collection.filtering;
+
+/**
+ * Java 8 Collection Filtering by List of Values base class.
+ *
+ * @author Rodolfo Felipe
+ */
+public class Employee {
+
+ private Integer employeeNumber;
+ private String name;
+ private Integer departmentId;
+
+ public Employee(Integer employeeNumber, String name, Integer departmentId) {
+ this.employeeNumber = employeeNumber;
+ this.name = name;
+ this.departmentId = departmentId;
+ }
+
+ public Integer getEmployeeNumber() {
+ return employeeNumber;
+ }
+
+ public void setEmployeeNumber(Integer employeeNumber) {
+ this.employeeNumber = employeeNumber;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public Integer getDepartmentId() {
+ return departmentId;
+ }
+
+ public void setDepartmentId(Integer departmentId) {
+ this.departmentId = departmentId;
+ }
+
+}
diff --git a/core-java-collections-list/src/main/java/com/baeldung/list/primitive/PrimitiveCollections.java b/core-java-collections-list/src/main/java/com/baeldung/list/primitive/PrimitiveCollections.java
new file mode 100644
index 0000000000..01372763e9
--- /dev/null
+++ b/core-java-collections-list/src/main/java/com/baeldung/list/primitive/PrimitiveCollections.java
@@ -0,0 +1,52 @@
+package com.baeldung.list.primitive;
+
+import com.google.common.primitives.ImmutableIntArray;
+import com.google.common.primitives.Ints;
+import gnu.trove.list.array.TIntArrayList;
+import it.unimi.dsi.fastutil.ints.IntArrayList;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.OptionalDouble;
+import java.util.function.IntPredicate;
+import java.util.stream.IntStream;
+
+public class PrimitiveCollections {
+
+ public static void main(String[] args) {
+
+ int[] primitives = new int[] {5, 10, 0, 2, -8};
+
+ guavaPrimitives(primitives);
+
+ intStream(primitives);
+
+ TIntArrayList tList = new TIntArrayList(primitives);
+
+ cern.colt.list.IntArrayList coltList = new cern.colt.list.IntArrayList(primitives);
+
+ IntArrayList fastUtilList = new IntArrayList(primitives);
+
+ System.out.println(tList);
+
+ System.out.println(coltList);
+
+ System.out.println(fastUtilList);
+ }
+
+ private static void intStream(int[] primitives) {
+
+ IntStream stream = IntStream.of(5, 10, 0, 2, -8);
+
+ IntStream newStream = IntStream.of(primitives);
+
+ OptionalDouble average = stream.filter(i -> i > 0).average();
+ }
+
+
+ private static void guavaPrimitives(int[] primitives) {
+
+ ImmutableIntArray immutableIntArray = ImmutableIntArray.builder().addAll(primitives).build();
+ System.out.println(immutableIntArray);
+ }
+}
diff --git a/core-java-collections-list/src/main/java/com/baeldung/list/primitive/PrimitivesListPerformance.java b/core-java-collections-list/src/main/java/com/baeldung/list/primitive/PrimitivesListPerformance.java
new file mode 100644
index 0000000000..bd37e5e74e
--- /dev/null
+++ b/core-java-collections-list/src/main/java/com/baeldung/list/primitive/PrimitivesListPerformance.java
@@ -0,0 +1,96 @@
+package com.baeldung.list.primitive;
+
+import it.unimi.dsi.fastutil.ints.IntArrayList;
+import gnu.trove.list.array.TIntArrayList;
+import org.openjdk.jmh.annotations.*;
+import org.openjdk.jmh.runner.Runner;
+import org.openjdk.jmh.runner.options.Options;
+import org.openjdk.jmh.runner.options.OptionsBuilder;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+@BenchmarkMode(Mode.SingleShotTime)
+@OutputTimeUnit(TimeUnit.MILLISECONDS)
+@Measurement(batchSize = 100000, iterations = 10)
+@Warmup(batchSize = 100000, iterations = 10)
+@State(Scope.Thread)
+public class PrimitivesListPerformance {
+
+ private List arrayList = new ArrayList<>();
+ private TIntArrayList tList = new TIntArrayList();
+ private cern.colt.list.IntArrayList coltList = new cern.colt.list.IntArrayList();
+ private IntArrayList fastUtilList = new IntArrayList();
+
+ private int getValue = 10;
+
+ @Benchmark
+ public boolean addArrayList() {
+ return arrayList.add(getValue);
+ }
+
+ @Benchmark
+ public boolean addTroveIntList() {
+ return tList.add(getValue);
+ }
+
+ @Benchmark
+ public void addColtIntList() {
+ coltList.add(getValue);
+ }
+
+ @Benchmark
+ public boolean addFastUtilIntList() {
+ return fastUtilList.add(getValue);
+ }
+
+ @Benchmark
+ public int getArrayList() {
+ return arrayList.get(getValue);
+ }
+
+ @Benchmark
+ public int getTroveIntList() {
+ return tList.get(getValue);
+ }
+
+ @Benchmark
+ public int getColtIntList() {
+ return coltList.get(getValue);
+ }
+
+ @Benchmark
+ public int getFastUtilIntList() {
+ return fastUtilList.getInt(getValue);
+ }
+
+ @Benchmark
+ public boolean containsArrayList() {
+ return arrayList.contains(getValue);
+ }
+
+ @Benchmark
+ public boolean containsTroveIntList() {
+ return tList.contains(getValue);
+ }
+
+ @Benchmark
+ public boolean containsColtIntList() {
+ return coltList.contains(getValue);
+ }
+
+ @Benchmark
+ public boolean containsFastUtilIntList() {
+ return fastUtilList.contains(getValue);
+ }
+
+ public static void main(String[] args) throws Exception {
+ Options options = new OptionsBuilder()
+ .include(PrimitivesListPerformance.class.getSimpleName()).threads(1)
+ .forks(1).shouldFailOnError(true)
+ .shouldDoGC(true)
+ .jvmArgs("-server").build();
+ new Runner(options).run();
+ }
+}
diff --git a/core-java-collections-list/src/test/java/com/baeldung/allequalelements/VerifyAllEqualListElementsUnitTest.java b/core-java-collections-list/src/test/java/com/baeldung/allequalelements/VerifyAllEqualListElementsUnitTest.java
new file mode 100644
index 0000000000..698725591c
--- /dev/null
+++ b/core-java-collections-list/src/test/java/com/baeldung/allequalelements/VerifyAllEqualListElementsUnitTest.java
@@ -0,0 +1,172 @@
+package com.baeldung.allequalelements;
+
+import org.junit.Test;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import static org.junit.Assert.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+public class VerifyAllEqualListElementsUnitTest {
+
+ private static List notAllEqualList = new ArrayList<>();
+
+ private static List emptyList = new ArrayList<>();
+
+ private static List allEqualList = new ArrayList<>();
+
+ static {
+ notAllEqualList = Arrays.asList("Jack", "James", "Sam", "James");
+ emptyList = Arrays.asList();
+ allEqualList = Arrays.asList("Jack", "Jack", "Jack", "Jack");
+ }
+
+ private static VerifyAllEqualListElements verifyAllEqualListElements = new VerifyAllEqualListElements();
+
+ @Test
+ public void givenNotAllEqualList_whenUsingALoop_thenReturnFalse() {
+ boolean allEqual = verifyAllEqualListElements.verifyAllEqualUsingALoop(notAllEqualList);
+
+ assertFalse(allEqual);
+ }
+
+ @Test
+ public void givenEmptyList_whenUsingALoop_thenReturnTrue() {
+ boolean allEqual = verifyAllEqualListElements.verifyAllEqualUsingALoop(emptyList);
+
+ assertTrue(allEqual);
+ }
+
+ @Test
+ public void givenAllEqualList_whenUsingALoop_thenReturnTrue() {
+ boolean allEqual = verifyAllEqualListElements.verifyAllEqualUsingALoop(allEqualList);
+
+ assertTrue(allEqual);
+ }
+
+ @Test
+ public void givenNotAllEqualList_whenUsingHashSet_thenReturnFalse() {
+ boolean allEqual = verifyAllEqualListElements.verifyAllEqualUsingHashSet(notAllEqualList);
+
+ assertFalse(allEqual);
+ }
+
+ @Test
+ public void givenEmptyList_whenUsingHashSet_thenReturnTrue() {
+ boolean allEqual = verifyAllEqualListElements.verifyAllEqualUsingHashSet(emptyList);
+
+ assertTrue(allEqual);
+ }
+
+ @Test
+ public void givenAllEqualList_whenUsingHashSet_thenReturnTrue() {
+ boolean allEqual = verifyAllEqualListElements.verifyAllEqualUsingHashSet(allEqualList);
+
+ assertTrue(allEqual);
+ }
+
+ @Test
+ public void givenNotAllEqualList_whenUsingFrequency_thenReturnFalse() {
+ boolean allEqual = verifyAllEqualListElements.verifyAllEqualUsingFrequency(notAllEqualList);
+
+ assertFalse(allEqual);
+ }
+
+ @Test
+ public void givenEmptyList_whenUsingFrequency_thenReturnTrue() {
+ boolean allEqual = verifyAllEqualListElements.verifyAllEqualUsingFrequency(emptyList);
+
+ assertTrue(allEqual);
+ }
+
+ @Test
+ public void givenAllEqualList_whenUsingFrequency_thenReturnTrue() {
+ boolean allEqual = verifyAllEqualListElements.verifyAllEqualUsingFrequency(allEqualList);
+
+ assertTrue(allEqual);
+ }
+
+ @Test
+ public void givenNotAllEqualList_whenUsingStream_thenReturnFalse() {
+ boolean allEqual = verifyAllEqualListElements.verifyAllEqualUsingStream(notAllEqualList);
+
+ assertFalse(allEqual);
+ }
+
+ @Test
+ public void givenEmptyList_whenUsingStream_thenReturnTrue() {
+ boolean allEqual = verifyAllEqualListElements.verifyAllEqualUsingStream(emptyList);
+
+ assertTrue(allEqual);
+ }
+
+ @Test
+ public void givenAllEqualList_whenUsingStream_thenReturnTrue() {
+ boolean allEqual = verifyAllEqualListElements.verifyAllEqualUsingStream(allEqualList);
+
+ assertTrue(allEqual);
+ }
+
+ @Test
+ public void givenNotAllEqualList_whenUsingAnotherStream_thenReturnFalse() {
+ boolean allEqual = verifyAllEqualListElements.verifyAllEqualAnotherUsingStream(notAllEqualList);
+
+ assertFalse(allEqual);
+ }
+
+ @Test
+ public void givenEmptyList_whenUsingAnotherStream_thenReturnTrue() {
+ boolean allEqual = verifyAllEqualListElements.verifyAllEqualAnotherUsingStream(emptyList);
+
+ assertTrue(allEqual);
+ }
+
+ @Test
+ public void givenAllEqualList_whenUsingAnotherStream_thenReturnTrue() {
+ boolean allEqual = verifyAllEqualListElements.verifyAllEqualAnotherUsingStream(allEqualList);
+
+ assertTrue(allEqual);
+ }
+
+ @Test
+ public void givenNotAllEqualList_whenUsingGuava_thenReturnFalse() {
+ boolean allEqual = verifyAllEqualListElements.verifyAllEqualUsingGuava(notAllEqualList);
+
+ assertFalse(allEqual);
+ }
+
+ @Test
+ public void givenEmptyList_whenUsingGuava_thenReturnTrue() {
+ boolean allEqual = verifyAllEqualListElements.verifyAllEqualUsingGuava(emptyList);
+
+ assertTrue(allEqual);
+ }
+
+ @Test
+ public void givenAllEqualList_whenUsingGuava_thenReturnTrue() {
+ boolean allEqual = verifyAllEqualListElements.verifyAllEqualUsingGuava(allEqualList);
+
+ assertTrue(allEqual);
+ }
+
+ @Test
+ public void givenNotAllEqualList_whenUsingApacheCommon_thenReturnFalse() {
+ boolean allEqual = verifyAllEqualListElements.verifyAllEqualUsingApacheCommon(notAllEqualList);
+
+ assertFalse(allEqual);
+ }
+
+ @Test
+ public void givenEmptyList_whenUsingApacheCommon_thenReturnTrue() {
+ boolean allEqual = verifyAllEqualListElements.verifyAllEqualUsingApacheCommon(emptyList);
+
+ assertTrue(allEqual);
+ }
+
+ @Test
+ public void givenAllEqualList_whenUsingApacheCommon_thenReturnTrue() {
+ boolean allEqual = verifyAllEqualListElements.verifyAllEqualUsingApacheCommon(allEqualList);
+
+ assertTrue(allEqual);
+ }
+}
diff --git a/core-java-collections-list/src/test/java/com/baeldung/collection/filtering/CollectionFilteringUnitTest.java b/core-java-collections-list/src/test/java/com/baeldung/collection/filtering/CollectionFilteringUnitTest.java
new file mode 100644
index 0000000000..cbc7136192
--- /dev/null
+++ b/core-java-collections-list/src/test/java/com/baeldung/collection/filtering/CollectionFilteringUnitTest.java
@@ -0,0 +1,73 @@
+package com.baeldung.collection.filtering;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import org.hamcrest.Matchers;
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ * Various filtering examples.
+ *
+ * @author Rodolfo Felipe
+ */
+public class CollectionFilteringUnitTest {
+
+ private List buildEmployeeList() {
+ return Arrays.asList(new Employee(1, "Mike", 1), new Employee(2, "John", 1), new Employee(3, "Mary", 1), new Employee(4, "Joe", 2), new Employee(5, "Nicole", 2), new Employee(6, "Alice", 2), new Employee(7, "Bob", 3), new Employee(8, "Scarlett", 3));
+ }
+
+ private List employeeNameFilter() {
+ return Arrays.asList("Alice", "Mike", "Bob");
+ }
+
+ @Test
+ public void givenEmployeeList_andNameFilterList_thenObtainFilteredEmployeeList_usingForEachLoop() {
+ List filteredList = new ArrayList<>();
+ List originalList = buildEmployeeList();
+ List nameFilter = employeeNameFilter();
+
+ for (Employee employee : originalList) {
+ for (String name : nameFilter) {
+ if (employee.getName()
+ .equalsIgnoreCase(name)) {
+ filteredList.add(employee);
+ }
+ }
+ }
+
+ Assert.assertThat(filteredList.size(), Matchers.is(nameFilter.size()));
+ }
+
+ @Test
+ public void givenEmployeeList_andNameFilterList_thenObtainFilteredEmployeeList_usingLambda() {
+ List filteredList;
+ List originalList = buildEmployeeList();
+ List nameFilter = employeeNameFilter();
+
+ filteredList = originalList.stream()
+ .filter(employee -> nameFilter.contains(employee.getName()))
+ .collect(Collectors.toList());
+
+ Assert.assertThat(filteredList.size(), Matchers.is(nameFilter.size()));
+ }
+
+ @Test
+ public void givenEmployeeList_andNameFilterList_thenObtainFilteredEmployeeList_usingLambdaAndHashSet() {
+ List filteredList;
+ List originalList = buildEmployeeList();
+ Set nameFilterSet = employeeNameFilter().stream()
+ .collect(Collectors.toSet());
+
+ filteredList = originalList.stream()
+ .filter(employee -> nameFilterSet.contains(employee.getName()))
+ .collect(Collectors.toList());
+
+ Assert.assertThat(filteredList.size(), Matchers.is(nameFilterSet.size()));
+ }
+
+}
diff --git a/core-java-collections/README.md b/core-java-collections/README.md
index be83621429..80d4385c45 100644
--- a/core-java-collections/README.md
+++ b/core-java-collections/README.md
@@ -31,3 +31,5 @@
- [A Guide to EnumMap](https://www.baeldung.com/java-enum-map)
- [A Guide to Iterator in Java](http://www.baeldung.com/java-iterator)
- [Differences Between HashMap and Hashtable](https://www.baeldung.com/hashmap-hashtable-differences)
+- [Java ArrayList vs Vector](https://www.baeldung.com/java-arraylist-vs-vector)
+- [Defining a Char Stack in Java](https://www.baeldung.com/java-char-stack)
diff --git a/core-java-collections/pom.xml b/core-java-collections/pom.xml
index 2201ee8b15..b791f38b24 100644
--- a/core-java-collections/pom.xml
+++ b/core-java-collections/pom.xml
@@ -3,8 +3,8 @@
4.0.0
core-java-collections
0.1.0-SNAPSHOT
- jar
core-java-collections
+ jar
com.baeldung
@@ -54,7 +54,7 @@
org.apache.commons
commons-exec
- 1.3
+ ${commons-exec.version}
org.projectlombok
@@ -73,6 +73,6 @@
1.7.0
3.11.1
7.1.0
- 1.16.12
+ 1.3
diff --git a/core-java-collections/src/main/java/com/baeldung/charstack/CharStack.java b/core-java-collections/src/main/java/com/baeldung/charstack/CharStack.java
new file mode 100644
index 0000000000..f789a68d90
--- /dev/null
+++ b/core-java-collections/src/main/java/com/baeldung/charstack/CharStack.java
@@ -0,0 +1,37 @@
+package com.baeldung.charstack;
+
+import java.util.Iterator;
+import java.util.LinkedList;
+
+public class CharStack {
+
+ private LinkedList items;
+
+ public CharStack() {
+ this.items = new LinkedList();
+ }
+
+ public void push(Character item) {
+ items.push(item);
+ }
+
+ public Character peek() {
+ return items.getFirst();
+ }
+
+ public Character pop() {
+
+ Iterator iter = items.iterator();
+ Character item = iter.next();
+ if (item != null) {
+ iter.remove();
+ return item;
+ }
+ return null;
+ }
+
+ public int size() {
+ return items.size();
+ }
+
+}
diff --git a/core-java-collections/src/main/java/com/baeldung/charstack/CharStackWithArray.java b/core-java-collections/src/main/java/com/baeldung/charstack/CharStackWithArray.java
new file mode 100644
index 0000000000..ed7fa3f253
--- /dev/null
+++ b/core-java-collections/src/main/java/com/baeldung/charstack/CharStackWithArray.java
@@ -0,0 +1,48 @@
+package com.baeldung.charstack;
+
+public class CharStackWithArray {
+
+ private char[] elements;
+ private int size;
+
+ public CharStackWithArray() {
+ size = 0;
+ elements = new char[4];
+ }
+
+ public int size() {
+ return size;
+ }
+
+ public char peek() {
+ if (size == 0) {
+ throw new EmptyStackException();
+ }
+ return elements[size - 1];
+ }
+
+ public char pop() {
+ if (size == 0) {
+ throw new EmptyStackException();
+ }
+
+ return elements[--size];
+ }
+
+ public void push(char item) {
+ ensureCapacity(size + 1);
+ elements[size] = item;
+ size++;
+ }
+
+ private void ensureCapacity(int newSize) {
+ char newBiggerArray[];
+
+ if (elements.length < newSize) {
+ newBiggerArray = new char[elements.length * 2];
+ System.arraycopy(elements, 0, newBiggerArray, 0, size);
+ elements = newBiggerArray;
+ }
+ }
+
+}
diff --git a/core-java-collections/src/main/java/com/baeldung/charstack/EmptyStackException.java b/core-java-collections/src/main/java/com/baeldung/charstack/EmptyStackException.java
new file mode 100644
index 0000000000..f005854e7f
--- /dev/null
+++ b/core-java-collections/src/main/java/com/baeldung/charstack/EmptyStackException.java
@@ -0,0 +1,9 @@
+package com.baeldung.charstack;
+
+public class EmptyStackException extends RuntimeException {
+
+ public EmptyStackException() {
+ super("Stack is empty");
+ }
+
+}
diff --git a/core-java-collections/src/main/java/com/baeldung/java/sort/CollectionsSortCompare.java b/core-java-collections/src/main/java/com/baeldung/java/sort/CollectionsSortCompare.java
new file mode 100644
index 0000000000..1eff522877
--- /dev/null
+++ b/core-java-collections/src/main/java/com/baeldung/java/sort/CollectionsSortCompare.java
@@ -0,0 +1,39 @@
+package com.baeldung.java.sort;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+public class CollectionsSortCompare {
+
+ public static void main(String[] args) {
+ sortPrimitives();
+ sortReferenceType();
+ sortCollection();
+ }
+
+ private static void sortReferenceType() {
+ Integer[] numbers = {5, 22, 10, 0};
+ Arrays.sort(numbers);
+ System.out.println(Arrays.toString(numbers));
+ }
+
+ private static void sortCollection() {
+ List numbersList = new ArrayList<>();
+ numbersList.add(5);
+ numbersList.add(22);
+ numbersList.add(10);
+ numbersList.add(0);
+
+ Collections.sort(numbersList);
+
+ numbersList.forEach(System.out::print);
+ }
+
+ private static void sortPrimitives() {
+ int[] numbers = {5, 22, 10, 0};
+ Arrays.sort(numbers);
+ System.out.println(Arrays.toString(numbers));
+ }
+}
diff --git a/core-java-collections/src/main/java/com/baeldung/performance/ArraySortBenchmark.java b/core-java-collections/src/main/java/com/baeldung/performance/ArraySortBenchmark.java
new file mode 100644
index 0000000000..b93f8e9cc2
--- /dev/null
+++ b/core-java-collections/src/main/java/com/baeldung/performance/ArraySortBenchmark.java
@@ -0,0 +1,51 @@
+package com.baeldung.performance;
+
+import java.util.Arrays;
+import java.util.concurrent.TimeUnit;
+
+import org.openjdk.jmh.annotations.Benchmark;
+import org.openjdk.jmh.annotations.BenchmarkMode;
+import org.openjdk.jmh.annotations.Measurement;
+import org.openjdk.jmh.annotations.Mode;
+import org.openjdk.jmh.annotations.OutputTimeUnit;
+import org.openjdk.jmh.annotations.Scope;
+import org.openjdk.jmh.annotations.State;
+import org.openjdk.jmh.annotations.Warmup;
+import org.openjdk.jmh.runner.Runner;
+import org.openjdk.jmh.runner.options.Options;
+import org.openjdk.jmh.runner.options.OptionsBuilder;
+
+@BenchmarkMode(Mode.AverageTime)
+@OutputTimeUnit(TimeUnit.MILLISECONDS)
+@Measurement(batchSize = 100000, iterations = 10)
+@Warmup(batchSize = 100000, iterations = 10)
+public class ArraySortBenchmark {
+
+ @State(Scope.Thread)
+ public static class Initialize {
+ Integer[] numbers = { -769214442, -1283881723, 1504158300, -1260321086, -1800976432, 1278262737, 1863224321, 1895424914, 2062768552, -1051922993, 751605209, -1500919212, 2094856518, -1014488489, -931226326, -1677121986, -2080561705, 562424208, -1233745158, 41308167 };
+ int[] primitives = { -769214442, -1283881723, 1504158300, -1260321086, -1800976432, 1278262737, 1863224321, 1895424914, 2062768552, -1051922993, 751605209, -1500919212, 2094856518, -1014488489, -931226326, -1677121986, -2080561705, 562424208, -1233745158, 41308167 };
+ }
+
+ @Benchmark
+ public Integer[] benchmarkArraysIntegerSort(ArraySortBenchmark.Initialize state) {
+ Arrays.sort(state.numbers);
+ return state.numbers;
+ }
+
+ @Benchmark
+ public int[] benchmarkArraysIntSort(ArraySortBenchmark.Initialize state) {
+ Arrays.sort(state.primitives);
+ return state.primitives;
+ }
+
+
+ public static void main(String[] args) throws Exception {
+ Options options = new OptionsBuilder()
+ .include(ArraySortBenchmark.class.getSimpleName()).threads(1)
+ .forks(1).shouldFailOnError(true)
+ .shouldDoGC(true)
+ .jvmArgs("-server").build();
+ new Runner(options).run();
+ }
+}
diff --git a/core-java-collections/src/main/java/com/baeldung/queueInterface/CustomBaeldungQueue.java b/core-java-collections/src/main/java/com/baeldung/queueInterface/CustomBaeldungQueue.java
index 6b088a5079..4fcc211812 100644
--- a/core-java-collections/src/main/java/com/baeldung/queueInterface/CustomBaeldungQueue.java
+++ b/core-java-collections/src/main/java/com/baeldung/queueInterface/CustomBaeldungQueue.java
@@ -1,4 +1,4 @@
-package com.baeldung.queueinterface;
+package com.baeldung.queueInterface;
import java.util.AbstractQueue;
import java.util.Iterator;
diff --git a/core-java-collections/src/test/java/com/baeldung/charstack/CharStackUnitTest.java b/core-java-collections/src/test/java/com/baeldung/charstack/CharStackUnitTest.java
new file mode 100644
index 0000000000..a20526fd9d
--- /dev/null
+++ b/core-java-collections/src/test/java/com/baeldung/charstack/CharStackUnitTest.java
@@ -0,0 +1,50 @@
+package com.baeldung.charstack;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.jupiter.api.Test;
+
+public class CharStackUnitTest {
+
+ @Test
+ public void whenCharStackIsCreated_thenItHasSize0() {
+
+ CharStack charStack = new CharStack();
+
+ assertEquals(0, charStack.size());
+ }
+
+ @Test
+ public void givenEmptyCharStack_whenElementIsPushed_thenStackSizeisIncreased() {
+
+ CharStack charStack = new CharStack();
+
+ charStack.push('A');
+
+ assertEquals(1, charStack.size());
+ }
+
+ @Test
+ public void givenCharStack_whenElementIsPoppedFromStack_thenElementIsRemovedAndSizeChanges() {
+
+ CharStack charStack = new CharStack();
+ charStack.push('A');
+
+ char element = charStack.pop();
+
+ assertEquals('A', element);
+ assertEquals(0, charStack.size());
+ }
+
+ @Test
+ public void givenCharStack_whenElementIsPeeked_thenElementIsNotRemovedAndSizeDoesNotChange() {
+ CharStack charStack = new CharStack();
+ charStack.push('A');
+
+ char element = charStack.peek();
+
+ assertEquals('A', element);
+ assertEquals(1, charStack.size());
+ }
+
+}
diff --git a/core-java-collections/src/test/java/com/baeldung/charstack/CharStackUsingJavaUnitTest.java b/core-java-collections/src/test/java/com/baeldung/charstack/CharStackUsingJavaUnitTest.java
new file mode 100644
index 0000000000..964b901ae0
--- /dev/null
+++ b/core-java-collections/src/test/java/com/baeldung/charstack/CharStackUsingJavaUnitTest.java
@@ -0,0 +1,53 @@
+package com.baeldung.charstack;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.Stack;
+
+import org.junit.jupiter.api.Test;
+
+public class CharStackUsingJavaUnitTest {
+
+ @Test
+ public void whenCharStackIsCreated_thenItHasSize0() {
+
+ Stack charStack = new Stack<>();
+
+ assertEquals(0, charStack.size());
+ }
+
+ @Test
+ public void givenEmptyCharStack_whenElementIsPushed_thenStackSizeisIncreased() {
+
+ Stack charStack = new Stack<>();
+
+ charStack.push('A');
+
+ assertEquals(1, charStack.size());
+ }
+
+ @Test
+ public void givenCharStack_whenElementIsPoppedFromStack_thenElementIsRemovedAndSizeChanges() {
+
+ Stack charStack = new Stack<>();
+ charStack.push('A');
+
+ char element = charStack.pop();
+
+ assertEquals('A', element);
+ assertEquals(0, charStack.size());
+ }
+
+ @Test
+ public void givenCharStack_whenElementIsPeeked_thenElementIsNotRemovedAndSizeDoesNotChange() {
+
+ Stack charStack = new Stack<>();
+ charStack.push('A');
+
+ char element = charStack.peek();
+
+ assertEquals('A', element);
+ assertEquals(1, charStack.size());
+ }
+
+}
diff --git a/core-java-collections/src/test/java/com/baeldung/charstack/CharStackWithArrayUnitTest.java b/core-java-collections/src/test/java/com/baeldung/charstack/CharStackWithArrayUnitTest.java
new file mode 100644
index 0000000000..df90b8f0a4
--- /dev/null
+++ b/core-java-collections/src/test/java/com/baeldung/charstack/CharStackWithArrayUnitTest.java
@@ -0,0 +1,65 @@
+package com.baeldung.charstack;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.jupiter.api.Test;
+
+public class CharStackWithArrayUnitTest {
+
+ @Test
+ public void whenCharStackIsCreated_thenItHasSize0() {
+
+ CharStackWithArray charStack = new CharStackWithArray();
+
+ assertEquals(0, charStack.size());
+ }
+
+ @Test
+ public void givenEmptyCharStack_whenElementIsPushed_thenStackSizeisIncreased() {
+
+ CharStackWithArray charStack = new CharStackWithArray();
+
+ charStack.push('A');
+
+ assertEquals(1, charStack.size());
+ }
+
+ @Test
+ public void givenEmptyCharStack_when5ElementIsPushed_thenStackSizeis() {
+
+ CharStackWithArray charStack = new CharStackWithArray();
+
+ charStack.push('A');
+ charStack.push('B');
+ charStack.push('C');
+ charStack.push('D');
+ charStack.push('E');
+
+ assertEquals(5, charStack.size());
+ }
+
+ @Test
+ public void givenCharStack_whenElementIsPoppedFromStack_thenElementIsRemovedAndSizeChanges() {
+
+ CharStackWithArray charStack = new CharStackWithArray();
+ charStack.push('A');
+
+ char element = charStack.pop();
+
+ assertEquals('A', element);
+ assertEquals(0, charStack.size());
+ }
+
+ @Test
+ public void givenCharStack_whenElementIsPeeked_thenElementIsNotRemovedAndSizeDoesNotChange() {
+
+ CharStackWithArray charStack = new CharStackWithArray();
+ charStack.push('A');
+
+ char element = charStack.peek();
+
+ assertEquals('A', element);
+ assertEquals(1, charStack.size());
+ }
+
+}
diff --git a/core-java-collections/src/test/java/com/baeldung/queueinterface/CustomBaeldungQueueUnitTest.java b/core-java-collections/src/test/java/com/baeldung/queueInterface/CustomBaeldungQueueUnitTest.java
similarity index 93%
rename from core-java-collections/src/test/java/com/baeldung/queueinterface/CustomBaeldungQueueUnitTest.java
rename to core-java-collections/src/test/java/com/baeldung/queueInterface/CustomBaeldungQueueUnitTest.java
index 6dec768542..7471d9841d 100644
--- a/core-java-collections/src/test/java/com/baeldung/queueinterface/CustomBaeldungQueueUnitTest.java
+++ b/core-java-collections/src/test/java/com/baeldung/queueInterface/CustomBaeldungQueueUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.queueinterface;
+package com.baeldung.queueInterface;
import org.junit.Before;
import org.junit.Test;
diff --git a/core-java-collections/src/test/java/com/baeldung/queueInterface/PriorityQueueUnitTest.java b/core-java-collections/src/test/java/com/baeldung/queueInterface/PriorityQueueUnitTest.java
index c5b564b55b..748099e8d1 100644
--- a/core-java-collections/src/test/java/com/baeldung/queueInterface/PriorityQueueUnitTest.java
+++ b/core-java-collections/src/test/java/com/baeldung/queueInterface/PriorityQueueUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.queueinterface;
+package com.baeldung.queueInterface;
import org.junit.Before;
import org.junit.Test;
diff --git a/core-java-concurrency-advanced/pom.xml b/core-java-concurrency-advanced/pom.xml
index 1209cba619..23032fb2e1 100644
--- a/core-java-concurrency-advanced/pom.xml
+++ b/core-java-concurrency-advanced/pom.xml
@@ -4,8 +4,8 @@
com.baeldung
core-java-concurrency-advanced
0.1.0-SNAPSHOT
- jar
core-java-concurrency-advanced
+ jar
com.baeldung
diff --git a/core-java-concurrency-basic/README.md b/core-java-concurrency-basic/README.md
index 1c43149d03..ad3de4a758 100644
--- a/core-java-concurrency-basic/README.md
+++ b/core-java-concurrency-basic/README.md
@@ -14,4 +14,5 @@
- [ExecutorService - Waiting for Threads to Finish](http://www.baeldung.com/java-executor-wait-for-threads)
- [wait and notify() Methods in Java](http://www.baeldung.com/java-wait-notify)
- [Life Cycle of a Thread in Java](http://www.baeldung.com/java-thread-lifecycle)
-- [Runnable vs. Callable in Java](http://www.baeldung.com/java-runnable-callable)
\ No newline at end of file
+- [Runnable vs. Callable in Java](http://www.baeldung.com/java-runnable-callable)
+- [What is Thread-Safety and How to Achieve it](https://www.baeldung.com/java-thread-safety)
diff --git a/core-java-concurrency-basic/pom.xml b/core-java-concurrency-basic/pom.xml
index 3544403aca..35c360769b 100644
--- a/core-java-concurrency-basic/pom.xml
+++ b/core-java-concurrency-basic/pom.xml
@@ -4,8 +4,8 @@
com.baeldung
core-java-concurrency-basic
0.1.0-SNAPSHOT
- jar
core-java-concurrency-basic
+ jar
com.baeldung
diff --git a/core-java-concurrency-collections/pom.xml b/core-java-concurrency-collections/pom.xml
index 9473de8c51..e192bbe46f 100644
--- a/core-java-concurrency-collections/pom.xml
+++ b/core-java-concurrency-collections/pom.xml
@@ -4,8 +4,8 @@
com.baeldung
core-java-concurrency-collections
0.1.0-SNAPSHOT
- jar
core-java-concurrency-collections
+ jar
com.baeldung
diff --git a/core-java-io/README.md b/core-java-io/README.md
index 2ad980ca6a..5e0f7bfbd1 100644
--- a/core-java-io/README.md
+++ b/core-java-io/README.md
@@ -3,7 +3,7 @@
## Core Java IO Cookbooks and Examples
### Relevant Articles:
-- [Java - Reading a Large File Efficiently](http://www.baeldung.com/java-read-lines-large-file)
+- [How to Read a Large File Efficiently with Java](http://www.baeldung.com/java-read-lines-large-file)
- [Java InputStream to String](http://www.baeldung.com/convert-input-stream-to-string)
- [Java – Write to File](http://www.baeldung.com/java-write-to-file)
- [Java - Convert File to InputStream](http://www.baeldung.com/convert-file-to-input-stream)
@@ -11,7 +11,7 @@
- [Java – Byte Array to Writer](http://www.baeldung.com/java-convert-byte-array-to-writer)
- [Java – Directory Size](http://www.baeldung.com/java-folder-size)
- [Differences Between the Java WatchService API and the Apache Commons IO Monitor Library](http://www.baeldung.com/java-watchservice-vs-apache-commons-io-monitor-library)
-- [Calculate the Size of a File in Java](http://www.baeldung.com/java-file-size)
+- [File Size in Java](http://www.baeldung.com/java-file-size)
- [Comparing getPath(), getAbsolutePath(), and getCanonicalPath() in Java](http://www.baeldung.com/java-path)
- [Using Java MappedByteBuffer](http://www.baeldung.com/java-mapped-byte-buffer)
- [Copy a File with Java](http://www.baeldung.com/java-copy-file)
@@ -36,4 +36,7 @@
- [Reading a CSV File into an Array](https://www.baeldung.com/java-csv-file-array)
- [Guide to BufferedReader](https://www.baeldung.com/java-buffered-reader)
- [How to Get the File Extension of a File in Java](http://www.baeldung.com/java-file-extension)
-- [Getting a File’s Mime Type in Java](http://www.baeldung.com/java-file-mime-type)
\ No newline at end of file
+- [Getting a File’s Mime Type in Java](http://www.baeldung.com/java-file-mime-type)
+- [Create a Directory in Java](https://www.baeldung.com/java-create-directory)
+- [How to Write to a CSV File in Java](https://www.baeldung.com/java-csv)
+- [List Files in a Directory in Java](https://www.baeldung.com/java-list-directory-files)
diff --git a/core-java-io/pom.xml b/core-java-io/pom.xml
index 1f2d52de81..b6f8a317f6 100644
--- a/core-java-io/pom.xml
+++ b/core-java-io/pom.xml
@@ -3,8 +3,8 @@
4.0.0
core-java-io
0.1.0-SNAPSHOT
- jar
core-java-io
+ jar
com.baeldung
@@ -246,8 +246,6 @@
-
- 2.9.7
3.5
@@ -259,7 +257,6 @@
4.01
0.4
1.8.7
- 1.16.12
4.6-b01
1.13
0.6.5
diff --git a/core-java-io/src/main/java/com/baeldung/files/ListFiles.java b/core-java-io/src/main/java/com/baeldung/files/ListFiles.java
new file mode 100644
index 0000000000..c5de36270c
--- /dev/null
+++ b/core-java-io/src/main/java/com/baeldung/files/ListFiles.java
@@ -0,0 +1,64 @@
+package com.baeldung.files;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.DirectoryStream;
+import java.nio.file.FileVisitResult;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.SimpleFileVisitor;
+import java.nio.file.attribute.BasicFileAttributes;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+public class ListFiles {
+ public static final int DEPTH = 1;
+
+ public Set listFilesUsingJavaIO(String dir) {
+ return Stream.of(new File(dir).listFiles())
+ .filter(file -> !file.isDirectory())
+ .map(File::getName)
+ .collect(Collectors.toSet());
+ }
+
+ public Set listFilesUsingFileWalk(String dir, int depth) throws IOException {
+ try (Stream stream = Files.walk(Paths.get(dir), depth)) {
+ return stream.filter(file -> !Files.isDirectory(file))
+ .map(Path::getFileName)
+ .map(Path::toString)
+ .collect(Collectors.toSet());
+ }
+ }
+
+ public Set listFilesUsingFileWalkAndVisitor(String dir) throws IOException {
+ Set fileList = new HashSet<>();
+ Files.walkFileTree(Paths.get(dir), new SimpleFileVisitor() {
+ @Override
+ public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
+ if (!Files.isDirectory(file)) {
+ fileList.add(file.getFileName()
+ .toString());
+ }
+ return FileVisitResult.CONTINUE;
+ }
+ });
+ return fileList;
+ }
+
+ public Set listFilesUsingDirectoryStream(String dir) throws IOException {
+ Set fileList = new HashSet<>();
+ try (DirectoryStream stream = Files.newDirectoryStream(Paths.get(dir))) {
+ for (Path path : stream) {
+ if (!Files.isDirectory(path)) {
+ fileList.add(path.getFileName()
+ .toString());
+ }
+ }
+ }
+ return fileList;
+ }
+
+}
diff --git a/core-java-io/src/test/java/com/baeldung/csv/WriteCsvFileExampleUnitTest.java b/core-java-io/src/test/java/com/baeldung/csv/WriteCsvFileExampleUnitTest.java
index 0658ec6101..5f4827bc21 100644
--- a/core-java-io/src/test/java/com/baeldung/csv/WriteCsvFileExampleUnitTest.java
+++ b/core-java-io/src/test/java/com/baeldung/csv/WriteCsvFileExampleUnitTest.java
@@ -5,6 +5,7 @@ import static org.junit.Assert.assertTrue;
import java.io.File;
import java.io.FileNotFoundException;
+import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
@@ -17,7 +18,6 @@ import org.slf4j.LoggerFactory;
public class WriteCsvFileExampleUnitTest {
private static final Logger LOG = LoggerFactory.getLogger(WriteCsvFileExampleUnitTest.class);
- private static final String CSV_FILE_NAME = "src/test/resources/exampleOutput.csv";
private WriteCsvFileExample csvExample;
@Before
@@ -65,12 +65,12 @@ public class WriteCsvFileExampleUnitTest {
}
@Test
- public void givenDataArray_whenConvertToCSV_thenOutputCreated() {
+ public void givenDataArray_whenConvertToCSV_thenOutputCreated() throws IOException {
List dataLines = new ArrayList();
dataLines.add(new String[] { "John", "Doe", "38", "Comment Data\nAnother line of comment data" });
dataLines.add(new String[] { "Jane", "Doe, Jr.", "19", "She said \"I'm being quoted\"" });
- File csvOutputFile = new File(CSV_FILE_NAME);
+ File csvOutputFile = File.createTempFile("exampleOutput", ".csv");
try (PrintWriter pw = new PrintWriter(csvOutputFile)) {
dataLines.stream()
.map(csvExample::convertToCSV)
@@ -80,5 +80,6 @@ public class WriteCsvFileExampleUnitTest {
}
assertTrue(csvOutputFile.exists());
+ csvOutputFile.deleteOnExit();
}
}
diff --git a/core-java-io/src/test/java/com/baeldung/directories/NewDirectoryUnitTest.java b/core-java-io/src/test/java/com/baeldung/directories/NewDirectoryUnitTest.java
index e0111c2702..d645782955 100644
--- a/core-java-io/src/test/java/com/baeldung/directories/NewDirectoryUnitTest.java
+++ b/core-java-io/src/test/java/com/baeldung/directories/NewDirectoryUnitTest.java
@@ -62,7 +62,7 @@ public class NewDirectoryUnitTest {
@Test
public void givenUnexistingNestedDirectories_whenMkdirs_thenTrue() {
- File newDirectory = new File(TEMP_DIRECTORY, "new_directory");
+ File newDirectory = new File(System.getProperty("java.io.tmpdir") + File.separator + "new_directory");
File nestedDirectory = new File(newDirectory, "nested_directory");
assertFalse(newDirectory.exists());
assertFalse(nestedDirectory.exists());
diff --git a/core-java-io/src/test/java/com/baeldung/file/FilesClearDataUnitTest.java b/core-java-io/src/test/java/com/baeldung/file/FilesClearDataUnitTest.java
new file mode 100644
index 0000000000..8302124f32
--- /dev/null
+++ b/core-java-io/src/test/java/com/baeldung/file/FilesClearDataUnitTest.java
@@ -0,0 +1,96 @@
+package com.baeldung.file;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.nio.channels.FileChannel;
+import java.nio.charset.Charset;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.nio.file.StandardOpenOption;
+
+import org.apache.commons.io.FileUtils;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.baeldung.util.StreamUtils;
+
+public class FilesClearDataUnitTest {
+
+ public static final String FILE_PATH = "src/test/resources/fileexample.txt";
+
+ @Before
+ @After
+ public void setup() throws IOException {
+ PrintWriter writer = new PrintWriter(FILE_PATH);
+ writer.print("This example shows how we can delete the file contents without deleting the file");
+ writer.close();
+ }
+
+ @Test
+ public void givenExistingFile_whenDeleteContentUsingPrintWritter_thenEmptyFile() throws IOException {
+ PrintWriter writer = new PrintWriter(FILE_PATH);
+ writer.print("");
+ writer.close();
+ assertEquals(0, StreamUtils.getStringFromInputStream(new FileInputStream(FILE_PATH)).length());
+ }
+
+ @Test
+ public void givenExistingFile_whenDeleteContentUsingPrintWritterWithougObject_thenEmptyFile() throws IOException {
+ new PrintWriter(FILE_PATH).close();
+ assertEquals(0, StreamUtils.getStringFromInputStream(new FileInputStream(FILE_PATH)).length());
+ }
+
+ @Test
+ public void givenExistingFile_whenDeleteContentUsingFileWriter_thenEmptyFile() throws IOException {
+ new FileWriter(FILE_PATH, false).close();
+
+ assertEquals(0, StreamUtils.getStringFromInputStream(new FileInputStream(FILE_PATH)).length());
+ }
+
+ @Test
+ public void givenExistingFile_whenDeleteContentUsingFileOutputStream_thenEmptyFile() throws IOException {
+ new FileOutputStream(FILE_PATH).close();
+
+ assertEquals(0, StreamUtils.getStringFromInputStream(new FileInputStream(FILE_PATH)).length());
+ }
+
+ @Test
+ public void givenExistingFile_whenDeleteContentUsingFileUtils_thenEmptyFile() throws IOException {
+ FileUtils.write(new File(FILE_PATH), "", Charset.defaultCharset());
+
+ assertEquals(0, StreamUtils.getStringFromInputStream(new FileInputStream(FILE_PATH)).length());
+ }
+
+ @Test
+ public void givenExistingFile_whenDeleteContentUsingNIOFiles_thenEmptyFile() throws IOException {
+ BufferedWriter writer = Files.newBufferedWriter(Paths.get(FILE_PATH));
+ writer.write("");
+ writer.flush();
+
+ assertEquals(0, StreamUtils.getStringFromInputStream(new FileInputStream(FILE_PATH)).length());
+ }
+
+ @Test
+ public void givenExistingFile_whenDeleteContentUsingNIOFileChannel_thenEmptyFile() throws IOException {
+ FileChannel.open(Paths.get(FILE_PATH), StandardOpenOption.WRITE).truncate(0).close();
+
+ assertEquals(0, StreamUtils.getStringFromInputStream(new FileInputStream(FILE_PATH)).length());
+ }
+
+ @Test
+ public void givenExistingFile_whenDeleteContentUsingGuava_thenEmptyFile() throws IOException {
+ File file = new File(FILE_PATH);
+ byte[] empty = new byte[0];
+ com.google.common.io.Files.write(empty, file);
+
+ assertEquals(0, StreamUtils.getStringFromInputStream(new FileInputStream(FILE_PATH)).length());
+ }
+}
diff --git a/core-java-io/src/test/java/com/baeldung/file/ListFilesUnitTest.java b/core-java-io/src/test/java/com/baeldung/file/ListFilesUnitTest.java
new file mode 100644
index 0000000000..65710121cc
--- /dev/null
+++ b/core-java-io/src/test/java/com/baeldung/file/ListFilesUnitTest.java
@@ -0,0 +1,46 @@
+package com.baeldung.file;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.IOException;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.junit.Test;
+
+import com.baeldung.files.ListFiles;
+
+public class ListFilesUnitTest {
+
+ private ListFiles listFiles = new ListFiles();
+ private String DIRECTORY = "src/test/resources/listFilesUnitTestFolder";
+ private static final int DEPTH = 1;
+ private Set EXPECTED_FILE_LIST = new HashSet() {
+ {
+ add("test.xml");
+ add("employee.json");
+ add("students.json");
+ add("country.txt");
+ }
+ };
+
+ @Test
+ public void givenDir_whenUsingJAVAIO_thenListAllFiles() throws IOException {
+ assertEquals(EXPECTED_FILE_LIST, listFiles.listFilesUsingJavaIO(DIRECTORY));
+ }
+
+ @Test
+ public void givenDir_whenWalkingTree_thenListAllFiles() throws IOException {
+ assertEquals(EXPECTED_FILE_LIST, listFiles.listFilesUsingFileWalk(DIRECTORY,DEPTH));
+ }
+
+ @Test
+ public void givenDir_whenWalkingTreeWithVisitor_thenListAllFiles() throws IOException {
+ assertEquals(EXPECTED_FILE_LIST, listFiles.listFilesUsingFileWalkAndVisitor(DIRECTORY));
+ }
+
+ @Test
+ public void givenDir_whenUsingDirectoryStream_thenListAllFiles() throws IOException {
+ assertEquals(EXPECTED_FILE_LIST, listFiles.listFilesUsingDirectoryStream(DIRECTORY));
+ }
+}
diff --git a/core-java-io/src/test/resources/exampleOutput.csv b/core-java-io/src/test/resources/exampleOutput.csv
deleted file mode 100644
index 45c37f3a3b..0000000000
--- a/core-java-io/src/test/resources/exampleOutput.csv
+++ /dev/null
@@ -1,2 +0,0 @@
-John,Doe,38,Comment Data Another line of comment data
-Jane,"Doe, Jr.",19,"She said ""I'm being quoted"""
\ No newline at end of file
diff --git a/core-java-io/src/test/resources/fileexample.txt b/core-java-io/src/test/resources/fileexample.txt
new file mode 100644
index 0000000000..ee48fdfb84
--- /dev/null
+++ b/core-java-io/src/test/resources/fileexample.txt
@@ -0,0 +1 @@
+This example shows how we can delete the file contents without deleting the file
\ No newline at end of file
diff --git a/core-java-io/src/test/resources/listFilesUnitTestFolder/country.txt b/core-java-io/src/test/resources/listFilesUnitTestFolder/country.txt
new file mode 100644
index 0000000000..45bfe896dc
--- /dev/null
+++ b/core-java-io/src/test/resources/listFilesUnitTestFolder/country.txt
@@ -0,0 +1 @@
+This is a sample txt file for unit test ListFilesUnitTest
\ No newline at end of file
diff --git a/core-java-io/src/test/resources/listFilesUnitTestFolder/employee.json b/core-java-io/src/test/resources/listFilesUnitTestFolder/employee.json
new file mode 100644
index 0000000000..9e26dfeeb6
--- /dev/null
+++ b/core-java-io/src/test/resources/listFilesUnitTestFolder/employee.json
@@ -0,0 +1 @@
+{}
\ No newline at end of file
diff --git a/core-java-io/src/test/resources/listFilesUnitTestFolder/students.json b/core-java-io/src/test/resources/listFilesUnitTestFolder/students.json
new file mode 100644
index 0000000000..9e26dfeeb6
--- /dev/null
+++ b/core-java-io/src/test/resources/listFilesUnitTestFolder/students.json
@@ -0,0 +1 @@
+{}
\ No newline at end of file
diff --git a/core-java-io/src/test/resources/listFilesUnitTestFolder/test.xml b/core-java-io/src/test/resources/listFilesUnitTestFolder/test.xml
new file mode 100644
index 0000000000..19b16cc72c
--- /dev/null
+++ b/core-java-io/src/test/resources/listFilesUnitTestFolder/test.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/core-java-lang-oop/README.md b/core-java-lang-oop/README.md
index bbc3d26c99..200415fe21 100644
--- a/core-java-lang-oop/README.md
+++ b/core-java-lang-oop/README.md
@@ -22,3 +22,4 @@
- [Inheritance and Composition (Is-a vs Has-a relationship) in Java](http://www.baeldung.com/java-inheritance-composition)
- [A Guide to Constructors in Java](https://www.baeldung.com/java-constructors)
- [Java equals() and hashCode() Contracts](https://www.baeldung.com/java-equals-hashcode-contracts)
+- [Marker Interfaces in Java](https://www.baeldung.com/java-marker-interfaces)
diff --git a/core-java-lang-oop/pom.xml b/core-java-lang-oop/pom.xml
index 262408c024..6763bbb26d 100644
--- a/core-java-lang-oop/pom.xml
+++ b/core-java-lang-oop/pom.xml
@@ -4,8 +4,8 @@
com.baeldung
core-java-lang-oop
0.1.0-SNAPSHOT
- jar
core-java-lang-oop
+ jar
com.baeldung
@@ -82,7 +82,6 @@
3.5
- 1.16.12
3.10.0
3.0.3
diff --git a/core-java-lang-oop/src/main/java/com/baeldung/markerinterface/DeletableShape.java b/core-java-lang-oop/src/main/java/com/baeldung/markerinterface/DeletableShape.java
new file mode 100644
index 0000000000..7674407da8
--- /dev/null
+++ b/core-java-lang-oop/src/main/java/com/baeldung/markerinterface/DeletableShape.java
@@ -0,0 +1,5 @@
+package com.baeldung.markerinterface;
+
+public interface DeletableShape extends Shape {
+
+}
diff --git a/core-java-lang-oop/src/main/java/com/baeldung/markerinterface/Rectangle.java b/core-java-lang-oop/src/main/java/com/baeldung/markerinterface/Rectangle.java
new file mode 100644
index 0000000000..d64ffad0a2
--- /dev/null
+++ b/core-java-lang-oop/src/main/java/com/baeldung/markerinterface/Rectangle.java
@@ -0,0 +1,22 @@
+package com.baeldung.markerinterface;
+
+public class Rectangle implements DeletableShape {
+
+ private double width;
+ private double height;
+
+ public Rectangle(double width, double height) {
+ this.width = width;
+ this.height = height;
+ }
+
+ @Override
+ public double getArea() {
+ return width * height;
+ }
+
+ @Override
+ public double getCircumference() {
+ return 2 * (width + height);
+ }
+}
diff --git a/core-java-lang-oop/src/main/java/com/baeldung/markerinterface/Shape.java b/core-java-lang-oop/src/main/java/com/baeldung/markerinterface/Shape.java
new file mode 100644
index 0000000000..2e53aefc03
--- /dev/null
+++ b/core-java-lang-oop/src/main/java/com/baeldung/markerinterface/Shape.java
@@ -0,0 +1,6 @@
+package com.baeldung.markerinterface;
+
+public interface Shape {
+ double getArea();
+ double getCircumference();
+}
\ No newline at end of file
diff --git a/core-java-lang-oop/src/main/java/com/baeldung/markerinterface/ShapeDao.java b/core-java-lang-oop/src/main/java/com/baeldung/markerinterface/ShapeDao.java
new file mode 100644
index 0000000000..bc988a793d
--- /dev/null
+++ b/core-java-lang-oop/src/main/java/com/baeldung/markerinterface/ShapeDao.java
@@ -0,0 +1,14 @@
+package com.baeldung.markerinterface;
+
+public class ShapeDao {
+
+ public boolean delete(Object object) {
+ if (!(object instanceof DeletableShape)) {
+ return false;
+ }
+ // Calling the code that deletes the entity from the database
+
+ return true;
+ }
+
+}
diff --git a/core-java-lang-oop/src/test/java/com/baeldung/markerinterface/MarkerInterfaceUnitTest.java b/core-java-lang-oop/src/test/java/com/baeldung/markerinterface/MarkerInterfaceUnitTest.java
new file mode 100644
index 0000000000..70d32ba253
--- /dev/null
+++ b/core-java-lang-oop/src/test/java/com/baeldung/markerinterface/MarkerInterfaceUnitTest.java
@@ -0,0 +1,26 @@
+package com.baeldung.markerinterface;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import org.junit.jupiter.api.Test;
+
+public class MarkerInterfaceUnitTest {
+
+ @Test
+ public void givenDeletableObjectThenTrueReturned() {
+ ShapeDao shapeDao = new ShapeDao();
+ Object rectangle = new Rectangle(2, 3);
+
+ boolean result = shapeDao.delete(rectangle);
+ assertEquals(true, result);
+ }
+
+ @Test
+ public void givenNonDeletableObjectThenFalseReturned() {
+ ShapeDao shapeDao = new ShapeDao();
+ Object object = new Object();
+
+ boolean result = shapeDao.delete(object);
+ assertEquals(false, result);
+ }
+}
diff --git a/core-java-lang-syntax/README.md b/core-java-lang-syntax/README.md
index a7c1b7cc4a..81c3d6c354 100644
--- a/core-java-lang-syntax/README.md
+++ b/core-java-lang-syntax/README.md
@@ -3,12 +3,12 @@
## Core Java Lang Syntax Cookbooks and Examples
### Relevant Articles:
-- [Introduction to Java Generics](http://www.baeldung.com/java-generics)
+- [The Basics of Java Generics](http://www.baeldung.com/java-generics)
- [Java Primitive Conversions](http://www.baeldung.com/java-primitive-conversions)
- [Java Double Brace Initialization](http://www.baeldung.com/java-double-brace-initialization)
- [Guide to the Diamond Operator in Java](http://www.baeldung.com/java-diamond-operator)
- [The Java continue and break Keywords](http://www.baeldung.com/java-continue-and-break)
-- [A Guide to Java Initialization](http://www.baeldung.com/java-initialization)
+- [A Guide to Creating Objects in Java](http://www.baeldung.com/java-initialization)
- [A Guide to Java Loops](http://www.baeldung.com/java-loops)
- [Varargs in Java](http://www.baeldung.com/java-varargs)
- [A Guide to Java Enums](http://www.baeldung.com/a-guide-to-java-enums)
@@ -16,4 +16,5 @@
- [Quick Guide to java.lang.System](http://www.baeldung.com/java-lang-system)
- [Java Switch Statement](https://www.baeldung.com/java-switch)
- [The Modulo Operator in Java](https://www.baeldung.com/modulo-java)
-- [Ternary Operator In Java](https://www.baeldung.com/java-ternary-operator)
\ No newline at end of file
+- [Ternary Operator In Java](https://www.baeldung.com/java-ternary-operator)
+- [Java instanceof Operator](https://www.baeldung.com/java-instanceof)
diff --git a/core-java-lang-syntax/pom.xml b/core-java-lang-syntax/pom.xml
index 9481f29459..9a9df01057 100644
--- a/core-java-lang-syntax/pom.xml
+++ b/core-java-lang-syntax/pom.xml
@@ -4,8 +4,8 @@
com.baeldung
core-java-lang-syntax
0.1.0-SNAPSHOT
- jar
core-java-lang-syntax
+ jar
com.baeldung
diff --git a/core-java-lang/README.md b/core-java-lang/README.md
index 7af962558d..eaedc93eed 100644
--- a/core-java-lang/README.md
+++ b/core-java-lang/README.md
@@ -34,4 +34,11 @@
- [“Sneaky Throws” in Java](http://www.baeldung.com/java-sneaky-throws)
- [Retrieving a Class Name in Java](https://www.baeldung.com/java-class-name)
- [Java Compound Operators](https://www.baeldung.com/java-compound-operators)
-- [Guide to Java Packages](https://www.baeldung.com/java-packages)
\ No newline at end of file
+- [Guide to Java Packages](https://www.baeldung.com/java-packages)
+- [The Java Native Keyword and Methods](https://www.baeldung.com/java-native)
+- [If-Else Statement in Java](https://www.baeldung.com/java-if-else)
+- [Control Structures in Java](https://www.baeldung.com/java-control-structures)
+- [Java Interfaces](https://www.baeldung.com/java-interfaces)
+- [Attaching Values to Java Enum](https://www.baeldung.com/java-enum-values)
+- [Variable Scope in Java](https://www.baeldung.com/java-variable-scope)
+- [Java Classes and Objects](https://www.baeldung.com/java-classes-objects)
diff --git a/core-java-lang/pom.xml b/core-java-lang/pom.xml
index 283acab775..551c8e8505 100644
--- a/core-java-lang/pom.xml
+++ b/core-java-lang/pom.xml
@@ -4,8 +4,8 @@
com.baeldung
core-java-lang
0.1.0-SNAPSHOT
- jar
core-java-lang
+ jar
com.baeldung
@@ -74,14 +74,10 @@
-
-
- 2.9.7
2.8.2
3.5
- 1.16.12
1.5.0-b01
diff --git a/core-java-lang/src/main/java/com/baeldung/objects/Car.java b/core-java-lang/src/main/java/com/baeldung/objects/Car.java
new file mode 100644
index 0000000000..35ef8585b2
--- /dev/null
+++ b/core-java-lang/src/main/java/com/baeldung/objects/Car.java
@@ -0,0 +1,51 @@
+package com.baeldung.objects;
+
+public class Car {
+
+ private String type;
+ private String model;
+ private String color;
+ private int speed;
+
+ public Car(String type, String model, String color) {
+ this.type = type;
+ this.model = model;
+ this.color = color;
+ }
+
+ public String getColor() {
+ return color;
+ }
+
+ public void setColor(String color) {
+ this.color = color;
+ }
+
+ public int getSpeed() {
+ return speed;
+ }
+
+ public int increaseSpeed(int increment) {
+ if (increment > 0) {
+ this.speed += increment;
+ } else {
+ System.out.println("Increment can't be negative.");
+ }
+ return this.speed;
+ }
+
+ public int decreaseSpeed(int decrement) {
+ if (decrement > 0 && decrement <= this.speed) {
+ this.speed -= decrement;
+ } else {
+ System.out.println("Decrement can't be negative or greater than current speed.");
+ }
+ return this.speed;
+ }
+
+ @Override
+ public String toString() {
+ return "Car [type=" + type + ", model=" + model + ", color=" + color + ", speed=" + speed + "]";
+ }
+
+}
diff --git a/core-java-lang/src/main/java/com/baeldung/scope/BracketScopeExample.java b/core-java-lang/src/main/java/com/baeldung/scope/BracketScopeExample.java
new file mode 100644
index 0000000000..8deec35c16
--- /dev/null
+++ b/core-java-lang/src/main/java/com/baeldung/scope/BracketScopeExample.java
@@ -0,0 +1,14 @@
+package com.baeldung.scope;
+
+public class BracketScopeExample {
+
+ public void mathOperationExample() {
+ Integer sum = 0;
+ {
+ Integer number = 2;
+ sum = sum + number;
+ }
+ // compiler error, number cannot be solved as a variable
+ // number++;
+ }
+}
\ No newline at end of file
diff --git a/core-java-lang/src/main/java/com/baeldung/scope/ClassScopeExample.java b/core-java-lang/src/main/java/com/baeldung/scope/ClassScopeExample.java
new file mode 100644
index 0000000000..c81fcc9550
--- /dev/null
+++ b/core-java-lang/src/main/java/com/baeldung/scope/ClassScopeExample.java
@@ -0,0 +1,14 @@
+package com.baeldung.scope;
+
+public class ClassScopeExample {
+
+ Integer amount = 0;
+
+ public void exampleMethod() {
+ amount++;
+ }
+
+ public void anotherExampleMethod() {
+ Integer anotherAmount = amount + 4;
+ }
+}
\ No newline at end of file
diff --git a/core-java-lang/src/main/java/com/baeldung/scope/LoopScopeExample.java b/core-java-lang/src/main/java/com/baeldung/scope/LoopScopeExample.java
new file mode 100644
index 0000000000..be41252623
--- /dev/null
+++ b/core-java-lang/src/main/java/com/baeldung/scope/LoopScopeExample.java
@@ -0,0 +1,18 @@
+package com.baeldung.scope;
+
+import java.util.Arrays;
+import java.util.List;
+
+public class LoopScopeExample {
+
+ List listOfNames = Arrays.asList("Joe", "Susan", "Pattrick");
+
+ public void iterationOfNames() {
+ String allNames = "";
+ for (String name : listOfNames) {
+ allNames = allNames + " " + name;
+ }
+ // compiler error, name cannot be resolved to a variable
+ // String lastNameUsed = name;
+ }
+}
diff --git a/core-java-lang/src/main/java/com/baeldung/scope/MethodScopeExample.java b/core-java-lang/src/main/java/com/baeldung/scope/MethodScopeExample.java
new file mode 100644
index 0000000000..63a6a25271
--- /dev/null
+++ b/core-java-lang/src/main/java/com/baeldung/scope/MethodScopeExample.java
@@ -0,0 +1,13 @@
+package com.baeldung.scope;
+
+public class MethodScopeExample {
+
+ public void methodA() {
+ Integer area = 2;
+ }
+
+ public void methodB() {
+ // compiler error, area cannot be resolved to a variable
+ // area = area + 2;
+ }
+}
\ No newline at end of file
diff --git a/core-java-lang/src/main/java/com/baeldung/scope/NestedScopesExample.java b/core-java-lang/src/main/java/com/baeldung/scope/NestedScopesExample.java
new file mode 100644
index 0000000000..c3c5bec221
--- /dev/null
+++ b/core-java-lang/src/main/java/com/baeldung/scope/NestedScopesExample.java
@@ -0,0 +1,12 @@
+package com.baeldung.scope;
+
+public class NestedScopesExample {
+
+ String title = "Baeldung";
+
+ public void printTitle() {
+ System.out.println(title);
+ String title = "John Doe";
+ System.out.println(title);
+ }
+}
\ No newline at end of file
diff --git a/core-java-lang/src/test/java/com/baeldung/java/enumiteration/EnumIterationExamples.java b/core-java-lang/src/test/java/com/baeldung/java/enumiteration/EnumIterationExamples.java
index 2d874fa650..110943e39f 100644
--- a/core-java-lang/src/test/java/com/baeldung/java/enumiteration/EnumIterationExamples.java
+++ b/core-java-lang/src/test/java/com/baeldung/java/enumiteration/EnumIterationExamples.java
@@ -1,18 +1,43 @@
package com.baeldung.java.enumiteration;
+import java.util.ArrayList;
+import java.util.Arrays;
import java.util.EnumSet;
+import java.util.List;
+
public class EnumIterationExamples {
public static void main(String[] args) {
- System.out.println("Enum iteration using forEach:");
+ System.out.println("Enum iteration using EnumSet:");
EnumSet.allOf(DaysOfWeekEnum.class).forEach(day -> System.out.println(day));
System.out.println("Enum iteration using Stream:");
DaysOfWeekEnum.stream().filter(d -> d.getTypeOfDay().equals("off")).forEach(System.out::println);
- System.out.println("Enum iteration using for loop:");
+ System.out.println("Enum iteration using a for loop:");
for (DaysOfWeekEnum day : DaysOfWeekEnum.values()) {
System.out.println(day);
}
+
+ System.out.println("Enum iteration using Arrays.asList():");
+ Arrays.asList(DaysOfWeekEnum.values()).forEach(day -> System.out.println(day));
+
+ System.out.println("Add Enum values to ArrayList:");
+ List days = new ArrayList<>();
+ days.add(DaysOfWeekEnum.FRIDAY);
+ days.add(DaysOfWeekEnum.SATURDAY);
+ days.add(DaysOfWeekEnum.SUNDAY);
+ for (DaysOfWeekEnum day : days) {
+ System.out.println(day);
+ }
+ System.out.println("Remove SATURDAY from the list:");
+ days.remove(DaysOfWeekEnum.SATURDAY);
+ if (!days.contains(DaysOfWeekEnum.SATURDAY)) {
+ System.out.println("Saturday is no longer in the list");
+ }
+ for (DaysOfWeekEnum day : days) {
+ System.out.println(day);
+ }
+
}
}
diff --git a/core-java-lang/src/test/java/com/baeldung/objects/CarUnitTest.java b/core-java-lang/src/test/java/com/baeldung/objects/CarUnitTest.java
new file mode 100644
index 0000000000..a1ef20523e
--- /dev/null
+++ b/core-java-lang/src/test/java/com/baeldung/objects/CarUnitTest.java
@@ -0,0 +1,38 @@
+package com.baeldung.objects;
+
+import static org.junit.Assert.*;
+
+import org.junit.Before;
+import org.junit.Test;
+
+public class CarUnitTest {
+
+ private Car car;
+
+ @Before
+ public void setUp() throws Exception {
+ car = new Car("Ford", "Focus", "red");
+ }
+
+ @Test
+ public final void when_speedIncreased_then_verifySpeed() {
+ car.increaseSpeed(30);
+ assertEquals(30, car.getSpeed());
+
+ car.increaseSpeed(20);
+ assertEquals(50, car.getSpeed());
+ }
+
+ @Test
+ public final void when_speedDecreased_then_verifySpeed() {
+ car.increaseSpeed(50);
+ assertEquals(50, car.getSpeed());
+
+ car.decreaseSpeed(30);
+ assertEquals(20, car.getSpeed());
+
+ car.decreaseSpeed(20);
+ assertEquals(0, car.getSpeed());
+ }
+
+}
diff --git a/core-java-networking/README.md b/core-java-networking/README.md
index b2367782b6..e76f28030d 100644
--- a/core-java-networking/README.md
+++ b/core-java-networking/README.md
@@ -12,5 +12,6 @@
- [A Guide to the Java URL](http://www.baeldung.com/java-url)
- [Working with Network Interfaces in Java](http://www.baeldung.com/java-network-interfaces)
- [A Guide to Java Sockets](http://www.baeldung.com/a-guide-to-java-sockets)
-- [URL Encoding and Decoding in Java](http://www.baeldung.com/java-url-encoding-decoding)
-- [How to Perform a Simple HTTP Request in Java](http://www.baeldung.com/java-http-request)
\ No newline at end of file
+- [Guide to Java URL Encoding/Decoding](http://www.baeldung.com/java-url-encoding-decoding)
+- [Do a Simple HTTP Request in Java](http://www.baeldung.com/java-http-request)
+- [Difference between URL and URI](http://www.baeldung.com/java-url-vs-uri)
\ No newline at end of file
diff --git a/core-java-networking/pom.xml b/core-java-networking/pom.xml
index d9c7c691e9..12bb257fcb 100644
--- a/core-java-networking/pom.xml
+++ b/core-java-networking/pom.xml
@@ -3,8 +3,8 @@
4.0.0
core-java-networking
0.1.0-SNAPSHOT
- jar
core-java-networking
+ jar
com.baeldung
diff --git a/core-java-perf/README.md b/core-java-perf/README.md
index 252ee4cc45..1b3b590bf8 100644
--- a/core-java-perf/README.md
+++ b/core-java-perf/README.md
@@ -5,4 +5,5 @@
- [Different Ways to Capture Java Heap Dumps](https://www.baeldung.com/java-heap-dump-capture)
- [Understanding Memory Leaks in Java](https://www.baeldung.com/java-memory-leaks)
- [OutOfMemoryError: GC Overhead Limit Exceeded](http://www.baeldung.com/java-gc-overhead-limit-exceeded)
-- [Basic Introduction to JMX](http://www.baeldung.com/java-management-extensions)
\ No newline at end of file
+- [Basic Introduction to JMX](http://www.baeldung.com/java-management-extensions)
+- [Monitoring Java Applications with Flight Recorder](https://www.baeldung.com/java-flight-recorder-monitoring)
diff --git a/core-java-perf/pom.xml b/core-java-perf/pom.xml
index 062f76db77..0e0ec79691 100644
--- a/core-java-perf/pom.xml
+++ b/core-java-perf/pom.xml
@@ -4,8 +4,8 @@
com.baeldung
core-java-perf
0.1.0-SNAPSHOT
- jar
core-java-perf
+ jar
com.baeldung
diff --git a/core-java-security/README.md b/core-java-security/README.md
index 415171094b..9526b15be5 100644
--- a/core-java-security/README.md
+++ b/core-java-security/README.md
@@ -8,4 +8,5 @@
- [Encrypting and Decrypting Files in Java](http://www.baeldung.com/java-cipher-input-output-stream)
- [Hashing a Password in Java](https://www.baeldung.com/java-password-hashing)
- [SSL Handshake Failures](https://www.baeldung.com/java-ssl-handshake-failures)
-- [SHA-256 Hashing in Java](https://www.baeldung.com/sha-256-hashing-java)
\ No newline at end of file
+- [SHA-256 and SHA3-256 Hashing in Java](https://www.baeldung.com/sha-256-hashing-java)
+- [Enabling TLS v1.2 in Java 7](https://www.baeldung.com/java-7-tls-v12)
diff --git a/core-java-security/pom.xml b/core-java-security/pom.xml
index cf91121465..63bc46b114 100644
--- a/core-java-security/pom.xml
+++ b/core-java-security/pom.xml
@@ -4,8 +4,8 @@
com.baeldung
core-java-security
0.1.0-SNAPSHOT
- jar
core-java-security
+ jar
com.baeldung
@@ -44,8 +44,8 @@
3.8.1
- 1.55
- 1.10
+ 1.60
+ 1.11
3.10.0
diff --git a/core-java-security/src/main/java/com/baeldung/hashing/DigestAlgorithms.java b/core-java-security/src/main/java/com/baeldung/hashing/DigestAlgorithms.java
new file mode 100644
index 0000000000..94dd22ff4b
--- /dev/null
+++ b/core-java-security/src/main/java/com/baeldung/hashing/DigestAlgorithms.java
@@ -0,0 +1,9 @@
+package com.baeldung.hashing;
+
+public class DigestAlgorithms {
+
+ public static final String SHA3_256 = "SHA3-256";
+ public static final String SHA_256 = "SHA-256";
+ public static final String KECCAK_256 = "Keccak-256";
+
+}
diff --git a/core-java-security/src/main/java/com/baeldung/hashing/Keccak256Hashing.java b/core-java-security/src/main/java/com/baeldung/hashing/Keccak256Hashing.java
new file mode 100644
index 0000000000..19fc4cf059
--- /dev/null
+++ b/core-java-security/src/main/java/com/baeldung/hashing/Keccak256Hashing.java
@@ -0,0 +1,30 @@
+package com.baeldung.hashing;
+
+import org.bouncycastle.jcajce.provider.digest.Keccak;
+import org.bouncycastle.jce.provider.BouncyCastleProvider;
+import org.bouncycastle.util.encoders.Hex;
+
+import java.nio.charset.StandardCharsets;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.security.Security;
+
+import static com.baeldung.hashing.DigestAlgorithms.KECCAK_256;
+import static com.baeldung.hashing.SHACommonUtils.bytesToHex;
+
+public class Keccak256Hashing {
+
+ public static String hashWithJavaMessageDigest(final String originalString) throws NoSuchAlgorithmException {
+ Security.addProvider(new BouncyCastleProvider());
+ final MessageDigest digest = MessageDigest.getInstance(KECCAK_256);
+ final byte[] encodedhash = digest.digest(originalString.getBytes(StandardCharsets.UTF_8));
+ return bytesToHex(encodedhash);
+ }
+
+ public static String hashWithBouncyCastle(final String originalString) {
+ Keccak.Digest256 digest256 = new Keccak.Digest256();
+ byte[] hashbytes = digest256.digest(originalString.getBytes(StandardCharsets.UTF_8));
+ return new String(Hex.encode(hashbytes));
+ }
+
+}
diff --git a/core-java-security/src/main/java/com/baeldung/hashing/SHA256Hashing.java b/core-java-security/src/main/java/com/baeldung/hashing/SHA256Hashing.java
index 4fa164cadc..ec008cebab 100644
--- a/core-java-security/src/main/java/com/baeldung/hashing/SHA256Hashing.java
+++ b/core-java-security/src/main/java/com/baeldung/hashing/SHA256Hashing.java
@@ -8,15 +8,18 @@ import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
+import static com.baeldung.hashing.DigestAlgorithms.SHA_256;
+import static com.baeldung.hashing.SHACommonUtils.bytesToHex;
+
public class SHA256Hashing {
public static String HashWithJavaMessageDigest(final String originalString) throws NoSuchAlgorithmException {
- final MessageDigest digest = MessageDigest.getInstance("SHA-256");
+ final MessageDigest digest = MessageDigest.getInstance(SHA_256);
final byte[] encodedhash = digest.digest(originalString.getBytes(StandardCharsets.UTF_8));
return bytesToHex(encodedhash);
}
- public static String HashWithGuava(final String originalString) {
+ public static String hashWithGuava(final String originalString) {
final String sha256hex = Hashing.sha256().hashString(originalString, StandardCharsets.UTF_8).toString();
return sha256hex;
}
@@ -27,20 +30,10 @@ public class SHA256Hashing {
}
public static String HashWithBouncyCastle(final String originalString) throws NoSuchAlgorithmException {
- final MessageDigest digest = MessageDigest.getInstance("SHA-256");
+ final MessageDigest digest = MessageDigest.getInstance(SHA_256);
final byte[] hash = digest.digest(originalString.getBytes(StandardCharsets.UTF_8));
final String sha256hex = new String(Hex.encode(hash));
return sha256hex;
}
- private static String bytesToHex(byte[] hash) {
- StringBuffer hexString = new StringBuffer();
- for (int i = 0; i < hash.length; i++) {
- String hex = Integer.toHexString(0xff & hash[i]);
- if (hex.length() == 1)
- hexString.append('0');
- hexString.append(hex);
- }
- return hexString.toString();
- }
}
diff --git a/core-java-security/src/main/java/com/baeldung/hashing/SHA3Hashing.java b/core-java-security/src/main/java/com/baeldung/hashing/SHA3Hashing.java
new file mode 100644
index 0000000000..eb363205b1
--- /dev/null
+++ b/core-java-security/src/main/java/com/baeldung/hashing/SHA3Hashing.java
@@ -0,0 +1,45 @@
+package com.baeldung.hashing;
+
+import com.google.common.hash.Hashing;
+import org.apache.commons.codec.digest.DigestUtils;
+import org.bouncycastle.crypto.digests.SHA3Digest;
+import org.bouncycastle.jcajce.provider.digest.SHA3;
+import org.bouncycastle.jce.provider.BouncyCastleProvider;
+import org.bouncycastle.util.encoders.Hex;
+
+import java.nio.charset.StandardCharsets;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.security.Security;
+
+import static com.baeldung.hashing.DigestAlgorithms.SHA3_256;
+import static com.baeldung.hashing.SHACommonUtils.bytesToHex;
+
+public class SHA3Hashing {
+
+ /* works with JDK9+ only */
+ public static String hashWithJavaMessageDigestJDK9(final String originalString) throws NoSuchAlgorithmException {
+ final MessageDigest digest = MessageDigest.getInstance(SHA3_256);
+ final byte[] hashbytes = digest.digest(originalString.getBytes(StandardCharsets.UTF_8));
+ return bytesToHex(hashbytes);
+ }
+
+ public static String hashWithJavaMessageDigest(final String originalString) throws NoSuchAlgorithmException {
+ Security.addProvider(new BouncyCastleProvider());
+ final MessageDigest digest = MessageDigest.getInstance(SHA3_256);
+ final byte[] hashbytes = digest.digest(originalString.getBytes(StandardCharsets.UTF_8));
+ return bytesToHex(hashbytes);
+ }
+
+ /* works with JDK9+ only */
+ public static String hashWithApacheCommonsJDK9(final String originalString) {
+ return new DigestUtils(SHA3_256).digestAsHex(originalString);
+ }
+
+ public static String hashWithBouncyCastle(final String originalString) {
+ SHA3.Digest256 digest256 = new SHA3.Digest256();
+ byte[] hashbytes = digest256.digest(originalString.getBytes(StandardCharsets.UTF_8));
+ return new String(Hex.encode(hashbytes));
+ }
+
+}
diff --git a/core-java-security/src/main/java/com/baeldung/hashing/SHACommonUtils.java b/core-java-security/src/main/java/com/baeldung/hashing/SHACommonUtils.java
new file mode 100644
index 0000000000..0f28408083
--- /dev/null
+++ b/core-java-security/src/main/java/com/baeldung/hashing/SHACommonUtils.java
@@ -0,0 +1,16 @@
+package com.baeldung.hashing;
+
+class SHACommonUtils {
+
+ public static String bytesToHex(byte[] hash) {
+ StringBuffer hexString = new StringBuffer();
+ for (byte h : hash) {
+ String hex = Integer.toHexString(0xff & h);
+ if (hex.length() == 1)
+ hexString.append('0');
+ hexString.append(hex);
+ }
+ return hexString.toString();
+ }
+
+}
diff --git a/core-java-security/src/test/java/com/baeldung/hashing/Keccak256HashingUnitTest.java b/core-java-security/src/test/java/com/baeldung/hashing/Keccak256HashingUnitTest.java
new file mode 100644
index 0000000000..9ed35c8834
--- /dev/null
+++ b/core-java-security/src/test/java/com/baeldung/hashing/Keccak256HashingUnitTest.java
@@ -0,0 +1,22 @@
+package com.baeldung.hashing;
+
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+public class Keccak256HashingUnitTest {
+
+ private static String originalValue = "abc123";
+ private static String hashedValue = "719accc61a9cc126830e5906f9d672d06eab6f8597287095a2c55a8b775e7016";
+
+ @Test public void testHashWithJavaMessageDigest() throws Exception {
+ final String currentHashedValue = Keccak256Hashing.hashWithJavaMessageDigest(originalValue);
+ assertEquals(hashedValue, currentHashedValue);
+ }
+
+ @Test public void testHashWithBouncyCastle() {
+ final String currentHashedValue = Keccak256Hashing.hashWithBouncyCastle(originalValue);
+ assertEquals(hashedValue, currentHashedValue);
+ }
+
+}
diff --git a/core-java-security/src/test/java/com/baeldung/hashing/SHA256HashingUnitTest.java b/core-java-security/src/test/java/com/baeldung/hashing/SHA256HashingUnitTest.java
index 3c34bf2c6e..6bc9ad2cc6 100644
--- a/core-java-security/src/test/java/com/baeldung/hashing/SHA256HashingUnitTest.java
+++ b/core-java-security/src/test/java/com/baeldung/hashing/SHA256HashingUnitTest.java
@@ -12,24 +12,24 @@ public class SHA256HashingUnitTest {
@Test
public void testHashWithJavaMessageDigest() throws Exception {
final String currentHashedValue = SHA256Hashing.HashWithJavaMessageDigest(originalValue);
- assertEquals(currentHashedValue, hashedValue);
+ assertEquals(hashedValue, currentHashedValue);
}
@Test
public void testHashWithGuava() throws Exception {
- final String currentHashedValue = SHA256Hashing.HashWithApacheCommons(originalValue);
- assertEquals(currentHashedValue, hashedValue);
+ final String currentHashedValue = SHA256Hashing.hashWithGuava(originalValue);
+ assertEquals(hashedValue, currentHashedValue);
}
@Test
public void testHashWithApacheCommans() throws Exception {
- final String currentHashedValue = SHA256Hashing.HashWithGuava(originalValue);
- assertEquals(currentHashedValue, hashedValue);
+ final String currentHashedValue = SHA256Hashing.HashWithApacheCommons(originalValue);
+ assertEquals(hashedValue, currentHashedValue);
}
@Test
public void testHashWithBouncyCastle() throws Exception {
final String currentHashedValue = SHA256Hashing.HashWithBouncyCastle(originalValue);
- assertEquals(currentHashedValue, hashedValue);
+ assertEquals(hashedValue, currentHashedValue);
}
}
\ No newline at end of file
diff --git a/core-java-security/src/test/java/com/baeldung/hashing/SHA3HashingUnitTest.java b/core-java-security/src/test/java/com/baeldung/hashing/SHA3HashingUnitTest.java
new file mode 100644
index 0000000000..fffab96405
--- /dev/null
+++ b/core-java-security/src/test/java/com/baeldung/hashing/SHA3HashingUnitTest.java
@@ -0,0 +1,38 @@
+package com.baeldung.hashing;
+
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+public class SHA3HashingUnitTest {
+
+ private static String originalValue = "abc123";
+ private static String hashedValue = "f58fa3df820114f56e1544354379820cff464c9c41cb3ca0ad0b0843c9bb67ee";
+
+ /* works with JDK9+ only */
+ //@Test
+ public void testHashWithJavaMessageDigestJDK9() throws Exception {
+ final String currentHashedValue = SHA3Hashing.hashWithJavaMessageDigestJDK9(originalValue);
+ assertEquals(hashedValue, currentHashedValue);
+ }
+
+ @Test
+ public void testHashWithJavaMessageDigest() throws Exception {
+ final String currentHashedValue = SHA3Hashing.hashWithJavaMessageDigest(originalValue);
+ assertEquals(hashedValue, currentHashedValue);
+ }
+
+ /* works with JDK9+ only */
+ //@Test
+ public void testHashWithApacheCommonsJDK9() {
+ final String currentHashedValue = SHA3Hashing.hashWithApacheCommonsJDK9(originalValue);
+ assertEquals(hashedValue, currentHashedValue);
+ }
+
+ @Test
+ public void testHashWithBouncyCastle() {
+ final String currentHashedValue = SHA3Hashing.hashWithBouncyCastle(originalValue);
+ assertEquals(hashedValue, currentHashedValue);
+ }
+
+}
diff --git a/core-java-sun/pom.xml b/core-java-sun/pom.xml
index ef68c947ce..5f2065016f 100644
--- a/core-java-sun/pom.xml
+++ b/core-java-sun/pom.xml
@@ -4,8 +4,8 @@
com.baeldung
core-java-sun
0.1.0-SNAPSHOT
- jar
core-java-sun
+ jar
com.baeldung
@@ -261,8 +261,6 @@
-
- 2.9.7
23.0
@@ -275,7 +273,6 @@
4.01
0.4
1.8.7
- 1.16.12
4.6-b01
1.13
0.6.5
diff --git a/core-java/README.md b/core-java/README.md
index 5aee69d9a9..67538a3895 100644
--- a/core-java/README.md
+++ b/core-java/README.md
@@ -19,7 +19,6 @@
- [Introduction to Java Serialization](http://www.baeldung.com/java-serialization)
- [Guide to UUID in Java](http://www.baeldung.com/java-uuid)
- [Guide to Escaping Characters in Java RegExps](http://www.baeldung.com/java-regexp-escape-char)
-- [Difference between URL and URI](http://www.baeldung.com/java-url-vs-uri)
- [Creating a Java Compiler Plugin](http://www.baeldung.com/java-build-compiler-plugin)
- [Quick Guide to Java Stack](http://www.baeldung.com/java-stack)
- [Compiling Java *.class Files with javac](http://www.baeldung.com/javac)
@@ -46,3 +45,9 @@
- [Graphs in Java](https://www.baeldung.com/java-graphs)
- [Console I/O in Java](http://www.baeldung.com/java-console-input-output)
- [Formatting with printf() in Java](https://www.baeldung.com/java-printstream-printf)
+- [Retrieve Fields from a Java Class Using Reflection](https://www.baeldung.com/java-reflection-class-fields)
+- [Introduction to Basic Syntax in Java](https://www.baeldung.com/java-syntax)
+- [Using Curl in Java](https://www.baeldung.com/java-curl)
+- [Finding Leap Years in Java](https://www.baeldung.com/java-leap-year)
+- [Java Bitwise Operators](https://www.baeldung.com/java-bitwise-operators)
+- [Guide to Creating and Running a Jar File in Java](https://www.baeldung.com/java-create-jar)
diff --git a/core-java/pom.xml b/core-java/pom.xml
index d21c624997..463b65a4ce 100644
--- a/core-java/pom.xml
+++ b/core-java/pom.xml
@@ -451,7 +451,6 @@
- 2.9.7
2.8.2
@@ -461,7 +460,6 @@
1.0.3
0.4
1.8.7
- 1.16.12
4.6-b01
1.13
0.6.5
diff --git a/core-java/src/main/java/com/baeldung/jar/JarExample.java b/core-java/src/main/java/com/baeldung/jar/JarExample.java
new file mode 100644
index 0000000000..5f33188adf
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/jar/JarExample.java
@@ -0,0 +1,9 @@
+package com.baeldung.jar;
+
+public class JarExample {
+
+ public static void main(String[] args) {
+ System.out.println("Hello Baeldung Reader!");
+ }
+
+}
diff --git a/core-java/src/main/java/com/baeldung/jar/example_manifest.txt b/core-java/src/main/java/com/baeldung/jar/example_manifest.txt
new file mode 100644
index 0000000000..90e83e9b42
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/jar/example_manifest.txt
@@ -0,0 +1 @@
+Main-Class: com.baeldung.jar.JarExample
diff --git a/core-java/src/main/java/com/baeldung/reflection/MonthEmployee.java b/core-java/src/main/java/com/baeldung/reflection/MonthEmployee.java
index 697ecc1500..df2a19bbff 100644
--- a/core-java/src/main/java/com/baeldung/reflection/MonthEmployee.java
+++ b/core-java/src/main/java/com/baeldung/reflection/MonthEmployee.java
@@ -2,6 +2,6 @@ package com.baeldung.reflection;
public class MonthEmployee extends Employee {
- private double reward;
+ protected double reward;
}
diff --git a/core-java/src/main/java/com/baeldung/reflection/Person.java b/core-java/src/main/java/com/baeldung/reflection/Person.java
index 23b312cdd9..e036ab5223 100644
--- a/core-java/src/main/java/com/baeldung/reflection/Person.java
+++ b/core-java/src/main/java/com/baeldung/reflection/Person.java
@@ -2,7 +2,7 @@ package com.baeldung.reflection;
public class Person {
- public String lastName;
+ protected String lastName;
private String firstName;
}
diff --git a/core-java/src/main/java/com/baeldung/urlconnection/PostJSONWithHttpURLConnection.java b/core-java/src/main/java/com/baeldung/urlconnection/PostJSONWithHttpURLConnection.java
new file mode 100644
index 0000000000..38b4a0411d
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/urlconnection/PostJSONWithHttpURLConnection.java
@@ -0,0 +1,46 @@
+package com.baeldung.urlconnection;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.net.HttpURLConnection;
+import java.net.URL;
+
+public class PostJSONWithHttpURLConnection {
+
+ public static void main (String []args) throws IOException{
+ //Change the URL with any other publicly accessible POST resource, which accepts JSON request body
+ URL url = new URL ("https://reqres.in/api/users");
+
+ HttpURLConnection con = (HttpURLConnection)url.openConnection();
+ con.setRequestMethod("POST");
+
+ con.setRequestProperty("Content-Type", "application/json; utf-8");
+ con.setRequestProperty("Accept", "application/json");
+
+ con.setDoOutput(true);
+
+ //JSON String need to be constructed for the specific resource.
+ //We may construct complex JSON using any third-party JSON libraries such as jackson or org.json
+ String jsonInputString = "{\"name\": \"Upendra\", \"job\": \"Programmer\"}";
+
+ try(OutputStream os = con.getOutputStream()){
+ byte[] input = jsonInputString.getBytes("utf-8");
+ os.write(input, 0, input.length);
+ }
+
+ int code = con.getResponseCode();
+ System.out.println(code);
+
+ try(BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream(), "utf-8"))){
+ StringBuilder response = new StringBuilder();
+ String responseLine = null;
+ while ((responseLine = br.readLine()) != null) {
+ response.append(responseLine.trim());
+ }
+ System.out.println(response.toString());
+ }
+ }
+
+}
diff --git a/core-java/src/test/java/com/baeldung/bitwiseoperator/test/BitwiseOperatorUnitTest.java b/core-java/src/test/java/com/baeldung/bitwiseoperator/test/BitwiseOperatorUnitTest.java
new file mode 100644
index 0000000000..f74e181e36
--- /dev/null
+++ b/core-java/src/test/java/com/baeldung/bitwiseoperator/test/BitwiseOperatorUnitTest.java
@@ -0,0 +1,81 @@
+package com.baeldung.bitwiseoperator.test;
+
+import static org.junit.Assert.assertEquals;
+import org.junit.jupiter.api.Test;
+
+public class BitwiseOperatorUnitTest {
+
+ @Test
+ public void givenTwoIntegers_whenAndOperator_thenNewDecimalNumber() {
+ int value1 = 6;
+ int value2 = 5;
+ int result = value1 & value2;
+ assertEquals(4, result);
+ }
+
+ @Test
+ public void givenTwoIntegers_whenOrOperator_thenNewDecimalNumber() {
+ int value1 = 6;
+ int value2 = 5;
+ int result = value1 | value2;
+ assertEquals(7, result);
+ }
+
+ @Test
+ public void givenTwoIntegers_whenXorOperator_thenNewDecimalNumber() {
+ int value1 = 6;
+ int value2 = 5;
+ int result = value1 ^ value2;
+ assertEquals(3, result);
+ }
+
+ @Test
+ public void givenOneInteger_whenNotOperator_thenNewDecimalNumber() {
+ int value1 = 6;
+ int result = ~value1;
+ assertEquals(result, -7);
+ }
+
+ @Test
+ public void givenOnePositiveInteger_whenSignedRightShiftOperator_thenNewDecimalNumber() {
+ int value = 12;
+ int rightShift = value >> 2;
+ assertEquals(3, rightShift);
+ }
+
+ @Test
+ public void givenOneNegativeInteger_whenSignedRightShiftOperator_thenNewDecimalNumber() {
+ int value = -12;
+ int rightShift = value >> 2;
+ assertEquals(-3, rightShift);
+ }
+
+ @Test
+ public void givenOnePositiveInteger_whenLeftShiftOperator_thenNewDecimalNumber() {
+ int value = 12;
+ int leftShift = value << 2;
+ assertEquals(48, leftShift);
+ }
+
+ @Test
+ public void givenOneNegativeInteger_whenLeftShiftOperator_thenNewDecimalNumber() {
+ int value = -12;
+ int leftShift = value << 2;
+ assertEquals(-48, leftShift);
+ }
+
+ @Test
+ public void givenOnePositiveInteger_whenUnsignedRightShiftOperator_thenNewDecimalNumber() {
+ int value = 12;
+ int unsignedRightShift = value >>> 2;
+ assertEquals(3, unsignedRightShift);
+ }
+
+ @Test
+ public void givenOneNegativeInteger_whenUnsignedRightShiftOperator_thenNewDecimalNumber() {
+ int value = -12;
+ int unsignedRightShift = value >>> 2;
+ assertEquals(1073741821, unsignedRightShift);
+ }
+
+}
diff --git a/core-java/src/test/java/com/baeldung/reflection/PersonAndEmployeeReflectionUnitTest.java b/core-java/src/test/java/com/baeldung/reflection/PersonAndEmployeeReflectionUnitTest.java
index c051f165f1..b1a6a1fe57 100644
--- a/core-java/src/test/java/com/baeldung/reflection/PersonAndEmployeeReflectionUnitTest.java
+++ b/core-java/src/test/java/com/baeldung/reflection/PersonAndEmployeeReflectionUnitTest.java
@@ -3,10 +3,13 @@ package com.baeldung.reflection;
import org.junit.Test;
import java.lang.reflect.Field;
+import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
import static org.junit.Assert.*;
@@ -26,30 +29,14 @@ public class PersonAndEmployeeReflectionUnitTest {
// Then
assertEquals(2, allFields.length);
- Field lastNameField = allFields[0];
- assertEquals(LAST_NAME_FIELD, lastNameField.getName());
- assertEquals(String.class, lastNameField.getType());
-
- Field firstNameField = allFields[1];
- assertEquals(FIRST_NAME_FIELD, firstNameField.getName());
- assertEquals(String.class, firstNameField.getType());
- }
-
- @Test
- public void givenEmployeeClass_whenSuperClassGetDeclaredFields_thenOneField() {
- // When
- Field[] allFields = Employee.class.getSuperclass().getDeclaredFields();
-
- // Then
- assertEquals(2, allFields.length);
-
- Field lastNameField = allFields[0];
- assertEquals(LAST_NAME_FIELD, lastNameField.getName());
- assertEquals(String.class, lastNameField.getType());
-
- Field firstNameField = allFields[1];
- assertEquals(FIRST_NAME_FIELD, firstNameField.getName());
- assertEquals(String.class, firstNameField.getType());
+ assertTrue(Arrays.stream(allFields).anyMatch(field ->
+ field.getName().equals(LAST_NAME_FIELD)
+ && field.getType().equals(String.class))
+ );
+ assertTrue(Arrays.stream(allFields).anyMatch(field ->
+ field.getName().equals(FIRST_NAME_FIELD)
+ && field.getType().equals(String.class))
+ );
}
@Test
@@ -60,9 +47,28 @@ public class PersonAndEmployeeReflectionUnitTest {
// Then
assertEquals(1, allFields.length);
- Field employeeIdField = allFields[0];
- assertEquals(EMPLOYEE_ID_FIELD, employeeIdField.getName());
- assertEquals(int.class, employeeIdField.getType());
+ assertTrue(Arrays.stream(allFields).anyMatch(field ->
+ field.getName().equals(EMPLOYEE_ID_FIELD)
+ && field.getType().equals(int.class))
+ );
+ }
+
+ @Test
+ public void givenEmployeeClass_whenSuperClassGetDeclaredFields_thenOneField() {
+ // When
+ Field[] allFields = Employee.class.getSuperclass().getDeclaredFields();
+
+ // Then
+ assertEquals(2, allFields.length);
+
+ assertTrue(Arrays.stream(allFields).anyMatch(field ->
+ field.getName().equals(LAST_NAME_FIELD)
+ && field.getType().equals(String.class))
+ );
+ assertTrue(Arrays.stream(allFields).anyMatch(field ->
+ field.getName().equals(FIRST_NAME_FIELD)
+ && field.getType().equals(String.class))
+ );
}
@Test
@@ -76,42 +82,56 @@ public class PersonAndEmployeeReflectionUnitTest {
// Then
assertEquals(3, allFields.length);
- Field lastNameField = allFields[0];
- assertEquals(LAST_NAME_FIELD, lastNameField.getName());
- assertEquals(String.class, lastNameField.getType());
-
- Field firstNameField = allFields[1];
- assertEquals(FIRST_NAME_FIELD, firstNameField.getName());
- assertEquals(String.class, firstNameField.getType());
-
- Field employeeIdField = allFields[2];
- assertEquals(EMPLOYEE_ID_FIELD, employeeIdField.getName());
- assertEquals(int.class, employeeIdField.getType());
+ assertTrue(Arrays.stream(allFields).anyMatch(field ->
+ field.getName().equals(LAST_NAME_FIELD)
+ && field.getType().equals(String.class))
+ );
+ assertTrue(Arrays.stream(allFields).anyMatch(field ->
+ field.getName().equals(FIRST_NAME_FIELD)
+ && field.getType().equals(String.class))
+ );
+ assertTrue(Arrays.stream(allFields).anyMatch(field ->
+ field.getName().equals(EMPLOYEE_ID_FIELD)
+ && field.getType().equals(int.class))
+ );
}
@Test
- public void givenMonthEmployeeClass_whenGetAllFields_thenFourFields() {
+ public void givenEmployeeClass_whenGetDeclaredFieldsOnEmployeeSuperclassWithModifiersFilter_thenOneFields() {
+ // When
+ List personFields = Arrays.stream(Employee.class.getSuperclass().getDeclaredFields())
+ .filter(f -> Modifier.isPublic(f.getModifiers()) || Modifier.isProtected(f.getModifiers()))
+ .collect(Collectors.toList());
+
+ // Then
+ assertEquals(1, personFields.size());
+
+ assertTrue(personFields.stream().anyMatch(field ->
+ field.getName().equals(LAST_NAME_FIELD)
+ && field.getType().equals(String.class))
+ );
+ }
+
+ @Test
+ public void givenMonthEmployeeClass_whenGetAllFields_thenThreeFields() {
// When
List allFields = getAllFields(MonthEmployee.class);
// Then
- assertEquals(4, allFields.size());
+ assertEquals(3, allFields.size());
- Field lastNameField = allFields.get(0);
- assertEquals(LAST_NAME_FIELD, lastNameField.getName());
- assertEquals(String.class, lastNameField.getType());
-
- Field firstNameField = allFields.get(1);
- assertEquals(FIRST_NAME_FIELD, firstNameField.getName());
- assertEquals(String.class, firstNameField.getType());
-
- Field employeeIdField = allFields.get(2);
- assertEquals(EMPLOYEE_ID_FIELD, employeeIdField.getName());
- assertEquals(int.class, employeeIdField.getType());
-
- Field monthEmployeeRewardField = allFields.get(3);
- assertEquals(MONTH_EMPLOYEE_REWARD_FIELD, monthEmployeeRewardField.getName());
- assertEquals(double.class, monthEmployeeRewardField.getType());
+ assertTrue(allFields.stream().anyMatch(field ->
+ field.getName().equals(LAST_NAME_FIELD)
+ && field.getType().equals(String.class))
+ );
+ assertTrue(allFields.stream().anyMatch(field ->
+ field.getName().equals(EMPLOYEE_ID_FIELD)
+ && field.getType().equals(int.class))
+ );
+ assertTrue(allFields.stream().anyMatch(field ->
+ field.getName().equals(MONTH_EMPLOYEE_REWARD_FIELD)
+ && field.getType().equals(double.class))
+ );
}
public List getAllFields(Class clazz) {
@@ -119,9 +139,11 @@ public class PersonAndEmployeeReflectionUnitTest {
return Collections.emptyList();
}
- List result = new ArrayList<>();
- result.addAll(getAllFields(clazz.getSuperclass()));
- result.addAll(Arrays.asList(clazz.getDeclaredFields()));
+ List result = new ArrayList<>(getAllFields(clazz.getSuperclass()));
+ List filteredFields = Arrays.stream(clazz.getDeclaredFields())
+ .filter(f -> Modifier.isPublic(f.getModifiers()) || Modifier.isProtected(f.getModifiers()))
+ .collect(Collectors.toList());
+ result.addAll(filteredFields);
return result;
}
diff --git a/core-kotlin-2/.gitignore b/core-kotlin-2/.gitignore
new file mode 100644
index 0000000000..0c017e8f8c
--- /dev/null
+++ b/core-kotlin-2/.gitignore
@@ -0,0 +1,14 @@
+/bin/
+
+#ignore gradle
+.gradle/
+
+
+#ignore build and generated files
+build/
+node/
+out/
+
+#ignore installed node modules and package lock file
+node_modules/
+package-lock.json
diff --git a/core-kotlin-2/README.md b/core-kotlin-2/README.md
new file mode 100644
index 0000000000..8d22c4f1a8
--- /dev/null
+++ b/core-kotlin-2/README.md
@@ -0,0 +1,4 @@
+## Relevant articles:
+
+- [Void Type in Kotlin](https://www.baeldung.com/kotlin-void-type)
+- [How to use Kotlin Range Expressions](https://www.baeldung.com/kotlin-ranges)
diff --git a/core-kotlin-2/build.gradle b/core-kotlin-2/build.gradle
new file mode 100644
index 0000000000..b058e0ecad
--- /dev/null
+++ b/core-kotlin-2/build.gradle
@@ -0,0 +1,48 @@
+
+
+group 'com.baeldung.ktor'
+version '1.0-SNAPSHOT'
+
+
+buildscript {
+ ext.kotlin_version = '1.2.41'
+
+ repositories {
+ mavenCentral()
+ }
+ dependencies {
+
+ classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
+ }
+}
+
+apply plugin: 'java'
+apply plugin: 'kotlin'
+apply plugin: 'application'
+
+mainClassName = 'APIServer.kt'
+
+sourceCompatibility = 1.8
+compileKotlin { kotlinOptions.jvmTarget = "1.8" }
+compileTestKotlin { kotlinOptions.jvmTarget = "1.8" }
+
+kotlin { experimental { coroutines "enable" } }
+
+repositories {
+ mavenCentral()
+ jcenter()
+ maven { url "https://dl.bintray.com/kotlin/ktor" }
+}
+sourceSets {
+ main{
+ kotlin{
+ srcDirs 'com/baeldung/ktor'
+ }
+ }
+
+}
+
+dependencies {
+ compile "ch.qos.logback:logback-classic:1.2.1"
+ testCompile group: 'junit', name: 'junit', version: '4.12'
+}
\ No newline at end of file
diff --git a/core-kotlin-2/gradle/wrapper/gradle-wrapper.jar b/core-kotlin-2/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000000..01b8bf6b1f
Binary files /dev/null and b/core-kotlin-2/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/core-kotlin-2/gradle/wrapper/gradle-wrapper.properties b/core-kotlin-2/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000000..933b6473ce
--- /dev/null
+++ b/core-kotlin-2/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,5 @@
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-bin.zip
diff --git a/core-kotlin-2/gradlew b/core-kotlin-2/gradlew
new file mode 100644
index 0000000000..cccdd3d517
--- /dev/null
+++ b/core-kotlin-2/gradlew
@@ -0,0 +1,172 @@
+#!/usr/bin/env sh
+
+##############################################################################
+##
+## Gradle start up script for UN*X
+##
+##############################################################################
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`"/$link"
+ fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn () {
+ echo "$*"
+}
+
+die () {
+ echo
+ echo "$*"
+ echo
+ exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "`uname`" in
+ CYGWIN* )
+ cygwin=true
+ ;;
+ Darwin* )
+ darwin=true
+ ;;
+ MINGW* )
+ msys=true
+ ;;
+ NONSTOP* )
+ nonstop=true
+ ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD="$JAVA_HOME/jre/sh/java"
+ else
+ JAVACMD="$JAVA_HOME/bin/java"
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD="java"
+ which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
+ MAX_FD_LIMIT=`ulimit -H -n`
+ if [ $? -eq 0 ] ; then
+ if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+ MAX_FD="$MAX_FD_LIMIT"
+ fi
+ ulimit -n $MAX_FD
+ if [ $? -ne 0 ] ; then
+ warn "Could not set maximum file descriptor limit: $MAX_FD"
+ fi
+ else
+ warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+ fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+ GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin ; then
+ APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+ CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+ JAVACMD=`cygpath --unix "$JAVACMD"`
+
+ # We build the pattern for arguments to be converted via cygpath
+ ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+ SEP=""
+ for dir in $ROOTDIRSRAW ; do
+ ROOTDIRS="$ROOTDIRS$SEP$dir"
+ SEP="|"
+ done
+ OURCYGPATTERN="(^($ROOTDIRS))"
+ # Add a user-defined pattern to the cygpath arguments
+ if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+ OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+ fi
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ i=0
+ for arg in "$@" ; do
+ CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+ CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
+
+ if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
+ eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+ else
+ eval `echo args$i`="\"$arg\""
+ fi
+ i=$((i+1))
+ done
+ case $i in
+ (0) set -- ;;
+ (1) set -- "$args0" ;;
+ (2) set -- "$args0" "$args1" ;;
+ (3) set -- "$args0" "$args1" "$args2" ;;
+ (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+ (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+ (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+ (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+ (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+ (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+ esac
+fi
+
+# Escape application args
+save () {
+ for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+ echo " "
+}
+APP_ARGS=$(save "$@")
+
+# Collect all arguments for the java command, following the shell quoting and substitution rules
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+
+# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
+if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
+ cd "$(dirname "$0")"
+fi
+
+exec "$JAVACMD" "$@"
diff --git a/core-kotlin-2/gradlew.bat b/core-kotlin-2/gradlew.bat
new file mode 100644
index 0000000000..f9553162f1
--- /dev/null
+++ b/core-kotlin-2/gradlew.bat
@@ -0,0 +1,84 @@
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS=
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windows variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/core-kotlin-2/pom.xml b/core-kotlin-2/pom.xml
new file mode 100644
index 0000000000..81df3cee81
--- /dev/null
+++ b/core-kotlin-2/pom.xml
@@ -0,0 +1,16 @@
+
+
+ 4.0.0
+ core-kotlin-2
+ core-kotlin-2
+ jar
+
+
+ com.baeldung
+ parent-kotlin
+ 1.0.0-SNAPSHOT
+ ../parent-kotlin
+
+
+
diff --git a/core-kotlin-2/resources/logback.xml b/core-kotlin-2/resources/logback.xml
new file mode 100644
index 0000000000..9452207268
--- /dev/null
+++ b/core-kotlin-2/resources/logback.xml
@@ -0,0 +1,11 @@
+
+
+
+ %d{YYYY-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/core-kotlin-2/settings.gradle b/core-kotlin-2/settings.gradle
new file mode 100644
index 0000000000..c91c993971
--- /dev/null
+++ b/core-kotlin-2/settings.gradle
@@ -0,0 +1,2 @@
+rootProject.name = 'KtorWithKotlin'
+
diff --git a/core-kotlin-2/src/main/resources/logback.xml b/core-kotlin-2/src/main/resources/logback.xml
new file mode 100644
index 0000000000..7d900d8ea8
--- /dev/null
+++ b/core-kotlin-2/src/main/resources/logback.xml
@@ -0,0 +1,13 @@
+
+
+
+
+ %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/core-kotlin-2/src/test/kotlin/stringcomparison/StringComparisonTest.kt b/core-kotlin-2/src/test/kotlin/stringcomparison/StringComparisonTest.kt
new file mode 100644
index 0000000000..45a8dd7e04
--- /dev/null
+++ b/core-kotlin-2/src/test/kotlin/stringcomparison/StringComparisonTest.kt
@@ -0,0 +1,47 @@
+package stringcomparison
+
+import org.junit.Test
+import kotlin.test.assertFalse
+import kotlin.test.assertTrue
+
+class StringComparisonUnitTest {
+
+ @Test
+ fun `compare using equals operator`() {
+ val first = "kotlin"
+ val second = "kotlin"
+ val firstCapitalized = "KOTLIN"
+ assertTrue { first == second }
+ assertFalse { first == firstCapitalized }
+ }
+
+ @Test
+ fun `compare using referential equals operator`() {
+ val first = "kotlin"
+ val second = "kotlin"
+ val copyOfFirst = buildString { "kotlin" }
+ assertTrue { first === second }
+ assertFalse { first === copyOfFirst }
+ }
+
+ @Test
+ fun `compare using equals method`() {
+ val first = "kotlin"
+ val second = "kotlin"
+ val firstCapitalized = "KOTLIN"
+ assertTrue { first.equals(second) }
+ assertFalse { first.equals(firstCapitalized) }
+ assertTrue { first.equals(firstCapitalized, true) }
+ }
+
+ @Test
+ fun `compare using compare method`() {
+ val first = "kotlin"
+ val second = "kotlin"
+ val firstCapitalized = "KOTLIN"
+ assertTrue { first.compareTo(second) == 0 }
+ assertTrue { first.compareTo(firstCapitalized) == 32 }
+ assertTrue { firstCapitalized.compareTo(first) == -32 }
+ assertTrue { first.compareTo(firstCapitalized, true) == 0 }
+ }
+}
\ No newline at end of file
diff --git a/core-kotlin/src/test/kotlin/com/baeldung/voidtypes/VoidTypesUnitTest.kt b/core-kotlin-2/src/test/kotlin/voidtypes/VoidTypesUnitTest.kt
similarity index 68%
rename from core-kotlin/src/test/kotlin/com/baeldung/voidtypes/VoidTypesUnitTest.kt
rename to core-kotlin-2/src/test/kotlin/voidtypes/VoidTypesUnitTest.kt
index 5c285c3135..468352dbed 100644
--- a/core-kotlin/src/test/kotlin/com/baeldung/voidtypes/VoidTypesUnitTest.kt
+++ b/core-kotlin-2/src/test/kotlin/voidtypes/VoidTypesUnitTest.kt
@@ -6,7 +6,19 @@ import kotlin.test.assertTrue
class VoidTypesUnitTest {
- fun returnTypeAsVoid(): Void? {
+ // Un-commenting below methods will result into compilation error
+ // as the syntax used is incorrect and is used for explanation in tutorial.
+
+ // fun returnTypeAsVoidAttempt1(): Void {
+ // println("Trying with Void as return type")
+ // }
+
+ // fun returnTypeAsVoidAttempt2(): Void {
+ // println("Trying with Void as return type")
+ // return null
+ // }
+
+ fun returnTypeAsVoidSuccess(): Void? {
println("Function can have Void as return type")
return null
}
@@ -36,7 +48,7 @@ class VoidTypesUnitTest {
@Test
fun givenVoidReturnType_thenReturnsNullOnly() {
- assertNull(returnTypeAsVoid())
+ assertNull(returnTypeAsVoidSuccess())
}
@Test
diff --git a/core-kotlin-2/src/test/resources/Kotlin.in b/core-kotlin-2/src/test/resources/Kotlin.in
new file mode 100644
index 0000000000..d140d4429e
--- /dev/null
+++ b/core-kotlin-2/src/test/resources/Kotlin.in
@@ -0,0 +1,5 @@
+Hello to Kotlin. Its:
+1. Concise
+2. Safe
+3. Interoperable
+4. Tool-friendly
\ No newline at end of file
diff --git a/core-kotlin-2/src/test/resources/Kotlin.out b/core-kotlin-2/src/test/resources/Kotlin.out
new file mode 100644
index 0000000000..63d15d2528
--- /dev/null
+++ b/core-kotlin-2/src/test/resources/Kotlin.out
@@ -0,0 +1,2 @@
+Kotlin
+Concise, Safe, Interoperable, Tool-friendly
\ No newline at end of file
diff --git a/core-kotlin/README.md b/core-kotlin/README.md
index 225ad87e87..7d8001d667 100644
--- a/core-kotlin/README.md
+++ b/core-kotlin/README.md
@@ -4,7 +4,7 @@
- [A guide to the “when{}” block in Kotlin](http://www.baeldung.com/kotlin-when)
- [Comprehensive Guide to Null Safety in Kotlin](http://www.baeldung.com/kotlin-null-safety)
- [Kotlin Java Interoperability](http://www.baeldung.com/kotlin-java-interoperability)
-- [Difference Between “==” and “===” in Kotlin](http://www.baeldung.com/kotlin-equality-operators)
+- [Difference Between “==” and “===” operators in Kotlin](http://www.baeldung.com/kotlin-equality-operators)
- [Generics in Kotlin](http://www.baeldung.com/kotlin-generics)
- [Introduction to Kotlin Coroutines](http://www.baeldung.com/kotlin-coroutines)
- [Destructuring Declarations in Kotlin](http://www.baeldung.com/kotlin-destructuring-declarations)
@@ -51,3 +51,6 @@
- [Operator Overloading in Kotlin](https://www.baeldung.com/kotlin-operator-overloading)
- [Inline Classes in Kotlin](https://www.baeldung.com/kotlin-inline-classes)
- [Creating Java static final Equivalents in Kotlin](https://www.baeldung.com/kotlin-java-static-final)
+- [Nested forEach in Kotlin](https://www.baeldung.com/kotlin-nested-foreach)
+- [Building DSLs in Kotlin](https://www.baeldung.com/kotlin-dsl)
+- [Static Methods Behavior in Kotlin](https://www.baeldung.com/kotlin-static-methods)
diff --git a/core-kotlin/pom.xml b/core-kotlin/pom.xml
index ed79ebc01b..5de986b49e 100644
--- a/core-kotlin/pom.xml
+++ b/core-kotlin/pom.xml
@@ -64,13 +64,13 @@
nl.komponents.kovenant
kovenant
- 3.3.0
+ ${kovenant.version}
pom
uy.kohesive.injekt
injekt-core
- 1.16.1
+ ${injekt-core.version}
@@ -82,6 +82,8 @@
3.10.0
1.4.197
1.15.0
+ 3.3.0
+ 1.16.1
diff --git a/core-kotlin/src/main/kotlin/com/baeldung/kotlin/dsl/SqlDsl.kt b/core-kotlin/src/main/kotlin/com/baeldung/kotlin/dsl/SqlDsl.kt
new file mode 100644
index 0000000000..5296d301a3
--- /dev/null
+++ b/core-kotlin/src/main/kotlin/com/baeldung/kotlin/dsl/SqlDsl.kt
@@ -0,0 +1,114 @@
+package com.baeldung.kotlin.dsl
+
+abstract class Condition {
+
+ fun and(initializer: Condition.() -> Unit) {
+ addCondition(And().apply(initializer))
+ }
+
+ fun or(initializer: Condition.() -> Unit) {
+ addCondition(Or().apply(initializer))
+ }
+
+ infix fun String.eq(value: Any?) {
+ addCondition(Eq(this, value))
+ }
+
+ protected abstract fun addCondition(condition: Condition)
+}
+
+open class CompositeCondition(private val sqlOperator: String) : Condition() {
+ private val conditions = mutableListOf()
+
+ override fun addCondition(condition: Condition) {
+ conditions += condition
+ }
+
+ override fun toString(): String {
+ return if (conditions.size == 1) {
+ conditions.first().toString()
+ } else {
+ conditions.joinToString(prefix = "(", postfix = ")", separator = " $sqlOperator ") {
+ "$it"
+ }
+ }
+ }
+}
+
+class And : CompositeCondition("and")
+
+class Or : CompositeCondition("or")
+
+class Eq(private val column: String, private val value: Any?) : Condition() {
+
+ init {
+ if (value != null && value !is Number && value !is String) {
+ throw IllegalArgumentException("Only , numbers and strings values can be used in the 'where' clause")
+ }
+ }
+
+ override fun addCondition(condition: Condition) {
+ throw IllegalStateException("Can't add a nested condition to the sql 'eq'")
+ }
+
+ override fun toString(): String {
+ return when (value) {
+ null -> "$column is null"
+ is String -> "$column = '$value'"
+ else -> "$column = $value"
+ }
+ }
+}
+
+class SqlSelectBuilder {
+
+ private val columns = mutableListOf()
+ private lateinit var table: String
+ private var condition: Condition? = null
+
+ fun select(vararg columns: String) {
+ if (columns.isEmpty()) {
+ throw IllegalArgumentException("At least one column should be defined")
+ }
+ if (this.columns.isNotEmpty()) {
+ throw IllegalStateException("Detected an attempt to re-define columns to fetch. Current columns list: "
+ + "${this.columns}, new columns list: $columns")
+ }
+ this.columns.addAll(columns)
+ }
+
+ fun from(table: String) {
+ this.table = table
+ }
+
+ fun where(initializer: Condition.() -> Unit) {
+ condition = And().apply(initializer)
+ }
+
+ fun build(): String {
+ if (!::table.isInitialized) {
+ throw IllegalStateException("Failed to build an sql select - target table is undefined")
+ }
+ return toString()
+ }
+
+ override fun toString(): String {
+ val columnsToFetch =
+ if (columns.isEmpty()) {
+ "*"
+ } else {
+ columns.joinToString(", ")
+ }
+ val conditionString =
+ if (condition == null) {
+ ""
+ } else {
+ " where $condition"
+ }
+ return "select $columnsToFetch from $table$conditionString"
+ }
+}
+
+fun query(initializer: SqlSelectBuilder.() -> Unit): SqlSelectBuilder {
+ return SqlSelectBuilder().apply(initializer)
+}
\ No newline at end of file
diff --git a/core-kotlin/src/main/kotlin/com/baeldung/static/ConsoleUtils.kt b/core-kotlin/src/main/kotlin/com/baeldung/static/ConsoleUtils.kt
new file mode 100644
index 0000000000..23c7cfb11a
--- /dev/null
+++ b/core-kotlin/src/main/kotlin/com/baeldung/static/ConsoleUtils.kt
@@ -0,0 +1,10 @@
+package com.baeldung.static
+
+class ConsoleUtils {
+ companion object {
+ @JvmStatic
+ fun debug(debugMessage : String) {
+ println("[DEBUG] $debugMessage")
+ }
+ }
+}
\ No newline at end of file
diff --git a/core-kotlin/src/main/kotlin/com/baeldung/static/LoggingUtils.kt b/core-kotlin/src/main/kotlin/com/baeldung/static/LoggingUtils.kt
new file mode 100644
index 0000000000..e67addc9ea
--- /dev/null
+++ b/core-kotlin/src/main/kotlin/com/baeldung/static/LoggingUtils.kt
@@ -0,0 +1,5 @@
+package com.baeldung.static
+
+fun debug(debugMessage : String) {
+ println("[DEBUG] $debugMessage")
+}
\ No newline at end of file
diff --git a/core-kotlin/src/test/kotlin/com/baeldung/kotlin/dsl/SqlDslTest.kt b/core-kotlin/src/test/kotlin/com/baeldung/kotlin/dsl/SqlDslTest.kt
new file mode 100644
index 0000000000..55ae44e4dc
--- /dev/null
+++ b/core-kotlin/src/test/kotlin/com/baeldung/kotlin/dsl/SqlDslTest.kt
@@ -0,0 +1,74 @@
+package com.baeldung.kotlin.dsl
+
+import org.assertj.core.api.Assertions.assertThat
+import org.junit.Test
+import java.lang.Exception
+
+class SqlDslTest {
+
+ @Test
+ fun `when no columns are specified then star is used`() {
+ doTest("select * from table1") {
+ from ("table1")
+ }
+ }
+
+ @Test
+ fun `when no condition is specified then correct query is built`() {
+ doTest("select column1, column2 from table1") {
+ select("column1", "column2")
+ from ("table1")
+ }
+ }
+
+ @Test(expected = Exception::class)
+ fun `when no table is specified then an exception is thrown`() {
+ query {
+ select("column1")
+ }.build()
+ }
+
+ @Test
+ fun `when a list of conditions is specified then it's respected`() {
+ doTest("select * from table1 where (column3 = 4 and column4 is null)") {
+ from ("table1")
+ where {
+ "column3" eq 4
+ "column4" eq null
+ }
+ }
+ }
+
+ @Test
+ fun `when 'or' conditions are specified then they are respected`() {
+ doTest("select * from table1 where (column3 = 4 or column4 is null)") {
+ from ("table1")
+ where {
+ or {
+ "column3" eq 4
+ "column4" eq null
+ }
+ }
+ }
+ }
+
+ @Test
+ fun `when either 'and' or 'or' conditions are specified then they are respected`() {
+ doTest("select * from table1 where ((column3 = 4 or column4 is null) and column5 = 42)") {
+ from ("table1")
+ where {
+ and {
+ or {
+ "column3" eq 4
+ "column4" eq null
+ }
+ "column5" eq 42
+ }
+ }
+ }
+ }
+
+ private fun doTest(expected: String, sql: SqlSelectBuilder.() -> Unit) {
+ assertThat(query(sql).build()).isEqualTo(expected)
+ }
+}
\ No newline at end of file
diff --git a/core-kotlin/src/test/kotlin/com/baeldung/kotlin/junit5/CalculatorTest5.kt b/core-kotlin/src/test/kotlin/com/baeldung/kotlin/junit5/CalculatorTest5.kt
index 40cd9adc99..daaedca5a3 100644
--- a/core-kotlin/src/test/kotlin/com/baeldung/kotlin/junit5/CalculatorTest5.kt
+++ b/core-kotlin/src/test/kotlin/com/baeldung/kotlin/junit5/CalculatorTest5.kt
@@ -7,12 +7,12 @@ class CalculatorTest5 {
private val calculator = Calculator()
@Test
- fun whenAdding1and3_thenAnswerIs4() {
+ fun `Adding 1 and 3 should be equal to 4`() {
Assertions.assertEquals(4, calculator.add(1, 3))
}
@Test
- fun whenDividingBy0_thenErrorOccurs() {
+ fun `Dividing by zero should throw the DivideByZeroException`() {
val exception = Assertions.assertThrows(DivideByZeroException::class.java) {
calculator.divide(5, 0)
}
@@ -21,7 +21,7 @@ class CalculatorTest5 {
}
@Test
- fun whenSquaringNumbers_thenCorrectAnswerGiven() {
+ fun `The square of a number should be equal to that number multiplied in itself`() {
Assertions.assertAll(
Executable { Assertions.assertEquals(1, calculator.square(1)) },
Executable { Assertions.assertEquals(4, calculator.square(2)) },
@@ -76,7 +76,7 @@ class CalculatorTest5 {
Tag("logarithms")
)
@Test
- fun whenIcalculateLog2Of8_thenIget3() {
+ fun `Log to base 2 of 8 should be equal to 3`() {
Assertions.assertEquals(3.0, calculator.log(2, 8))
}
}
diff --git a/core-kotlin/src/test/kotlin/com/baeldung/kotlin/junit5/SimpleTest5.kt b/core-kotlin/src/test/kotlin/com/baeldung/kotlin/junit5/SimpleTest5.kt
index 70d3fb90bf..15ff201430 100644
--- a/core-kotlin/src/test/kotlin/com/baeldung/kotlin/junit5/SimpleTest5.kt
+++ b/core-kotlin/src/test/kotlin/com/baeldung/kotlin/junit5/SimpleTest5.kt
@@ -5,15 +5,16 @@ import org.junit.jupiter.api.Disabled
import org.junit.jupiter.api.Test
class SimpleTest5 {
+
@Test
- fun whenEmptyList_thenListIsEmpty() {
+ fun `isEmpty should return true for empty lists`() {
val list = listOf()
Assertions.assertTrue(list::isEmpty)
}
@Test
@Disabled
- fun when3equals4_thenTestFails() {
+ fun `3 is equal to 4`() {
Assertions.assertEquals(3, 4) {
"Three does not equal four"
}
diff --git a/core-kotlin/src/test/kotlin/com/baeldung/static/ConsoleUtilsUnitTest.kt b/core-kotlin/src/test/kotlin/com/baeldung/static/ConsoleUtilsUnitTest.kt
new file mode 100644
index 0000000000..8abed144eb
--- /dev/null
+++ b/core-kotlin/src/test/kotlin/com/baeldung/static/ConsoleUtilsUnitTest.kt
@@ -0,0 +1,10 @@
+package com.baeldung.static
+
+import org.junit.Test
+
+class ConsoleUtilsUnitTest {
+ @Test
+ fun givenAStaticMethod_whenCalled_thenNoErrorIsThrown() {
+ ConsoleUtils.debug("test message")
+ }
+}
\ No newline at end of file
diff --git a/core-kotlin/src/test/kotlin/com/baeldung/static/LoggingUtilsUnitTest.kt b/core-kotlin/src/test/kotlin/com/baeldung/static/LoggingUtilsUnitTest.kt
new file mode 100644
index 0000000000..59587ff009
--- /dev/null
+++ b/core-kotlin/src/test/kotlin/com/baeldung/static/LoggingUtilsUnitTest.kt
@@ -0,0 +1,10 @@
+package com.baeldung.static
+
+import org.junit.Test
+
+class LoggingUtilsUnitTest {
+ @Test
+ fun givenAPackageMethod_whenCalled_thenNoErrorIsThrown() {
+ debug("test message")
+ }
+}
\ No newline at end of file
diff --git a/couchbase/pom.xml b/couchbase/pom.xml
index 7da027597e..31e6a53388 100644
--- a/couchbase/pom.xml
+++ b/couchbase/pom.xml
@@ -5,9 +5,9 @@
com.baeldung
couchbase
0.1-SNAPSHOT
- jar
couchbase
Couchbase Tutorials
+ jar
com.baeldung
@@ -25,7 +25,7 @@
com.fasterxml.jackson.core
jackson-databind
- ${jackson-version}
+ ${jackson.version}
@@ -70,7 +70,6 @@
2.5.0
4.3.5.RELEASE
3.5
- 2.9.7
diff --git a/custom-pmd/pom.xml b/custom-pmd/pom.xml
index 0f73282ae3..74e6d9593b 100644
--- a/custom-pmd/pom.xml
+++ b/custom-pmd/pom.xml
@@ -4,8 +4,8 @@
org.baeldung.pmd
custom-pmd
0.0.1
- jar
custom-pmd
+ jar
http://maven.apache.org
diff --git a/ddd/pom.xml b/ddd/pom.xml
index a61ae24e92..4ac65ea841 100644
--- a/ddd/pom.xml
+++ b/ddd/pom.xml
@@ -1,25 +1,19 @@
4.0.0
-
-
- org.springframework.boot
- spring-boot-starter-parent
- 2.0.6.RELEASE
-
-
-
com.baeldung.ddd
ddd
0.0.1-SNAPSHOT
- jar
ddd
+ jar
DDD series examples
-
- 1.0.1
- 2.22.0
-
+
+ parent-boot-2
+ com.baeldung
+ 0.0.1-SNAPSHOT
+ ../parent-boot-2
+
@@ -88,4 +82,11 @@
test
+
+
+ 1.0.1
+ 2.22.0
+ 2.0.6.RELEASE
+
+
\ No newline at end of file
diff --git a/ddd/src/test/java/com/baeldung/ddd/order/OrderTest.java b/ddd/src/test/java/com/baeldung/ddd/order/OrderUnitTest.java
similarity index 99%
rename from ddd/src/test/java/com/baeldung/ddd/order/OrderTest.java
rename to ddd/src/test/java/com/baeldung/ddd/order/OrderUnitTest.java
index 431a6a5293..502827960a 100644
--- a/ddd/src/test/java/com/baeldung/ddd/order/OrderTest.java
+++ b/ddd/src/test/java/com/baeldung/ddd/order/OrderUnitTest.java
@@ -11,7 +11,7 @@ import org.joda.money.Money;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
-class OrderTest {
+class OrderUnitTest {
@DisplayName("given order with two items, when calculate total cost, then sum is returned")
@Test
void test0() throws Exception {
diff --git a/ddd/src/test/java/com/baeldung/ddd/order/jpa/ViolateOrderBusinessRulesTest.java b/ddd/src/test/java/com/baeldung/ddd/order/jpa/ViolateOrderBusinessRulesUnitTest.java
similarity index 96%
rename from ddd/src/test/java/com/baeldung/ddd/order/jpa/ViolateOrderBusinessRulesTest.java
rename to ddd/src/test/java/com/baeldung/ddd/order/jpa/ViolateOrderBusinessRulesUnitTest.java
index 3eda9250f9..6f1de3276c 100644
--- a/ddd/src/test/java/com/baeldung/ddd/order/jpa/ViolateOrderBusinessRulesTest.java
+++ b/ddd/src/test/java/com/baeldung/ddd/order/jpa/ViolateOrderBusinessRulesUnitTest.java
@@ -7,7 +7,7 @@ import java.math.BigDecimal;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
-public class ViolateOrderBusinessRulesTest {
+public class ViolateOrderBusinessRulesUnitTest {
@DisplayName("given two non-zero order line items, when create an order with them, it's possible to set total cost to zero")
@Test
void test() throws Exception {
diff --git a/deeplearning4j/pom.xml b/deeplearning4j/pom.xml
index 38be189bd0..181dbc871c 100644
--- a/deeplearning4j/pom.xml
+++ b/deeplearning4j/pom.xml
@@ -3,9 +3,9 @@
4.0.0
com.baeldung.deeplearning4j
deeplearning4j
- jar
1.0-SNAPSHOT
deeplearning4j
+ jar
com.baeldung
diff --git a/disruptor/pom.xml b/disruptor/pom.xml
index c26dcc0cd4..296704f546 100644
--- a/disruptor/pom.xml
+++ b/disruptor/pom.xml
@@ -4,8 +4,8 @@
com.baeldung
disruptor
0.1.0-SNAPSHOT
- jar
disruptor
+ jar
com.baeldung
diff --git a/ethereum/pom.xml b/ethereum/pom.xml
index c7f82eaf22..baa74b58a5 100644
--- a/ethereum/pom.xml
+++ b/ethereum/pom.xml
@@ -208,15 +208,12 @@
UTF-8
- 1.8
8.5.4
1.5.0-RELEASE
3.3.1
1.5.6.RELEASE
2.21.0
- 2.9.7
1.3
- 2.9.7
2.3.1
3.1.0
2.4.0
diff --git a/feign/pom.xml b/feign/pom.xml
index ea645383c1..d2fa334270 100644
--- a/feign/pom.xml
+++ b/feign/pom.xml
@@ -56,7 +56,6 @@
9.4.0
- 1.16.12
1.4.2.RELEASE
diff --git a/flyway-cdi-extension/pom.xml b/flyway-cdi-extension/pom.xml
index dbb32f1e5a..f49a51ea4b 100644
--- a/flyway-cdi-extension/pom.xml
+++ b/flyway-cdi-extension/pom.xml
@@ -8,44 +8,49 @@
1.0-SNAPSHOT
flyway-cdi-extension
-
- 1.8
- 1.8
-
-
javax.enterprise
cdi-api
- 2.0.SP1
+ ${cdi-api.version}
org.jboss.weld.se
weld-se-core
- 3.0.5.Final
+ ${weld-se-core.version}
runtime
org.flywaydb
flyway-core
- 5.1.4
+ ${flyway-core.version}
org.apache.tomcat
tomcat-jdbc
- 8.5.33
+ ${tomcat-jdbc.version}
javax.annotation
javax.annotation-api
- 1.3.2
+ ${javax.annotation-api.version}
com.h2database
h2
- 1.4.197
+ ${h2.version}
runtime
+
+ 1.8
+ 1.8
+ 2.0.SP1
+ 3.0.5.Final
+ 5.1.4
+ 8.5.33
+ 1.3.2
+ 1.4.197
+
diff --git a/geotools/pom.xml b/geotools/pom.xml
index 3ac8a63564..17beded326 100644
--- a/geotools/pom.xml
+++ b/geotools/pom.xml
@@ -4,8 +4,8 @@
4.0.0
geotools
0.0.1-SNAPSHOT
- jar
geotools
+ jar
http://maven.apache.org
@@ -33,24 +33,11 @@
-
- maven2-repository.dev.java.net
- Java.net repository
- http://download.java.net/maven/2
-
osgeo
Open Source Geospatial Foundation Repository
http://download.osgeo.org/webdav/geotools/
-
-
- true
-
- opengeo
- OpenGeo Maven Repository
- http://repo.opengeo.org
-
diff --git a/google-cloud/pom.xml b/google-cloud/pom.xml
index 85f47cc2f5..e39e186f05 100644
--- a/google-cloud/pom.xml
+++ b/google-cloud/pom.xml
@@ -4,9 +4,9 @@
4.0.0
google-cloud
0.1-SNAPSHOT
- jar
google-cloud
Google Cloud Tutorials
+ jar
com.baeldung
diff --git a/google-web-toolkit/pom.xml b/google-web-toolkit/pom.xml
index db9ce2eac0..f4c6a0ab39 100644
--- a/google-web-toolkit/pom.xml
+++ b/google-web-toolkit/pom.xml
@@ -7,9 +7,9 @@
4.0.0
com.baeldung
google-web-toolkit
- war
1.0-SNAPSHOT
google-web-toolkit
+ war
com.baeldung
@@ -23,7 +23,7 @@
com.google.gwt
gwt
- 2.8.2
+ ${gwt.version}
pom
import
@@ -49,7 +49,7 @@
junit
junit
- 4.11
+ ${junit.version}
test
@@ -120,6 +120,8 @@
UTF-8
UTF-8
+ 4.11
+ 2.8.2
diff --git a/grpc/pom.xml b/grpc/pom.xml
index 725bec3e70..ab550c31d7 100644
--- a/grpc/pom.xml
+++ b/grpc/pom.xml
@@ -3,8 +3,8 @@
4.0.0
grpc
0.0.1-SNAPSHOT
- jar
grpc
+ jar
com.baeldung
diff --git a/gson/README.md b/gson/README.md
index 4edd7158d4..02b06eac20 100644
--- a/gson/README.md
+++ b/gson/README.md
@@ -10,3 +10,4 @@
- [Save Data to a JSON File with Gson](https://www.baeldung.com/gson-save-file)
- [Convert JSON to a Map Using Gson](https://www.baeldung.com/gson-json-to-map)
- [Working with Primitive Values in Gson](https://www.baeldung.com/java-gson-primitives)
+- [Convert String to JsonObject with Gson](https://www.baeldung.com/gson-string-to-jsonobject)
diff --git a/gson/src/test/java/org/baeldung/gson/conversion/JsonObjectConversionsUnitTest.java b/gson/src/test/java/org/baeldung/gson/conversion/JsonObjectConversionsUnitTest.java
new file mode 100644
index 0000000000..847ec1b85d
--- /dev/null
+++ b/gson/src/test/java/org/baeldung/gson/conversion/JsonObjectConversionsUnitTest.java
@@ -0,0 +1,33 @@
+package org.baeldung.gson.conversion;
+
+import com.google.gson.*;
+import org.junit.Assert;
+import org.junit.jupiter.api.Test;
+
+public class JsonObjectConversionsUnitTest {
+
+ @Test
+ void whenUsingJsonParser_thenConvertToJsonObject() throws Exception {
+ // Example 1: Using JsonParser
+ String json = "{ \"name\": \"Baeldung\", \"java\": true }";
+
+ JsonObject jsonObject = new JsonParser().parse(json).getAsJsonObject();
+
+ Assert.assertTrue(jsonObject.isJsonObject());
+ Assert.assertTrue(jsonObject.get("name").getAsString().equals("Baeldung"));
+ Assert.assertTrue(jsonObject.get("java").getAsBoolean() == true);
+ }
+
+ @Test
+ void whenUsingGsonInstanceFromJson_thenConvertToJsonObject() throws Exception {
+ // Example 2: Using fromJson
+ String json = "{ \"name\": \"Baeldung\", \"java\": true }";
+
+ JsonObject convertedObject = new Gson().fromJson(json, JsonObject.class);
+
+ Assert.assertTrue(convertedObject.isJsonObject());
+ Assert.assertTrue(convertedObject.get("name").getAsString().equals("Baeldung"));
+ Assert.assertTrue(convertedObject.get("java").getAsBoolean() == true);
+ }
+
+}
diff --git a/guava-modules/pom.xml b/guava-modules/pom.xml
new file mode 100644
index 0000000000..fed9e446f7
--- /dev/null
+++ b/guava-modules/pom.xml
@@ -0,0 +1,22 @@
+
+
+ 4.0.0
+ guava-modules
+ guava-modules
+ pom
+
+
+ com.baeldung
+ parent-modules
+ 1.0.0-SNAPSHOT
+ ..
+
+
+
+ guava-18
+ guava-19
+ guava-21
+
+
+
diff --git a/guest/spring-boot-app/src/test/java/com/stackify/test/EmployeeControllerTest.java b/guest/spring-boot-app/src/test/java/com/stackify/test/EmployeeControllerUnitTest.java
similarity index 97%
rename from guest/spring-boot-app/src/test/java/com/stackify/test/EmployeeControllerTest.java
rename to guest/spring-boot-app/src/test/java/com/stackify/test/EmployeeControllerUnitTest.java
index 2711a77ebd..9808546e82 100644
--- a/guest/spring-boot-app/src/test/java/com/stackify/test/EmployeeControllerTest.java
+++ b/guest/spring-boot-app/src/test/java/com/stackify/test/EmployeeControllerUnitTest.java
@@ -21,7 +21,7 @@ import com.stackify.Application;
@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
@WebAppConfiguration
-public class EmployeeControllerTest {
+public class EmployeeControllerUnitTest {
private static final String CONTENT_TYPE = "application/json;charset=UTF-8";
diff --git a/guice/README.md b/guice/README.md
index d1bd1ff883..77c788c363 100644
--- a/guice/README.md
+++ b/guice/README.md
@@ -2,3 +2,4 @@
### Relevant Articles
- [Guide to Google Guice](http://www.baeldung.com/guice)
+- [Guice vs Spring – Dependency Injection](https://www.baeldung.com/guice-spring-dependency-injection)
diff --git a/guice/pom.xml b/guice/pom.xml
index f3e7873245..8ed2b557dc 100644
--- a/guice/pom.xml
+++ b/guice/pom.xml
@@ -5,8 +5,8 @@
com.baeldung.examples.guice
guice
1.0-SNAPSHOT
- jar
guice
+ jar
com.baeldung
@@ -26,4 +26,4 @@
4.1.0
-
+
\ No newline at end of file
diff --git a/guice/src/main/java/com/baeldung/examples/common/Account.java b/guice/src/main/java/com/baeldung/examples/common/Account.java
new file mode 100644
index 0000000000..fd2df005ac
--- /dev/null
+++ b/guice/src/main/java/com/baeldung/examples/common/Account.java
@@ -0,0 +1,24 @@
+package com.baeldung.examples.common;
+
+public class Account {
+
+ private String accountNumber;
+ private String type;
+
+ public String getAccountNumber() {
+ return accountNumber;
+ }
+
+ public void setAccountNumber(String accountNumber) {
+ this.accountNumber = accountNumber;
+ }
+
+ public String getType() {
+ return type;
+ }
+
+ public void setType(String type) {
+ this.type = type;
+ }
+
+}
diff --git a/guice/src/main/java/com/baeldung/examples/common/AccountService.java b/guice/src/main/java/com/baeldung/examples/common/AccountService.java
new file mode 100644
index 0000000000..97a64e3c6e
--- /dev/null
+++ b/guice/src/main/java/com/baeldung/examples/common/AccountService.java
@@ -0,0 +1,5 @@
+package com.baeldung.examples.common;
+
+public interface AccountService {
+
+}
diff --git a/guice/src/main/java/com/baeldung/examples/common/AccountServiceImpl.java b/guice/src/main/java/com/baeldung/examples/common/AccountServiceImpl.java
new file mode 100644
index 0000000000..18d6777c4a
--- /dev/null
+++ b/guice/src/main/java/com/baeldung/examples/common/AccountServiceImpl.java
@@ -0,0 +1,5 @@
+package com.baeldung.examples.common;
+
+public class AccountServiceImpl implements AccountService {
+
+}
diff --git a/guice/src/main/java/com/baeldung/examples/common/AudioBookService.java b/guice/src/main/java/com/baeldung/examples/common/AudioBookService.java
new file mode 100644
index 0000000000..5d501f2051
--- /dev/null
+++ b/guice/src/main/java/com/baeldung/examples/common/AudioBookService.java
@@ -0,0 +1,5 @@
+package com.baeldung.examples.common;
+
+public interface AudioBookService {
+
+}
diff --git a/guice/src/main/java/com/baeldung/examples/common/AudioBookServiceImpl.java b/guice/src/main/java/com/baeldung/examples/common/AudioBookServiceImpl.java
new file mode 100644
index 0000000000..c64e953a58
--- /dev/null
+++ b/guice/src/main/java/com/baeldung/examples/common/AudioBookServiceImpl.java
@@ -0,0 +1,5 @@
+package com.baeldung.examples.common;
+
+public class AudioBookServiceImpl implements AudioBookService {
+
+}
diff --git a/guice/src/main/java/com/baeldung/examples/common/AuthorService.java b/guice/src/main/java/com/baeldung/examples/common/AuthorService.java
new file mode 100644
index 0000000000..9be148b8c3
--- /dev/null
+++ b/guice/src/main/java/com/baeldung/examples/common/AuthorService.java
@@ -0,0 +1,5 @@
+package com.baeldung.examples.common;
+
+public interface AuthorService {
+
+}
diff --git a/guice/src/main/java/com/baeldung/examples/common/AuthorServiceImpl.java b/guice/src/main/java/com/baeldung/examples/common/AuthorServiceImpl.java
new file mode 100644
index 0000000000..bac532e469
--- /dev/null
+++ b/guice/src/main/java/com/baeldung/examples/common/AuthorServiceImpl.java
@@ -0,0 +1,5 @@
+package com.baeldung.examples.common;
+
+public class AuthorServiceImpl implements AuthorService {
+
+}
diff --git a/guice/src/main/java/com/baeldung/examples/common/BookService.java b/guice/src/main/java/com/baeldung/examples/common/BookService.java
new file mode 100644
index 0000000000..56339c1398
--- /dev/null
+++ b/guice/src/main/java/com/baeldung/examples/common/BookService.java
@@ -0,0 +1,5 @@
+package com.baeldung.examples.common;
+
+public interface BookService {
+
+}
diff --git a/guice/src/main/java/com/baeldung/examples/common/BookServiceImpl.java b/guice/src/main/java/com/baeldung/examples/common/BookServiceImpl.java
new file mode 100644
index 0000000000..aee0d22e51
--- /dev/null
+++ b/guice/src/main/java/com/baeldung/examples/common/BookServiceImpl.java
@@ -0,0 +1,7 @@
+package com.baeldung.examples.common;
+
+public class BookServiceImpl implements BookService {
+
+ private AuthorService authorService;
+
+}
diff --git a/guice/src/main/java/com/baeldung/examples/common/PersonDao.java b/guice/src/main/java/com/baeldung/examples/common/PersonDao.java
new file mode 100644
index 0000000000..980fee0252
--- /dev/null
+++ b/guice/src/main/java/com/baeldung/examples/common/PersonDao.java
@@ -0,0 +1,5 @@
+package com.baeldung.examples.common;
+
+public interface PersonDao {
+
+}
diff --git a/guice/src/main/java/com/baeldung/examples/common/PersonDaoImpl.java b/guice/src/main/java/com/baeldung/examples/common/PersonDaoImpl.java
new file mode 100644
index 0000000000..ecbf198cc0
--- /dev/null
+++ b/guice/src/main/java/com/baeldung/examples/common/PersonDaoImpl.java
@@ -0,0 +1,5 @@
+package com.baeldung.examples.common;
+
+public class PersonDaoImpl implements PersonDao {
+
+}
\ No newline at end of file
diff --git a/guice/src/main/java/com/baeldung/examples/guice/Foo.java b/guice/src/main/java/com/baeldung/examples/guice/Foo.java
new file mode 100644
index 0000000000..fca32b165b
--- /dev/null
+++ b/guice/src/main/java/com/baeldung/examples/guice/Foo.java
@@ -0,0 +1,4 @@
+package com.baeldung.examples.guice;
+
+public class Foo {
+}
diff --git a/guice/src/main/java/com/baeldung/examples/guice/FooProcessor.java b/guice/src/main/java/com/baeldung/examples/guice/FooProcessor.java
new file mode 100644
index 0000000000..929013cd2b
--- /dev/null
+++ b/guice/src/main/java/com/baeldung/examples/guice/FooProcessor.java
@@ -0,0 +1,9 @@
+package com.baeldung.examples.guice;
+
+import com.google.inject.Inject;
+
+public class FooProcessor {
+
+ @Inject
+ private Foo foo;
+}
\ No newline at end of file
diff --git a/guice/src/main/java/com/baeldung/examples/guice/GuicePersonService.java b/guice/src/main/java/com/baeldung/examples/guice/GuicePersonService.java
new file mode 100644
index 0000000000..ce12e3e528
--- /dev/null
+++ b/guice/src/main/java/com/baeldung/examples/guice/GuicePersonService.java
@@ -0,0 +1,19 @@
+package com.baeldung.examples.guice;
+
+import com.baeldung.examples.common.PersonDao;
+import com.google.inject.Inject;
+
+public class GuicePersonService {
+
+ @Inject
+ private PersonDao personDao;
+
+ public PersonDao getPersonDao() {
+ return personDao;
+ }
+
+ public void setPersonDao(PersonDao personDao) {
+ this.personDao = personDao;
+ }
+
+}
diff --git a/guice/src/main/java/com/baeldung/examples/guice/GuiceUserService.java b/guice/src/main/java/com/baeldung/examples/guice/GuiceUserService.java
new file mode 100644
index 0000000000..0e58d0bacf
--- /dev/null
+++ b/guice/src/main/java/com/baeldung/examples/guice/GuiceUserService.java
@@ -0,0 +1,19 @@
+package com.baeldung.examples.guice;
+
+import com.baeldung.examples.common.AccountService;
+import com.google.inject.Inject;
+
+public class GuiceUserService {
+
+ @Inject
+ private AccountService accountService;
+
+ public AccountService getAccountService() {
+ return accountService;
+ }
+
+ public void setAccountService(AccountService accountService) {
+ this.accountService = accountService;
+ }
+
+}
diff --git a/guice/src/main/java/com/baeldung/examples/guice/Person.java b/guice/src/main/java/com/baeldung/examples/guice/Person.java
new file mode 100644
index 0000000000..d54b5110eb
--- /dev/null
+++ b/guice/src/main/java/com/baeldung/examples/guice/Person.java
@@ -0,0 +1,24 @@
+package com.baeldung.examples.guice;
+
+public class Person {
+ private String firstName;
+
+ private String lastName;
+
+ public String getFirstName() {
+ return firstName;
+ }
+
+ public void setFirstName(String firstName) {
+ this.firstName = firstName;
+ }
+
+ public String getLastName() {
+ return lastName;
+ }
+
+ public void setLastName(String lastName) {
+ this.lastName = lastName;
+ }
+
+}
diff --git a/guice/src/main/java/com/baeldung/examples/guice/modules/GuiceModule.java b/guice/src/main/java/com/baeldung/examples/guice/modules/GuiceModule.java
new file mode 100644
index 0000000000..fbcd36b56a
--- /dev/null
+++ b/guice/src/main/java/com/baeldung/examples/guice/modules/GuiceModule.java
@@ -0,0 +1,50 @@
+package com.baeldung.examples.guice.modules;
+
+import com.baeldung.examples.common.AccountService;
+import com.baeldung.examples.common.AccountServiceImpl;
+import com.baeldung.examples.common.BookService;
+import com.baeldung.examples.common.BookServiceImpl;
+import com.baeldung.examples.common.PersonDao;
+import com.baeldung.examples.common.PersonDaoImpl;
+import com.baeldung.examples.guice.Foo;
+import com.baeldung.examples.guice.Person;
+import com.google.inject.AbstractModule;
+import com.google.inject.Provider;
+import com.google.inject.Provides;
+
+public class GuiceModule extends AbstractModule {
+
+ @Override
+ protected void configure() {
+ try {
+ bind(AccountService.class).to(AccountServiceImpl.class);
+ bind(Person.class).toConstructor(Person.class.getConstructor());
+ // bind(Person.class).toProvider(new Provider() {
+ // public Person get() {
+ // Person p = new Person();
+ // return p;
+ // }
+ // });
+ bind(Foo.class).toProvider(new Provider() {
+ public Foo get() {
+ return new Foo();
+ }
+ });
+ bind(PersonDao.class).to(PersonDaoImpl.class);
+
+ } catch (NoSuchMethodException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (SecurityException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+
+ }
+
+ @Provides
+ public BookService bookServiceGenerator() {
+ return new BookServiceImpl();
+ }
+
+}
diff --git a/guice/src/test/java/com/baeldung/examples/GuiceUnitTest.java b/guice/src/test/java/com/baeldung/examples/GuiceUnitTest.java
new file mode 100644
index 0000000000..dd2a89e101
--- /dev/null
+++ b/guice/src/test/java/com/baeldung/examples/GuiceUnitTest.java
@@ -0,0 +1,61 @@
+package com.baeldung.examples;
+
+import static org.junit.Assert.assertNotNull;
+
+import org.junit.Test;
+
+import com.baeldung.examples.common.BookService;
+import com.baeldung.examples.guice.FooProcessor;
+import com.baeldung.examples.guice.GuicePersonService;
+import com.baeldung.examples.guice.GuiceUserService;
+import com.baeldung.examples.guice.Person;
+import com.baeldung.examples.guice.modules.GuiceModule;
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+
+public class GuiceUnitTest {
+
+ @Test
+ public void givenAccountServiceInjectedInGuiceUserService_WhenGetAccountServiceInvoked_ThenReturnValueIsNotNull() {
+ Injector injector = Guice.createInjector(new GuiceModule());
+ GuiceUserService guiceUserService = injector.getInstance(GuiceUserService.class);
+ assertNotNull(guiceUserService.getAccountService());
+ }
+
+ @Test
+ public void givenBookServiceIsRegisteredInModule_WhenBookServiceIsInjected_ThenReturnValueIsNotNull() {
+ Injector injector = Guice.createInjector(new GuiceModule());
+ BookService bookService = injector.getInstance(BookService.class);
+ assertNotNull(bookService);
+ }
+
+ @Test
+ public void givenMultipleBindingsForPerson_WhenPersonIsInjected_ThenTestFailsByProvisionException() {
+ Injector injector = Guice.createInjector(new GuiceModule());
+ Person person = injector.getInstance(Person.class);
+ assertNotNull(person);
+ }
+
+ @Test
+ public void givenFooInjectedToFooProcessorAsOptionalDependency_WhenFooProcessorIsRetrievedFromContext_ThenCreationExceptionIsNotThrown() {
+ Injector injector = Guice.createInjector(new GuiceModule());
+ FooProcessor fooProcessor = injector.getInstance(FooProcessor.class);
+ assertNotNull(fooProcessor);
+ }
+
+ @Test
+ public void givenGuicePersonServiceConstructorAnnotatedByInject_WhenGuicePersonServiceIsInjected_ThenInstanceWillBeCreatedFromTheConstructor() {
+ Injector injector = Guice.createInjector(new GuiceModule());
+ GuicePersonService personService = injector.getInstance(GuicePersonService.class);
+ assertNotNull(personService);
+ }
+
+ @Test
+ public void givenPersonDaoInjectedToGuicePersonServiceBySetterInjection_WhenGuicePersonServiceIsInjected_ThenPersonDaoInitializedByTheSetter() {
+ Injector injector = Guice.createInjector(new GuiceModule());
+ GuicePersonService personService = injector.getInstance(GuicePersonService.class);
+ assertNotNull(personService);
+ assertNotNull(personService.getPersonDao());
+ }
+
+}
diff --git a/httpclient/README.md b/httpclient/README.md
index 93e0f3c9e1..7c5122c5b8 100644
--- a/httpclient/README.md
+++ b/httpclient/README.md
@@ -14,11 +14,11 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring
- [Unshorten URLs with HttpClient](http://www.baeldung.com/unshorten-url-httpclient)
- [HttpClient with SSL](http://www.baeldung.com/httpclient-ssl)
- [HttpClient 4 – Follow Redirects for POST](http://www.baeldung.com/httpclient-redirect-on-http-post)
-- [HttpClient – Set Custom Header](http://www.baeldung.com/httpclient-custom-http-header)
+- [Custom HTTP Header with the HttpClient](http://www.baeldung.com/httpclient-custom-http-header)
- [HttpClient Basic Authentication](http://www.baeldung.com/httpclient-4-basic-authentication)
- [Multipart Upload with HttpClient 4](http://www.baeldung.com/httpclient-multipart-upload)
- [HttpAsyncClient Tutorial](http://www.baeldung.com/httpasyncclient-tutorial)
- [HttpClient 4 Tutorial](http://www.baeldung.com/httpclient-guide)
- [Advanced HttpClient Configuration](http://www.baeldung.com/httpclient-advanced-config)
- [HttpClient 4 – Do Not Follow Redirects](http://www.baeldung.com/httpclient-stop-follow-redirect)
-- [HttpClient 4 – Setting a Custom User-Agent](http://www.baeldung.com/httpclient-user-agent-header)
+- [Custom User-Agent in HttpClient 4](http://www.baeldung.com/httpclient-user-agent-header)
diff --git a/jackson/README.md b/jackson/README.md
index 04e88d0ea1..25194c7255 100644
--- a/jackson/README.md
+++ b/jackson/README.md
@@ -10,14 +10,14 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring
- [Jackson – Unmarshall to Collection/Array](http://www.baeldung.com/jackson-collection-array)
- [Jackson Unmarshalling json with Unknown Properties](http://www.baeldung.com/jackson-deserialize-json-unknown-properties)
- [Jackson – Custom Serializer](http://www.baeldung.com/jackson-custom-serialization)
-- [Jackson – Custom Deserializer](http://www.baeldung.com/jackson-deserialization)
+- [Getting Started with Custom Deserialization in Jackson](http://www.baeldung.com/jackson-deserialization)
- [Jackson Exceptions – Problems and Solutions](http://www.baeldung.com/jackson-exception)
- [Jackson Date](http://www.baeldung.com/jackson-serialize-dates)
- [Jackson – Bidirectional Relationships](http://www.baeldung.com/jackson-bidirectional-relationships-and-infinite-recursion)
- [Jackson JSON Tutorial](http://www.baeldung.com/jackson)
- [Jackson – Working with Maps and nulls](http://www.baeldung.com/jackson-map-null-values-or-null-key)
- [Jackson – Decide What Fields Get Serialized/Deserializaed](http://www.baeldung.com/jackson-field-serializable-deserializable-or-not)
-- [A Guide to Jackson Annotations](http://www.baeldung.com/jackson-annotations)
+- [Jackson Annotation Examples](http://www.baeldung.com/jackson-annotations)
- [Working with Tree Model Nodes in Jackson](http://www.baeldung.com/jackson-json-node-tree-model)
- [Jackson vs Gson](http://www.baeldung.com/jackson-vs-gson)
- [Intro to the Jackson ObjectMapper](http://www.baeldung.com/jackson-object-mapper-tutorial)
@@ -25,7 +25,7 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring
- [More Jackson Annotations](http://www.baeldung.com/jackson-advanced-annotations)
- [Inheritance with Jackson](http://www.baeldung.com/jackson-inheritance)
- [Guide to @JsonFormat in Jackson](http://www.baeldung.com/jackson-jsonformat)
-- [A Guide to Optional with Jackson](http://www.baeldung.com/jackson-optional)
+- [Using Optional with Jackson](http://www.baeldung.com/jackson-optional)
- [Map Serialization and Deserialization with Jackson](http://www.baeldung.com/jackson-map)
- [Jackson Streaming API](http://www.baeldung.com/jackson-streaming-api)
- [Jackson – JsonMappingException (No serializer found for class)](http://www.baeldung.com/jackson-jsonmappingexception)
@@ -37,3 +37,4 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring
- [Serialize Only Fields that meet a Custom Criteria with Jackson](http://www.baeldung.com/jackson-serialize-field-custom-criteria)
- [Mapping Nested Values with Jackson](http://www.baeldung.com/jackson-nested-values)
- [Convert XML to JSON Using Jackson](https://www.baeldung.com/jackson-convert-xml-json)
+- [Deserialize Immutable Objects with Jackson](https://www.baeldung.com/jackson-deserialize-immutable-objects)
diff --git a/jackson/pom.xml b/jackson/pom.xml
index e941ababc5..948248d255 100644
--- a/jackson/pom.xml
+++ b/jackson/pom.xml
@@ -117,8 +117,6 @@
-
- 2.9.7
3.8
2.10
diff --git a/jackson/src/test/java/com/baeldung/jackson/dtos/Address.java b/jackson/src/test/java/com/baeldung/jackson/dtos/Address.java
new file mode 100644
index 0000000000..985851f456
--- /dev/null
+++ b/jackson/src/test/java/com/baeldung/jackson/dtos/Address.java
@@ -0,0 +1,33 @@
+package com.baeldung.jackson.dtos;
+
+public class Address {
+
+ String streetNumber;
+ String streetName;
+ String city;
+
+ public String getStreetNumber() {
+ return streetNumber;
+ }
+
+ public void setStreetNumber(String streetNumber) {
+ this.streetNumber = streetNumber;
+ }
+
+ public String getStreetName() {
+ return streetName;
+ }
+
+ public void setStreetName(String streetName) {
+ this.streetName = streetName;
+ }
+
+ public String getCity() {
+ return city;
+ }
+
+ public void setCity(String city) {
+ this.city = city;
+ }
+
+}
diff --git a/jackson/src/test/java/com/baeldung/jackson/dtos/Person.java b/jackson/src/test/java/com/baeldung/jackson/dtos/Person.java
new file mode 100644
index 0000000000..13093cdcad
--- /dev/null
+++ b/jackson/src/test/java/com/baeldung/jackson/dtos/Person.java
@@ -0,0 +1,47 @@
+package com.baeldung.jackson.dtos;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
+
+@JacksonXmlRootElement(localName = "person")
+public final class Person {
+ private String firstName;
+ private String lastName;
+ private List phoneNumbers = new ArrayList<>();
+ private List address = new ArrayList<>();
+
+ public List getAddress() {
+ return address;
+ }
+
+ public void setAddress(List address) {
+ this.address = address;
+ }
+
+ public String getFirstName() {
+ return firstName;
+ }
+
+ public void setFirstName(String firstName) {
+ this.firstName = firstName;
+ }
+
+ public String getLastName() {
+ return lastName;
+ }
+
+ public void setLastName(String lastName) {
+ this.lastName = lastName;
+ }
+
+ public List getPhoneNumbers() {
+ return phoneNumbers;
+ }
+
+ public void setPhoneNumbers(List phoneNumbers) {
+ this.phoneNumbers = phoneNumbers;
+ }
+
+}
\ No newline at end of file
diff --git a/jackson/src/test/java/com/baeldung/jackson/xml/XMLSerializeDeserializeUnitTest.java b/jackson/src/test/java/com/baeldung/jackson/xml/XMLSerializeDeserializeUnitTest.java
index 0e2a52e75c..1d430e9758 100644
--- a/jackson/src/test/java/com/baeldung/jackson/xml/XMLSerializeDeserializeUnitTest.java
+++ b/jackson/src/test/java/com/baeldung/jackson/xml/XMLSerializeDeserializeUnitTest.java
@@ -2,19 +2,25 @@ package com.baeldung.jackson.xml;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertEquals;
import java.io.BufferedReader;
+import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
+import java.util.ArrayList;
+import java.util.List;
import org.junit.Test;
+import com.baeldung.jackson.dtos.Address;
+import com.baeldung.jackson.dtos.Person;
+import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
-import com.fasterxml.jackson.annotation.JsonProperty;
public class XMLSerializeDeserializeUnitTest {
@@ -49,24 +55,76 @@ public class XMLSerializeDeserializeUnitTest {
assertTrue(value.getX() == 1 && value.getY() == 2);
}
- @Test
+ @Test
public void whenJavaGotFromXmlStrWithCapitalElem_thenCorrect() throws IOException {
XmlMapper xmlMapper = new XmlMapper();
- SimpleBeanForCapitalizedFields value = xmlMapper.
- readValue("1 2 ",
- SimpleBeanForCapitalizedFields.class);
+ SimpleBeanForCapitalizedFields value = xmlMapper.readValue("1 2 ", SimpleBeanForCapitalizedFields.class);
assertTrue(value.getX() == 1 && value.getY() == 2);
}
@Test
public void whenJavaSerializedToXmlFileWithCapitalizedField_thenCorrect() throws IOException {
XmlMapper xmlMapper = new XmlMapper();
- xmlMapper.writeValue(new File("target/simple_bean_capitalized.xml"),
- new SimpleBeanForCapitalizedFields());
+ xmlMapper.writeValue(new File("target/simple_bean_capitalized.xml"), new SimpleBeanForCapitalizedFields());
File file = new File("target/simple_bean_capitalized.xml");
assertNotNull(file);
}
+ @Test
+ public void whenJavaDeserializedFromXmlFile_thenCorrect() throws IOException {
+ XmlMapper xmlMapper = new XmlMapper();
+
+ String xml = "Rohan Daye 9911034731 9911033478 1 Name1 City1 2 Name2 City2 ";
+ Person value = xmlMapper.readValue(xml, Person.class);
+
+ assertTrue(value.getAddress()
+ .get(0)
+ .getCity()
+ .equalsIgnoreCase("city1")
+ && value.getAddress()
+ .get(1)
+ .getCity()
+ .equalsIgnoreCase("city2"));
+ }
+
+ @Test
+ public void whenJavaSerializedToXmlFile_thenSuccess() throws IOException {
+ XmlMapper xmlMapper = new XmlMapper();
+
+ String expectedXml = "Rohan Daye 9911034731 9911033478 1 Name1 City1 2 Name2 City2 ";
+
+ Person person = new Person();
+
+ person.setFirstName("Rohan");
+ person.setLastName("Daye");
+
+ List ph = new ArrayList<>();
+ ph.add("9911034731");
+ ph.add("9911033478");
+ person.setPhoneNumbers(ph);
+
+ List addresses = new ArrayList<>();
+
+ Address address1 = new Address();
+ address1.setStreetNumber("1");
+ address1.setStreetName("Name1");
+ address1.setCity("City1");
+
+ Address address2 = new Address();
+ address2.setStreetNumber("2");
+ address2.setStreetName("Name2");
+ address2.setCity("City2");
+
+ addresses.add(address1);
+ addresses.add(address2);
+
+ person.setAddress(addresses);
+
+ ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
+ xmlMapper.writeValue(byteArrayOutputStream, person);
+ assertEquals(expectedXml, byteArrayOutputStream.toString());
+ }
+
private static String inputStreamToString(InputStream is) throws IOException {
BufferedReader br;
StringBuilder sb = new StringBuilder();
@@ -103,10 +161,10 @@ class SimpleBean {
}
-class SimpleBeanForCapitalizedFields {
- @JsonProperty("X")
- private int x = 1;
- private int y = 2;
+class SimpleBeanForCapitalizedFields {
+ @JsonProperty("X")
+ private int x = 1;
+ private int y = 2;
public int getX() {
return x;
diff --git a/java-collections-conversions/pom.xml b/java-collections-conversions/pom.xml
index 9b54652001..ee7221b25e 100644
--- a/java-collections-conversions/pom.xml
+++ b/java-collections-conversions/pom.xml
@@ -3,8 +3,8 @@
4.0.0
java-collections-conversions
0.1.0-SNAPSHOT
- jar
java-collections-conversions
+ jar
com.baeldung
diff --git a/java-collections-maps/README.md b/java-collections-maps/README.md
index b4ab270448..2eeb2c8843 100644
--- a/java-collections-maps/README.md
+++ b/java-collections-maps/README.md
@@ -19,3 +19,5 @@
- [How to Check If a Key Exists in a Map](https://www.baeldung.com/java-map-key-exists)
- [Comparing Two HashMaps in Java](https://www.baeldung.com/java-compare-hashmaps)
- [Immutable Map Implementations in Java](https://www.baeldung.com/java-immutable-maps)
+- [Map to String Conversion in Java](https://www.baeldung.com/java-map-to-string-conversion)
+- [Guide to Apache Commons MultiValuedMap](https://www.baeldung.com/apache-commons-multi-valued-map)
diff --git a/java-collections-maps/pom.xml b/java-collections-maps/pom.xml
index 0803866c51..b5eba31437 100644
--- a/java-collections-maps/pom.xml
+++ b/java-collections-maps/pom.xml
@@ -3,8 +3,8 @@
4.0.0
java-collections-maps
0.1.0-SNAPSHOT
- jar
java-collections-maps
+ jar
com.baeldung
@@ -39,7 +39,7 @@
one.util
streamex
- 0.6.5
+ ${streamex.version}
@@ -50,5 +50,6 @@
1.7.0
3.6.1
7.1.0
+ 0.6.5
diff --git a/java-collections-maps/src/test/java/com/baeldung/java/map/MultiValuedMapUnitTest.java b/java-collections-maps/src/test/java/com/baeldung/java/map/MultiValuedMapUnitTest.java
new file mode 100644
index 0000000000..b3aaf8925f
--- /dev/null
+++ b/java-collections-maps/src/test/java/com/baeldung/java/map/MultiValuedMapUnitTest.java
@@ -0,0 +1,227 @@
+package com.baeldung.java.map;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+
+import org.apache.commons.collections4.MultiMapUtils;
+import org.apache.commons.collections4.MultiSet;
+import org.apache.commons.collections4.MultiValuedMap;
+import org.apache.commons.collections4.multimap.ArrayListValuedHashMap;
+import org.apache.commons.collections4.multimap.HashSetValuedHashMap;
+import org.junit.Test;
+
+public class MultiValuedMapUnitTest {
+
+ @Test
+ public void givenMultiValuesMap_whenPuttingMultipleValuesUsingPutMethod_thenReturningAllValues() {
+ MultiValuedMap map = new ArrayListValuedHashMap<>();
+
+ map.put("fruits", "apple");
+ map.put("fruits", "orange");
+
+ assertThat((Collection) map.get("fruits")).containsExactly("apple", "orange");
+
+ }
+
+ @Test
+ public void givenMultiValuesMap_whenPuttingMultipleValuesUsingPutAllMethod_thenReturningAllValues() {
+ MultiValuedMap map = new ArrayListValuedHashMap<>();
+
+ map.putAll("vehicles", Arrays.asList("car", "bike"));
+
+ assertThat((Collection) map.get("vehicles")).containsExactly("car", "bike");
+
+ }
+
+ @Test
+ public void givenMultiValuesMap_whenGettingValueUsingGetMethod_thenReturningValue() {
+ MultiValuedMap map = new ArrayListValuedHashMap<>();
+
+ map.put("fruits", "apple");
+
+ assertThat((Collection) map.get("fruits")).containsExactly("apple");
+ }
+
+ @Test
+ public void givenMultiValuesMap_whenUsingEntriesMethod_thenReturningMappings() {
+ MultiValuedMap map = new ArrayListValuedHashMap<>();
+ map.put("fruits", "apple");
+ map.put("fruits", "orange");
+
+ Collection> entries = (Collection>) map.entries();
+
+ for(Map.Entry entry : entries) {
+ assertThat(entry.getKey()).contains("fruits");
+ assertTrue(entry.getValue().equals("apple") || entry.getValue().equals("orange") );
+ }
+ }
+
+ @Test
+ public void givenMultiValuesMap_whenUsingKeysMethod_thenReturningAllKeys() {
+ MultiValuedMap map = new ArrayListValuedHashMap<>();
+ map.put("fruits", "apple");
+ map.put("fruits", "orange");
+ map.put("vehicles", "car");
+ map.put("vehicles", "bike");
+
+ MultiSet keys = map.keys();
+
+ assertThat((keys)).contains("fruits", "vehicles");
+
+ }
+
+ @Test
+ public void givenMultiValuesMap_whenUsingKeySetMethod_thenReturningAllKeys() {
+ MultiValuedMap map = new ArrayListValuedHashMap<>();
+ map.put("fruits", "apple");
+ map.put("fruits", "orange");
+ map.put("vehicles", "car");
+ map.put("vehicles", "bike");
+
+ Set keys = map.keySet();
+
+ assertThat(keys).contains("fruits", "vehicles");
+
+ }
+
+ @Test
+ public void givenMultiValuesMap_whenUsingValuesMethod_thenReturningAllValues() {
+ MultiValuedMap map = new ArrayListValuedHashMap<>();
+
+ map.put("fruits", "apple");
+ map.put("fruits", "orange");
+ map.put("vehicles", "car");
+ map.put("vehicles", "bike");
+
+ assertThat(((Collection) map.values())).contains("apple", "orange", "car", "bike");
+ }
+
+ @Test
+ public void givenMultiValuesMap_whenUsingRemoveMethod_thenReturningUpdatedMap() {
+ MultiValuedMap map = new ArrayListValuedHashMap<>();
+
+ map.put("fruits", "apple");
+ map.put("fruits", "orange");
+ map.put("vehicles", "car");
+ map.put("vehicles", "bike");
+ assertThat(((Collection) map.values())).contains("apple", "orange", "car", "bike");
+
+ map.remove("fruits");
+
+ assertThat(((Collection) map.values())).contains("car", "bike");
+
+ }
+
+ @Test
+ public void givenMultiValuesMap_whenUsingRemoveMappingMethod_thenReturningUpdatedMapAfterMappingRemoved() {
+ MultiValuedMap map = new ArrayListValuedHashMap<>();
+
+ map.put("fruits", "apple");
+ map.put("fruits", "orange");
+ map.put("vehicles", "car");
+ map.put("vehicles", "bike");
+ assertThat(((Collection) map.values())).contains("apple", "orange", "car", "bike");
+
+ map.removeMapping("fruits", "apple");
+
+ assertThat(((Collection) map.values())).contains("orange", "car", "bike");
+ }
+
+ @Test
+ public void givenMultiValuesMap_whenUsingClearMethod_thenReturningEmptyMap() {
+ MultiValuedMap map = new ArrayListValuedHashMap<>();
+ map.put("fruits", "apple");
+ map.put("fruits", "orange");
+ map.put("vehicles", "car");
+ map.put("vehicles", "bike");
+ assertThat(((Collection) map.values())).contains("apple", "orange", "car", "bike");
+
+ map.clear();
+
+ assertTrue(map.isEmpty());
+ }
+
+ @Test
+ public void givenMultiValuesMap_whenUsingContainsKeyMethod_thenReturningTrue() {
+ MultiValuedMap map = new ArrayListValuedHashMap<>();
+ map.put("fruits", "apple");
+ map.put("fruits", "orange");
+ map.put("vehicles", "car");
+ map.put("vehicles", "bike");
+
+ assertTrue(map.containsKey("fruits"));
+ }
+
+ @Test
+ public void givenMultiValuesMap_whenUsingContainsValueMethod_thenReturningTrue() {
+ MultiValuedMap map = new ArrayListValuedHashMap<>();
+ map.put("fruits", "apple");
+ map.put("fruits", "orange");
+ map.put("vehicles", "car");
+ map.put("vehicles", "bike");
+
+ assertTrue(map.containsValue("orange"));
+ }
+
+ @Test
+ public void givenMultiValuesMap_whenUsingIsEmptyMethod_thenReturningFalse() {
+ MultiValuedMap map = new ArrayListValuedHashMap<>();
+ map.put("fruits", "apple");
+ map.put("fruits", "orange");
+ map.put("vehicles", "car");
+ map.put("vehicles", "bike");
+
+ assertFalse(map.isEmpty());
+ }
+
+ @Test
+ public void givenMultiValuesMap_whenUsingSizeMethod_thenReturningElementCount() {
+ MultiValuedMap map = new ArrayListValuedHashMap<>();
+ map.put("fruits", "apple");
+ map.put("fruits", "orange");
+ map.put("vehicles", "car");
+ map.put("vehicles", "bike");
+
+ assertEquals(4, map.size());
+ }
+
+ @Test
+ public void givenArrayListValuedHashMap_whenPuttingDoubleValues_thenReturningAllValues() {
+ MultiValuedMap map = new ArrayListValuedHashMap<>();
+ map.put("fruits", "apple");
+ map.put("fruits", "orange");
+ map.put("fruits", "orange");
+
+ assertThat((Collection) map.get("fruits")).containsExactly("apple", "orange", "orange");
+ }
+
+ @Test
+ public void givenHashSetValuedHashMap_whenPuttingTwiceTheSame_thenReturningOneValue() {
+ MultiValuedMap map = new HashSetValuedHashMap<>();
+ map.put("fruits", "apple");
+ map.put("fruits", "apple");
+
+ assertThat((Collection) map.get("fruits")).containsExactly("apple");
+ }
+
+ @Test(expected = UnsupportedOperationException.class)
+ public void givenUnmodifiableMultiValuedMap_whenInserting_thenThrowingException() {
+ MultiValuedMap map = new ArrayListValuedHashMap<>();
+ map.put("fruits", "apple");
+ map.put("fruits", "orange");
+ MultiValuedMap immutableMap = MultiMapUtils.unmodifiableMultiValuedMap(map);
+
+ immutableMap.put("fruits", "banana");
+
+ }
+
+
+}
diff --git a/java-dates/README.md b/java-dates/README.md
index ac3166d938..8171e5def9 100644
--- a/java-dates/README.md
+++ b/java-dates/README.md
@@ -27,4 +27,5 @@
- [Convert Between java.time.Instant and java.sql.Timestamp](https://www.baeldung.com/java-time-instant-to-java-sql-timestamp)
- [Convert between String and Timestamp](https://www.baeldung.com/java-string-to-timestamp)
- [A Guide to SimpleDateFormat](https://www.baeldung.com/java-simple-date-format)
-- [ZoneOffset in Java](https://www.baeldung.com/java-zone-offset)
\ No newline at end of file
+- [ZoneOffset in Java](https://www.baeldung.com/java-zone-offset)
+- [Differences Between ZonedDateTime and OffsetDateTime](https://www.baeldung.com/java-zoneddatetime-offsetdatetime)
diff --git a/java-dates/pom.xml b/java-dates/pom.xml
index 2618fad1d4..d4f690d894 100644
--- a/java-dates/pom.xml
+++ b/java-dates/pom.xml
@@ -4,8 +4,8 @@
com.baeldung
java-dates
0.1.0-SNAPSHOT
- jar
java-dates
+ jar
com.baeldung
@@ -76,7 +76,6 @@
3.5
- 1.16.12
2.10
3.6.1
diff --git a/java-ee-8-security-api/pom.xml b/java-ee-8-security-api/pom.xml
index ad33c74ad3..0cce84e5f2 100644
--- a/java-ee-8-security-api/pom.xml
+++ b/java-ee-8-security-api/pom.xml
@@ -58,6 +58,13 @@
+
+ app-auth-basic-store-db
+ app-auth-form-store-ldap
+ app-auth-custom-form-store-custom
+ app-auth-custom-no-store
+
+
9080
9443
@@ -70,11 +77,4 @@
3.2.2
-
- app-auth-basic-store-db
- app-auth-form-store-ldap
- app-auth-custom-form-store-custom
- app-auth-custom-no-store
-
-
diff --git a/java-lite/pom.xml b/java-lite/pom.xml
index b261e521a1..ce6e838d92 100644
--- a/java-lite/pom.xml
+++ b/java-lite/pom.xml
@@ -95,7 +95,6 @@
1.15
5.1.45
1.7.0
- 2.9.7
1.15
diff --git a/java-numbers/pom.xml b/java-numbers/pom.xml
index 0f5140ea5e..eb75f85bf0 100644
--- a/java-numbers/pom.xml
+++ b/java-numbers/pom.xml
@@ -4,8 +4,8 @@
4.0.0
java-numbers
0.1.0-SNAPSHOT
- jar
java-numbers
+ jar
com.baeldung
@@ -13,6 +13,7 @@
0.0.1-SNAPSHOT
../parent-java
+
log4j
diff --git a/java-streams/README.md b/java-streams/README.md
index 33ca2619a8..b931c0d7d9 100644
--- a/java-streams/README.md
+++ b/java-streams/README.md
@@ -3,7 +3,7 @@
## Java Streams Cookbooks and Examples
### Relevant Articles:
-- [Java 8 Streams Advanced](http://www.baeldung.com/java-8-streams)
+- [The Java 8 Stream API Tutorial](http://www.baeldung.com/java-8-streams)
- [Introduction to Java 8 Streams](http://www.baeldung.com/java-8-streams-introduction)
- [Java 8 and Infinite Streams](http://www.baeldung.com/java-inifinite-streams)
- [Java 8 Stream findFirst() vs. findAny()](http://www.baeldung.com/java-stream-findfirst-vs-findany)
@@ -15,3 +15,5 @@
- [Stream Ordering in Java](https://www.baeldung.com/java-stream-ordering)
- [Introduction to Protonpack](https://www.baeldung.com/java-protonpack)
- [Java Stream Filter with Lambda Expression](https://www.baeldung.com/java-stream-filter-lambda)
+- [Counting Matches on a Stream Filter](https://www.baeldung.com/java-stream-filter-count)
+- [Java 8 Streams peek() API](https://www.baeldung.com/java-streams-peek-api)
diff --git a/java-streams/pom.xml b/java-streams/pom.xml
index 2b52ebb4b3..00384eeead 100644
--- a/java-streams/pom.xml
+++ b/java-streams/pom.xml
@@ -3,8 +3,8 @@
4.0.0
java-streams
0.1.0-SNAPSHOT
- jar
java-streams
+ jar
com.baeldung
@@ -94,10 +94,10 @@
org.apache.maven.plugins
maven-compiler-plugin
- 3.1
+ ${maven-compiler-plugin.version}
- 1.8
- 1.8
+ ${maven.compiler.source}
+ ${maven.compiler.target}
-parameters
@@ -108,7 +108,6 @@
1.21
3.5
- 1.16.12
0.9.0
1.15
0.6.5
@@ -117,5 +116,8 @@
3.11.1
1.8.9
+ 3.1
+ 1.8
+ 1.8
diff --git a/java-streams/src/main/java/com/baeldung/reduce/application/Application.java b/java-streams/src/main/java/com/baeldung/reduce/application/Application.java
new file mode 100644
index 0000000000..b101c86780
--- /dev/null
+++ b/java-streams/src/main/java/com/baeldung/reduce/application/Application.java
@@ -0,0 +1,70 @@
+package com.baeldung.reduce.application;
+
+import com.baeldung.reduce.entities.User;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import org.openjdk.jmh.annotations.Benchmark;
+import org.openjdk.jmh.annotations.BenchmarkMode;
+import org.openjdk.jmh.annotations.Fork;
+import org.openjdk.jmh.annotations.Mode;
+import org.openjdk.jmh.annotations.Warmup;
+
+public class Application {
+
+ public static void main(String[] args) throws Exception {
+ List numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
+ int result1 = numbers.stream().reduce(0, (subtotal, element) -> subtotal + element);
+ System.out.println(result1);
+
+ int result2 = numbers.stream().reduce(0, Integer::sum);
+ System.out.println(result2);
+
+ List letters = Arrays.asList("a", "b", "c", "d", "e");
+ String result3 = letters.stream().reduce("", (partialString, element) -> partialString + element);
+ System.out.println(result3);
+
+ String result4 = letters.stream().reduce("", String::concat);
+ System.out.println(result4);
+
+ String result5 = letters.stream().reduce("", (partialString, element) -> partialString.toUpperCase() + element.toUpperCase());
+ System.out.println(result5);
+
+ List users = Arrays.asList(new User("John", 30), new User("Julie", 35));
+ int result6 = users.stream().reduce(0, (partialAgeResult, user) -> partialAgeResult + user.getAge(), Integer::sum);
+ System.out.println(result6);
+
+ String result7 = letters.parallelStream().reduce("", String::concat);
+ System.out.println(result7);
+
+ int result8 = users.parallelStream().reduce(0, (partialAgeResult, user) -> partialAgeResult + user.getAge(), Integer::sum);
+ System.out.println(result8);
+
+ org.openjdk.jmh.Main.main(args);
+
+ }
+
+ @Benchmark
+ @Fork(value = 1, warmups = 2)
+ @Warmup(iterations = 2)
+ @BenchmarkMode(Mode.AverageTime)
+ public void executeReduceOnParallelizedStream() {
+ List userList = new ArrayList<>();
+ for (int i = 0; i <= 1000000; i++) {
+ userList.add(new User("John" + i, i));
+ }
+ userList.parallelStream().reduce(0, (partialAgeResult, user) -> partialAgeResult + user.getAge(), Integer::sum);
+ }
+
+ @Benchmark
+ @Fork(value = 1, warmups = 2)
+ @Warmup(iterations = 2)
+ @BenchmarkMode(Mode.AverageTime)
+ public void executeReduceOnSequentialStream() {
+ List userList = new ArrayList<>();
+ for (int i = 0; i <= 1000000; i++) {
+ userList.add(new User("John" + i, i));
+ }
+ userList.stream().reduce(0, (partialAgeResult, user) -> partialAgeResult + user.getAge(), Integer::sum);
+ }
+}
diff --git a/java-streams/src/main/java/com/baeldung/reduce/entities/User.java b/java-streams/src/main/java/com/baeldung/reduce/entities/User.java
new file mode 100644
index 0000000000..a17c6a02b6
--- /dev/null
+++ b/java-streams/src/main/java/com/baeldung/reduce/entities/User.java
@@ -0,0 +1,25 @@
+package com.baeldung.reduce.entities;
+
+public class User {
+
+ private final String name;
+ private final int age;
+
+ public User(String name, int age) {
+ this.name = name;
+ this.age = age;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public int getAge() {
+ return age;
+ }
+
+ @Override
+ public String toString() {
+ return "User{" + "name=" + name + ", age=" + age + '}';
+ }
+}
diff --git a/java-streams/src/main/java/com/baeldung/reduce/utilities/NumberUtils.java b/java-streams/src/main/java/com/baeldung/reduce/utilities/NumberUtils.java
new file mode 100644
index 0000000000..8b4af2cbe2
--- /dev/null
+++ b/java-streams/src/main/java/com/baeldung/reduce/utilities/NumberUtils.java
@@ -0,0 +1,52 @@
+package com.baeldung.reduce.utilities;
+
+import java.util.List;
+import java.util.function.BiFunction;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+public abstract class NumberUtils {
+
+ private static final Logger LOGGER = Logger.getLogger(NumberUtils.class.getName());
+
+ public static int divideListElements(List values, Integer divider) {
+ return values.stream()
+ .reduce(0, (a, b) -> {
+ try {
+ return a / divider + b / divider;
+ } catch (ArithmeticException e) {
+ LOGGER.log(Level.INFO, "Arithmetic Exception: Division by Zero");
+ }
+ return 0;
+ });
+ }
+
+ public static int divideListElementsWithExtractedTryCatchBlock(List values, int divider) {
+ return values.stream().reduce(0, (a, b) -> divide(a, divider) + divide(b, divider));
+ }
+
+ public static int divideListElementsWithApplyFunctionMethod(List values, int divider) {
+ BiFunction division = (a, b) -> a / b;
+ return values.stream().reduce(0, (a, b) -> applyFunction(division, a, divider) + applyFunction(division, b, divider));
+ }
+
+ private static int divide(int value, int factor) {
+ int result = 0;
+ try {
+ result = value / factor;
+ } catch (ArithmeticException e) {
+ LOGGER.log(Level.INFO, "Arithmetic Exception: Division by Zero");
+ }
+ return result;
+ }
+
+ private static int applyFunction(BiFunction function, int a, int b) {
+ try {
+ return function.apply(a, b);
+ }
+ catch(Exception e) {
+ LOGGER.log(Level.INFO, "Exception occurred!");
+ }
+ return 0;
+ }
+}
diff --git a/java-streams/src/main/java/com/baeldung/stream/filter/Customer.java b/java-streams/src/main/java/com/baeldung/stream/filter/Customer.java
index 49da6e7175..fd4f6021ff 100644
--- a/java-streams/src/main/java/com/baeldung/stream/filter/Customer.java
+++ b/java-streams/src/main/java/com/baeldung/stream/filter/Customer.java
@@ -32,7 +32,7 @@ public class Customer {
return this.points > points;
}
- public boolean hasOverThousandPoints() {
+ public boolean hasOverHundredPoints() {
return this.points > 100;
}
diff --git a/java-streams/src/test/java/com/baeldung/reduce/tests/StreamReduceUnitTest.java b/java-streams/src/test/java/com/baeldung/reduce/tests/StreamReduceUnitTest.java
new file mode 100644
index 0000000000..8e2ff7bf22
--- /dev/null
+++ b/java-streams/src/test/java/com/baeldung/reduce/tests/StreamReduceUnitTest.java
@@ -0,0 +1,79 @@
+package com.baeldung.reduce.tests;
+
+import com.baeldung.reduce.entities.User;
+import com.baeldung.reduce.utilities.NumberUtils;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import static org.assertj.core.api.Assertions.assertThat;
+import org.junit.Test;
+
+public class StreamReduceUnitTest {
+
+ @Test
+ public void givenIntegerList_whenReduceWithSumAccumulatorLambda_thenCorrect() {
+ List numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
+ int result = numbers.stream().reduce(0, (a, b) -> a + b);
+ assertThat(result).isEqualTo(21);
+ }
+
+ @Test
+ public void givenIntegerList_whenReduceWithSumAccumulatorMethodReference_thenCorrect() {
+ List numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
+ int result = numbers.stream().reduce(0, Integer::sum);
+ assertThat(result).isEqualTo(21);
+ }
+
+ @Test
+ public void givenStringList_whenReduceWithConcatenatorAccumulatorLambda_thenCorrect() {
+ List letters = Arrays.asList("a", "b", "c", "d", "e");
+ String result = letters.stream().reduce("", (a, b) -> a + b);
+ assertThat(result).isEqualTo("abcde");
+ }
+
+ @Test
+ public void givenStringList_whenReduceWithConcatenatorAccumulatorMethodReference_thenCorrect() {
+ List letters = Arrays.asList("a", "b", "c", "d", "e");
+ String result = letters.stream().reduce("", String::concat);
+ assertThat(result).isEqualTo("abcde");
+ }
+
+ @Test
+ public void givenStringList_whenReduceWithUppercaseConcatenatorAccumulator_thenCorrect() {
+ List letters = Arrays.asList("a", "b", "c", "d", "e");
+ String result = letters.stream().reduce("", (a, b) -> a.toUpperCase() + b.toUpperCase());
+ assertThat(result).isEqualTo("ABCDE");
+ }
+
+ @Test
+ public void givenUserList_whenReduceWithAgeAccumulatorAndSumCombiner_thenCorrect() {
+ List users = Arrays.asList(new User("John", 30), new User("Julie", 35));
+ int result = users.stream().reduce(0, (partialAgeResult, user) -> partialAgeResult + user.getAge(), Integer::sum);
+ assertThat(result).isEqualTo(65);
+ }
+
+ @Test
+ public void givenStringList_whenReduceWithParallelStream_thenCorrect() {
+ List letters = Arrays.asList("a", "b", "c", "d", "e");
+ String result = letters.parallelStream().reduce("", String::concat);
+ assertThat(result).isEqualTo("abcde");
+ }
+
+ @Test
+ public void givenNumberUtilsClass_whenCalledDivideListElements_thenCorrect() {
+ List numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
+ assertThat(NumberUtils.divideListElements(numbers, 1)).isEqualTo(21);
+ }
+
+ @Test
+ public void givenNumberUtilsClass_whenCalledDivideListElementsWithExtractedTryCatchBlock_thenCorrect() {
+ List numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
+ assertThat(NumberUtils.divideListElementsWithExtractedTryCatchBlock(numbers, 1)).isEqualTo(21);
+ }
+
+ @Test
+ public void givenStream_whneCalleddivideListElementsWithApplyFunctionMethod_thenCorrect() {
+ List numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
+ assertThat(NumberUtils.divideListElementsWithApplyFunctionMethod(numbers, 1)).isEqualTo(21);
+ }
+}
diff --git a/java-streams/src/test/java/com/baeldung/stream/StreamMapUnitTest.java b/java-streams/src/test/java/com/baeldung/stream/StreamMapUnitTest.java
new file mode 100644
index 0000000000..5cb2a274d1
--- /dev/null
+++ b/java-streams/src/test/java/com/baeldung/stream/StreamMapUnitTest.java
@@ -0,0 +1,83 @@
+package com.baeldung.stream;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+public class StreamMapUnitTest {
+
+ private Map books;
+
+ @Before
+ public void setup() {
+ books = new HashMap<>();
+ books.put("978-0201633610", "Design patterns : elements of reusable object-oriented software");
+ books.put("978-1617291999", "Java 8 in Action: Lambdas, Streams, and functional-style programming");
+ books.put("978-0134685991", "Effective Java");
+ }
+
+
+ @Test
+ public void whenOptionalVersionCalledForExistingTitle_thenReturnOptionalWithISBN() {
+ Optional optionalIsbn = books.entrySet().stream()
+ .filter(e -> "Effective Java".equals(e.getValue()))
+ .map(Map.Entry::getKey).findFirst();
+
+ assertEquals("978-0134685991", optionalIsbn.get());
+ }
+
+ @Test
+ public void whenOptionalVersionCalledForNonExistingTitle_thenReturnEmptyOptionalForISBN() {
+ Optional optionalIsbn = books.entrySet().stream()
+ .filter(e -> "Non Existent Title".equals(e.getValue()))
+ .map(Map.Entry::getKey).findFirst();
+
+ assertEquals(false, optionalIsbn.isPresent());
+ }
+
+ @Test
+ public void whenMultipleResultsVersionCalledForExistingTitle_aCollectionWithMultipleValuesIsReturned() {
+ books.put("978-0321356680", "Effective Java: Second Edition");
+
+ List isbnCodes = books.entrySet().stream()
+ .filter(e -> e.getValue().startsWith("Effective Java"))
+ .map(Map.Entry::getKey)
+ .collect(Collectors.toList());
+
+ assertTrue(isbnCodes.contains("978-0321356680"));
+ assertTrue(isbnCodes.contains("978-0134685991"));
+ }
+
+ @Test
+ public void whenMultipleResultsVersionCalledForNonExistingTitle_aCollectionWithNoValuesIsReturned() {
+ List isbnCodes = books.entrySet().stream()
+ .filter(e -> e.getValue().startsWith("Spring"))
+ .map(Map.Entry::getKey)
+ .collect(Collectors.toList());
+
+ assertTrue(isbnCodes.isEmpty());
+ }
+
+ @Test
+ public void whenKeysFollowingPatternReturnsAllValuesForThoseKeys() {
+ List titlesForKeyPattern = books.entrySet().stream()
+ .filter(e -> e.getKey().startsWith("978-0"))
+ .map(Map.Entry::getValue)
+ .collect(Collectors.toList());
+ assertEquals(2, titlesForKeyPattern.size());
+ assertTrue(titlesForKeyPattern.contains("Design patterns : elements of reusable object-oriented software"));
+ assertTrue(titlesForKeyPattern.contains("Effective Java"));
+ }
+
+}
diff --git a/java-streams/src/test/java/com/baeldung/stream/filter/StreamCountUnitTest.java b/java-streams/src/test/java/com/baeldung/stream/filter/StreamCountUnitTest.java
new file mode 100644
index 0000000000..742e5aedc9
--- /dev/null
+++ b/java-streams/src/test/java/com/baeldung/stream/filter/StreamCountUnitTest.java
@@ -0,0 +1,72 @@
+package com.baeldung.stream.filter;
+
+import org.junit.Test;
+import org.junit.Before;
+
+import java.util.Arrays;
+import java.util.List;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class StreamCountUnitTest {
+
+ private List customers;
+
+ @Before
+ public void setUp() {
+ Customer john = new Customer("John P.", 15, "https://images.unsplash.com/photo-1543320485-d0d5a49c2b2e");
+ Customer sarah = new Customer("Sarah M.", 200);
+ Customer charles = new Customer("Charles B.", 150);
+ Customer mary = new Customer("Mary T.", 1, "https://images.unsplash.com/photo-1543297057-25167dfc180e");
+ customers = Arrays.asList(john, sarah, charles, mary);
+ }
+
+ @Test
+ public void givenListOfCustomers_whenCount_thenGetListSize() {
+ long count = customers
+ .stream()
+ .count();
+
+ assertThat(count).isEqualTo(4L);
+ }
+
+ @Test
+ public void givenListOfCustomers_whenFilterByPointsOver100AndCount_thenGetTwo() {
+ long countBigCustomers = customers
+ .stream()
+ .filter(c -> c.getPoints() > 100)
+ .count();
+
+ assertThat(countBigCustomers).isEqualTo(2L);
+ }
+
+ @Test
+ public void givenListOfCustomers_whenFilterByPointsAndNameAndCount_thenGetOne() {
+ long count = customers
+ .stream()
+ .filter(c -> c.getPoints() > 10 && c.getName().startsWith("Charles"))
+ .count();
+
+ assertThat(count).isEqualTo(1L);
+ }
+
+ @Test
+ public void givenListOfCustomers_whenNoneMatchesFilterAndCount_thenGetZero() {
+ long count = customers
+ .stream()
+ .filter(c -> c.getPoints() > 500)
+ .count();
+
+ assertThat(count).isEqualTo(0L);
+ }
+
+ @Test
+ public void givenListOfCustomers_whenUsingMethodOverHundredPointsAndCount_thenGetTwo() {
+ long count = customers
+ .stream()
+ .filter(Customer::hasOverHundredPoints)
+ .count();
+
+ assertThat(count).isEqualTo(2L);
+ }
+}
diff --git a/java-streams/src/test/java/com/baeldung/stream/filter/StreamFilterUnitTest.java b/java-streams/src/test/java/com/baeldung/stream/filter/StreamFilterUnitTest.java
index cf82802940..5ad875f61e 100644
--- a/java-streams/src/test/java/com/baeldung/stream/filter/StreamFilterUnitTest.java
+++ b/java-streams/src/test/java/com/baeldung/stream/filter/StreamFilterUnitTest.java
@@ -62,7 +62,7 @@ public class StreamFilterUnitTest {
List customersWithMoreThan100Points = customers
.stream()
- .filter(Customer::hasOverThousandPoints)
+ .filter(Customer::hasOverHundredPoints)
.collect(Collectors.toList());
assertThat(customersWithMoreThan100Points).hasSize(2);
@@ -81,7 +81,7 @@ public class StreamFilterUnitTest {
.flatMap(c -> c
.map(Stream::of)
.orElseGet(Stream::empty))
- .filter(Customer::hasOverThousandPoints)
+ .filter(Customer::hasOverHundredPoints)
.collect(Collectors.toList());
assertThat(customersWithMoreThan100Points).hasSize(2);
@@ -156,4 +156,5 @@ public class StreamFilterUnitTest {
})
.collect(Collectors.toList())).isInstanceOf(RuntimeException.class);
}
+
}
diff --git a/java-streams/src/test/java/com/baeldung/stream/sum/. .. b/java-streams/src/test/java/com/baeldung/stream/sum/. ..
deleted file mode 100644
index 8b13789179..0000000000
--- a/java-streams/src/test/java/com/baeldung/stream/sum/. ..
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/java-strings/README.md b/java-strings/README.md
index b72a378d06..b342f53918 100644
--- a/java-strings/README.md
+++ b/java-strings/README.md
@@ -22,7 +22,7 @@
- [Check if a String is a Palindrome](http://www.baeldung.com/java-palindrome)
- [Comparing Strings in Java](http://www.baeldung.com/java-compare-strings)
- [Check If a String Is Numeric in Java](http://www.baeldung.com/java-check-string-number)
-- [Why Use char[] Array Over a String for Storing Passwords in Java?](http://www.baeldung.com/java-storing-passwords)
+- [Use char[] Array Over a String for Manipulating Passwords in Java?](http://www.baeldung.com/java-storing-passwords)
- [Convert a String to Title Case](http://www.baeldung.com/java-string-title-case)
- [Compact Strings in Java 9](http://www.baeldung.com/java-9-compact-string)
- [Java Check a String for Lowercase/Uppercase Letter, Special Character and Digit](https://www.baeldung.com/java-lowercase-uppercase-special-character-digit-regex)
@@ -50,3 +50,7 @@
- [Remove Leading and Trailing Characters from a String](https://www.baeldung.com/java-remove-trailing-characters)
- [Concatenating Strings In Java](https://www.baeldung.com/java-strings-concatenation)
- [Java toString() Method](https://www.baeldung.com/java-tostring)
+- [Java String Interview Questions and Answers](https://www.baeldung.com/java-string-interview-questions)
+- [Check if a String is a Pangram in Java](https://www.baeldung.com/java-string-pangram)
+- [Check If a String Contains Multiple Keywords](https://www.baeldung.com/string-contains-multiple-words)
+- [Common String Operations in Java](https://www.baeldung.com/java-string-operations)
diff --git a/java-strings/pom.xml b/java-strings/pom.xml
index f4fb1c0865..4555b8ad4a 100755
--- a/java-strings/pom.xml
+++ b/java-strings/pom.xml
@@ -66,20 +66,20 @@
com.vdurmont
emoji-java
- 4.0.0
+ ${emoji-java.version}
org.junit.jupiter
junit-jupiter-api
- 5.3.1
+ ${junit-jupiter-api.version}
test
org.hamcrest
hamcrest-library
- 1.3
+ ${hamcrest-library.version}
test
@@ -87,12 +87,18 @@
org.passay
passay
- 1.3.1
+ ${passay.version}
org.apache.commons
commons-text
- 1.4
+ ${commons-text.version}
+
+
+
+ org.ahocorasick
+ ahocorasick
+ ${ahocorasick.version}
@@ -110,10 +116,10 @@
org.apache.maven.plugins
maven-compiler-plugin
- 3.1
+ ${maven-compiler-plugin.version}
- 1.8
- 1.8
+ ${java.version}
+ ${java.version}
-parameters
@@ -129,6 +135,12 @@
1.19
61.1
27.0.1-jre
+ 4.0.0
+ 5.3.1
+ 1.3
+ 1.3.1
+ 1.4
+ 0.4.0
diff --git a/java-strings/src/main/java/com/baeldung/string/MatchWords.java b/java-strings/src/main/java/com/baeldung/string/MatchWords.java
new file mode 100644
index 0000000000..0cad52c320
--- /dev/null
+++ b/java-strings/src/main/java/com/baeldung/string/MatchWords.java
@@ -0,0 +1,83 @@
+package com.baeldung.string;
+
+import org.ahocorasick.trie.Emit;
+import org.ahocorasick.trie.Token;
+import org.ahocorasick.trie.Trie;
+
+import java.util.*;
+import java.util.function.Function;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+public class MatchWords {
+
+ public static boolean containsWordsIndexOf(String inputString, String[] words) {
+ boolean found = true;
+ for (String word : words) {
+ if (inputString.indexOf(word) == -1) {
+ found = false;
+ break;
+ }
+ }
+ return found;
+ }
+
+ public static boolean containsWords(String inputString, String[] items) {
+ boolean found = true;
+ for (String item : items) {
+ if (!inputString.contains(item)) {
+ found = false;
+ break;
+ }
+ }
+ return found;
+ }
+
+ public static boolean containsWordsAhoCorasick(String inputString, String[] words) {
+ Trie trie = Trie.builder()
+ .onlyWholeWords()
+ .addKeywords(words)
+ .build();
+
+ Collection emits = trie.parseText(inputString);
+ emits.forEach(System.out::println);
+
+ boolean found = true;
+ for(String word : words) {
+ boolean contains = Arrays.toString(emits.toArray()).contains(word);
+ if (!contains) {
+ found = false;
+ break;
+ }
+ }
+
+ return found;
+ }
+
+ public static boolean containsWordsPatternMatch(String inputString, String[] words) {
+
+ StringBuilder regexp = new StringBuilder();
+ for (String word : words) {
+ regexp.append("(?=.*").append(word).append(")");
+ }
+
+ Pattern pattern = Pattern.compile(regexp.toString());
+
+ return pattern.matcher(inputString).find();
+ }
+
+ public static boolean containsWordsJava8(String inputString, String[] words) {
+ List inputStringList = Arrays.asList(inputString.split(" "));
+ List wordsList = Arrays.asList(words);
+
+ return wordsList.stream().allMatch(inputStringList::contains);
+ }
+
+ public static boolean containsWordsArray(String inputString, String[] words) {
+ List inputStringList = Arrays.asList(inputString.split(" "));
+ List wordsList = Arrays.asList(words);
+
+ return inputStringList.containsAll(wordsList);
+ }
+}
diff --git a/java-strings/src/test/java/com/baeldung/string/MatchWordsUnitTest.java b/java-strings/src/test/java/com/baeldung/string/MatchWordsUnitTest.java
new file mode 100644
index 0000000000..385aadaa5d
--- /dev/null
+++ b/java-strings/src/test/java/com/baeldung/string/MatchWordsUnitTest.java
@@ -0,0 +1,66 @@
+package com.baeldung.string;
+
+import org.junit.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class MatchWordsUnitTest {
+
+ private final String[] words = {"hello", "Baeldung"};
+ private final String inputString = "hello there, Baeldung";
+ private final String wholeInput = "helloBaeldung";
+
+ @Test
+ public void givenText_whenCallingStringContains_shouldMatchWords() {
+ final boolean result = MatchWords.containsWords(inputString, words);
+ assertThat(result).isTrue();
+ }
+
+ @Test
+ public void givenText_whenCallingJava8_shouldMatchWords() {
+ final boolean result = MatchWords.containsWordsJava8(inputString, words);
+ assertThat(result).isTrue();
+ }
+
+ @Test
+ public void givenText_whenCallingJava8_shouldNotMatchWords() {
+ final boolean result = MatchWords.containsWordsJava8(wholeInput, words);
+ assertThat(result).isFalse();
+ }
+
+ @Test
+ public void givenText_whenCallingPattern_shouldMatchWords() {
+ final boolean result = MatchWords.containsWordsPatternMatch(inputString, words);
+ assertThat(result).isTrue();
+ }
+
+ @Test
+ public void givenText_whenCallingAhoCorasick_shouldMatchWords() {
+ final boolean result = MatchWords.containsWordsAhoCorasick(inputString, words);
+ assertThat(result).isTrue();
+ }
+
+ @Test
+ public void givenText_whenCallingAhoCorasick_shouldNotMatchWords() {
+ final boolean result = MatchWords.containsWordsAhoCorasick(wholeInput, words);
+ assertThat(result).isFalse();
+ }
+
+ @Test
+ public void givenText_whenCallingIndexOf_shouldMatchWords() {
+ final boolean result = MatchWords.containsWordsIndexOf(inputString, words);
+ assertThat(result).isTrue();
+ }
+
+ @Test
+ public void givenText_whenCallingArrayList_shouldMatchWords() {
+ final boolean result = MatchWords.containsWordsArray(inputString, words);
+ assertThat(result).isTrue();
+ }
+
+ @Test
+ public void givenText_whenCallingArrayList_shouldNotMatchWords() {
+ final boolean result = MatchWords.containsWordsArray(wholeInput, words);
+ assertThat(result).isFalse();
+ }
+}
diff --git a/javax-servlets/pom.xml b/javax-servlets/pom.xml
index f00dd0ebe8..bf85feb7ce 100644
--- a/javax-servlets/pom.xml
+++ b/javax-servlets/pom.xml
@@ -80,6 +80,7 @@
test
+
4.5.3
5.0.5.RELEASE
diff --git a/javaxval/pom.xml b/javaxval/pom.xml
index 5f2690b5b4..7ecddc0ca8 100644
--- a/javaxval/pom.xml
+++ b/javaxval/pom.xml
@@ -50,12 +50,12 @@
test
+
2.0.1.Final
6.0.13.Final
3.0.0
- 5.0.2.RELEASE
- 4.12
+ 5.0.2.RELEASE
3.11.1
diff --git a/jee-7-security/pom.xml b/jee-7-security/pom.xml
index 622ca19903..5b7bb07239 100644
--- a/jee-7-security/pom.xml
+++ b/jee-7-security/pom.xml
@@ -4,8 +4,8 @@
4.0.0
jee-7-security
1.0-SNAPSHOT
- war
jee-7-security
+ war
JavaEE 7 Spring Security Application
@@ -56,7 +56,7 @@
javax.mvc
javax.mvc-api
- 1.0-pr
+ ${javax.mvc-api.version}
@@ -97,6 +97,7 @@
2.2
1.1.2
4.2.3.RELEASE
+ 1.0-pr
diff --git a/jee-7/pom.xml b/jee-7/pom.xml
index 97ed2cc51d..62ccb9d313 100644
--- a/jee-7/pom.xml
+++ b/jee-7/pom.xml
@@ -128,52 +128,52 @@
org.jboss.spec.javax.batch
jboss-batch-api_1.0_spec
- 1.0.0.Final
+ ${jboss-batch-api.version}
org.jberet
jberet-core
- 1.0.2.Final
+ ${jberet.version}
org.jberet
jberet-support
- 1.0.2.Final
+ ${jberet.version}
org.jboss.spec.javax.transaction
jboss-transaction-api_1.2_spec
- 1.0.0.Final
+ ${jboss-transaction-api.version}
org.jboss.marshalling
jboss-marshalling
- 1.4.2.Final
+ ${jboss-marshalling.version}
org.jboss.weld
weld-core
- 2.1.1.Final
+ ${weld.version}
org.jboss.weld.se
weld-se
- 2.1.1.Final
+ ${weld.version}
org.jberet
jberet-se
- 1.0.2.Final
+ ${jberet.version}
com.h2database
h2
- 1.4.178
+ ${h2.version}
org.glassfish.jersey.containers
jersey-container-jetty-servlet
- 2.22.1
+ ${jersey-container-jetty-servlet.version}
@@ -533,6 +533,13 @@
1.2
2.2
20160715
+ 1.0.0.Final
+ 1.0.2.Final
+ 1.0.0.Final
+ 1.4.2.Final
+ 2.1.1.Final
+ 1.4.178
+ 2.22.1
-
\ No newline at end of file
+
diff --git a/jgroups/pom.xml b/jgroups/pom.xml
index 34bdd59919..e95fe2be3c 100644
--- a/jgroups/pom.xml
+++ b/jgroups/pom.xml
@@ -4,9 +4,9 @@
4.0.0
jgroups
0.1-SNAPSHOT
- jar
jgroups
Reliable Messaging with JGroups Tutorial
+ jar
com.baeldung
diff --git a/jhipster/README.md b/jhipster/README.md
index 91ba54bf60..289bfac754 100644
--- a/jhipster/README.md
+++ b/jhipster/README.md
@@ -3,3 +3,4 @@
- [JHipster with a Microservice Architecture](http://www.baeldung.com/jhipster-microservices)
- [Intro to JHipster](http://www.baeldung.com/jhipster)
- [Building a Basic UAA-Secured JHipster Microservice](https://www.baeldung.com/jhipster-uaa-secured-micro-service)
+- [Creating New Roles and Authorities in JHipster](https://www.baeldung.com/jhipster-new-roles)
diff --git a/jhipster/jhipster-microservice/car-app/pom.xml b/jhipster/jhipster-microservice/car-app/pom.xml
index b05979b9c5..529877d448 100644
--- a/jhipster/jhipster-microservice/car-app/pom.xml
+++ b/jhipster/jhipster-microservice/car-app/pom.xml
@@ -1,6 +1,10 @@
4.0.0
+ com.car.app
+ car-app
+ car-app
+ war
jhipster-microservice
@@ -8,94 +12,10 @@
1.0.0-SNAPSHOT
- com.car.app
- car-app
- war
- car-app
-
${maven.version}
-
- -Djava.security.egd=file:/dev/./urandom -Xmx256m
- 3.6.2
- 2.0.0
- 2.5
- 3.5
- 0.4.13
- 1.2
- 5.2.8.Final
- 2.6.0
- 0.7.9
- 1.8
- 3.21.0-GA
- 1.0.0
- 1.1.0
- 0.7.0
- 3.6
- 2.0.0
- 3.6.2
- 4.8
- jdt_apt
- 1.1.0.Final
- 2.10
- 1.4.1
- 3.0.1
- yyyyMMddHHmmss
- 3.0.0
- 3.1.3
- v6.10.0
-
-
-
-
- ${project.build.directory}/test-results
- 0.0.20
- false
- 3.2.2
- 2.12.1
- 3.2
-
- src/main/webapp/content/**/*.*, src/main/webapp/bower_components/**/*.*, src/main/webapp/i18n/*.js, target/www/**/*.*
-
- S3437,UndocumentedApi,BoldAndItalicTagsCheck
-
-
- src/main/webapp/app/**/*.*
- Web:BoldAndItalicTagsCheck
-
- src/main/java/**/*
- squid:S3437
-
- src/main/java/**/*
- squid:UndocumentedApi
-
- ${project.testresult.directory}/coverage/jacoco/jacoco-it.exec
- ${project.testresult.directory}/coverage/jacoco/jacoco.exec
- jacoco
-
- ${project.testresult.directory}/karma
-
- ${project.testresult.directory}/coverage/report-lcov/lcov.info
-
- ${project.testresult.directory}/coverage/report-lcov/lcov.info
-
- ${project.basedir}/src/main/
- ${project.testresult.directory}/surefire-reports
- ${project.basedir}/src/test/
-
- 2.5.0
-
- Camden.SR5
- 2.6.1
- 1.4.10.Final
- 1.1.0.Final
- v0.21.3
-
-
@@ -898,4 +818,84 @@
+
+
+ -Djava.security.egd=file:/dev/./urandom -Xmx256m
+ 3.6.2
+ 2.0.0
+ 2.5
+ 3.5
+ 0.4.13
+ 1.2
+ 5.2.8.Final
+ 2.6.0
+ 0.7.9
+ 1.8
+ 3.21.0-GA
+ 1.0.0
+ 1.1.0
+ 0.7.0
+ 3.6
+ 2.0.0
+ 3.6.2
+ 4.8
+ jdt_apt
+ 1.1.0.Final
+ 2.10
+ 1.4.1
+ 3.0.1
+ yyyyMMddHHmmss
+ 3.0.0
+ 3.1.3
+ v6.10.0
+
+
+
+
+ ${project.build.directory}/test-results
+ 0.0.20
+ false
+ 3.2.2
+ 2.12.1
+ 3.2
+
+ src/main/webapp/content/**/*.*, src/main/webapp/bower_components/**/*.*, src/main/webapp/i18n/*.js, target/www/**/*.*
+
+ S3437,UndocumentedApi,BoldAndItalicTagsCheck
+
+
+ src/main/webapp/app/**/*.*
+ Web:BoldAndItalicTagsCheck
+
+ src/main/java/**/*
+ squid:S3437
+
+ src/main/java/**/*
+ squid:UndocumentedApi
+
+ ${project.testresult.directory}/coverage/jacoco/jacoco-it.exec
+ ${project.testresult.directory}/coverage/jacoco/jacoco.exec
+ jacoco
+
+ ${project.testresult.directory}/karma
+
+ ${project.testresult.directory}/coverage/report-lcov/lcov.info
+
+ ${project.testresult.directory}/coverage/report-lcov/lcov.info
+
+ ${project.basedir}/src/main/
+ ${project.testresult.directory}/surefire-reports
+ ${project.basedir}/src/test/
+
+ 2.5.0
+
+ Camden.SR5
+ 2.6.1
+ 1.4.10.Final
+ 1.1.0.Final
+ v0.21.3
+
+
diff --git a/jhipster/jhipster-microservice/dealer-app/pom.xml b/jhipster/jhipster-microservice/dealer-app/pom.xml
index 803a0f62e6..1eac8a930e 100644
--- a/jhipster/jhipster-microservice/dealer-app/pom.xml
+++ b/jhipster/jhipster-microservice/dealer-app/pom.xml
@@ -1,6 +1,10 @@
4.0.0
+ com.dealer.app
+ dealer-app
+ dealer-app
+ war
jhipster-microservice
@@ -8,93 +12,10 @@
1.0.0-SNAPSHOT
- com.dealer.app
- dealer-app
- war
- dealer-app
-
${maven.version}
-
- -Djava.security.egd=file:/dev/./urandom -Xmx256m
- 3.6.2
- 2.0.0
- 2.5
- 3.5
- 0.4.13
- 1.2
- 5.2.8.Final
- 2.6.0
- 0.7.9
- 3.21.0-GA
- 1.0.0
- 1.1.0
- 0.7.0
- 3.6
- 2.0.0
- 3.6.2
- 4.8
- jdt_apt
- 1.1.0.Final
- 2.10
- 1.4.1
- 3.0.1
- yyyyMMddHHmmss
- 3.0.0
- 3.1.3
- v6.10.0
-
-
-
-
- ${project.build.directory}/test-results
- 0.0.20
- false
- 3.2.2
- 2.12.1
- 3.2
-
- src/main/webapp/content/**/*.*, src/main/webapp/bower_components/**/*.*, src/main/webapp/i18n/*.js, target/www/**/*.*
-
- S3437,UndocumentedApi,BoldAndItalicTagsCheck
-
-
- src/main/webapp/app/**/*.*
- Web:BoldAndItalicTagsCheck
-
- src/main/java/**/*
- squid:S3437
-
- src/main/java/**/*
- squid:UndocumentedApi
-
- ${project.testresult.directory}/coverage/jacoco/jacoco-it.exec
- ${project.testresult.directory}/coverage/jacoco/jacoco.exec
- jacoco
-
- ${project.testresult.directory}/karma
-
- ${project.testresult.directory}/coverage/report-lcov/lcov.info
-
- ${project.testresult.directory}/coverage/report-lcov/lcov.info
-
- ${project.basedir}/src/main/
- ${project.testresult.directory}/surefire-reports
- ${project.basedir}/src/test/
-
- 2.5.0
-
- Camden.SR5
- 2.6.1
- 1.4.10.Final
- 1.1.0.Final
- v0.21.3
-
-
@@ -892,5 +813,83 @@
+
+
+ -Djava.security.egd=file:/dev/./urandom -Xmx256m
+ 3.6.2
+ 2.0.0
+ 2.5
+ 3.5
+ 0.4.13
+ 1.2
+ 5.2.8.Final
+ 2.6.0
+ 0.7.9
+ 3.21.0-GA
+ 1.0.0
+ 1.1.0
+ 0.7.0
+ 3.6
+ 2.0.0
+ 3.6.2
+ 4.8
+ jdt_apt
+ 1.1.0.Final
+ 2.10
+ 1.4.1
+ 3.0.1
+ yyyyMMddHHmmss
+ 3.0.0
+ 3.1.3
+ v6.10.0
+
+
+
+
+ ${project.build.directory}/test-results
+ 0.0.20
+ false
+ 3.2.2
+ 2.12.1
+ 3.2
+ src/main/webapp/content/**/*.*, src/main/webapp/bower_components/**/*.*, src/main/webapp/i18n/*.js, target/www/**/*.*
+
+ S3437,UndocumentedApi,BoldAndItalicTagsCheck
+
+
+ src/main/webapp/app/**/*.*
+ Web:BoldAndItalicTagsCheck
+
+ src/main/java/**/*
+ squid:S3437
+
+ src/main/java/**/*
+ squid:UndocumentedApi
+
+ ${project.testresult.directory}/coverage/jacoco/jacoco-it.exec
+ ${project.testresult.directory}/coverage/jacoco/jacoco.exec
+ jacoco
+
+ ${project.testresult.directory}/karma
+
+ ${project.testresult.directory}/coverage/report-lcov/lcov.info
+
+ ${project.testresult.directory}/coverage/report-lcov/lcov.info
+
+ ${project.basedir}/src/main/
+ ${project.testresult.directory}/surefire-reports
+ ${project.basedir}/src/test/
+
+ 2.5.0
+
+ Camden.SR5
+ 2.6.1
+ 1.4.10.Final
+ 1.1.0.Final
+ v0.21.3
+
+
diff --git a/jhipster/jhipster-microservice/gateway-app/pom.xml b/jhipster/jhipster-microservice/gateway-app/pom.xml
index ed0c929027..babc9e4f24 100644
--- a/jhipster/jhipster-microservice/gateway-app/pom.xml
+++ b/jhipster/jhipster-microservice/gateway-app/pom.xml
@@ -1,6 +1,10 @@
4.0.0
+ com.gateway
+ gateway-app
+ gateway-app
+ war
jhipster-microservice
@@ -8,97 +12,10 @@
1.0.0-SNAPSHOT
- com.gateway
- gateway-app
- war
- gateway-app
-
${maven.version}
-
- -Djava.security.egd=file:/dev/./urandom -Xmx256m
- 3.6.2
- 2.0.0
- 3.6.0
- 1.10
- 2.5
- 3.5
- 0.4.13
- 1.3
- 1.2
- 5.2.8.Final
- 2.6.0
- 0.7.9
- 3.21.0-GA
- 1.0.0
- 1.1.0
- 0.7.0
- 3.6
- 2.0.0
- 3.6.2
- 4.8
- 1.3.0
- jdt_apt
- 1.1.0.Final
- 2.10
- 1.4.1
- 3.0.1
- yyyyMMddHHmmss
- 3.0.0
- 3.1.3
- v6.10.0
-
-
-
-
- ${project.build.directory}/test-results
- 0.0.20
- false
- 3.2.2
- 2.12.1
- 3.2
-
- src/main/webapp/content/**/*.*, src/main/webapp/bower_components/**/*.*, src/main/webapp/i18n/*.js, target/www/**/*.*
-
- S3437,UndocumentedApi,BoldAndItalicTagsCheck
-
-
- src/main/webapp/app/**/*.*
- Web:BoldAndItalicTagsCheck
-
- src/main/java/**/*
- squid:S3437
-
- src/main/java/**/*
- squid:UndocumentedApi
-
- ${project.testresult.directory}/coverage/jacoco/jacoco-it.exec
- ${project.testresult.directory}/coverage/jacoco/jacoco.exec
- jacoco
-
- ${project.testresult.directory}/karma
-
- ${project.testresult.directory}/coverage/report-lcov/lcov.info
-
- ${project.testresult.directory}/coverage/report-lcov/lcov.info
-
- ${project.basedir}/src/main/
- ${project.testresult.directory}/surefire-reports
- ${project.basedir}/src/test/
-
- 2.5.0
-
- Camden.SR5
- 2.6.1
- 1.4.10.Final
- 1.1.0.Final
- v0.21.3
-
-
@@ -1008,5 +925,87 @@
+
+
+ -Djava.security.egd=file:/dev/./urandom -Xmx256m
+ 3.6.2
+ 2.0.0
+ 3.6.0
+ 1.10
+ 2.5
+ 3.5
+ 0.4.13
+ 1.3
+ 1.2
+ 5.2.8.Final
+ 2.6.0
+ 0.7.9
+ 3.21.0-GA
+ 1.0.0
+ 1.1.0
+ 0.7.0
+ 3.6
+ 2.0.0
+ 3.6.2
+ 4.8
+ 1.3.0
+ jdt_apt
+ 1.1.0.Final
+ 2.10
+ 1.4.1
+ 3.0.1
+ yyyyMMddHHmmss
+ 3.0.0
+ 3.1.3
+ v6.10.0
+
+
+
+
+ ${project.build.directory}/test-results
+ 0.0.20
+ false
+ 3.2.2
+ 2.12.1
+ 3.2
+
+ src/main/webapp/content/**/*.*, src/main/webapp/bower_components/**/*.*, src/main/webapp/i18n/*.js, target/www/**/*.*
+
+ S3437,UndocumentedApi,BoldAndItalicTagsCheck
+
+
+ src/main/webapp/app/**/*.*
+ Web:BoldAndItalicTagsCheck
+
+ src/main/java/**/*
+ squid:S3437
+
+ src/main/java/**/*
+ squid:UndocumentedApi
+
+ ${project.testresult.directory}/coverage/jacoco/jacoco-it.exec
+ ${project.testresult.directory}/coverage/jacoco/jacoco.exec
+ jacoco
+
+ ${project.testresult.directory}/karma
+
+ ${project.testresult.directory}/coverage/report-lcov/lcov.info
+
+ ${project.testresult.directory}/coverage/report-lcov/lcov.info
+
+ ${project.basedir}/src/main/
+ ${project.testresult.directory}/surefire-reports
+ ${project.basedir}/src/test/
+
+ 2.5.0
+
+ Camden.SR5
+ 2.6.1
+ 1.4.10.Final
+ 1.1.0.Final
+ v0.21.3
+
diff --git a/jhipster/jhipster-monolithic/src/main/java/com/baeldung/security/AuthoritiesConstants.java b/jhipster/jhipster-monolithic/src/main/java/com/baeldung/security/AuthoritiesConstants.java
index 40cf54e4f6..a28edd97de 100644
--- a/jhipster/jhipster-monolithic/src/main/java/com/baeldung/security/AuthoritiesConstants.java
+++ b/jhipster/jhipster-monolithic/src/main/java/com/baeldung/security/AuthoritiesConstants.java
@@ -7,6 +7,8 @@ public final class AuthoritiesConstants {
public static final String ADMIN = "ROLE_ADMIN";
+ public static final String MANAGER = "ROLE_MANAGER";
+
public static final String USER = "ROLE_USER";
public static final String ANONYMOUS = "ROLE_ANONYMOUS";
diff --git a/jhipster/jhipster-monolithic/src/main/resources/config/liquibase/authorities.csv b/jhipster/jhipster-monolithic/src/main/resources/config/liquibase/authorities.csv
index af5c6dfa18..91f05d6303 100644
--- a/jhipster/jhipster-monolithic/src/main/resources/config/liquibase/authorities.csv
+++ b/jhipster/jhipster-monolithic/src/main/resources/config/liquibase/authorities.csv
@@ -1,3 +1,4 @@
name
ROLE_ADMIN
+ROLE_MANAGER
ROLE_USER
diff --git a/jhipster/jhipster-uaa/gateway/pom.xml b/jhipster/jhipster-uaa/gateway/pom.xml
index 52f84e4006..0f815bedad 100644
--- a/jhipster/jhipster-uaa/gateway/pom.xml
+++ b/jhipster/jhipster-uaa/gateway/pom.xml
@@ -1,12 +1,11 @@
4.0.0
-
com.baeldung.jhipster.gateway
gateway
0.0.1-SNAPSHOT
- war
Gateway
+ war
@@ -14,87 +13,6 @@
-
-
- 3.0.0
- 1.8
- 2.12.6
- v8.12.0
- 6.4.1
- UTF-8
- UTF-8
- ${project.build.directory}/test-results
- yyyyMMddHHmmss
- ${java.version}
- ${java.version}
- -Djava.security.egd=file:/dev/./urandom -Xmx256m
- jdt_apt
- false
-
-
-
-
-
-
- 2.0.25
-
- 2.0.5.RELEASE
-
- 5.2.17.Final
-
- 3.22.0-GA
-
- 3.5.5
- 3.6
- 2.0.1.Final
- 1.2.0.Final
-
-
- 3.1.0
- 3.8.0
- 2.10
- 3.0.0-M2
- 3.1.0
- 2.22.0
- 3.2.2
- 0.9.11
- 1.6
- 0.8.2
- 3.4.2
- 3.5.0.1254
- 2.2.5
-
-
- http://localhost:9001
- src/main/webapp/content/**/*.*, src/main/webapp/i18n/*.js, target/www/**/*.*
- S3437,S4684,UndocumentedApi,BoldAndItalicTagsCheck
-
- src/main/webapp/app/**/*.*
- Web:BoldAndItalicTagsCheck
-
- src/main/java/**/*
- squid:S3437
-
- src/main/java/**/*
- squid:UndocumentedApi
-
- src/main/java/**/*
- squid:S4684
- ${project.testresult.directory}/coverage/jacoco/jacoco.exec
- jacoco
- ${project.testresult.directory}/jest/TESTS-results-sonar.xml
- ${project.testresult.directory}/lcov.info
- ${project.basedir}/src/main/
- ${project.testresult.directory}/surefire-reports
- ${project.basedir}/src/test/
-
-
-
-
@@ -1092,4 +1010,85 @@
+
+
+
+ 3.0.0
+ 1.8
+ 2.12.6
+ v8.12.0
+ 6.4.1
+ UTF-8
+ UTF-8
+ ${project.build.directory}/test-results
+ yyyyMMddHHmmss
+ ${java.version}
+ ${java.version}
+ -Djava.security.egd=file:/dev/./urandom -Xmx256m
+ jdt_apt
+ false
+
+
+
+
+
+
+ 2.0.25
+
+ 2.0.5.RELEASE
+
+ 5.2.17.Final
+
+ 3.22.0-GA
+
+ 3.5.5
+ 3.6
+ 2.0.1.Final
+ 1.2.0.Final
+
+
+ 3.1.0
+ 3.8.0
+ 2.10
+ 3.0.0-M2
+ 3.1.0
+ 2.22.0
+ 3.2.2
+ 0.9.11
+ 1.6
+ 0.8.2
+ 3.4.2
+ 3.5.0.1254
+ 2.2.5
+
+
+ http://localhost:9001
+ src/main/webapp/content/**/*.*, src/main/webapp/i18n/*.js, target/www/**/*.*
+ S3437,S4684,UndocumentedApi,BoldAndItalicTagsCheck
+
+ src/main/webapp/app/**/*.*
+ Web:BoldAndItalicTagsCheck
+
+ src/main/java/**/*
+ squid:S3437
+
+ src/main/java/**/*
+ squid:UndocumentedApi
+
+ src/main/java/**/*
+ squid:S4684
+ ${project.testresult.directory}/coverage/jacoco/jacoco.exec
+ jacoco
+ ${project.testresult.directory}/jest/TESTS-results-sonar.xml
+ ${project.testresult.directory}/lcov.info
+ ${project.basedir}/src/main/
+ ${project.testresult.directory}/surefire-reports
+ ${project.basedir}/src/test/
+
+
+
diff --git a/jhipster/jhipster-uaa/pom.xml b/jhipster/jhipster-uaa/pom.xml
index e8ccaabfb0..a59b19d1fd 100644
--- a/jhipster/jhipster-uaa/pom.xml
+++ b/jhipster/jhipster-uaa/pom.xml
@@ -2,10 +2,9 @@
4.0.0
- com.baeldung.jhipster
- jhipster-microservice-uaa
+ jhipster-uaa
+ jhipster-uaa
pom
- JHipster Microservice with UAA
jhipster
diff --git a/jhipster/jhipster-uaa/quotes/pom.xml b/jhipster/jhipster-uaa/quotes/pom.xml
index 9984f009ff..81ab23471f 100644
--- a/jhipster/jhipster-uaa/quotes/pom.xml
+++ b/jhipster/jhipster-uaa/quotes/pom.xml
@@ -1,12 +1,11 @@
4.0.0
-
com.baeldung.jhipster.quotes
quotes
0.0.1-SNAPSHOT
- war
Quotes
+ war
@@ -14,85 +13,6 @@
-
-
- 3.0.0
- 1.8
- 2.12.6
- v8.12.0
- 6.4.1
- UTF-8
- UTF-8
- ${project.build.directory}/test-results
- yyyyMMddHHmmss
- ${java.version}
- ${java.version}
- -Djava.security.egd=file:/dev/./urandom -Xmx256m
- jdt_apt
- false
-
-
-
-
-
-
- 2.0.25
-
- 2.0.5.RELEASE
-
- 5.2.17.Final
-
- 3.22.0-GA
-
- 3.5.5
- 3.6
- 2.0.1.Final
- 1.2.0.Final
-
-
- 3.1.0
- 3.8.0
- 2.10
- 3.0.0-M2
- 3.1.0
- 2.22.0
- 3.2.2
- 0.9.11
- 0.8.2
- 3.4.2
- 3.5.0.1254
- 2.2.5
-
-
- http://localhost:9001
- src/main/webapp/content/**/*.*, src/main/webapp/i18n/*.js, target/www/**/*.*
- S3437,S4684,UndocumentedApi,BoldAndItalicTagsCheck
-
- src/main/webapp/app/**/*.*
- Web:BoldAndItalicTagsCheck
-
- src/main/java/**/*
- squid:S3437
-
- src/main/java/**/*
- squid:UndocumentedApi
-
- src/main/java/**/*
- squid:S4684
- ${project.testresult.directory}/coverage/jacoco/jacoco.exec
- jacoco
- ${project.testresult.directory}/lcov.info
- ${project.basedir}/src/main/
- ${project.testresult.directory}/surefire-reports
- ${project.basedir}/src/test/
-
-
-
-
@@ -912,4 +832,83 @@
+
+
+
+ 3.0.0
+ 1.8
+ 2.12.6
+ v8.12.0
+ 6.4.1
+ UTF-8
+ UTF-8
+ ${project.build.directory}/test-results
+ yyyyMMddHHmmss
+ ${java.version}
+ ${java.version}
+ -Djava.security.egd=file:/dev/./urandom -Xmx256m
+ jdt_apt
+ false
+
+
+
+
+
+
+ 2.0.25
+
+ 2.0.5.RELEASE
+
+ 5.2.17.Final
+
+ 3.22.0-GA
+
+ 3.5.5
+ 3.6
+ 2.0.1.Final
+ 1.2.0.Final
+
+
+ 3.1.0
+ 3.8.0
+ 2.10
+ 3.0.0-M2
+ 3.1.0
+ 2.22.0
+ 3.2.2
+ 0.9.11
+ 0.8.2
+ 3.4.2
+ 3.5.0.1254
+ 2.2.5
+
+
+ http://localhost:9001
+ src/main/webapp/content/**/*.*, src/main/webapp/i18n/*.js, target/www/**/*.*
+ S3437,S4684,UndocumentedApi,BoldAndItalicTagsCheck
+
+ src/main/webapp/app/**/*.*
+ Web:BoldAndItalicTagsCheck
+
+ src/main/java/**/*
+ squid:S3437
+
+ src/main/java/**/*
+ squid:UndocumentedApi
+
+ src/main/java/**/*
+ squid:S4684
+ ${project.testresult.directory}/coverage/jacoco/jacoco.exec
+ jacoco
+ ${project.testresult.directory}/lcov.info
+ ${project.basedir}/src/main/
+ ${project.testresult.directory}/surefire-reports
+ ${project.basedir}/src/test/
+
+
+
diff --git a/jhipster/jhipster-uaa/uaa/pom.xml b/jhipster/jhipster-uaa/uaa/pom.xml
index 9c4783747a..2c4dd9d0f0 100644
--- a/jhipster/jhipster-uaa/uaa/pom.xml
+++ b/jhipster/jhipster-uaa/uaa/pom.xml
@@ -1,12 +1,11 @@
4.0.0
-
com.baeldung.jhipster.uaa
uaa
0.0.1-SNAPSHOT
- war
Uaa
+ war
@@ -14,85 +13,6 @@
-
-
- 3.0.0
- 1.8
- 2.12.6
- v8.12.0
- 6.4.1
- UTF-8
- UTF-8
- ${project.build.directory}/test-results
- yyyyMMddHHmmss
- ${java.version}
- ${java.version}
- -Djava.security.egd=file:/dev/./urandom -Xmx256m
- jdt_apt
- false
-
-
-
-
-
-
- 2.0.25
-
- 2.0.5.RELEASE
-
- 5.2.17.Final
-
- 3.22.0-GA
-
- 3.5.5
- 3.6
- 2.0.1.Final
- 1.2.0.Final
-
-
- 3.1.0
- 3.8.0
- 2.10
- 3.0.0-M2
- 3.1.0
- 2.22.0
- 3.2.2
- 0.9.11
- 0.8.2
- 3.4.2
- 3.5.0.1254
- 2.2.5
-
-
- http://localhost:9001
- src/main/webapp/content/**/*.*, src/main/webapp/i18n/*.js, target/www/**/*.*
- S3437,S4684,UndocumentedApi,BoldAndItalicTagsCheck
-
- src/main/webapp/app/**/*.*
- Web:BoldAndItalicTagsCheck
-
- src/main/java/**/*
- squid:S3437
-
- src/main/java/**/*
- squid:UndocumentedApi
-
- src/main/java/**/*
- squid:S4684
- ${project.testresult.directory}/coverage/jacoco/jacoco.exec
- jacoco
- ${project.testresult.directory}/lcov.info
- ${project.basedir}/src/main/
- ${project.testresult.directory}/surefire-reports
- ${project.basedir}/src/test/
-
-
-
-
@@ -912,4 +832,84 @@
+
+
+
+ 3.0.0
+ 1.8
+ 2.12.6
+ v8.12.0
+ 6.4.1
+ UTF-8
+ UTF-8
+ ${project.build.directory}/test-results
+ yyyyMMddHHmmss
+ ${java.version}
+ ${java.version}
+ -Djava.security.egd=file:/dev/./urandom -Xmx256m
+ jdt_apt
+ false
+
+
+
+
+
+
+ 2.0.25
+
+ 2.0.5.RELEASE
+
+ 5.2.17.Final
+
+ 3.22.0-GA
+
+ 3.5.5
+ 3.6
+ 2.0.1.Final
+ 1.2.0.Final
+
+
+ 3.1.0
+ 3.8.0
+ 2.10
+ 3.0.0-M2
+ 3.1.0
+ 2.22.0
+ 3.2.2
+ 0.9.11
+ 0.8.2
+ 3.4.2
+ 3.5.0.1254
+ 2.2.5
+
+
+ http://localhost:9001
+ src/main/webapp/content/**/*.*, src/main/webapp/i18n/*.js, target/www/**/*.*
+ S3437,S4684,UndocumentedApi,BoldAndItalicTagsCheck
+
+ src/main/webapp/app/**/*.*
+ Web:BoldAndItalicTagsCheck
+
+ src/main/java/**/*
+ squid:S3437
+
+ src/main/java/**/*
+ squid:UndocumentedApi
+
+ src/main/java/**/*
+ squid:S4684
+ ${project.testresult.directory}/coverage/jacoco/jacoco.exec
+ jacoco
+ ${project.testresult.directory}/lcov.info
+ ${project.basedir}/src/main/
+ ${project.testresult.directory}/surefire-reports
+ ${project.basedir}/src/test/
+
+
+
+
diff --git a/jhipster/pom.xml b/jhipster/pom.xml
index 5132c6dc95..3fcc53b354 100644
--- a/jhipster/pom.xml
+++ b/jhipster/pom.xml
@@ -5,8 +5,8 @@
com.baeldung.jhipster
jhipster
1.0.0-SNAPSHOT
- pom
JHipster
+ pom
parent-boot-1
diff --git a/jib/pom.xml b/jib/pom.xml
index ad4011c3c4..2341fcca0c 100644
--- a/jib/pom.xml
+++ b/jib/pom.xml
@@ -18,11 +18,7 @@
spring-boot-starter-web
-
-
- 1.8
-
-
+
@@ -32,7 +28,7 @@
com.google.cloud.tools
jib-maven-plugin
- 0.9.10
+ ${jib-maven-plugin.version}
registry.hub.docker.com/baeldungjib/jib-spring-boot-app
@@ -42,4 +38,7 @@
+
+ 0.9.10
+
diff --git a/jjwt/pom.xml b/jjwt/pom.xml
index 6bf9f4426a..2d03543293 100644
--- a/jjwt/pom.xml
+++ b/jjwt/pom.xml
@@ -5,8 +5,8 @@
io.jsonwebtoken
jjwt
0.0.1-SNAPSHOT
- jar
jjwt
+ jar
Exercising the JJWT
diff --git a/jmeter/pom.xml b/jmeter/pom.xml
index 943b75e03b..514546987d 100644
--- a/jmeter/pom.xml
+++ b/jmeter/pom.xml
@@ -4,9 +4,9 @@
4.0.0
jmeter
0.0.1-SNAPSHOT
- jar
jmeter
Intro to Performance testing using JMeter
+ jar
parent-boot-1
diff --git a/jmh/pom.xml b/jmh/pom.xml
index 1e01809fe6..70a0a398d4 100644
--- a/jmh/pom.xml
+++ b/jmh/pom.xml
@@ -3,9 +3,9 @@
4.0.0
com.baeldung
jmh
- jar
1.0-SNAPSHOT
jmh
+ jar
http://maven.apache.org
diff --git a/jooby/README.md b/jooby/README.md
index 032e595354..aa867b2c56 100644
--- a/jooby/README.md
+++ b/jooby/README.md
@@ -1,3 +1,3 @@
## Relevant articles:
-- [Introduction to Jooby Project](http://www.baeldung.com/jooby)
+- [Introduction to Jooby](http://www.baeldung.com/jooby)
diff --git a/jooby/src/test/java/com/baeldung/jooby/AppLiveTest.java b/jooby/src/test/java/com/baeldung/jooby/AppLiveTest.java
new file mode 100644
index 0000000000..1bd12f8bb3
--- /dev/null
+++ b/jooby/src/test/java/com/baeldung/jooby/AppLiveTest.java
@@ -0,0 +1,21 @@
+package com.baeldung.jooby;
+
+import static io.restassured.RestAssured.get;
+import static org.hamcrest.Matchers.equalTo;
+
+import org.jooby.test.JoobyRule;
+import org.junit.ClassRule;
+import org.junit.Test;
+
+public class AppLiveTest {
+
+ @ClassRule
+ public static JoobyRule app = new JoobyRule(new App());
+
+ @Test
+ public void given_defaultUrl_expect_fixedString() {
+ get("/").then().assertThat().body(equalTo("Hello World!")).statusCode(200)
+ .contentType("text/html;charset=UTF-8");
+ }
+
+}
diff --git a/jooby/src/test/java/com/baeldung/jooby/AppUnitTest.java b/jooby/src/test/java/com/baeldung/jooby/AppUnitTest.java
index ab7388f5f4..9bca30e2c1 100644
--- a/jooby/src/test/java/com/baeldung/jooby/AppUnitTest.java
+++ b/jooby/src/test/java/com/baeldung/jooby/AppUnitTest.java
@@ -1,25 +1,12 @@
package com.baeldung.jooby;
-import static io.restassured.RestAssured.get;
-import static org.hamcrest.Matchers.equalTo;
import static org.junit.Assert.assertEquals;
-import org.jooby.test.JoobyRule;
import org.jooby.test.MockRouter;
-import org.junit.ClassRule;
import org.junit.Test;
public class AppUnitTest {
- @ClassRule
- public static JoobyRule app = new JoobyRule(new App());
-
- @Test
- public void given_defaultUrl_expect_fixedString() {
- get("/").then().assertThat().body(equalTo("Hello World!")).statusCode(200)
- .contentType("text/html;charset=UTF-8");
- }
-
@Test
public void given_defaultUrl_with_mockrouter_expect_fixedString() throws Throwable {
String result = new MockRouter(new App()).get("/");
diff --git a/jsf/README.md b/jsf/README.md
index 6e0891182d..d96c1eb8e3 100644
--- a/jsf/README.md
+++ b/jsf/README.md
@@ -1,5 +1,5 @@
### Relevant Articles:
-- [Introduction to JSF Expression Language 3.0](http://www.baeldung.com/jsf-expression-language-el-3)
+- [Guide to JSF Expression Language 3.0](http://www.baeldung.com/jsf-expression-language-el-3)
- [Introduction to JSF EL 2](http://www.baeldung.com/intro-to-jsf-expression-language)
- [JavaServer Faces (JSF) with Spring](http://www.baeldung.com/spring-jsf)
- [Introduction to Primefaces](http://www.baeldung.com/jsf-primefaces)
diff --git a/json/README.md b/json/README.md
index 2e253a4ae9..c0ca4b00ef 100644
--- a/json/README.md
+++ b/json/README.md
@@ -11,3 +11,5 @@
- [Overview of JSON Pointer](https://www.baeldung.com/json-pointer)
- [Introduction to the JSON Binding API (JSR 367) in Java](http://www.baeldung.com/java-json-binding-api)
- [Get a Value by Key in a JSONArray](https://www.baeldung.com/java-jsonarray-get-value-by-key)
+- [Iterating Over an Instance of org.json.JSONObject](https://www.baeldung.com/jsonobject-iteration)
+- [Testing Web APIs with Postman Collections](https://www.baeldung.com/postman-testing-collections)
diff --git a/json/pom.xml b/json/pom.xml
index fce2d26db5..c76625a6fa 100644
--- a/json/pom.xml
+++ b/json/pom.xml
@@ -32,17 +32,17 @@
org.json
json
- 20171018
+ ${json.version}
com.google.code.gson
gson
- 2.8.5
+ ${gson.version}
com.fasterxml.jackson.core
jackson-databind
- 2.9.7
+ ${jackson.version}
javax.json.bind
@@ -52,14 +52,14 @@
junit
junit
- 4.12
+ ${junit.version}
test
org.glassfish
javax.json
- 1.1.2
+ ${javax.version}
org.eclipse
@@ -73,6 +73,12 @@
${commons-collections4.version}
test
+
+ org.assertj
+ assertj-core
+ ${assertj-core.version}
+ test
+
@@ -81,6 +87,10 @@
1.0
4.1
1.0.1
+ 20171018
+ 2.8.5
+ 1.1.2
+ 3.11.1
diff --git a/json/src/main/java/com/baeldung/jsonobject/iterate/JSONObjectIterator.java b/json/src/main/java/com/baeldung/jsonobject/iterate/JSONObjectIterator.java
new file mode 100644
index 0000000000..0ff8650652
--- /dev/null
+++ b/json/src/main/java/com/baeldung/jsonobject/iterate/JSONObjectIterator.java
@@ -0,0 +1,50 @@
+package com.baeldung.jsonobject.iterate;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+import org.json.JSONArray;
+import org.json.JSONObject;
+
+public class JSONObjectIterator {
+
+ private Map keyValuePairs;
+
+ public JSONObjectIterator() {
+ keyValuePairs = new HashMap<>();
+ }
+
+ public void handleValue(String key, Object value) {
+ if (value instanceof JSONArray) {
+ handleJSONArray(key, (JSONArray) value);
+ } else if (value instanceof JSONObject) {
+ handleJSONObject((JSONObject) value);
+ }
+ keyValuePairs.put(key, value);
+ }
+
+ public void handleJSONObject(JSONObject jsonObject) {
+ Iterator jsonObjectIterator = jsonObject.keys();
+ jsonObjectIterator.forEachRemaining(key -> {
+ Object value = jsonObject.get(key);
+ handleValue(key, value);
+ });
+ }
+
+ public void handleJSONArray(String key, JSONArray jsonArray) {
+ Iterator jsonArrayIterator = jsonArray.iterator();
+ jsonArrayIterator.forEachRemaining(element -> {
+ handleValue(key, element);
+ });
+ }
+
+ public Map getKeyValuePairs() {
+ return keyValuePairs;
+ }
+
+ public void setKeyValuePairs(Map keyValuePairs) {
+ this.keyValuePairs = keyValuePairs;
+ }
+
+}
diff --git a/json/src/test/java/com/baeldung/jsonobject/iterate/JSONObjectIteratorUnitTest.java b/json/src/test/java/com/baeldung/jsonobject/iterate/JSONObjectIteratorUnitTest.java
new file mode 100644
index 0000000000..55cfdab53b
--- /dev/null
+++ b/json/src/test/java/com/baeldung/jsonobject/iterate/JSONObjectIteratorUnitTest.java
@@ -0,0 +1,79 @@
+package com.baeldung.jsonobject.iterate;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.util.Map;
+
+import org.json.JSONArray;
+import org.json.JSONObject;
+import org.junit.Test;
+
+public class JSONObjectIteratorUnitTest {
+
+ private JSONObjectIterator jsonObjectIterator = new JSONObjectIterator();
+
+ @Test
+ public void givenJSONObject_whenIterating_thenGetKeyValuePairs() {
+ JSONObject jsonObject = getJsonObject();
+
+ jsonObjectIterator.handleJSONObject(jsonObject);
+
+ Map keyValuePairs = jsonObjectIterator.getKeyValuePairs();
+ assertThat(keyValuePairs.get("rType")).isEqualTo("Regular");
+ assertThat(keyValuePairs.get("rId")).isEqualTo("1001");
+ assertThat(keyValuePairs.get("cType")).isEqualTo("Chocolate");
+ assertThat(keyValuePairs.get("cId")).isEqualTo("1002");
+ assertThat(keyValuePairs.get("bType")).isEqualTo("BlueBerry");
+ assertThat(keyValuePairs.get("bId")).isEqualTo("1003");
+ assertThat(keyValuePairs.get("name")).isEqualTo("Cake");
+ assertThat(keyValuePairs.get("cakeId")).isEqualTo("0001");
+ assertThat(keyValuePairs.get("type")).isEqualTo("donut");
+ assertThat(keyValuePairs.get("Type")).isEqualTo("Maple");
+ assertThat(keyValuePairs.get("tId")).isEqualTo("5001");
+ assertThat(keyValuePairs.get("batters")
+ .toString()).isEqualTo("[{\"rType\":\"Regular\",\"rId\":\"1001\"},{\"cType\":\"Chocolate\",\"cId\":\"1002\"},{\"bType\":\"BlueBerry\",\"bId\":\"1003\"}]");
+ assertThat(keyValuePairs.get("cakeShapes")
+ .toString()).isEqualTo("[\"square\",\"circle\",\"heart\"]");
+ assertThat(keyValuePairs.get("topping")
+ .toString()).isEqualTo("{\"Type\":\"Maple\",\"tId\":\"5001\"}");
+ }
+
+ private JSONObject getJsonObject() {
+ JSONObject cake = new JSONObject();
+ cake.put("cakeId", "0001");
+ cake.put("type", "donut");
+ cake.put("name", "Cake");
+
+ JSONArray batters = new JSONArray();
+ JSONObject regular = new JSONObject();
+ regular.put("rId", "1001");
+ regular.put("rType", "Regular");
+ batters.put(regular);
+ JSONObject chocolate = new JSONObject();
+ chocolate.put("cId", "1002");
+ chocolate.put("cType", "Chocolate");
+ batters.put(chocolate);
+ JSONObject blueberry = new JSONObject();
+ blueberry.put("bId", "1003");
+ blueberry.put("bType", "BlueBerry");
+ batters.put(blueberry);
+
+ JSONArray cakeShapes = new JSONArray();
+ cakeShapes.put("square");
+ cakeShapes.put("circle");
+ cakeShapes.put("heart");
+
+ cake.put("cakeShapes", cakeShapes);
+
+ cake.put("batters", batters);
+
+ JSONObject topping = new JSONObject();
+ topping.put("tId", "5001");
+ topping.put("Type", "Maple");
+
+ cake.put("topping", topping);
+
+ return cake;
+ }
+
+}
diff --git a/jta/pom.xml b/jta/pom.xml
index 4754c1872b..6a31733996 100644
--- a/jta/pom.xml
+++ b/jta/pom.xml
@@ -7,22 +7,15 @@
1.0-SNAPSHOT
jta
jar
-
JEE JTA demo
- org.springframework.boot
- spring-boot-starter-parent
- 2.0.4.RELEASE
-
+ parent-boot-2
+ com.baeldung
+ 0.0.1-SNAPSHOT
+ ../parent-boot-2
-
- UTF-8
- UTF-8
- 1.8
-
-
org.springframework.boot
@@ -46,7 +39,7 @@
org.hsqldb
hsqldb
- 2.4.1
+ ${hsqldb.version}
@@ -86,4 +79,12 @@
+
+
+ UTF-8
+ UTF-8
+ 1.8
+ 2.4.1
+ 2.0.4.RELEASE
+
diff --git a/kotlin-libraries/README.md b/kotlin-libraries/README.md
index 4110bfe12e..5e2526e64e 100644
--- a/kotlin-libraries/README.md
+++ b/kotlin-libraries/README.md
@@ -9,3 +9,4 @@
- [Working with Dates in Kotlin](https://www.baeldung.com/kotlin-dates)
- [Introduction to Arrow in Kotlin](https://www.baeldung.com/kotlin-arrow)
- [Kotlin with Ktor](https://www.baeldung.com/kotlin-ktor)
+- [REST API With Kotlin and Kovert](https://www.baeldung.com/kotlin-kovert)
diff --git a/libraries-data/README.md b/libraries-data/README.md
index 69856af66b..077961f887 100644
--- a/libraries-data/README.md
+++ b/libraries-data/README.md
@@ -15,3 +15,4 @@
- [Intro to Apache Storm](https://www.baeldung.com/apache-storm)
- [Guide to Ebean ORM](https://www.baeldung.com/ebean-orm)
- [Introduction to Kafka Connectors](https://www.baeldung.com/kafka-connectors-guide)
+- [Kafka Connect Example with MQTT and MongoDB](https://www.baeldung.com/kafka-connect-mqtt-mongodb)
diff --git a/libraries-data/pom.xml b/libraries-data/pom.xml
index daf6c8b500..85be66c067 100644
--- a/libraries-data/pom.xml
+++ b/libraries-data/pom.xml
@@ -434,7 +434,6 @@
4.0.1
1.4.196
16.5.1
- 4.12
3.7.0
5.0
1.0.0
diff --git a/libraries-security/pom.xml b/libraries-security/pom.xml
index 3077abc29c..9f125361ba 100644
--- a/libraries-security/pom.xml
+++ b/libraries-security/pom.xml
@@ -23,7 +23,7 @@
org.springframework.security.oauth
spring-security-oauth2
- 2.3.3.RELEASE
+ ${spring-security-oauth2.version}
@@ -41,21 +41,20 @@
org.passay
passay
- 1.3.1
+ ${passay.version}
org.cryptacular
cryptacular
- 1.2.2
+ ${cryptacular.version}
-
- 4.12
2.0.4.RELEASE
5.6.0
+ 2.3.3.RELEASE
+ 1.3.1
+ 1.2.2
-
-
diff --git a/libraries-server/README.md b/libraries-server/README.md
index 28f963ade8..75c12fd61a 100644
--- a/libraries-server/README.md
+++ b/libraries-server/README.md
@@ -7,3 +7,4 @@
- [Creating and Configuring Jetty 9 Server in Java](http://www.baeldung.com/jetty-java-programmatic)
- [Testing Netty with EmbeddedChannel](http://www.baeldung.com/testing-netty-embedded-channel)
- [MQTT Client in Java](https://www.baeldung.com/java-mqtt-client)
+- [Guide to XMPP Smack Client](https://www.baeldung.com/xmpp-smack-chat-client)
diff --git a/libraries-server/pom.xml b/libraries-server/pom.xml
index 661f5f01d5..a6ead8fb31 100644
--- a/libraries-server/pom.xml
+++ b/libraries-server/pom.xml
@@ -5,16 +5,17 @@
0.0.1-SNAPSHOT
libraries-server
-
+
com.baeldung
parent-modules
1.0.0-SNAPSHOT
-
+
+
org.eclipse.paho
org.eclipse.paho.client.mqttv3
- 1.2.0
+ ${eclipse.paho.client.mqttv3.version}
@@ -71,6 +72,30 @@
tomcat-catalina
${tomcat.version}
+
+
+ org.igniterealtime.smack
+ smack-tcp
+ ${smack.version}
+
+
+
+ org.igniterealtime.smack
+ smack-im
+ ${smack.version}
+
+
+
+ org.igniterealtime.smack
+ smack-extensions
+ ${smack.version}
+
+
+
+ org.igniterealtime.smack
+ smack-java7
+ ${smack.version}
+
@@ -80,8 +105,9 @@
9.4.8.v20171121
4.1.20.Final
4.1
- 4.12
8.5.24
+ 4.3.1
+ 1.2.0
\ No newline at end of file
diff --git a/libraries/src/main/java/com/baeldung/smack/StanzaThread.java b/libraries-server/src/main/java/com/baeldung/smack/StanzaThread.java
similarity index 100%
rename from libraries/src/main/java/com/baeldung/smack/StanzaThread.java
rename to libraries-server/src/main/java/com/baeldung/smack/StanzaThread.java
diff --git a/libraries/src/test/java/com/baeldung/smack/SmackIntegrationTest.java b/libraries-server/src/test/java/com/baeldung/smack/SmackIntegrationTest.java
similarity index 100%
rename from libraries/src/test/java/com/baeldung/smack/SmackIntegrationTest.java
rename to libraries-server/src/test/java/com/baeldung/smack/SmackIntegrationTest.java
diff --git a/libraries/README.md b/libraries/README.md
index b247caedda..57f22631f1 100644
--- a/libraries/README.md
+++ b/libraries/README.md
@@ -64,7 +64,9 @@
- [Exactly Once Processing in Kafka](https://www.baeldung.com/kafka-exactly-once)
- [An Introduction to SuanShu](https://www.baeldung.com/suanshu)
- [Implementing a FTP-Client in Java](http://www.baeldung.com/java-ftp-client)
-- [Introduction to Functional Java](https://www.baeldung.com/java-functional-library
+- [Introduction to Functional Java](https://www.baeldung.com/java-functional-library)
+- [Intro to Derive4J](https://www.baeldung.com/derive4j)
+- [A Guide to the Reflections Library](https://www.baeldung.com/reflections-library)
The libraries module contains examples related to small libraries that are relatively easy to use and does not require any separate module of its own.
diff --git a/libraries/pom.xml b/libraries/pom.xml
index 301fa86c8d..7823732224 100644
--- a/libraries/pom.xml
+++ b/libraries/pom.xml
@@ -223,6 +223,12 @@
serenity-spring
${serenity.version}
test
+
+
+ org.springframework
+ spring-test
+
+
net.serenity-bdd
@@ -318,6 +324,12 @@
pact-jvm-consumer-junit_2.11
${pact.version}
test
+
+
+ org.codehaus.groovy
+ groovy-all
+
+
org.codehaus.groovy
@@ -675,30 +687,18 @@
${mockftpserver.version}
test
-
- org.igniterealtime.smack
- smack-tcp
- ${smack.version}
+ org.asciidoctor
+ asciidoctor-maven-plugin
+ 1.5.7.1
+
+
+ org.reflections
+ reflections
+ ${reflections.version}
+
-
- org.igniterealtime.smack
- smack-im
- ${smack.version}
-
-
-
- org.igniterealtime.smack
- smack-extensions
- ${smack.version}
-
-
-
- org.igniterealtime.smack
- smack-java7
- ${smack.version}
-
@@ -710,10 +710,6 @@
bintray
http://dl.bintray.com/cuba-platform/main
-
- Apache Staging
- https://repository.apache.org/content/groups/staging
-
nm-repo
Numerical Method's Maven Repository
@@ -757,7 +753,7 @@
JDO
${basedir}/datanucleus.properties
${basedir}/log4j.properties
- true
+ false
false
@@ -849,7 +845,6 @@
1.9.0
1.9.27
1.1.0
- 4.12
0.10
3.5.0
3.0.0
@@ -920,7 +915,8 @@
1.1.0
2.7.1
3.6
- 4.3.1
+ 0.9.11
+
diff --git a/libraries/src/main/java/com/baeldung/derive4j/lazy/LazyRequest.java b/libraries/src/main/java/com/baeldung/derive4j/lazy/LazyRequest.java
index 9f53f3d25b..bee947df12 100644
--- a/libraries/src/main/java/com/baeldung/derive4j/lazy/LazyRequest.java
+++ b/libraries/src/main/java/com/baeldung/derive4j/lazy/LazyRequest.java
@@ -6,7 +6,7 @@ import org.derive4j.Make;
@Data(value = @Derive(
inClass = "{ClassName}Impl",
- make = {Make.lazyConstructor, Make.constructors}
+ make = {Make.lazyConstructor, Make.constructors, Make.getters}
))
public interface LazyRequest {
interface Cases{
diff --git a/libraries/src/main/java/com/baeldung/reflections/ReflectionsApp.java b/libraries/src/main/java/com/baeldung/reflections/ReflectionsApp.java
new file mode 100644
index 0000000000..30da8ea837
--- /dev/null
+++ b/libraries/src/main/java/com/baeldung/reflections/ReflectionsApp.java
@@ -0,0 +1,71 @@
+package com.baeldung.reflections;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Method;
+import java.util.Date;
+import java.util.Set;
+import java.util.regex.Pattern;
+
+import org.reflections.Reflections;
+import org.reflections.scanners.MethodAnnotationsScanner;
+import org.reflections.scanners.MethodParameterScanner;
+import org.reflections.scanners.ResourcesScanner;
+import org.reflections.scanners.Scanner;
+import org.reflections.scanners.SubTypesScanner;
+import org.reflections.util.ClasspathHelper;
+import org.reflections.util.ConfigurationBuilder;
+
+public class ReflectionsApp {
+
+ public Set> getReflectionsSubTypes() {
+ Reflections reflections = new Reflections("org.reflections");
+ Set> scannersSet = reflections.getSubTypesOf(Scanner.class);
+ return scannersSet;
+ }
+
+ public Set> getJDKFunctinalInterfaces() {
+ Reflections reflections = new Reflections("java.util.function");
+ Set> typesSet = reflections.getTypesAnnotatedWith(FunctionalInterface.class);
+ return typesSet;
+ }
+
+ public Set getDateDeprecatedMethods() {
+ Reflections reflections = new Reflections(java.util.Date.class, new MethodAnnotationsScanner());
+ Set deprecatedMethodsSet = reflections.getMethodsAnnotatedWith(Deprecated.class);
+ return deprecatedMethodsSet;
+ }
+
+ @SuppressWarnings("rawtypes")
+ public Set getDateDeprecatedConstructors() {
+ Reflections reflections = new Reflections(java.util.Date.class, new MethodAnnotationsScanner());
+ Set constructorsSet = reflections.getConstructorsAnnotatedWith(Deprecated.class);
+ return constructorsSet;
+ }
+
+ public Set getMethodsWithDateParam() {
+ Reflections reflections = new Reflections(java.text.SimpleDateFormat.class, new MethodParameterScanner());
+ Set methodsSet = reflections.getMethodsMatchParams(Date.class);
+ return methodsSet;
+ }
+
+ public Set getMethodsWithVoidReturn() {
+ Reflections reflections = new Reflections(java.text.SimpleDateFormat.class, new MethodParameterScanner());
+ Set methodsSet = reflections.getMethodsReturn(void.class);
+ return methodsSet;
+ }
+
+ public Set getPomXmlPaths() {
+ Reflections reflections = new Reflections(new ResourcesScanner());
+ Set resourcesSet = reflections.getResources(Pattern.compile(".*pom\\.xml"));
+ return resourcesSet;
+ }
+
+ public Set> getReflectionsSubTypesUsingBuilder() {
+ Reflections reflections = new Reflections(new ConfigurationBuilder().setUrls(ClasspathHelper.forPackage("org.reflections"))
+ .setScanners(new SubTypesScanner()));
+
+ Set> scannersSet = reflections.getSubTypesOf(Scanner.class);
+ return scannersSet;
+ }
+
+}
diff --git a/libraries/src/test/java/com/baeldung/google/sheets/GoogleSheetsIntegrationTest.java b/libraries/src/test/java/com/baeldung/google/sheets/GoogleSheetsLiveTest.java
similarity index 99%
rename from libraries/src/test/java/com/baeldung/google/sheets/GoogleSheetsIntegrationTest.java
rename to libraries/src/test/java/com/baeldung/google/sheets/GoogleSheetsLiveTest.java
index ba1861937b..358b3390f9 100644
--- a/libraries/src/test/java/com/baeldung/google/sheets/GoogleSheetsIntegrationTest.java
+++ b/libraries/src/test/java/com/baeldung/google/sheets/GoogleSheetsLiveTest.java
@@ -26,7 +26,7 @@ import com.google.api.services.sheets.v4.model.ValueRange;
import static org.assertj.core.api.Assertions.*;
-public class GoogleSheetsIntegrationTest {
+public class GoogleSheetsLiveTest {
private static Sheets sheetsService;
diff --git a/libraries/src/test/java/com/baeldung/reflections/ReflectionsUnitTest.java b/libraries/src/test/java/com/baeldung/reflections/ReflectionsUnitTest.java
new file mode 100644
index 0000000000..9a3ef0747b
--- /dev/null
+++ b/libraries/src/test/java/com/baeldung/reflections/ReflectionsUnitTest.java
@@ -0,0 +1,50 @@
+package com.baeldung.reflections;
+
+import static org.junit.jupiter.api.Assertions.assertFalse;
+
+import org.junit.jupiter.api.Test;
+
+public class ReflectionsUnitTest {
+
+ @Test
+ public void givenTypeThenGetAllSubTypes() {
+ ReflectionsApp reflectionsApp = new ReflectionsApp();
+ assertFalse(reflectionsApp.getReflectionsSubTypes()
+ .isEmpty());
+ }
+
+ @Test
+ public void givenTypeAndUsingBuilderThenGetAllSubTypes() {
+ ReflectionsApp reflectionsApp = new ReflectionsApp();
+ assertFalse(reflectionsApp.getReflectionsSubTypesUsingBuilder()
+ .isEmpty());
+ }
+
+ @Test
+ public void givenAnnotationThenGetAllAnnotatedMethods() {
+ ReflectionsApp reflectionsApp = new ReflectionsApp();
+ assertFalse(reflectionsApp.getDateDeprecatedMethods()
+ .isEmpty());
+ }
+
+ @Test
+ public void givenAnnotationThenGetAllAnnotatedConstructors() {
+ ReflectionsApp reflectionsApp = new ReflectionsApp();
+ assertFalse(reflectionsApp.getDateDeprecatedConstructors()
+ .isEmpty());
+ }
+
+ @Test
+ public void givenParamTypeThenGetAllMethods() {
+ ReflectionsApp reflectionsApp = new ReflectionsApp();
+ assertFalse(reflectionsApp.getMethodsWithDateParam()
+ .isEmpty());
+ }
+
+ @Test
+ public void givenReturnTypeThenGetAllMethods() {
+ ReflectionsApp reflectionsApp = new ReflectionsApp();
+ assertFalse(reflectionsApp.getMethodsWithVoidReturn()
+ .isEmpty());
+ }
+}
diff --git a/libraries/src/test/java/com/baeldung/smooks/converter/SmooksIntegrationTest.java b/libraries/src/test/java/com/baeldung/smooks/converter/SmooksIntegrationTest.java
index 69af042427..df7fea58f8 100644
--- a/libraries/src/test/java/com/baeldung/smooks/converter/SmooksIntegrationTest.java
+++ b/libraries/src/test/java/com/baeldung/smooks/converter/SmooksIntegrationTest.java
@@ -12,9 +12,10 @@ import static org.junit.Assert.*;
public class SmooksIntegrationTest {
- private static final String EDIFACT_MESSAGE = "UNA:+.? '\r\n" + "UNH+771+IN_PROGRESS+2018-01-14'\r\n" + "CTA+CompanyX+1234567'\r\n" + "LIN+1+PX1234+9.99'\r\n" + "LIN+2+RX990+120.32'\r\n";
- private static final String EMAIL_MESSAGE = "Hi,\r\n" + "Order number #771 created on 2018-01-14 is currently in IN_PROGRESS status.\r\n" + "Consider contact supplier \"CompanyX\" with phone number: \"1234567\".\r\n" + "Order items:\r\n"
- + "1 X PX1234 (total price 9.99)\r\n" + "2 X RX990 (total price 240.64)\r\n";
+ private static final String EDIFACT_MESSAGE = "UNA:+.? '" + System.lineSeparator() + "UNH+771+IN_PROGRESS+2018-01-14'" + System.lineSeparator() + "CTA+CompanyX+1234567'" + System.lineSeparator() + "LIN+1+PX1234+9.99'" + System.lineSeparator()
+ + "LIN+2+RX990+120.32'" + System.lineSeparator();
+ private static final String EMAIL_MESSAGE = "Hi," + System.lineSeparator() + "Order number #771 created on 2018-01-14 is currently in IN_PROGRESS status." + System.lineSeparator() + "Consider contact supplier \"CompanyX\" with phone number: \"1234567\"."
+ + System.lineSeparator() + "Order items:" + System.lineSeparator() + "1 X PX1234 (total price 9.99)" + System.lineSeparator() + "2 X RX990 (total price 240.64)" + System.lineSeparator();
@Test
public void givenOrderXML_whenConvert_thenPOJOsConstructedCorrectly() throws Exception {
@@ -37,7 +38,10 @@ public class SmooksIntegrationTest {
assertThat(validationResult.getErrors(), hasSize(1));
// 1234567 didn't match ^[0-9\\-\\+]{9,15}$
- assertThat(validationResult.getErrors().get(0).getFailRuleResult().getRuleName(), is("supplierPhone"));
+ assertThat(validationResult.getErrors()
+ .get(0)
+ .getFailRuleResult()
+ .getRuleName(), is("supplierPhone"));
}
@Test
diff --git a/logging-modules/logback/pom.xml b/logging-modules/logback/pom.xml
index ef7adbc3ea..845424af0c 100644
--- a/logging-modules/logback/pom.xml
+++ b/logging-modules/logback/pom.xml
@@ -4,9 +4,9 @@
http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
- logback
logback
0.1-SNAPSHOT
+ logback
com.baeldung
diff --git a/logging-modules/pom.xml b/logging-modules/pom.xml
new file mode 100644
index 0000000000..a303e50ff1
--- /dev/null
+++ b/logging-modules/pom.xml
@@ -0,0 +1,23 @@
+
+
+ 4.0.0
+ logging-modules
+ logging-modules
+ pom
+
+
+ com.baeldung
+ parent-modules
+ 1.0.0-SNAPSHOT
+ ..
+
+
+
+ log4j
+ log4j2
+ logback
+ log-mdc
+
+
+
diff --git a/lombok-custom/pom.xml b/lombok-custom/pom.xml
index 41bd042a5e..cfbe629945 100644
--- a/lombok-custom/pom.xml
+++ b/lombok-custom/pom.xml
@@ -2,34 +2,36 @@
+
+ 4.0.0
+ lombok-custom
+ lombok-custom
+ 0.1-SNAPSHOT
+
parent-modules
com.baeldung
1.0.0-SNAPSHOT
-
- 4.0.0
- lombok-custom
- 0.1-SNAPSHOT
-
+
org.projectlombok
lombok
- 1.14.8
+ ${lombok.version}
provided
org.kohsuke.metainf-services
metainf-services
- 1.8
+ ${metainf-services.version}
org.eclipse.jdt
core
- 3.3.0-v_771
+ ${eclipse.jdt.core.version}
@@ -54,5 +56,12 @@
+
+
+ 1.14.8
+ 1.8
+ 3.3.0-v_771
+
-
\ No newline at end of file
+
+
diff --git a/lombok/README.md b/lombok/README.md
index bd6282fd18..e3d08d4e26 100644
--- a/lombok/README.md
+++ b/lombok/README.md
@@ -5,3 +5,5 @@
- [Lombok @Builder with Inheritance](https://www.baeldung.com/lombok-builder-inheritance)
- [Lombok Builder with Default Value](https://www.baeldung.com/lombok-builder-default-value)
- [Lombok Builder with Custom Setter](https://www.baeldung.com/lombok-builder-custom-setter)
+- [Setting up Lombok with Eclipse and Intellij](https://www.baeldung.com/lombok-ide)
+
diff --git a/lombok/pom.xml b/lombok/pom.xml
index 7ad2e3dc83..2acf9e240d 100644
--- a/lombok/pom.xml
+++ b/lombok/pom.xml
@@ -76,11 +76,11 @@
- 1.16.18
+ 1.18.4
1.0.0.Final
- 1.16.10.0
+ 1.18.4.0
3.8.0
diff --git a/lombok/src/main/java/com/baeldung/lombok/builder/Child.java b/lombok/src/main/java/com/baeldung/lombok/builder/inheritance/buildermethodname/Child.java
similarity index 86%
rename from lombok/src/main/java/com/baeldung/lombok/builder/Child.java
rename to lombok/src/main/java/com/baeldung/lombok/builder/inheritance/buildermethodname/Child.java
index 70f6d9c46e..4cfcc22fb2 100644
--- a/lombok/src/main/java/com/baeldung/lombok/builder/Child.java
+++ b/lombok/src/main/java/com/baeldung/lombok/builder/inheritance/buildermethodname/Child.java
@@ -1,4 +1,4 @@
-package com.baeldung.lombok.builder;
+package com.baeldung.lombok.builder.inheritance.buildermethodname;
import lombok.Builder;
import lombok.Getter;
diff --git a/lombok/src/main/java/com/baeldung/lombok/builder/Parent.java b/lombok/src/main/java/com/baeldung/lombok/builder/inheritance/buildermethodname/Parent.java
similarity index 70%
rename from lombok/src/main/java/com/baeldung/lombok/builder/Parent.java
rename to lombok/src/main/java/com/baeldung/lombok/builder/inheritance/buildermethodname/Parent.java
index 0cf76d4b00..93e48ee44e 100644
--- a/lombok/src/main/java/com/baeldung/lombok/builder/Parent.java
+++ b/lombok/src/main/java/com/baeldung/lombok/builder/inheritance/buildermethodname/Parent.java
@@ -1,4 +1,4 @@
-package com.baeldung.lombok.builder;
+package com.baeldung.lombok.builder.inheritance.buildermethodname;
import lombok.Builder;
import lombok.Getter;
diff --git a/lombok/src/main/java/com/baeldung/lombok/builder/inheritance/buildermethodname/Student.java b/lombok/src/main/java/com/baeldung/lombok/builder/inheritance/buildermethodname/Student.java
new file mode 100644
index 0000000000..c8eea84b97
--- /dev/null
+++ b/lombok/src/main/java/com/baeldung/lombok/builder/inheritance/buildermethodname/Student.java
@@ -0,0 +1,16 @@
+package com.baeldung.lombok.builder.inheritance.buildermethodname;
+
+import lombok.Builder;
+import lombok.Getter;
+
+@Getter
+public class Student extends Child {
+
+ private final String schoolName;
+
+ @Builder(builderMethodName = "studentBuilder")
+ public Student(String parentName, int parentAge, String childName, int childAge, String schoolName) {
+ super(parentName, parentAge, childName, childAge);
+ this.schoolName = schoolName;
+ }
+}
diff --git a/lombok/src/main/java/com/baeldung/lombok/builder/inheritance/superbuilder/Child.java b/lombok/src/main/java/com/baeldung/lombok/builder/inheritance/superbuilder/Child.java
new file mode 100644
index 0000000000..92285ebdc3
--- /dev/null
+++ b/lombok/src/main/java/com/baeldung/lombok/builder/inheritance/superbuilder/Child.java
@@ -0,0 +1,11 @@
+package com.baeldung.lombok.builder.inheritance.superbuilder;
+
+import lombok.Getter;
+import lombok.experimental.SuperBuilder;
+
+@Getter
+@SuperBuilder(toBuilder = true)
+public class Child extends Parent {
+ private final String childName;
+ private final int childAge;
+}
diff --git a/lombok/src/main/java/com/baeldung/lombok/builder/inheritance/superbuilder/Parent.java b/lombok/src/main/java/com/baeldung/lombok/builder/inheritance/superbuilder/Parent.java
new file mode 100644
index 0000000000..b8e0934520
--- /dev/null
+++ b/lombok/src/main/java/com/baeldung/lombok/builder/inheritance/superbuilder/Parent.java
@@ -0,0 +1,11 @@
+package com.baeldung.lombok.builder.inheritance.superbuilder;
+
+import lombok.Getter;
+import lombok.experimental.SuperBuilder;
+
+@Getter
+@SuperBuilder(toBuilder = true)
+public class Parent {
+ private final String parentName;
+ private final int parentAge;
+}
diff --git a/lombok/src/main/java/com/baeldung/lombok/builder/inheritance/superbuilder/Student.java b/lombok/src/main/java/com/baeldung/lombok/builder/inheritance/superbuilder/Student.java
new file mode 100644
index 0000000000..db43bacafa
--- /dev/null
+++ b/lombok/src/main/java/com/baeldung/lombok/builder/inheritance/superbuilder/Student.java
@@ -0,0 +1,10 @@
+package com.baeldung.lombok.builder.inheritance.superbuilder;
+
+import lombok.Getter;
+import lombok.experimental.SuperBuilder;
+
+@Getter
+@SuperBuilder(toBuilder = true)
+public class Student extends Child {
+ private final String schoolName;
+}
diff --git a/lombok/src/main/java/com/baeldung/lombok/getter/GetterLazy.java b/lombok/src/main/java/com/baeldung/lombok/getter/GetterLazy.java
new file mode 100644
index 0000000000..5ac82a74d8
--- /dev/null
+++ b/lombok/src/main/java/com/baeldung/lombok/getter/GetterLazy.java
@@ -0,0 +1,36 @@
+package com.baeldung.lombok.getter;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import lombok.Getter;
+
+public class GetterLazy {
+
+ private static final String DELIMETER = ",";
+
+ @Getter(lazy = true)
+ private final Map transactions = readTxnsFromFile();
+
+ private Map readTxnsFromFile() {
+
+ final Map cache = new HashMap<>();
+ List txnRows = readTxnListFromFile();
+
+ txnRows.forEach(s -> {
+ String[] txnIdValueTuple = s.split(DELIMETER);
+ cache.put(txnIdValueTuple[0], Long.parseLong(txnIdValueTuple[1]));
+ });
+
+ return cache;
+ }
+
+ private List readTxnListFromFile() {
+
+ // read large file
+ return Stream.of("file content here").collect(Collectors.toList());
+ }
+}
diff --git a/lombok/src/test/java/com/baeldung/lombok/builder/BuilderUnitTest.java b/lombok/src/test/java/com/baeldung/lombok/builder/BuilderUnitTest.java
index 56a380569d..546c38f140 100644
--- a/lombok/src/test/java/com/baeldung/lombok/builder/BuilderUnitTest.java
+++ b/lombok/src/test/java/com/baeldung/lombok/builder/BuilderUnitTest.java
@@ -40,20 +40,4 @@ public class BuilderUnitTest {
assertThat(testImmutableClient.getName()).isEqualTo("foo");
assertThat(testImmutableClient.getId()).isEqualTo(1);
}
-
- @Test
- public void givenBuilderAtMethodLevel_ChildInheritingParentIsBuilt() {
- Child child = Child.childBuilder()
- .parentName("Andrea")
- .parentAge(38)
- .childName("Emma")
- .childAge(6)
- .build();
-
- assertThat(child.getChildName()).isEqualTo("Emma");
- assertThat(child.getChildAge()).isEqualTo(6);
- assertThat(child.getParentName()).isEqualTo("Andrea");
- assertThat(child.getParentAge()).isEqualTo(38);
- }
-
}
diff --git a/lombok/src/test/java/com/baeldung/lombok/builder/inheritance/buildermethodname/BuilderInheritanceUsingMethodNameUnitTest.java b/lombok/src/test/java/com/baeldung/lombok/builder/inheritance/buildermethodname/BuilderInheritanceUsingMethodNameUnitTest.java
new file mode 100644
index 0000000000..cf50b2577b
--- /dev/null
+++ b/lombok/src/test/java/com/baeldung/lombok/builder/inheritance/buildermethodname/BuilderInheritanceUsingMethodNameUnitTest.java
@@ -0,0 +1,40 @@
+package com.baeldung.lombok.builder.inheritance.buildermethodname;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import org.junit.jupiter.api.Test;
+
+public class BuilderInheritanceUsingMethodNameUnitTest {
+
+ @Test
+ public void givenBuilderAtMethodLevel_ChildInheritingParentIsBuilt() {
+ Child child = Child.childBuilder()
+ .parentName("Andrea")
+ .parentAge(38)
+ .childName("Emma")
+ .childAge(6)
+ .build();
+
+ assertThat(child.getChildName()).isEqualTo("Emma");
+ assertThat(child.getChildAge()).isEqualTo(6);
+ assertThat(child.getParentName()).isEqualTo("Andrea");
+ assertThat(child.getParentAge()).isEqualTo(38);
+ }
+
+ @Test
+ public void givenSuperBuilderOnAllThreeLevels_StudentInheritingChildAndParentIsBuilt() {
+ Student student = Student.studentBuilder()
+ .parentName("Andrea")
+ .parentAge(38)
+ .childName("Emma")
+ .childAge(6)
+ .schoolName("Baeldung High School")
+ .build();
+
+ assertThat(student.getChildName()).isEqualTo("Emma");
+ assertThat(student.getChildAge()).isEqualTo(6);
+ assertThat(student.getParentName()).isEqualTo("Andrea");
+ assertThat(student.getParentAge()).isEqualTo(38);
+ assertThat(student.getSchoolName()).isEqualTo("Baeldung High School");
+ }
+}
diff --git a/lombok/src/test/java/com/baeldung/lombok/builder/inheritance/superbuilder/BuilderInheritanceUsingSuperBuilderUnitTest.java b/lombok/src/test/java/com/baeldung/lombok/builder/inheritance/superbuilder/BuilderInheritanceUsingSuperBuilderUnitTest.java
new file mode 100644
index 0000000000..72bfa6567b
--- /dev/null
+++ b/lombok/src/test/java/com/baeldung/lombok/builder/inheritance/superbuilder/BuilderInheritanceUsingSuperBuilderUnitTest.java
@@ -0,0 +1,96 @@
+package com.baeldung.lombok.builder.inheritance.superbuilder;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import org.junit.jupiter.api.Test;
+
+public class BuilderInheritanceUsingSuperBuilderUnitTest {
+
+ @Test
+ public void givenSuperBuilderOnParentAndOnChild_ChildInheritingParentIsBuilt() {
+ Child child = Child.builder()
+ .parentName("Andrea")
+ .parentAge(38)
+ .childName("Emma")
+ .childAge(6)
+ .build();
+
+ assertThat(child.getChildName()).isEqualTo("Emma");
+ assertThat(child.getChildAge()).isEqualTo(6);
+ assertThat(child.getParentName()).isEqualTo("Andrea");
+ assertThat(child.getParentAge()).isEqualTo(38);
+ }
+
+ @Test
+ public void givenSuperBuilderOnParent_StandardBuilderIsBuilt() {
+ Parent parent = Parent.builder()
+ .parentName("Andrea")
+ .parentAge(38)
+ .build();
+
+ assertThat(parent.getParentName()).isEqualTo("Andrea");
+ assertThat(parent.getParentAge()).isEqualTo(38);
+ }
+
+ @Test
+ public void givenToBuilderIsSetToTrueOnParentAndChild_DeepCopyViaBuilderIsPossible() {
+ Child child1 = Child.builder()
+ .parentName("Andrea")
+ .parentAge(38)
+ .childName("Emma")
+ .childAge(6)
+ .build();
+
+ Child child2 = child1.toBuilder()
+ .childName("Anna")
+ .build();
+
+ assertThat(child2.getChildName()).isEqualTo("Anna");
+ assertThat(child2.getChildAge()).isEqualTo(6);
+ assertThat(child2.getParentName()).isEqualTo("Andrea");
+ assertThat(child2.getParentAge()).isEqualTo(38);
+
+ }
+
+ @Test
+ public void givenSuperBuilderOnAllThreeLevels_StudentInheritingChildAndParentIsBuilt() {
+ Student student = Student.builder()
+ .parentName("Andrea")
+ .parentAge(38)
+ .childName("Emma")
+ .childAge(6)
+ .schoolName("Baeldung High School")
+ .build();
+
+ assertThat(student.getChildName()).isEqualTo("Emma");
+ assertThat(student.getChildAge()).isEqualTo(6);
+ assertThat(student.getParentName()).isEqualTo("Andrea");
+ assertThat(student.getParentAge()).isEqualTo(38);
+ assertThat(student.getSchoolName()).isEqualTo("Baeldung High School");
+ }
+
+ @Test
+ public void givenToBuilderIsSetToTrueOnParentChildAndStudent_DeepCopyViaBuilderIsPossible() {
+ Student student1 = Student.builder()
+ .parentName("Andrea")
+ .parentAge(38)
+ .childName("Emma")
+ .childAge(6)
+ .schoolName("School 1")
+ .build();
+
+ Student student2 = student1.toBuilder()
+ .childName("Anna")
+ .schoolName("School 2")
+ .build();
+
+ assertThat(student2.getChildName()).isEqualTo("Anna");
+ assertThat(student2.getChildAge()).isEqualTo(6);
+ assertThat(student2.getParentName()).isEqualTo("Andrea");
+ assertThat(student2.getParentAge()).isEqualTo(38);
+ assertThat(student2.getSchoolName()).isEqualTo("School 2");
+
+ }
+
+
+}
diff --git a/mapstruct/pom.xml b/mapstruct/pom.xml
index 6c274dfcf2..0493775f85 100644
--- a/mapstruct/pom.xml
+++ b/mapstruct/pom.xml
@@ -30,6 +30,11 @@
${springframework.version}
test
+
+ org.projectlombok
+ lombok
+ ${org.projectlombok.version}
+
@@ -48,6 +53,11 @@
mapstruct-processor
${org.mapstruct.version}
+
+ org.projectlombok
+ lombok
+ ${org.projectlombok.version}
+
@@ -55,10 +65,11 @@
- 1.1.0.Final
+ 1.3.0.Beta2
4.3.4.RELEASE
1.8
1.8
+ 1.18.4
diff --git a/mapstruct/src/main/java/com/baeldung/dto/CarDTO.java b/mapstruct/src/main/java/com/baeldung/dto/CarDTO.java
new file mode 100644
index 0000000000..51aa8ccac2
--- /dev/null
+++ b/mapstruct/src/main/java/com/baeldung/dto/CarDTO.java
@@ -0,0 +1,11 @@
+package com.baeldung.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class CarDTO {
+ private int id;
+ private String name;
+}
diff --git a/mapstruct/src/main/java/com/baeldung/dto/PersonDTO.java b/mapstruct/src/main/java/com/baeldung/dto/PersonDTO.java
new file mode 100644
index 0000000000..ace7a2bc7d
--- /dev/null
+++ b/mapstruct/src/main/java/com/baeldung/dto/PersonDTO.java
@@ -0,0 +1,33 @@
+package com.baeldung.dto;
+
+public class PersonDTO {
+
+ private String id;
+ private String name;
+
+ public PersonDTO() {
+
+ }
+
+ public PersonDTO(String id, String name) {
+ super();
+ this.id = id;
+ this.name = name;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+}
\ No newline at end of file
diff --git a/mapstruct/src/main/java/com/baeldung/entity/Car.java b/mapstruct/src/main/java/com/baeldung/entity/Car.java
new file mode 100644
index 0000000000..8559b4a77d
--- /dev/null
+++ b/mapstruct/src/main/java/com/baeldung/entity/Car.java
@@ -0,0 +1,11 @@
+package com.baeldung.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class Car {
+ private int id;
+ private String name;
+}
diff --git a/mapstruct/src/main/java/com/baeldung/entity/Person.java b/mapstruct/src/main/java/com/baeldung/entity/Person.java
new file mode 100644
index 0000000000..5f73ee1130
--- /dev/null
+++ b/mapstruct/src/main/java/com/baeldung/entity/Person.java
@@ -0,0 +1,33 @@
+package com.baeldung.entity;
+
+public class Person {
+
+ private String id;
+ private String name;
+
+ public Person() {
+
+ }
+
+ public Person(String id, String name) {
+ super();
+ this.id = id;
+ this.name = name;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+}
\ No newline at end of file
diff --git a/mapstruct/src/main/java/com/baeldung/mapper/CarMapper.java b/mapstruct/src/main/java/com/baeldung/mapper/CarMapper.java
new file mode 100644
index 0000000000..c18fa44f8d
--- /dev/null
+++ b/mapstruct/src/main/java/com/baeldung/mapper/CarMapper.java
@@ -0,0 +1,15 @@
+package com.baeldung.mapper;
+
+import org.mapstruct.Mapper;
+import org.mapstruct.factory.Mappers;
+
+import com.baeldung.dto.CarDTO;
+import com.baeldung.entity.Car;
+
+@Mapper
+public interface CarMapper {
+
+ CarMapper INSTANCE = Mappers.getMapper(CarMapper.class);
+
+ CarDTO carToCarDTO(Car car);
+}
diff --git a/mapstruct/src/main/java/com/baeldung/mapper/PersonMapper.java b/mapstruct/src/main/java/com/baeldung/mapper/PersonMapper.java
new file mode 100644
index 0000000000..9b9e132b5d
--- /dev/null
+++ b/mapstruct/src/main/java/com/baeldung/mapper/PersonMapper.java
@@ -0,0 +1,17 @@
+package com.baeldung.mapper;
+
+import org.mapstruct.Mapper;
+import org.mapstruct.Mapping;
+import org.mapstruct.factory.Mappers;
+
+import com.baeldung.dto.PersonDTO;
+import com.baeldung.entity.Person;
+
+@Mapper
+public interface PersonMapper {
+
+ PersonMapper INSTANCE = Mappers.getMapper(PersonMapper.class);
+
+ @Mapping(target = "id", source = "person.id", defaultExpression = "java(java.util.UUID.randomUUID().toString())")
+ PersonDTO personToPersonDTO(Person person);
+}
diff --git a/mapstruct/src/test/java/com/baeldung/mapper/CarMapperUnitTest.java b/mapstruct/src/test/java/com/baeldung/mapper/CarMapperUnitTest.java
new file mode 100644
index 0000000000..32cae56c2e
--- /dev/null
+++ b/mapstruct/src/test/java/com/baeldung/mapper/CarMapperUnitTest.java
@@ -0,0 +1,24 @@
+package com.baeldung.mapper;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+
+import com.baeldung.dto.CarDTO;
+import com.baeldung.entity.Car;
+
+public class CarMapperUnitTest {
+
+ @Test
+ public void givenCarEntitytoCar_whenMaps_thenCorrect() {
+
+ Car entity = new Car();
+ entity.setId(1);
+ entity.setName("Toyota");
+
+ CarDTO carDto = CarMapper.INSTANCE.carToCarDTO(entity);
+
+ assertEquals(carDto.getId(), entity.getId());
+ assertEquals(carDto.getName(), entity.getName());
+ }
+}
diff --git a/mapstruct/src/test/java/com/baeldung/mapper/PersonMapperUnitTest.java b/mapstruct/src/test/java/com/baeldung/mapper/PersonMapperUnitTest.java
new file mode 100644
index 0000000000..fe4c52ac89
--- /dev/null
+++ b/mapstruct/src/test/java/com/baeldung/mapper/PersonMapperUnitTest.java
@@ -0,0 +1,26 @@
+package com.baeldung.mapper;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+
+import org.junit.Test;
+
+import com.baeldung.dto.PersonDTO;
+import com.baeldung.entity.Person;
+
+public class PersonMapperUnitTest {
+
+ @Test
+ public void givenPersonEntitytoPersonWithExpression_whenMaps_thenCorrect() {
+
+ Person entity = new Person();
+ entity.setName("Micheal");
+
+ PersonDTO personDto = PersonMapper.INSTANCE.personToPersonDTO(entity);
+
+ assertNull(entity.getId());
+ assertNotNull(personDto.getId());
+ assertEquals(personDto.getName(), entity.getName());
+ }
+}
\ No newline at end of file
diff --git a/maven-archetype/src/main/resources/archetype-resources/pom.xml b/maven-archetype/src/main/resources/archetype-resources/pom.xml
index eb69f64626..a5c813652d 100644
--- a/maven-archetype/src/main/resources/archetype-resources/pom.xml
+++ b/maven-archetype/src/main/resources/archetype-resources/pom.xml
@@ -1,7 +1,6 @@
4.0.0
-
${groupId}
${artifactId}
${version}
diff --git a/maven-polyglot/maven-polyglot-json-extension/pom.xml b/maven-polyglot/maven-polyglot-json-extension/pom.xml
index fe1e025d1f..5b18529ec5 100644
--- a/maven-polyglot/maven-polyglot-json-extension/pom.xml
+++ b/maven-polyglot/maven-polyglot-json-extension/pom.xml
@@ -7,11 +7,6 @@
maven-polyglot-json-extension
1.0-SNAPSHOT
maven-polyglot-json-extension
-
-
- 1.8
- 1.8
-
@@ -43,5 +38,10 @@
+
+
+ 1.8
+ 1.8
+
\ No newline at end of file
diff --git a/maven/.gitignore b/maven/.gitignore
index f843ae9109..bae0b0d7ce 100644
--- a/maven/.gitignore
+++ b/maven/.gitignore
@@ -1 +1,2 @@
-/output-resources
\ No newline at end of file
+/output-resources
+/.idea/
diff --git a/maven/README.md b/maven/README.md
index 1c0e50f95a..1352a2a10f 100644
--- a/maven/README.md
+++ b/maven/README.md
@@ -14,3 +14,4 @@
- [Apache Maven Tutorial](https://www.baeldung.com/maven)
- [Use the Latest Version of a Dependency in Maven](https://www.baeldung.com/maven-dependency-latest-version)
- [Multi-Module Project with Maven](https://www.baeldung.com/maven-multi-module)
+- [Maven Enforcer Plugin](https://www.baeldung.com/maven-enforcer-plugin)
diff --git a/maven/compiler-plugin-java-9/pom.xml b/maven/compiler-plugin-java-9/pom.xml
new file mode 100644
index 0000000000..5303cee82e
--- /dev/null
+++ b/maven/compiler-plugin-java-9/pom.xml
@@ -0,0 +1,22 @@
+
+ 4.0.0
+ com.baeldung
+ compiler-plugin-java-9
+ 0.0.1-SNAPSHOT
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.8.0
+
+ 9
+ 9
+
+
+
+
+
\ No newline at end of file
diff --git a/maven/compiler-plugin-java-9/src/main/java/com/baeldung/maven/java9/MavenCompilerPlugin.java b/maven/compiler-plugin-java-9/src/main/java/com/baeldung/maven/java9/MavenCompilerPlugin.java
new file mode 100644
index 0000000000..b460d6e38c
--- /dev/null
+++ b/maven/compiler-plugin-java-9/src/main/java/com/baeldung/maven/java9/MavenCompilerPlugin.java
@@ -0,0 +1,9 @@
+package com.baeldung.maven.java9;
+
+import static javax.xml.XMLConstants.XML_NS_PREFIX;
+
+public class MavenCompilerPlugin {
+ public static void main(String[] args) {
+ System.out.println("The XML namespace prefix is: " + XML_NS_PREFIX);
+ }
+}
diff --git a/maven/compiler-plugin-java-9/src/main/java/module-info.java b/maven/compiler-plugin-java-9/src/main/java/module-info.java
new file mode 100644
index 0000000000..afc1d45e71
--- /dev/null
+++ b/maven/compiler-plugin-java-9/src/main/java/module-info.java
@@ -0,0 +1,3 @@
+module com.baeldung.maven.java9 {
+ requires java.xml;
+}
\ No newline at end of file
diff --git a/maven/custom-rule/pom.xml b/maven/custom-rule/pom.xml
new file mode 100644
index 0000000000..25a3489fb9
--- /dev/null
+++ b/maven/custom-rule/pom.xml
@@ -0,0 +1,70 @@
+
+
+
+ maven
+ com.baeldung
+ 0.0.1-SNAPSHOT
+
+ 4.0.0
+ custom-rule
+ custom-rule
+
+
+ 3.0.0-M2
+ 2.0.9
+
+
+
+
+
+
+ org.apache.maven.enforcer
+ enforcer-api
+ ${api.version}
+
+
+ org.apache.maven
+ maven-project
+ ${maven.version}
+
+
+ org.apache.maven
+ maven-core
+ ${maven.version}
+
+
+ org.apache.maven
+ maven-artifact
+ ${maven.version}
+
+
+ org.apache.maven
+ maven-plugin-api
+ ${maven.version}
+
+
+ org.codehaus.plexus
+ plexus-container-default
+ 1.0-alpha-9
+
+
+
+
+
+
+ maven-verifier-plugin
+ ${maven.verifier.version}
+
+ ../input-resources/verifications.xml
+ false
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/maven/custom-rule/src/main/java/com/baeldung/enforcer/MyCustomRule.java b/maven/custom-rule/src/main/java/com/baeldung/enforcer/MyCustomRule.java
new file mode 100644
index 0000000000..9b72f40bf1
--- /dev/null
+++ b/maven/custom-rule/src/main/java/com/baeldung/enforcer/MyCustomRule.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 2019 PloyRef
+ * Created by Seun Matt
+ * on 19 - 2 - 2019
+ */
+
+package com.baeldung.enforcer;
+
+import org.apache.maven.enforcer.rule.api.EnforcerRule;
+import org.apache.maven.enforcer.rule.api.EnforcerRuleException;
+import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper;
+import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluationException;
+
+public class MyCustomRule implements EnforcerRule {
+
+ public void execute(EnforcerRuleHelper enforcerRuleHelper) throws EnforcerRuleException {
+
+ try {
+
+ String groupId = (String) enforcerRuleHelper.evaluate("${project.groupId}");
+
+ if (groupId == null || !groupId.startsWith("org.baeldung")) {
+ throw new EnforcerRuleException("Project group id does not start with org.baeldung");
+ }
+
+ }
+ catch (ExpressionEvaluationException ex ) {
+ throw new EnforcerRuleException( "Unable to lookup an expression " + ex.getLocalizedMessage(), ex );
+ }
+ }
+
+ public boolean isCacheable() {
+ return false;
+ }
+
+ public boolean isResultValid(EnforcerRule enforcerRule) {
+ return false;
+ }
+
+ public String getCacheId() {
+ return null;
+ }
+}
diff --git a/maven/maven-enforcer/pom.xml b/maven/maven-enforcer/pom.xml
new file mode 100644
index 0000000000..9826beb0d9
--- /dev/null
+++ b/maven/maven-enforcer/pom.xml
@@ -0,0 +1,75 @@
+
+
+
+ maven
+ com.baeldung
+ 0.0.1-SNAPSHOT
+
+ 4.0.0
+ maven-enforcer
+ maven-enforcer
+
+
+
+
+ org.apache.maven.plugins
+ maven-enforcer-plugin
+ 3.0.0-M2
+
+
+
+
+
+
+
+
+
+ enforce
+
+ enforce
+
+
+
+
+
+ 3.0
+ Invalid Maven version. It should, at least, be 3.0
+
+
+ 1.8
+
+
+ ui
+ WARN
+
+
+ cook
+ WARN
+
+
+ local,base
+ Missing active profiles
+ WARN
+
+
+
+
+
+
+
+
+
+ maven-verifier-plugin
+ ${maven.verifier.version}
+
+ ../input-resources/verifications.xml
+ false
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/maven/pom.xml b/maven/pom.xml
index 01fd28db74..942bf683e2 100644
--- a/maven/pom.xml
+++ b/maven/pom.xml
@@ -4,8 +4,12 @@
com.baeldung
maven
0.0.1-SNAPSHOT
- maven
- war
+
+ custom-rule
+ maven-enforcer
+
+ maven
+ pom
diff --git a/maven/versions-maven-plugin/original/pom.xml b/maven/versions-maven-plugin/original/pom.xml
index 295c77b860..7608e4d168 100644
--- a/maven/versions-maven-plugin/original/pom.xml
+++ b/maven/versions-maven-plugin/original/pom.xml
@@ -6,10 +6,6 @@
versions-maven-plugin-example
0.0.1-SNAPSHOT
-
- 1.15
-
-
@@ -73,4 +69,8 @@
+
+ 1.15
+
+
\ No newline at end of file
diff --git a/metrics/pom.xml b/metrics/pom.xml
index d7d7a8a911..014931a957 100644
--- a/metrics/pom.xml
+++ b/metrics/pom.xml
@@ -66,7 +66,7 @@
org.springframework.boot
spring-boot-starter-web
- 2.0.7.RELEASE
+ ${spring-boot-starter-web.version}
@@ -89,7 +89,7 @@
org.assertj
assertj-core
- 3.11.1
+ ${assertj-core.version}
test
@@ -102,6 +102,8 @@
0.12.0.RELEASE
2.9.1
0.57.1
+ 2.0.7.RELEASE
+ 3.11.1
diff --git a/micronaut/pom.xml b/micronaut/pom.xml
index aa69c77f73..2a8d135483 100644
--- a/micronaut/pom.xml
+++ b/micronaut/pom.xml
@@ -4,12 +4,6 @@
micronaut
0.1
micronaut
-
-
- com.baeldung.micronaut.helloworld.server.ServerApplication
- 1.0.0.RC2
- 1.8
-
@@ -133,4 +127,10 @@
+
+
+ com.baeldung.micronaut.helloworld.server.ServerApplication
+ 1.0.0.RC2
+ 1.8
+
diff --git a/mustache/pom.xml b/mustache/pom.xml
index 1b89997996..027d62ebc4 100644
--- a/mustache/pom.xml
+++ b/mustache/pom.xml
@@ -3,8 +3,8 @@
4.0.0
mustache
- jar
mustache
+ jar
parent-boot-2
diff --git a/osgi/osgi-intro-sample-activator/pom.xml b/osgi/osgi-intro-sample-activator/pom.xml
index 77d7198698..2bc1c20eed 100644
--- a/osgi/osgi-intro-sample-activator/pom.xml
+++ b/osgi/osgi-intro-sample-activator/pom.xml
@@ -2,9 +2,10 @@
4.0.0
+ osgi-intro-sample-activator
+ osgi-intro-sample-activator
bundle
- osgi-intro-sample-activator
diff --git a/osgi/osgi-intro-sample-client/pom.xml b/osgi/osgi-intro-sample-client/pom.xml
index 7f5faedb30..a630625ed2 100644
--- a/osgi/osgi-intro-sample-client/pom.xml
+++ b/osgi/osgi-intro-sample-client/pom.xml
@@ -5,6 +5,7 @@
4.0.0
osgi-intro-sample-client
+ osgi-intro-sample-client
bundle
diff --git a/osgi/osgi-intro-sample-service/pom.xml b/osgi/osgi-intro-sample-service/pom.xml
index 8f81645ad4..4f0b108837 100644
--- a/osgi/osgi-intro-sample-service/pom.xml
+++ b/osgi/osgi-intro-sample-service/pom.xml
@@ -3,6 +3,7 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
osgi-intro-sample-service
+ osgi-intro-sample-service
bundle
diff --git a/parent-boot-1/pom.xml b/parent-boot-1/pom.xml
index 53f91f975d..1054038623 100644
--- a/parent-boot-1/pom.xml
+++ b/parent-boot-1/pom.xml
@@ -55,7 +55,7 @@
3.1.0
- 1.5.16.RELEASE
+ 1.5.19.RELEASE
diff --git a/parent-boot-2/pom.xml b/parent-boot-2/pom.xml
index 280d226e95..4b81e27333 100644
--- a/parent-boot-2/pom.xml
+++ b/parent-boot-2/pom.xml
@@ -77,9 +77,7 @@
3.1.0
- 1.0.11.RELEASE
- 2.1.1.RELEASE
+ 1.0.21.RELEASE
+ 2.1.3.RELEASE
-
-
diff --git a/parent-java/pom.xml b/parent-java/pom.xml
index 8f603b2d09..cb3e205871 100644
--- a/parent-java/pom.xml
+++ b/parent-java/pom.xml
@@ -4,9 +4,9 @@
com.baeldung
parent-java
0.0.1-SNAPSHOT
- pom
parent-java
Parent for all java modules
+ pom
com.baeldung
diff --git a/parent-kotlin/pom.xml b/parent-kotlin/pom.xml
index 73c98e1a80..7a3a8b10ca 100644
--- a/parent-kotlin/pom.xml
+++ b/parent-kotlin/pom.xml
@@ -3,8 +3,8 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
4.0.0
parent-kotlin
- pom
parent-kotlin
+ pom
Parent for all kotlin modules
diff --git a/parent-spring-4/pom.xml b/parent-spring-4/pom.xml
index 9b3c42599b..d7eea44989 100644
--- a/parent-spring-4/pom.xml
+++ b/parent-spring-4/pom.xml
@@ -4,8 +4,8 @@
com.baeldung
parent-spring-4
0.0.1-SNAPSHOT
- pom
parent-spring-4
+ pom
Parent for all spring 4 core modules
@@ -29,7 +29,7 @@
- 4.3.20.RELEASE
+ 4.3.22.RELEASE
5.0.2
diff --git a/parent-spring-5/pom.xml b/parent-spring-5/pom.xml
index 51a2c1fd1f..5d7a3b66b3 100644
--- a/parent-spring-5/pom.xml
+++ b/parent-spring-5/pom.xml
@@ -4,9 +4,9 @@
com.baeldung
parent-spring-5
0.0.1-SNAPSHOT
- pom
parent-spring-5
Parent for all spring 5 core modules
+ pom
com.baeldung
@@ -31,7 +31,6 @@
5.1.2.RELEASE
5.0.2
- 2.9.6
2.9.6
5.1.2.RELEASE
diff --git a/patterns/design-patterns-2/pom.xml b/patterns/design-patterns-2/pom.xml
new file mode 100644
index 0000000000..2a0213065b
--- /dev/null
+++ b/patterns/design-patterns-2/pom.xml
@@ -0,0 +1,25 @@
+
+
+ 4.0.0
+ design-patterns-2
+ 1.0
+ design-patterns-2
+ jar
+
+
+ com.baeldung
+ patterns
+ 1.0.0-SNAPSHOT
+ ..
+
+
+
+
+
+
+ UTF-8
+ 1.8
+ 1.8
+
+
diff --git a/patterns/design-patterns-2/src/main/java/com/baeldung/nullobject/JmsRouter.java b/patterns/design-patterns-2/src/main/java/com/baeldung/nullobject/JmsRouter.java
new file mode 100644
index 0000000000..7d8215fead
--- /dev/null
+++ b/patterns/design-patterns-2/src/main/java/com/baeldung/nullobject/JmsRouter.java
@@ -0,0 +1,10 @@
+package com.baeldung.nullobject;
+
+public class JmsRouter implements Router {
+
+ @Override
+ public void route(Message msg) {
+ System.out.println("Routing to a JMS queue. Msg: " + msg);
+ }
+
+}
diff --git a/patterns/design-patterns-2/src/main/java/com/baeldung/nullobject/Message.java b/patterns/design-patterns-2/src/main/java/com/baeldung/nullobject/Message.java
new file mode 100644
index 0000000000..9086b6d92d
--- /dev/null
+++ b/patterns/design-patterns-2/src/main/java/com/baeldung/nullobject/Message.java
@@ -0,0 +1,24 @@
+package com.baeldung.nullobject;
+
+public class Message {
+
+ private String body;
+
+ private String priority;
+
+ public Message(String body, String priority) {
+ this.body = body;
+ this.priority = priority;
+ }
+
+ public String getPriority() {
+ return priority;
+ }
+
+ @Override
+ public String toString() {
+ return "{body='" + body + '\'' +
+ ", priority='" + priority + '\'' +
+ '}';
+ }
+}
diff --git a/patterns/design-patterns-2/src/main/java/com/baeldung/nullobject/NullRouter.java b/patterns/design-patterns-2/src/main/java/com/baeldung/nullobject/NullRouter.java
new file mode 100644
index 0000000000..a0065a321d
--- /dev/null
+++ b/patterns/design-patterns-2/src/main/java/com/baeldung/nullobject/NullRouter.java
@@ -0,0 +1,10 @@
+package com.baeldung.nullobject;
+
+public class NullRouter implements Router {
+
+ @Override
+ public void route(Message msg) {
+ // do nothing
+ }
+
+}
diff --git a/patterns/design-patterns-2/src/main/java/com/baeldung/nullobject/Router.java b/patterns/design-patterns-2/src/main/java/com/baeldung/nullobject/Router.java
new file mode 100644
index 0000000000..3e67de9558
--- /dev/null
+++ b/patterns/design-patterns-2/src/main/java/com/baeldung/nullobject/Router.java
@@ -0,0 +1,7 @@
+package com.baeldung.nullobject;
+
+public interface Router {
+
+ void route(Message msg);
+
+}
diff --git a/patterns/design-patterns-2/src/main/java/com/baeldung/nullobject/RouterFactory.java b/patterns/design-patterns-2/src/main/java/com/baeldung/nullobject/RouterFactory.java
new file mode 100644
index 0000000000..ba80834865
--- /dev/null
+++ b/patterns/design-patterns-2/src/main/java/com/baeldung/nullobject/RouterFactory.java
@@ -0,0 +1,23 @@
+package com.baeldung.nullobject;
+
+public class RouterFactory {
+
+ public static Router getRouterForMessage(Message msg) {
+
+ if (msg.getPriority() == null) {
+ return new NullRouter();
+ }
+
+ switch (msg.getPriority()) {
+ case "high":
+ return new SmsRouter();
+
+ case "medium":
+ return new JmsRouter();
+
+ default:
+ return new NullRouter();
+ }
+
+ }
+}
diff --git a/patterns/design-patterns-2/src/main/java/com/baeldung/nullobject/RoutingHandler.java b/patterns/design-patterns-2/src/main/java/com/baeldung/nullobject/RoutingHandler.java
new file mode 100644
index 0000000000..282b066085
--- /dev/null
+++ b/patterns/design-patterns-2/src/main/java/com/baeldung/nullobject/RoutingHandler.java
@@ -0,0 +1,30 @@
+package com.baeldung.nullobject;
+
+import java.util.Arrays;
+import java.util.List;
+
+public class RoutingHandler {
+
+ public void handle(Iterable messages){
+ for (Message msg : messages) {
+ Router router = RouterFactory.getRouterForMessage(msg);
+ router.route(msg);
+ }
+ }
+
+ public static void main(String[] args) {
+ Message highPriorityMsg = new Message("Alert!", "high");
+ Message mediumPriorityMsg = new Message("Warning!", "medium");
+ Message lowPriorityMsg = new Message("Take a look!", "low");
+ Message nullPriorityMsg = new Message("Take a look!", null);
+
+ List messages = Arrays.asList(highPriorityMsg,
+ mediumPriorityMsg,
+ lowPriorityMsg,
+ nullPriorityMsg);
+
+ RoutingHandler routingHandler = new RoutingHandler();
+ routingHandler.handle(messages);
+
+ }
+}
diff --git a/patterns/design-patterns-2/src/main/java/com/baeldung/nullobject/SmsRouter.java b/patterns/design-patterns-2/src/main/java/com/baeldung/nullobject/SmsRouter.java
new file mode 100644
index 0000000000..3e8e2f15f3
--- /dev/null
+++ b/patterns/design-patterns-2/src/main/java/com/baeldung/nullobject/SmsRouter.java
@@ -0,0 +1,10 @@
+package com.baeldung.nullobject;
+
+public class SmsRouter implements Router {
+
+ @Override
+ public void route(Message msg) {
+ System.out.println("Routing to a SMS gateway. Msg: " + msg);
+ }
+
+}
diff --git a/patterns/design-patterns/README.md b/patterns/design-patterns/README.md
index 8046d2034b..a4513b7d95 100644
--- a/patterns/design-patterns/README.md
+++ b/patterns/design-patterns/README.md
@@ -18,3 +18,4 @@
- [Chain of Responsibility Design Pattern in Java](http://www.baeldung.com/chain-of-responsibility-pattern)
- [The Command Pattern in Java](http://www.baeldung.com/java-command-pattern)
- [Java Constructors vs Static Factory Methods](https://www.baeldung.com/java-constructors-vs-static-factory-methods)
+- [The Adapter Pattern in Java](https://www.baeldung.com/java-adapter-pattern)
diff --git a/patterns/pom.xml b/patterns/pom.xml
index bc1f5173e2..111e72b9ca 100644
--- a/patterns/pom.xml
+++ b/patterns/pom.xml
@@ -17,6 +17,8 @@
front-controller
intercepting-filter
design-patterns
+ design-patterns-2
+ solid
diff --git a/patterns/principles/solid/README.md b/patterns/principles/solid/README.md
new file mode 100644
index 0000000000..e2d72ecd28
--- /dev/null
+++ b/patterns/principles/solid/README.md
@@ -0,0 +1,5 @@
+### Relevant Articles:
+
+- [A Guide to Solid Principles](https://www.baeldung.com/solid-principles)
+
+
diff --git a/patterns/solid/pom.xml b/patterns/solid/pom.xml
new file mode 100644
index 0000000000..146a9903cf
--- /dev/null
+++ b/patterns/solid/pom.xml
@@ -0,0 +1,18 @@
+
+
+ 4.0.0
+ com.baeldung
+ solid
+ solid
+ 1.0-SNAPSHOT
+
+
+ com.baeldung
+ patterns
+ 1.0.0-SNAPSHOT
+ ..
+
+
+
diff --git a/patterns/solid/src/main/java/com/baeldung/d/Keyboard.java b/patterns/solid/src/main/java/com/baeldung/d/Keyboard.java
new file mode 100644
index 0000000000..cc6fc47d65
--- /dev/null
+++ b/patterns/solid/src/main/java/com/baeldung/d/Keyboard.java
@@ -0,0 +1,4 @@
+package com.baeldung.d;
+
+public interface Keyboard {
+}
diff --git a/patterns/solid/src/main/java/com/baeldung/d/Monitor.java b/patterns/solid/src/main/java/com/baeldung/d/Monitor.java
new file mode 100644
index 0000000000..c0ab7a53b2
--- /dev/null
+++ b/patterns/solid/src/main/java/com/baeldung/d/Monitor.java
@@ -0,0 +1,6 @@
+package com.baeldung.d;
+
+public class Monitor {
+
+
+}
diff --git a/patterns/solid/src/main/java/com/baeldung/d/StandardKeyboard.java b/patterns/solid/src/main/java/com/baeldung/d/StandardKeyboard.java
new file mode 100644
index 0000000000..cb0e229943
--- /dev/null
+++ b/patterns/solid/src/main/java/com/baeldung/d/StandardKeyboard.java
@@ -0,0 +1,5 @@
+package com.baeldung.d;
+
+public class StandardKeyboard implements Keyboard {
+
+}
diff --git a/patterns/solid/src/main/java/com/baeldung/d/Windows98Machine.java b/patterns/solid/src/main/java/com/baeldung/d/Windows98Machine.java
new file mode 100644
index 0000000000..4d6ead9aa2
--- /dev/null
+++ b/patterns/solid/src/main/java/com/baeldung/d/Windows98Machine.java
@@ -0,0 +1,15 @@
+package com.baeldung.d;
+
+public class Windows98Machine {
+
+ private final StandardKeyboard keyboard;
+ private final Monitor monitor;
+
+ public Windows98Machine() {
+
+ monitor = new Monitor();
+ keyboard = new StandardKeyboard();
+
+ }
+
+}
diff --git a/patterns/solid/src/main/java/com/baeldung/d/Windows98MachineDI.java b/patterns/solid/src/main/java/com/baeldung/d/Windows98MachineDI.java
new file mode 100644
index 0000000000..2a6fd74a41
--- /dev/null
+++ b/patterns/solid/src/main/java/com/baeldung/d/Windows98MachineDI.java
@@ -0,0 +1,12 @@
+package com.baeldung.d;
+
+public class Windows98MachineDI {
+
+ private final Keyboard keyboard;
+ private final Monitor monitor;
+
+ public Windows98MachineDI(Keyboard keyboard, Monitor monitor) {
+ this.keyboard = keyboard;
+ this.monitor = monitor;
+ }
+}
diff --git a/patterns/solid/src/main/java/com/baeldung/i/BearCarer.java b/patterns/solid/src/main/java/com/baeldung/i/BearCarer.java
new file mode 100644
index 0000000000..3d69211674
--- /dev/null
+++ b/patterns/solid/src/main/java/com/baeldung/i/BearCarer.java
@@ -0,0 +1,12 @@
+package com.baeldung.i;
+
+public class BearCarer implements BearCleaner, BearFeeder {
+
+ public void washTheBear() {
+ //I think we missed a spot..
+ }
+
+ public void feedTheBear() {
+ //Tuna tuesdays..
+ }
+}
diff --git a/patterns/solid/src/main/java/com/baeldung/i/BearCleaner.java b/patterns/solid/src/main/java/com/baeldung/i/BearCleaner.java
new file mode 100644
index 0000000000..e2b71b2ce8
--- /dev/null
+++ b/patterns/solid/src/main/java/com/baeldung/i/BearCleaner.java
@@ -0,0 +1,5 @@
+package com.baeldung.i;
+
+public interface BearCleaner {
+ void washTheBear();
+}
diff --git a/patterns/solid/src/main/java/com/baeldung/i/BearFeeder.java b/patterns/solid/src/main/java/com/baeldung/i/BearFeeder.java
new file mode 100644
index 0000000000..5d0ba7cd29
--- /dev/null
+++ b/patterns/solid/src/main/java/com/baeldung/i/BearFeeder.java
@@ -0,0 +1,5 @@
+package com.baeldung.i;
+
+public interface BearFeeder {
+ void feedTheBear();
+}
diff --git a/patterns/solid/src/main/java/com/baeldung/i/BearKeeper.java b/patterns/solid/src/main/java/com/baeldung/i/BearKeeper.java
new file mode 100644
index 0000000000..f09774a5ff
--- /dev/null
+++ b/patterns/solid/src/main/java/com/baeldung/i/BearKeeper.java
@@ -0,0 +1,9 @@
+package com.baeldung.i;
+
+public interface BearKeeper {
+
+ void washTheBear();
+ void feedTheBear();
+ void petTheBear();
+
+}
diff --git a/patterns/solid/src/main/java/com/baeldung/i/BearPetter.java b/patterns/solid/src/main/java/com/baeldung/i/BearPetter.java
new file mode 100644
index 0000000000..a913cf3d8a
--- /dev/null
+++ b/patterns/solid/src/main/java/com/baeldung/i/BearPetter.java
@@ -0,0 +1,5 @@
+package com.baeldung.i;
+
+public interface BearPetter {
+ void petTheBear();
+}
diff --git a/patterns/solid/src/main/java/com/baeldung/i/CrazyPerson.java b/patterns/solid/src/main/java/com/baeldung/i/CrazyPerson.java
new file mode 100644
index 0000000000..aae0d4c11b
--- /dev/null
+++ b/patterns/solid/src/main/java/com/baeldung/i/CrazyPerson.java
@@ -0,0 +1,8 @@
+package com.baeldung.i;
+
+public class CrazyPerson implements BearPetter {
+
+ public void petTheBear() {
+ //Good luck with that!
+ }
+}
diff --git a/patterns/solid/src/main/java/com/baeldung/l/Car.java b/patterns/solid/src/main/java/com/baeldung/l/Car.java
new file mode 100644
index 0000000000..b3481f894a
--- /dev/null
+++ b/patterns/solid/src/main/java/com/baeldung/l/Car.java
@@ -0,0 +1,8 @@
+package com.baeldung.l;
+
+public interface Car {
+
+ void turnOnEngine();
+ void accelerate();
+
+}
diff --git a/patterns/solid/src/main/java/com/baeldung/l/ElectricCar.java b/patterns/solid/src/main/java/com/baeldung/l/ElectricCar.java
new file mode 100644
index 0000000000..fd919c5659
--- /dev/null
+++ b/patterns/solid/src/main/java/com/baeldung/l/ElectricCar.java
@@ -0,0 +1,12 @@
+package com.baeldung.l;
+
+public class ElectricCar implements Car {
+
+ public void turnOnEngine() {
+ throw new AssertionError("I don't have an engine!");
+ }
+
+ public void accelerate() {
+ //this acceleration is crazy!
+ }
+}
diff --git a/patterns/solid/src/main/java/com/baeldung/l/Engine.java b/patterns/solid/src/main/java/com/baeldung/l/Engine.java
new file mode 100644
index 0000000000..a8e38b8877
--- /dev/null
+++ b/patterns/solid/src/main/java/com/baeldung/l/Engine.java
@@ -0,0 +1,13 @@
+package com.baeldung.l;
+
+public class Engine {
+
+ public void on(){
+ //vroom.
+ }
+
+ public void powerOn(int amount){
+ //do something
+ }
+
+}
diff --git a/patterns/solid/src/main/java/com/baeldung/l/MotorCar.java b/patterns/solid/src/main/java/com/baeldung/l/MotorCar.java
new file mode 100644
index 0000000000..638f315475
--- /dev/null
+++ b/patterns/solid/src/main/java/com/baeldung/l/MotorCar.java
@@ -0,0 +1,18 @@
+package com.baeldung.l;
+
+public class MotorCar implements Car {
+
+ private Engine engine;
+
+ //Constructors, getters + setters
+
+ public void turnOnEngine() {
+ //turn on the engine!
+ engine.on();
+ }
+
+ public void accelerate() {
+ //move forward!
+ engine.powerOn(1000);
+ }
+}
diff --git a/patterns/solid/src/main/java/com/baeldung/o/Guitar.java b/patterns/solid/src/main/java/com/baeldung/o/Guitar.java
new file mode 100644
index 0000000000..baab006b5b
--- /dev/null
+++ b/patterns/solid/src/main/java/com/baeldung/o/Guitar.java
@@ -0,0 +1,10 @@
+package com.baeldung.o;
+
+public class Guitar {
+
+ private String make;
+ private String model;
+ private int volume;
+
+ //Constructors, getters & setters
+}
diff --git a/patterns/solid/src/main/java/com/baeldung/o/SuperCoolGuitarWithFlames.java b/patterns/solid/src/main/java/com/baeldung/o/SuperCoolGuitarWithFlames.java
new file mode 100644
index 0000000000..b69e3be74a
--- /dev/null
+++ b/patterns/solid/src/main/java/com/baeldung/o/SuperCoolGuitarWithFlames.java
@@ -0,0 +1,9 @@
+package com.baeldung.o;
+
+public class SuperCoolGuitarWithFlames extends Guitar {
+
+ private String flameColour;
+
+ //constructor, getters + setters
+
+}
diff --git a/patterns/solid/src/main/java/com/baeldung/s/BadBook.java b/patterns/solid/src/main/java/com/baeldung/s/BadBook.java
new file mode 100644
index 0000000000..03c8fcd488
--- /dev/null
+++ b/patterns/solid/src/main/java/com/baeldung/s/BadBook.java
@@ -0,0 +1,27 @@
+package com.baeldung.s;
+
+public class BadBook {
+
+ private String name;
+ private String author;
+ private String text;
+
+ //constructor, getters and setters
+
+
+ //methods that directly relate to the book properties
+ public String replaceWordInText(String word){
+ return text.replaceAll(word, text);
+ }
+
+ public boolean isWordInText(String word){
+ return text.contains(word);
+ }
+
+ //methods for outputting text to console - should this really be here?
+ void printTextToConsole(){
+ //our code for formatting and printing the text
+ }
+
+
+}
diff --git a/patterns/solid/src/main/java/com/baeldung/s/BookPrinter.java b/patterns/solid/src/main/java/com/baeldung/s/BookPrinter.java
new file mode 100644
index 0000000000..0c8ef62e01
--- /dev/null
+++ b/patterns/solid/src/main/java/com/baeldung/s/BookPrinter.java
@@ -0,0 +1,13 @@
+package com.baeldung.s;
+
+public class BookPrinter {
+
+ //methods for outputting text
+ void printTextToConsole(String text){
+ //our code for formatting and printing the text
+ }
+
+ void printTextToAnotherMedium(String text){
+ //code for writing to any other location..
+ }
+}
diff --git a/patterns/solid/src/main/java/com/baeldung/s/GoodBook.java b/patterns/solid/src/main/java/com/baeldung/s/GoodBook.java
new file mode 100644
index 0000000000..b0993aca2b
--- /dev/null
+++ b/patterns/solid/src/main/java/com/baeldung/s/GoodBook.java
@@ -0,0 +1,20 @@
+package com.baeldung.s;
+
+public class GoodBook {
+
+ private String name;
+ private String author;
+ private String text;
+
+ //constructor, getters and setters
+
+ //methods that directly relate to the book properties
+ public String replaceWordInText(String word){
+ return text.replaceAll(word, text);
+ }
+
+ public boolean isWordInText(String word){
+ return text.contains(word);
+ }
+
+}
diff --git a/persistence-modules/activejdbc/pom.xml b/persistence-modules/activejdbc/pom.xml
index 6a29f14ced..45a618b840 100644
--- a/persistence-modules/activejdbc/pom.xml
+++ b/persistence-modules/activejdbc/pom.xml
@@ -3,8 +3,8 @@
4.0.0
activejdbc
1.0-SNAPSHOT
- jar
activejdbc
+ jar
http://maven.apache.org
diff --git a/persistence-modules/apache-cayenne/pom.xml b/persistence-modules/apache-cayenne/pom.xml
index d0c6d1f2b2..776b2b5233 100644
--- a/persistence-modules/apache-cayenne/pom.xml
+++ b/persistence-modules/apache-cayenne/pom.xml
@@ -2,11 +2,10 @@
4.0.0
-
apache-cayenne
0.0.1-SNAPSHOT
- jar
apache-cayenne
+ jar
Introduction to Apache Cayenne
diff --git a/persistence-modules/core-java-persistence/pom.xml b/persistence-modules/core-java-persistence/pom.xml
index f012d60ee6..a777eeb73f 100644
--- a/persistence-modules/core-java-persistence/pom.xml
+++ b/persistence-modules/core-java-persistence/pom.xml
@@ -4,14 +4,16 @@
com.baeldung.core-java-persistence
core-java-persistence
0.1.0-SNAPSHOT
- jar
core-java-persistence
+ jar
+
com.baeldung
parent-java
0.0.1-SNAPSHOT
../../parent-java
+
org.assertj
@@ -50,6 +52,7 @@
${springframework.boot.spring-boot-starter.version}
+
core-java-persistence
@@ -58,7 +61,8 @@
true
-
+
+
3.10.0
1.4.197
@@ -68,4 +72,5 @@
1.5.8.RELEASE
4.3.4.RELEASE
+
\ No newline at end of file
diff --git a/persistence-modules/deltaspike/pom.xml b/persistence-modules/deltaspike/pom.xml
index b798d2f39e..9a4669102a 100644
--- a/persistence-modules/deltaspike/pom.xml
+++ b/persistence-modules/deltaspike/pom.xml
@@ -5,8 +5,8 @@
com.baeldung
deltaspike
1.0
- war
deltaspike
+ war
A starter Java EE 7 webapp which uses DeltaSpike
http://wildfly.org
diff --git a/persistence-modules/flyway/pom.xml b/persistence-modules/flyway/pom.xml
index 237b426521..eb827f5675 100644
--- a/persistence-modules/flyway/pom.xml
+++ b/persistence-modules/flyway/pom.xml
@@ -3,8 +3,8 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
flyway
- jar
flyway
+ jar
Flyway Callbacks Demo
diff --git a/persistence-modules/hibernate5/README.md b/persistence-modules/hibernate5/README.md
index 03bdd9b759..a37720a428 100644
--- a/persistence-modules/hibernate5/README.md
+++ b/persistence-modules/hibernate5/README.md
@@ -18,7 +18,7 @@
- [@JoinColumn Annotation Explained](https://www.baeldung.com/jpa-join-column)
- [Hibernate 5 Naming Strategy Configuration](https://www.baeldung.com/hibernate-naming-strategy)
- [Proxy in Hibernate load() Method](https://www.baeldung.com/hibernate-proxy-load-method)
-- [Custom Types in Hibernate](https://www.baeldung.com/hibernate-custom-types)
+- [Custom Types in Hibernate and the @Type Annotation](https://www.baeldung.com/hibernate-custom-types)
- [Criteria API – An Example of IN Expressions](https://www.baeldung.com/jpa-criteria-api-in-expressions)
- [Difference Between @JoinColumn and mappedBy](https://www.baeldung.com/jpa-joincolumn-vs-mappedby)
- [Hibernate 5 Bootstrapping API](https://www.baeldung.com/hibernate-5-bootstrapping-api)
@@ -29,3 +29,6 @@
- [Hibernate Named Query](https://www.baeldung.com/hibernate-named-query)
- [Using c3p0 with Hibernate](https://www.baeldung.com/hibernate-c3p0)
- [Persist a JSON Object Using Hibernate](https://www.baeldung.com/hibernate-persist-json-object)
+- [Common Hibernate Exceptions](https://www.baeldung.com/hibernate-exceptions)
+- [Hibernate Aggregate Functions](https://www.baeldung.com/hibernate-aggregate-functions)
+- [Hibernate Query Plan Cache](https://www.baeldung.com/hibernate-query-plan-cache)
diff --git a/persistence-modules/hibernate5/pom.xml b/persistence-modules/hibernate5/pom.xml
index af94025a73..a09669c8b5 100644
--- a/persistence-modules/hibernate5/pom.xml
+++ b/persistence-modules/hibernate5/pom.xml
@@ -73,6 +73,16 @@
hibernate-jpamodelgen
${hibernate.version}
+
+ org.openjdk.jmh
+ jmh-core
+ ${openjdk-jmh.version}
+
+
+ org.openjdk.jmh
+ jmh-generator-annprocess
+ ${openjdk-jmh.version}
+
@@ -92,6 +102,7 @@
1.4.196
3.8.0
2.9.7
+ 1.21
diff --git a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/HibernateUtil.java b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/HibernateUtil.java
index e0d1de591b..ea0af97d5a 100644
--- a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/HibernateUtil.java
+++ b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/HibernateUtil.java
@@ -68,6 +68,11 @@ public class HibernateUtil {
return sessionFactory;
}
+ public static SessionFactory getSessionFactoryByProperties(Properties properties) throws IOException {
+ ServiceRegistry serviceRegistry = configureServiceRegistry(properties);
+ return makeSessionFactory(serviceRegistry);
+ }
+
private static SessionFactory makeSessionFactory(ServiceRegistry serviceRegistry) {
MetadataSources metadataSources = new MetadataSources(serviceRegistry);
@@ -119,12 +124,15 @@ public class HibernateUtil {
}
private static ServiceRegistry configureServiceRegistry() throws IOException {
- Properties properties = getProperties();
+ return configureServiceRegistry(getProperties());
+ }
+
+ private static ServiceRegistry configureServiceRegistry(Properties properties) throws IOException {
return new StandardServiceRegistryBuilder().applySettings(properties)
.build();
}
- private static Properties getProperties() throws IOException {
+ public static Properties getProperties() throws IOException {
Properties properties = new Properties();
URL propertiesURL = Thread.currentThread()
.getContextClassLoader()
diff --git a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/pojo/Student.java b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/pojo/Student.java
index a6dec4a30d..9b26c117eb 100644
--- a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/pojo/Student.java
+++ b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/pojo/Student.java
@@ -9,15 +9,43 @@ import javax.persistence.Id;
public class Student {
@Id
- @GeneratedValue (strategy = GenerationType.SEQUENCE)
+ @GeneratedValue(strategy = GenerationType.SEQUENCE)
private long studentId;
+ private String name;
+
+ private int age;
+
+ public Student() {
+ }
+
+ public Student(String name, int age) {
+ this.name = name;
+ this.age = age;
+ }
+
public long getStudentId() {
return studentId;
}
- public void setStudent_id(long studentId) {
+ public void setStudentId(long studentId) {
this.studentId = studentId;
}
-
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public int getAge() {
+ return age;
+ }
+
+ public void setAge(int age) {
+ this.age = age;
+ }
+
}
diff --git a/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/aggregatefunctions/AggregateFunctionsIntegrationTest.java b/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/aggregatefunctions/AggregateFunctionsIntegrationTest.java
new file mode 100644
index 0000000000..0b2bdf7ead
--- /dev/null
+++ b/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/aggregatefunctions/AggregateFunctionsIntegrationTest.java
@@ -0,0 +1,87 @@
+package com.baeldung.hibernate.aggregatefunctions;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.io.IOException;
+
+import org.hibernate.HibernateException;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import com.baeldung.hibernate.HibernateUtil;
+import com.baeldung.hibernate.pojo.Student;
+
+public class AggregateFunctionsIntegrationTest {
+
+ private static Session session;
+ private static Transaction transaction;
+
+ @BeforeClass
+ public static final void setup() throws HibernateException, IOException {
+ session = HibernateUtil.getSessionFactory()
+ .openSession();
+ transaction = session.beginTransaction();
+
+ Student jonas = new Student("Jonas", 22);
+ session.save(jonas);
+
+ Student sally = new Student("Sally", 20);
+ session.save(sally);
+
+ Student simon = new Student("Simon", 25);
+ session.save(simon);
+
+ Student raven = new Student("Raven", 21);
+ session.save(raven);
+
+ Student sam = new Student("Sam", 23);
+ session.save(sam);
+
+ }
+
+ @AfterClass
+ public static final void teardown() {
+ if (session != null) {
+ transaction.rollback();
+ session.close();
+ }
+ }
+
+ @Test
+ public void whenMaxAge_ThenReturnValue() {
+ int maxAge = (int) session.createQuery("SELECT MAX(age) from Student")
+ .getSingleResult();
+ assertThat(maxAge).isEqualTo(25);
+ }
+
+ @Test
+ public void whenMinAge_ThenReturnValue() {
+ int minAge = (int) session.createQuery("SELECT MIN(age) from Student")
+ .getSingleResult();
+ assertThat(minAge).isEqualTo(20);
+ }
+
+ @Test
+ public void whenAverageAge_ThenReturnValue() {
+ Double avgAge = (Double) session.createQuery("SELECT AVG(age) from Student")
+ .getSingleResult();
+ assertThat(avgAge).isEqualTo(22.2);
+ }
+
+ @Test
+ public void whenCountAll_ThenReturnValue() {
+ Long totalStudents = (Long) session.createQuery("SELECT COUNT(*) from Student")
+ .getSingleResult();
+ assertThat(totalStudents).isEqualTo(5);
+ }
+
+ @Test
+ public void whenSumOfAllAges_ThenReturnValue() {
+ Long sumOfAllAges = (Long) session.createQuery("SELECT SUM(age) from Student")
+ .getSingleResult();
+ assertThat(sumOfAllAges).isEqualTo(111);
+ }
+}
diff --git a/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/queryplancache/QueryPlanCacheBenchmark.java b/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/queryplancache/QueryPlanCacheBenchmark.java
new file mode 100644
index 0000000000..13eae3d877
--- /dev/null
+++ b/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/queryplancache/QueryPlanCacheBenchmark.java
@@ -0,0 +1,106 @@
+package com.baeldung.hibernate.queryplancache;
+
+import com.baeldung.hibernate.HibernateUtil;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.hibernate.jpa.QueryHints;
+import org.hibernate.query.Query;
+import org.openjdk.jmh.annotations.Benchmark;
+import org.openjdk.jmh.annotations.BenchmarkMode;
+import org.openjdk.jmh.annotations.Fork;
+import org.openjdk.jmh.annotations.Measurement;
+import org.openjdk.jmh.annotations.Mode;
+import org.openjdk.jmh.annotations.OutputTimeUnit;
+import org.openjdk.jmh.annotations.Param;
+import org.openjdk.jmh.annotations.Scope;
+import org.openjdk.jmh.annotations.Setup;
+import org.openjdk.jmh.annotations.State;
+import org.openjdk.jmh.annotations.TearDown;
+import org.openjdk.jmh.annotations.Warmup;
+import org.openjdk.jmh.infra.Blackhole;
+import org.openjdk.jmh.runner.RunnerException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.util.Properties;
+import java.util.concurrent.TimeUnit;
+
+public class QueryPlanCacheBenchmark {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(QueryPlanCacheBenchmark.class);
+
+ @State(Scope.Thread)
+ public static class QueryPlanCacheBenchMarkState {
+ @Param({"1", "2", "3"})
+ public int planCacheSize;
+
+ public Session session;
+
+ @Setup
+ public void stateSetup() throws IOException {
+ LOGGER.info("State - Setup");
+ session = initSession(planCacheSize);
+ LOGGER.info("State - Setup Complete");
+ }
+
+ private Session initSession(int planCacheSize) throws IOException {
+ Properties properties = HibernateUtil.getProperties();
+ properties.put("hibernate.query.plan_cache_max_size", planCacheSize);
+ properties.put("hibernate.query.plan_parameter_metadata_max_size", planCacheSize);
+ SessionFactory sessionFactory = HibernateUtil.getSessionFactoryByProperties(properties);
+ return sessionFactory.openSession();
+ }
+
+ @TearDown
+ public void tearDownState() {
+ LOGGER.info("State - Teardown");
+ SessionFactory sessionFactory = session.getSessionFactory();
+ session.close();
+ sessionFactory.close();
+ LOGGER.info("State - Teardown complete");
+ }
+ }
+
+ @Benchmark
+ @BenchmarkMode(Mode.AverageTime)
+ @OutputTimeUnit(TimeUnit.MICROSECONDS)
+ @Fork(1)
+ @Warmup(iterations = 2)
+ @Measurement(iterations = 5)
+ public void givenQueryPlanCacheSize_thenCompileQueries(QueryPlanCacheBenchMarkState state, Blackhole blackhole) {
+
+ Query query1 = findEmployeesByDepartmentNameQuery(state.session);
+ Query query2 = findEmployeesByDesignationQuery(state.session);
+ Query query3 = findDepartmentOfAnEmployeeQuery(state.session);
+
+ blackhole.consume(query1);
+ blackhole.consume(query2);
+ blackhole.consume(query3);
+
+ }
+
+ private Query findEmployeesByDepartmentNameQuery(Session session) {
+ return session.createQuery("SELECT e FROM DeptEmployee e " +
+ "JOIN e.department WHERE e.department.name = :deptName")
+ .setMaxResults(30)
+ .setHint(QueryHints.HINT_FETCH_SIZE, 30);
+ }
+
+ private Query findEmployeesByDesignationQuery(Session session) {
+ return session.createQuery("SELECT e FROM DeptEmployee e " +
+ "WHERE e.title = :designation")
+ .setHint(QueryHints.SPEC_HINT_TIMEOUT, 1000);
+ }
+
+ private Query findDepartmentOfAnEmployeeQuery(Session session) {
+ return session.createQuery("SELECT e.department FROM DeptEmployee e " +
+ "JOIN e.department WHERE e.employeeNumber = :empId");
+
+ }
+
+ public static void main(String... args) throws IOException, RunnerException {
+ //main-class to run the benchmark
+ org.openjdk.jmh.Main.main(args);
+ }
+}
diff --git a/persistence-modules/influxdb/pom.xml b/persistence-modules/influxdb/pom.xml
index 5043d61897..8e1aeebe6d 100644
--- a/persistence-modules/influxdb/pom.xml
+++ b/persistence-modules/influxdb/pom.xml
@@ -4,8 +4,8 @@
4.0.0
influxdb
0.1-SNAPSHOT
- jar
influxdb
+ jar
InfluxDB SDK Tutorial
diff --git a/persistence-modules/java-jpa/README.md b/persistence-modules/java-jpa/README.md
index 2eea5e60b4..2c26581bab 100644
--- a/persistence-modules/java-jpa/README.md
+++ b/persistence-modules/java-jpa/README.md
@@ -4,3 +4,5 @@
- [A Guide to Stored Procedures with JPA](http://www.baeldung.com/jpa-stored-procedures)
- [Fixing the JPA error “java.lang.String cannot be cast to Ljava.lang.String;”](https://www.baeldung.com/jpa-error-java-lang-string-cannot-be-cast)
- [JPA Entity Graph](https://www.baeldung.com/jpa-entity-graph)
+- [JPA 2.2 Support for Java 8 Date/Time Types](https://www.baeldung.com/jpa-java-time)
+- [Converting Between LocalDate and SQL Date](https://www.baeldung.com/java-convert-localdate-sql-date)
diff --git a/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/util/LocalDateConverter.java b/persistence-modules/java-jpa/src/main/java/com/baeldung/util/LocalDateConverter.java
similarity index 100%
rename from persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/util/LocalDateConverter.java
rename to persistence-modules/java-jpa/src/main/java/com/baeldung/util/LocalDateConverter.java
diff --git a/persistence-modules/jnosql/jnosql-artemis/pom.xml b/persistence-modules/jnosql/jnosql-artemis/pom.xml
index 8a978fb179..a07f26c6ee 100644
--- a/persistence-modules/jnosql/jnosql-artemis/pom.xml
+++ b/persistence-modules/jnosql/jnosql-artemis/pom.xml
@@ -12,11 +12,30 @@
jnosql
1.0-SNAPSHOT
-
-
- 2.4.2
- false
-
+
+
+
+ javax
+ javaee-web-api
+ 8.0
+ provided
+
+
+ org.jnosql.artemis
+ artemis-configuration
+ ${jnosql.version}
+
+
+ org.jnosql.artemis
+ artemis-document
+ ${jnosql.version}
+
+
+ org.jnosql.diana
+ mongodb-driver
+ ${jnosql.version}
+
+
${project.artifactId}
@@ -58,31 +77,9 @@
-
-
-
- javax
- javaee-web-api
- 8.0
- provided
-
-
-
- org.jnosql.artemis
- artemis-configuration
- ${jnosql.version}
-
-
- org.jnosql.artemis
- artemis-document
- ${jnosql.version}
-
-
- org.jnosql.diana
- mongodb-driver
- ${jnosql.version}
-
-
-
+
+ 2.4.2
+ false
+
diff --git a/persistence-modules/jnosql/jnosql-diana/pom.xml b/persistence-modules/jnosql/jnosql-diana/pom.xml
index 126f0314d9..b52c808cf5 100644
--- a/persistence-modules/jnosql/jnosql-diana/pom.xml
+++ b/persistence-modules/jnosql/jnosql-diana/pom.xml
@@ -12,45 +12,6 @@
1.0-SNAPSHOT
-
-
-
- org.codehaus.mojo
- exec-maven-plugin
- 1.6.0
-
-
- document
-
- java
-
-
- com.baeldung.jnosql.diana.document.DocumentApp
-
-
-
- column
-
- java
-
-
- com.baeldung.jnosql.diana.column.ColumnFamilyApp
-
-
-
- key
-
- java
-
-
- com.baeldung.jnosql.diana.key.KeyValueApp
-
-
-
-
-
-
-
@@ -90,4 +51,43 @@
+
+
+
+ org.codehaus.mojo
+ exec-maven-plugin
+ 1.6.0
+
+
+ document
+
+ java
+
+
+ com.baeldung.jnosql.diana.document.DocumentApp
+
+
+
+ column
+
+ java
+
+
+ com.baeldung.jnosql.diana.column.ColumnFamilyApp
+
+
+
+ key
+
+ java
+
+
+ com.baeldung.jnosql.diana.key.KeyValueApp
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/persistence-modules/jnosql/pom.xml b/persistence-modules/jnosql/pom.xml
index 5fb29a3b9c..513a447b91 100644
--- a/persistence-modules/jnosql/pom.xml
+++ b/persistence-modules/jnosql/pom.xml
@@ -9,15 +9,14 @@
jnosql
pom
-
- 1.8
- 1.8
- 0.0.5
-
-
jnosql-diana
jnosql-artemis
+
+ 1.8
+ 1.8
+ 0.0.5
+
diff --git a/persistence-modules/pom.xml b/persistence-modules/pom.xml
new file mode 100644
index 0000000000..47c733d8a7
--- /dev/null
+++ b/persistence-modules/pom.xml
@@ -0,0 +1,58 @@
+
+
+ 4.0.0
+ persistence-modules
+ persistence-modules
+ pom
+
+
+ com.baeldung
+ parent-modules
+ 1.0.0-SNAPSHOT
+ ..
+
+
+
+ activejdbc
+ apache-cayenne
+ core-java-persistence
+ deltaspike
+ flyway
+ hbase
+ hibernate5
+ hibernate-ogm
+ influxdb
+ java-cassandra
+ java-cockroachdb
+ java-jdbi
+ java-jpa
+ java-mongodb
+ jnosql
+ liquibase
+ orientdb
+ querydsl
+ redis
+ solr
+ spring-boot-h2/spring-boot-h2-database
+ spring-boot-persistence
+ spring-boot-persistence-mongodb
+ spring-data-cassandra
+ spring-data-cassandra-reactive
+ spring-data-couchbase-2
+ spring-data-dynamodb
+ spring-data-eclipselink
+ spring-data-elasticsearch
+ spring-data-gemfire
+ spring-data-jpa
+ spring-data-keyvalue
+ spring-data-mongodb
+ spring-data-neo4j
+ spring-data-redis
+ spring-data-solr
+ spring-hibernate-3
+ spring-hibernate-5
+ spring-hibernate4
+ spring-jpa
+
+
diff --git a/persistence-modules/querydsl/pom.xml b/persistence-modules/querydsl/pom.xml
index d3bf1b1fb7..4d4347e909 100644
--- a/persistence-modules/querydsl/pom.xml
+++ b/persistence-modules/querydsl/pom.xml
@@ -5,8 +5,8 @@
com.baeldung
querydsl
0.1-SNAPSHOT
- jar
querydsl
+ jar
http://maven.apache.org
diff --git a/persistence-modules/solr/pom.xml b/persistence-modules/solr/pom.xml
index 49f2f85856..1c14c06315 100644
--- a/persistence-modules/solr/pom.xml
+++ b/persistence-modules/solr/pom.xml
@@ -4,8 +4,8 @@
com.baeldung
solr
0.0.1-SNAPSHOT
- jar
solr
+ jar
com.baeldung
diff --git a/persistence-modules/spring-boot-h2/spring-boot-h2-database/pom.xml b/persistence-modules/spring-boot-h2/spring-boot-h2-database/pom.xml
index 6ebc75de8d..882b88b535 100644
--- a/persistence-modules/spring-boot-h2/spring-boot-h2-database/pom.xml
+++ b/persistence-modules/spring-boot-h2/spring-boot-h2-database/pom.xml
@@ -8,30 +8,20 @@
0.0.1-SNAPSHOT
spring-boot-h2-database
jar
-
Demo Spring Boot applications that starts H2 in memory database
- org.springframework.boot
- spring-boot-starter-parent
- 2.0.4.RELEASE
-
+ parent-boot-2
+ com.baeldung
+ 0.0.1-SNAPSHOT
+ ../../../parent-boot-2
-
- UTF-8
- UTF-8
- 1.8
-
- com.baeldung.h2db.demo.server.SpringBootApp
-
-
org.springframework.boot
spring-boot-starter-data-jpa
-
com.h2database
h2
@@ -51,4 +41,14 @@
+
+
+ UTF-8
+ UTF-8
+ 1.8
+
+ com.baeldung.h2db.demo.server.SpringBootApp
+ 2.0.4.RELEASE
+
+
diff --git a/persistence-modules/spring-boot-h2/spring-boot-h2-database/src/test/java/com/baeldung/SpringContextIntegrationTest.java b/persistence-modules/spring-boot-h2/spring-boot-h2-database/src/test/java/com/baeldung/SpringContextIntegrationTest.java
new file mode 100644
index 0000000000..cf964b5011
--- /dev/null
+++ b/persistence-modules/spring-boot-h2/spring-boot-h2-database/src/test/java/com/baeldung/SpringContextIntegrationTest.java
@@ -0,0 +1,19 @@
+package com.baeldung;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.test.context.support.AnnotationConfigContextLoader;
+import org.springframework.test.context.web.WebAppConfiguration;
+
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(loader = AnnotationConfigContextLoader.class)
+@WebAppConfiguration
+public class SpringContextIntegrationTest {
+
+ @Test
+ public void whenSpringContextIsBootstrapped_thenNoExceptions() {
+ }
+}
diff --git a/persistence-modules/spring-boot-persistence-mongodb/pom.xml b/persistence-modules/spring-boot-persistence-mongodb/pom.xml
index fc267eedf6..86b93c7826 100644
--- a/persistence-modules/spring-boot-persistence-mongodb/pom.xml
+++ b/persistence-modules/spring-boot-persistence-mongodb/pom.xml
@@ -3,6 +3,10 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
+ spring-boot-persistence-mongodb
+ spring-boot-persistence-mongodb
+ war
+ This is simple boot application for Spring boot persistence mongodb test
parent-boot-2
@@ -11,11 +15,6 @@
../../parent-boot-2
- spring-boot-persistence-mongodb
- war
- spring-boot-persistence-mongodb
- This is simple boot application for Spring boot persistence mongodb test
-
org.springframework.boot
diff --git a/persistence-modules/spring-boot-persistence/README.MD b/persistence-modules/spring-boot-persistence/README.MD
index 8988fb4ebd..f62ca57a19 100644
--- a/persistence-modules/spring-boot-persistence/README.MD
+++ b/persistence-modules/spring-boot-persistence/README.MD
@@ -2,6 +2,8 @@
- [Spring Boot with Multiple SQL Import Files](http://www.baeldung.com/spring-boot-sql-import-files)
- [Configuring Separate Spring DataSource for Tests](http://www.baeldung.com/spring-testing-separate-data-source)
-- [Quick Guide on data.sql and schema.sql Files in Spring Boot](http://www.baeldung.com/spring-boot-data-sql-and-schema-sql)
+- [Quick Guide on Loading Initial Data with Spring Boot](http://www.baeldung.com/spring-boot-data-sql-and-schema-sql)
- [Configuring a Tomcat Connection Pool in Spring Boot](https://www.baeldung.com/spring-boot-tomcat-connection-pool)
- [Hibernate Field Naming with Spring Boot](https://www.baeldung.com/hibernate-field-naming-spring-boot)
+- [Integrating Spring Boot with HSQLDB](https://www.baeldung.com/spring-boot-hsqldb)
+- [Configuring a DataSource Programmatically in Spring Boot](https://www.baeldung.com/spring-boot-configure-data-source-programmatic)
diff --git a/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/springbootdatasourceconfig/application/Application.java b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/springbootdatasourceconfig/application/Application.java
new file mode 100644
index 0000000000..e1f67c0185
--- /dev/null
+++ b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/springbootdatasourceconfig/application/Application.java
@@ -0,0 +1,27 @@
+package com.baeldung.springbootdatasourceconfig.application;
+
+import com.baeldung.springbootdatasourceconfig.application.entities.User;
+import com.baeldung.springbootdatasourceconfig.application.repositories.UserRepository;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.Bean;
+
+@SpringBootApplication
+public class Application {
+
+ public static void main(String[] args) {
+ SpringApplication.run(Application.class, args);
+ }
+
+ @Bean
+ public CommandLineRunner run(UserRepository userRepository) throws Exception {
+ return (String[] args) -> {
+ User user1 = new User("John", "john@domain.com");
+ User user2 = new User("Julie", "julie@domain.com");
+ userRepository.save(user1);
+ userRepository.save(user2);
+ userRepository.findAll().forEach(user -> System.out.println(user.getName()));
+ };
+ }
+}
diff --git a/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/springbootdatasourceconfig/application/datasources/DataSourceBean.java b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/springbootdatasourceconfig/application/datasources/DataSourceBean.java
new file mode 100644
index 0000000000..9ef9b77aed
--- /dev/null
+++ b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/springbootdatasourceconfig/application/datasources/DataSourceBean.java
@@ -0,0 +1,20 @@
+package com.baeldung.springbootdatasourceconfig.application.datasources;
+
+import javax.sql.DataSource;
+import org.springframework.boot.jdbc.DataSourceBuilder;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class DataSourceBean {
+
+ @Bean
+ public DataSource getDataSource() {
+ DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create();
+ dataSourceBuilder.driverClassName("org.h2.Driver");
+ dataSourceBuilder.url("jdbc:h2:mem:test");
+ dataSourceBuilder.username("SA");
+ dataSourceBuilder.password("");
+ return dataSourceBuilder.build();
+ }
+}
diff --git a/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/springbootdatasourceconfig/application/entities/User.java b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/springbootdatasourceconfig/application/entities/User.java
new file mode 100644
index 0000000000..518a11701f
--- /dev/null
+++ b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/springbootdatasourceconfig/application/entities/User.java
@@ -0,0 +1,46 @@
+package com.baeldung.springbootdatasourceconfig.application.entities;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "users")
+public class User {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.AUTO)
+ private long id;
+ private String name;
+ private String email;
+
+ public User(){}
+
+ public User(String name, String email) {
+ this.name = name;
+ this.email = email;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getEmail() {
+ return email;
+ }
+
+ public void setEmail(String email) {
+ this.email = email;
+ }
+
+ @Override
+ public String toString() {
+ return "User{" + "id=" + id + ", name=" + name + ", email=" + email + '}';
+ }
+}
diff --git a/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/springbootdatasourceconfig/application/repositories/UserRepository.java b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/springbootdatasourceconfig/application/repositories/UserRepository.java
new file mode 100644
index 0000000000..27929ead44
--- /dev/null
+++ b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/springbootdatasourceconfig/application/repositories/UserRepository.java
@@ -0,0 +1,8 @@
+package com.baeldung.springbootdatasourceconfig.application.repositories;
+
+import com.baeldung.springbootdatasourceconfig.application.entities.User;
+import org.springframework.data.repository.CrudRepository;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface UserRepository extends CrudRepository {}
diff --git a/persistence-modules/spring-boot-persistence/src/test/java/com/baeldung/springbootdatasourceconfig/tests/UserRepositoryIntegrationTest.java b/persistence-modules/spring-boot-persistence/src/test/java/com/baeldung/springbootdatasourceconfig/tests/UserRepositoryIntegrationTest.java
new file mode 100644
index 0000000000..f27681021e
--- /dev/null
+++ b/persistence-modules/spring-boot-persistence/src/test/java/com/baeldung/springbootdatasourceconfig/tests/UserRepositoryIntegrationTest.java
@@ -0,0 +1,28 @@
+package com.baeldung.springbootdatasourceconfig.tests;
+
+import com.baeldung.springbootdatasourceconfig.application.entities.User;
+import com.baeldung.springbootdatasourceconfig.application.repositories.UserRepository;
+import java.util.List;
+import java.util.Optional;
+import org.junit.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import static org.assertj.core.api.Assertions.assertThat;
+import org.junit.runner.RunWith;
+import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+@RunWith(SpringRunner.class)
+@DataJpaTest
+public class UserRepositoryIntegrationTest {
+
+ @Autowired
+ private UserRepository userRepository;
+
+ @Test
+ public void whenCalledSave_thenCorrectNumberOfUsers() {
+ userRepository.save(new User("Bob", "bob@domain.com"));
+ List users = (List) userRepository.findAll();
+
+ assertThat(users.size()).isEqualTo(1);
+ }
+}
diff --git a/persistence-modules/spring-data-cassandra-reactive/pom.xml b/persistence-modules/spring-data-cassandra-reactive/pom.xml
index 5303f9a53a..d2bc574ee9 100644
--- a/persistence-modules/spring-data-cassandra-reactive/pom.xml
+++ b/persistence-modules/spring-data-cassandra-reactive/pom.xml
@@ -3,13 +3,11 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
-
com.baeldung
spring-data-cassandra-reactive
0.0.1-SNAPSHOT
- jar
-
spring-data-cassandra-reactive
+ jar
Spring Data Cassandra reactive
@@ -19,13 +17,6 @@
../../parent-boot-2
-
- UTF-8
- UTF-8
-
- 1.8
-
-
org.springframework.data
@@ -57,5 +48,11 @@
+
+ UTF-8
+ UTF-8
+
+ 1.8
+
diff --git a/persistence-modules/spring-data-cassandra/pom.xml b/persistence-modules/spring-data-cassandra/pom.xml
index 11953a734b..4f323a72d8 100644
--- a/persistence-modules/spring-data-cassandra/pom.xml
+++ b/persistence-modules/spring-data-cassandra/pom.xml
@@ -4,8 +4,8 @@
com.baeldung
spring-data-cassandra
0.0.1-SNAPSHOT
- jar
spring-data-cassandra
+ jar
com.baeldung
diff --git a/persistence-modules/spring-data-couchbase-2/README.md b/persistence-modules/spring-data-couchbase-2/README.md
index 2e56b25fef..2b6a1faddf 100644
--- a/persistence-modules/spring-data-couchbase-2/README.md
+++ b/persistence-modules/spring-data-couchbase-2/README.md
@@ -1,7 +1,7 @@
## Spring Data Couchbase Tutorial Project
### Relevant Articles:
-- [Spring Data Couchbase](http://www.baeldung.com/spring-data-couchbase)
+- [Intro to Spring Data Couchbase](http://www.baeldung.com/spring-data-couchbase)
- [Entity Validation, Query Consistency, and Optimistic Locking in Spring Data Couchbase](http://www.baeldung.com/entity-validation-locking-and-query-consistency-in-spring-data-couchbase)
- [Multiple Buckets and Spatial View Queries in Spring Data Couchbase](http://www.baeldung.com/spring-data-couchbase-buckets-and-spatial-view-queries)
diff --git a/persistence-modules/spring-data-couchbase-2/src/test/java/org/baeldung/SpringContextIntegrationTest.java b/persistence-modules/spring-data-couchbase-2/src/test/java/org/baeldung/SpringContextLiveTest.java
similarity index 95%
rename from persistence-modules/spring-data-couchbase-2/src/test/java/org/baeldung/SpringContextIntegrationTest.java
rename to persistence-modules/spring-data-couchbase-2/src/test/java/org/baeldung/SpringContextLiveTest.java
index 9c9d58dd0b..af228735b8 100644
--- a/persistence-modules/spring-data-couchbase-2/src/test/java/org/baeldung/SpringContextIntegrationTest.java
+++ b/persistence-modules/spring-data-couchbase-2/src/test/java/org/baeldung/SpringContextLiveTest.java
@@ -12,7 +12,7 @@ import org.springframework.test.context.support.DependencyInjectionTestExecution
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { MultiBucketCouchbaseConfig.class, MultiBucketIntegrationTestConfig.class })
@TestExecutionListeners(listeners = { DependencyInjectionTestExecutionListener.class })
-public class SpringContextIntegrationTest {
+public class SpringContextLiveTest {
@Test
public void whenSpringContextIsBootstrapped_thenNoExceptions() {
diff --git a/persistence-modules/spring-data-couchbase-2/src/test/java/org/baeldung/spring/data/couchbase/service/PersonRepositoryServiceIntegrationTest.java b/persistence-modules/spring-data-couchbase-2/src/test/java/org/baeldung/spring/data/couchbase/service/PersonRepositoryServiceLiveTest.java
similarity index 78%
rename from persistence-modules/spring-data-couchbase-2/src/test/java/org/baeldung/spring/data/couchbase/service/PersonRepositoryServiceIntegrationTest.java
rename to persistence-modules/spring-data-couchbase-2/src/test/java/org/baeldung/spring/data/couchbase/service/PersonRepositoryServiceLiveTest.java
index d710e57def..899c21691d 100644
--- a/persistence-modules/spring-data-couchbase-2/src/test/java/org/baeldung/spring/data/couchbase/service/PersonRepositoryServiceIntegrationTest.java
+++ b/persistence-modules/spring-data-couchbase-2/src/test/java/org/baeldung/spring/data/couchbase/service/PersonRepositoryServiceLiveTest.java
@@ -3,7 +3,7 @@ package org.baeldung.spring.data.couchbase.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
-public class PersonRepositoryServiceIntegrationTest extends PersonServiceIntegrationTest {
+public class PersonRepositoryServiceLiveTest extends PersonServiceLiveTest {
@Autowired
@Qualifier("PersonRepositoryService")
diff --git a/persistence-modules/spring-data-couchbase-2/src/test/java/org/baeldung/spring/data/couchbase/service/PersonServiceIntegrationTest.java b/persistence-modules/spring-data-couchbase-2/src/test/java/org/baeldung/spring/data/couchbase/service/PersonServiceLiveTest.java
similarity index 98%
rename from persistence-modules/spring-data-couchbase-2/src/test/java/org/baeldung/spring/data/couchbase/service/PersonServiceIntegrationTest.java
rename to persistence-modules/spring-data-couchbase-2/src/test/java/org/baeldung/spring/data/couchbase/service/PersonServiceLiveTest.java
index 4044183849..08d641dc2c 100644
--- a/persistence-modules/spring-data-couchbase-2/src/test/java/org/baeldung/spring/data/couchbase/service/PersonServiceIntegrationTest.java
+++ b/persistence-modules/spring-data-couchbase-2/src/test/java/org/baeldung/spring/data/couchbase/service/PersonServiceLiveTest.java
@@ -20,7 +20,7 @@ import com.couchbase.client.java.CouchbaseCluster;
import com.couchbase.client.java.document.JsonDocument;
import com.couchbase.client.java.document.json.JsonObject;
-public abstract class PersonServiceIntegrationTest extends IntegrationTest {
+public abstract class PersonServiceLiveTest extends IntegrationTest {
static final String typeField = "_class";
static final String john = "John";
diff --git a/persistence-modules/spring-data-couchbase-2/src/test/java/org/baeldung/spring/data/couchbase/service/PersonTemplateServiceIntegrationTest.java b/persistence-modules/spring-data-couchbase-2/src/test/java/org/baeldung/spring/data/couchbase/service/PersonTemplateServiceLiveTest.java
similarity index 79%
rename from persistence-modules/spring-data-couchbase-2/src/test/java/org/baeldung/spring/data/couchbase/service/PersonTemplateServiceIntegrationTest.java
rename to persistence-modules/spring-data-couchbase-2/src/test/java/org/baeldung/spring/data/couchbase/service/PersonTemplateServiceLiveTest.java
index e19df8fc84..3bc99d28df 100644
--- a/persistence-modules/spring-data-couchbase-2/src/test/java/org/baeldung/spring/data/couchbase/service/PersonTemplateServiceIntegrationTest.java
+++ b/persistence-modules/spring-data-couchbase-2/src/test/java/org/baeldung/spring/data/couchbase/service/PersonTemplateServiceLiveTest.java
@@ -3,7 +3,7 @@ package org.baeldung.spring.data.couchbase.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
-public class PersonTemplateServiceIntegrationTest extends PersonServiceIntegrationTest {
+public class PersonTemplateServiceLiveTest extends PersonServiceLiveTest {
@Autowired
@Qualifier("PersonTemplateService")
diff --git a/persistence-modules/spring-data-couchbase-2/src/test/java/org/baeldung/spring/data/couchbase/service/StudentRepositoryServiceIntegrationTest.java b/persistence-modules/spring-data-couchbase-2/src/test/java/org/baeldung/spring/data/couchbase/service/StudentRepositoryServiceLiveTest.java
similarity index 78%
rename from persistence-modules/spring-data-couchbase-2/src/test/java/org/baeldung/spring/data/couchbase/service/StudentRepositoryServiceIntegrationTest.java
rename to persistence-modules/spring-data-couchbase-2/src/test/java/org/baeldung/spring/data/couchbase/service/StudentRepositoryServiceLiveTest.java
index 3b3f2a531a..162619db3e 100644
--- a/persistence-modules/spring-data-couchbase-2/src/test/java/org/baeldung/spring/data/couchbase/service/StudentRepositoryServiceIntegrationTest.java
+++ b/persistence-modules/spring-data-couchbase-2/src/test/java/org/baeldung/spring/data/couchbase/service/StudentRepositoryServiceLiveTest.java
@@ -3,7 +3,7 @@ package org.baeldung.spring.data.couchbase.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
-public class StudentRepositoryServiceIntegrationTest extends StudentServiceIntegrationTest {
+public class StudentRepositoryServiceLiveTest extends StudentServiceLiveTest {
@Autowired
@Qualifier("StudentRepositoryService")
diff --git a/persistence-modules/spring-data-couchbase-2/src/test/java/org/baeldung/spring/data/couchbase/service/StudentServiceIntegrationTest.java b/persistence-modules/spring-data-couchbase-2/src/test/java/org/baeldung/spring/data/couchbase/service/StudentServiceLiveTest.java
similarity index 98%
rename from persistence-modules/spring-data-couchbase-2/src/test/java/org/baeldung/spring/data/couchbase/service/StudentServiceIntegrationTest.java
rename to persistence-modules/spring-data-couchbase-2/src/test/java/org/baeldung/spring/data/couchbase/service/StudentServiceLiveTest.java
index fba549a9e5..6a18922007 100644
--- a/persistence-modules/spring-data-couchbase-2/src/test/java/org/baeldung/spring/data/couchbase/service/StudentServiceIntegrationTest.java
+++ b/persistence-modules/spring-data-couchbase-2/src/test/java/org/baeldung/spring/data/couchbase/service/StudentServiceLiveTest.java
@@ -22,7 +22,7 @@ import com.couchbase.client.java.CouchbaseCluster;
import com.couchbase.client.java.document.JsonDocument;
import com.couchbase.client.java.document.json.JsonObject;
-public abstract class StudentServiceIntegrationTest extends IntegrationTest {
+public abstract class StudentServiceLiveTest extends IntegrationTest {
static final String typeField = "_class";
static final String joe = "Joe";
diff --git a/persistence-modules/spring-data-couchbase-2/src/test/java/org/baeldung/spring/data/couchbase/service/StudentTemplateServiceIntegrationTest.java b/persistence-modules/spring-data-couchbase-2/src/test/java/org/baeldung/spring/data/couchbase/service/StudentTemplateServiceLiveTest.java
similarity index 79%
rename from persistence-modules/spring-data-couchbase-2/src/test/java/org/baeldung/spring/data/couchbase/service/StudentTemplateServiceIntegrationTest.java
rename to persistence-modules/spring-data-couchbase-2/src/test/java/org/baeldung/spring/data/couchbase/service/StudentTemplateServiceLiveTest.java
index 29fd605bc6..c666e004af 100644
--- a/persistence-modules/spring-data-couchbase-2/src/test/java/org/baeldung/spring/data/couchbase/service/StudentTemplateServiceIntegrationTest.java
+++ b/persistence-modules/spring-data-couchbase-2/src/test/java/org/baeldung/spring/data/couchbase/service/StudentTemplateServiceLiveTest.java
@@ -3,7 +3,7 @@ package org.baeldung.spring.data.couchbase.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
-public class StudentTemplateServiceIntegrationTest extends StudentServiceIntegrationTest {
+public class StudentTemplateServiceLiveTest extends StudentServiceLiveTest {
@Autowired
@Qualifier("StudentTemplateService")
diff --git a/persistence-modules/spring-data-couchbase-2/src/test/java/org/baeldung/spring/data/couchbase2b/MultiBucketIntegrationTest.java b/persistence-modules/spring-data-couchbase-2/src/test/java/org/baeldung/spring/data/couchbase2b/MultiBucketLiveTest.java
similarity index 92%
rename from persistence-modules/spring-data-couchbase-2/src/test/java/org/baeldung/spring/data/couchbase2b/MultiBucketIntegrationTest.java
rename to persistence-modules/spring-data-couchbase-2/src/test/java/org/baeldung/spring/data/couchbase2b/MultiBucketLiveTest.java
index 05ba58d616..3b406a851e 100644
--- a/persistence-modules/spring-data-couchbase-2/src/test/java/org/baeldung/spring/data/couchbase2b/MultiBucketIntegrationTest.java
+++ b/persistence-modules/spring-data-couchbase-2/src/test/java/org/baeldung/spring/data/couchbase2b/MultiBucketLiveTest.java
@@ -9,6 +9,6 @@ import org.springframework.test.context.support.DependencyInjectionTestExecution
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { MultiBucketCouchbaseConfig.class, MultiBucketIntegrationTestConfig.class })
@TestExecutionListeners(listeners = { DependencyInjectionTestExecutionListener.class })
-public abstract class MultiBucketIntegrationTest {
+public abstract class MultiBucketLiveTest {
}
diff --git a/persistence-modules/spring-data-couchbase-2/src/test/java/org/baeldung/spring/data/couchbase2b/service/CampusServiceImplIntegrationTest.java b/persistence-modules/spring-data-couchbase-2/src/test/java/org/baeldung/spring/data/couchbase2b/service/CampusServiceImplLiveTest.java
similarity index 96%
rename from persistence-modules/spring-data-couchbase-2/src/test/java/org/baeldung/spring/data/couchbase2b/service/CampusServiceImplIntegrationTest.java
rename to persistence-modules/spring-data-couchbase-2/src/test/java/org/baeldung/spring/data/couchbase2b/service/CampusServiceImplLiveTest.java
index 0996b252f1..5e7a12f292 100644
--- a/persistence-modules/spring-data-couchbase-2/src/test/java/org/baeldung/spring/data/couchbase2b/service/CampusServiceImplIntegrationTest.java
+++ b/persistence-modules/spring-data-couchbase-2/src/test/java/org/baeldung/spring/data/couchbase2b/service/CampusServiceImplLiveTest.java
@@ -10,7 +10,7 @@ import java.util.Set;
import javax.annotation.PostConstruct;
import org.baeldung.spring.data.couchbase.model.Campus;
-import org.baeldung.spring.data.couchbase2b.MultiBucketIntegrationTest;
+import org.baeldung.spring.data.couchbase2b.MultiBucketLiveTest;
import org.baeldung.spring.data.couchbase2b.repos.CampusRepository;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
@@ -18,7 +18,7 @@ import org.springframework.data.geo.Distance;
import org.springframework.data.geo.Metrics;
import org.springframework.data.geo.Point;
-public class CampusServiceImplIntegrationTest extends MultiBucketIntegrationTest {
+public class CampusServiceImplLiveTest extends MultiBucketLiveTest {
@Autowired
private CampusServiceImpl campusService;
diff --git a/persistence-modules/spring-data-couchbase-2/src/test/java/org/baeldung/spring/data/couchbase2b/service/PersonServiceImplIntegrationTest.java b/persistence-modules/spring-data-couchbase-2/src/test/java/org/baeldung/spring/data/couchbase2b/service/PersonServiceImplLiveTest.java
similarity index 96%
rename from persistence-modules/spring-data-couchbase-2/src/test/java/org/baeldung/spring/data/couchbase2b/service/PersonServiceImplIntegrationTest.java
rename to persistence-modules/spring-data-couchbase-2/src/test/java/org/baeldung/spring/data/couchbase2b/service/PersonServiceImplLiveTest.java
index 45475e50f6..9543d8fe12 100644
--- a/persistence-modules/spring-data-couchbase-2/src/test/java/org/baeldung/spring/data/couchbase2b/service/PersonServiceImplIntegrationTest.java
+++ b/persistence-modules/spring-data-couchbase-2/src/test/java/org/baeldung/spring/data/couchbase2b/service/PersonServiceImplLiveTest.java
@@ -9,7 +9,7 @@ import java.util.List;
import org.baeldung.spring.data.couchbase.model.Person;
import org.baeldung.spring.data.couchbase2b.MultiBucketCouchbaseConfig;
-import org.baeldung.spring.data.couchbase2b.MultiBucketIntegrationTest;
+import org.baeldung.spring.data.couchbase2b.MultiBucketLiveTest;
import org.joda.time.DateTime;
import org.junit.BeforeClass;
import org.junit.Test;
@@ -21,7 +21,7 @@ import com.couchbase.client.java.CouchbaseCluster;
import com.couchbase.client.java.document.JsonDocument;
import com.couchbase.client.java.document.json.JsonObject;
-public class PersonServiceImplIntegrationTest extends MultiBucketIntegrationTest {
+public class PersonServiceImplLiveTest extends MultiBucketLiveTest {
static final String typeField = "_class";
static final String john = "John";
diff --git a/persistence-modules/spring-data-couchbase-2/src/test/java/org/baeldung/spring/data/couchbase2b/service/StudentServiceImplIntegrationTest.java b/persistence-modules/spring-data-couchbase-2/src/test/java/org/baeldung/spring/data/couchbase2b/service/StudentServiceImplLiveTest.java
similarity index 97%
rename from persistence-modules/spring-data-couchbase-2/src/test/java/org/baeldung/spring/data/couchbase2b/service/StudentServiceImplIntegrationTest.java
rename to persistence-modules/spring-data-couchbase-2/src/test/java/org/baeldung/spring/data/couchbase2b/service/StudentServiceImplLiveTest.java
index e7c1eab92a..52b9113e8f 100644
--- a/persistence-modules/spring-data-couchbase-2/src/test/java/org/baeldung/spring/data/couchbase2b/service/StudentServiceImplIntegrationTest.java
+++ b/persistence-modules/spring-data-couchbase-2/src/test/java/org/baeldung/spring/data/couchbase2b/service/StudentServiceImplLiveTest.java
@@ -11,7 +11,7 @@ import javax.validation.ConstraintViolationException;
import org.baeldung.spring.data.couchbase.model.Student;
import org.baeldung.spring.data.couchbase2b.MultiBucketCouchbaseConfig;
-import org.baeldung.spring.data.couchbase2b.MultiBucketIntegrationTest;
+import org.baeldung.spring.data.couchbase2b.MultiBucketLiveTest;
import org.joda.time.DateTime;
import org.junit.BeforeClass;
import org.junit.Test;
@@ -23,7 +23,7 @@ import com.couchbase.client.java.CouchbaseCluster;
import com.couchbase.client.java.document.JsonDocument;
import com.couchbase.client.java.document.json.JsonObject;
-public class StudentServiceImplIntegrationTest extends MultiBucketIntegrationTest {
+public class StudentServiceImplLiveTest extends MultiBucketLiveTest {
static final String typeField = "_class";
static final String joe = "Joe";
diff --git a/persistence-modules/spring-data-elasticsearch/pom.xml b/persistence-modules/spring-data-elasticsearch/pom.xml
index ee9e71a1cb..9495d56798 100644
--- a/persistence-modules/spring-data-elasticsearch/pom.xml
+++ b/persistence-modules/spring-data-elasticsearch/pom.xml
@@ -4,8 +4,8 @@
com.baeldung
spring-data-elasticsearch
0.0.1-SNAPSHOT
- jar
spring-data-elasticsearch
+ jar
com.baeldung
diff --git a/persistence-modules/spring-data-jpa/README.md b/persistence-modules/spring-data-jpa/README.md
index 976a692699..9512ad336d 100644
--- a/persistence-modules/spring-data-jpa/README.md
+++ b/persistence-modules/spring-data-jpa/README.md
@@ -19,6 +19,9 @@
- [Sorting Query Results with Spring Data](https://www.baeldung.com/spring-data-sorting)
- [INSERT Statement in JPA](https://www.baeldung.com/jpa-insert)
- [Pagination and Sorting using Spring Data JPA](https://www.baeldung.com/spring-data-jpa-pagination-sorting)
+- [Spring Data JPA Query by Example](https://www.baeldung.com/spring-data-query-by-example)
+- [DB Integration Tests with Spring Boot and Testcontainers](https://www.baeldung.com/spring-boot-testcontainers-integration-test)
+- [Spring Data JPA @Modifying Annotation](https://www.baeldung.com/spring-data-jpa-modifying-annotation)
### Eclipse Config
After importing the project into Eclipse, you may see the following error:
diff --git a/persistence-modules/spring-data-jpa/pom.xml b/persistence-modules/spring-data-jpa/pom.xml
index 786e587734..401f4877ac 100644
--- a/persistence-modules/spring-data-jpa/pom.xml
+++ b/persistence-modules/spring-data-jpa/pom.xml
@@ -27,11 +27,27 @@
org.hibernate
hibernate-envers
+
com.h2database
h2
+
+
+ org.testcontainers
+ postgresql
+ 1.10.6
+ test
+
+
+
+ org.postgresql
+ postgresql
+ 42.2.5
+
+
+
org.springframework.security
spring-security-test
diff --git a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/config/PersistenceConfiguration.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/config/PersistenceConfiguration.java
index 2bdd4e5451..891624443b 100644
--- a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/config/PersistenceConfiguration.java
+++ b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/config/PersistenceConfiguration.java
@@ -1,14 +1,11 @@
package com.baeldung.config;
-import java.util.Properties;
-
-import javax.sql.DataSource;
-
+import com.baeldung.dao.repositories.impl.ExtendedRepositoryImpl;
+import com.baeldung.services.IBarService;
+import com.baeldung.services.impl.BarSpringDataJpaService;
+import com.google.common.base.Preconditions;
import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.ComponentScan;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.PropertySource;
+import org.springframework.context.annotation.*;
import org.springframework.core.env.Environment;
import org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
@@ -21,10 +18,8 @@ import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
-import com.baeldung.dao.repositories.impl.ExtendedRepositoryImpl;
-import com.baeldung.services.IBarService;
-import com.baeldung.services.impl.BarSpringDataJpaService;
-import com.google.common.base.Preconditions;
+import javax.sql.DataSource;
+import java.util.Properties;
@Configuration
@ComponentScan({ "com.baeldung.dao", "com.baeldung.services" })
@@ -32,6 +27,7 @@ import com.google.common.base.Preconditions;
@EnableJpaRepositories(basePackages = { "com.baeldung.dao" }, repositoryBaseClass = ExtendedRepositoryImpl.class)
@EnableJpaAuditing
@PropertySource("classpath:persistence.properties")
+@Profile("!tc")
public class PersistenceConfiguration {
@Autowired
diff --git a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/config/PersistenceProductConfiguration.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/config/PersistenceProductConfiguration.java
index 207fba9bc5..ecaee82ae5 100644
--- a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/config/PersistenceProductConfiguration.java
+++ b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/config/PersistenceProductConfiguration.java
@@ -4,6 +4,7 @@ import com.google.common.base.Preconditions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Profile;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
@@ -19,6 +20,7 @@ import java.util.HashMap;
@Configuration
@PropertySource({"classpath:persistence-multiple-db.properties"})
@EnableJpaRepositories(basePackages = "com.baeldung.dao.repositories.product", entityManagerFactoryRef = "productEntityManager", transactionManagerRef = "productTransactionManager")
+@Profile("!tc")
public class PersistenceProductConfiguration {
@Autowired
private Environment env;
diff --git a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/config/PersistenceUserConfiguration.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/config/PersistenceUserConfiguration.java
index dd32477755..6893d889e6 100644
--- a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/config/PersistenceUserConfiguration.java
+++ b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/config/PersistenceUserConfiguration.java
@@ -2,10 +2,7 @@ package com.baeldung.config;
import com.google.common.base.Preconditions;
import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Primary;
-import org.springframework.context.annotation.PropertySource;
+import org.springframework.context.annotation.*;
import org.springframework.core.env.Environment;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
@@ -20,6 +17,7 @@ import java.util.HashMap;
@Configuration
@PropertySource({"classpath:persistence-multiple-db.properties"})
@EnableJpaRepositories(basePackages = "com.baeldung.dao.repositories.user", entityManagerFactoryRef = "userEntityManager", transactionManagerRef = "userTransactionManager")
+@Profile("!tc")
public class PersistenceUserConfiguration {
@Autowired
private Environment env;
diff --git a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/CustomItemRepository.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/CustomItemRepository.java
index ba077ccf1f..4299f9e3bb 100644
--- a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/CustomItemRepository.java
+++ b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/CustomItemRepository.java
@@ -1,5 +1,7 @@
package com.baeldung.dao.repositories;
+import java.util.List;
+
import org.springframework.stereotype.Repository;
import com.baeldung.domain.Item;
@@ -12,4 +14,8 @@ public interface CustomItemRepository {
Item findItemById(Long id);
void findThenDelete(Long id);
+
+ List- findItemsByColorAndGrade();
+
+ List
- findItemByColorOrGrade();
}
diff --git a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/impl/CustomItemRepositoryImpl.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/impl/CustomItemRepositoryImpl.java
index 53def88af0..9791cb0aa7 100644
--- a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/impl/CustomItemRepositoryImpl.java
+++ b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/impl/CustomItemRepositoryImpl.java
@@ -1,12 +1,18 @@
package com.baeldung.dao.repositories.impl;
+import java.util.List;
+
import javax.persistence.EntityManager;
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
-import com.baeldung.domain.Item;
import com.baeldung.dao.repositories.CustomItemRepository;
+import com.baeldung.domain.Item;
@Repository
public class CustomItemRepositoryImpl implements CustomItemRepository {
@@ -29,4 +35,54 @@ public class CustomItemRepositoryImpl implements CustomItemRepository {
final Item item = entityManager.find(Item.class, id);
entityManager.remove(item);
}
+
+ @Override
+ public List
- findItemsByColorAndGrade() {
+
+ CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
+ CriteriaQuery
- criteriaQuery = criteriaBuilder.createQuery(Item.class);
+ Root
- itemRoot = criteriaQuery.from(Item.class);
+
+ Predicate predicateForBlueColor = criteriaBuilder.equal(itemRoot.get("color"), "blue");
+ Predicate predicateForRedColor = criteriaBuilder.equal(itemRoot.get("color"), "red");
+ Predicate predicateForColor = criteriaBuilder.or(predicateForBlueColor, predicateForRedColor);
+
+ Predicate predicateForGradeA = criteriaBuilder.equal(itemRoot.get("grade"), "A");
+ Predicate predicateForGradeB = criteriaBuilder.equal(itemRoot.get("grade"), "B");
+ Predicate predicateForGrade = criteriaBuilder.or(predicateForGradeA, predicateForGradeB);
+
+ // final search filter
+ Predicate finalPredicate = criteriaBuilder.and(predicateForColor, predicateForGrade);
+
+ criteriaQuery.where(finalPredicate);
+
+ List
- items = entityManager.createQuery(criteriaQuery)
+ .getResultList();
+ return items;
+ }
+
+ @Override
+ public List
- findItemByColorOrGrade() {
+
+ CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
+ CriteriaQuery
- criteriaQuery = criteriaBuilder.createQuery(Item.class);
+ Root
- itemRoot = criteriaQuery.from(Item.class);
+
+ Predicate predicateForBlueColor = criteriaBuilder.equal(itemRoot.get("color"), "red");
+ Predicate predicateForGradeA = criteriaBuilder.equal(itemRoot.get("grade"), "D");
+ Predicate predicateForBlueColorAndGradeA = criteriaBuilder.and(predicateForBlueColor, predicateForGradeA);
+
+ Predicate predicateForRedColor = criteriaBuilder.equal(itemRoot.get("color"), "blue");
+ Predicate predicateForGradeB = criteriaBuilder.equal(itemRoot.get("grade"), "B");
+ Predicate predicateForRedColorAndGradeB = criteriaBuilder.and(predicateForRedColor, predicateForGradeB);
+
+ // final search filter
+ Predicate finalPredicate = criteriaBuilder.or(predicateForBlueColorAndGradeA, predicateForRedColorAndGradeB);
+
+ criteriaQuery.where(finalPredicate);
+
+ List
- items = entityManager.createQuery(criteriaQuery)
+ .getResultList();
+ return items;
+ }
}
diff --git a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/user/UserRepository.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/user/UserRepository.java
index 7f54254832..1d05a17414 100644
--- a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/user/UserRepository.java
+++ b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/user/UserRepository.java
@@ -1,7 +1,6 @@
package com.baeldung.dao.repositories.user;
import com.baeldung.domain.user.User;
-
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
@@ -10,6 +9,7 @@ import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
+import java.time.LocalDate;
import java.util.Collection;
import java.util.List;
import java.util.stream.Stream;
@@ -18,16 +18,19 @@ public interface UserRepository extends JpaRepository
, UserRepos
Stream findAllByName(String name);
+ @Query("select u from User u where u.email like '%@gmail.com'")
+ List findUsersWithGmailAddress();
+
@Query("SELECT u FROM User u WHERE u.status = 1")
Collection findAllActiveUsers();
- @Query(value = "SELECT * FROM USERS.USERS u WHERE u.status = 1", nativeQuery = true)
+ @Query(value = "SELECT * FROM Users u WHERE u.status = 1", nativeQuery = true)
Collection findAllActiveUsersNative();
@Query("SELECT u FROM User u WHERE u.status = ?1")
User findUserByStatus(Integer status);
- @Query(value = "SELECT * FROM USERS.Users u WHERE u.status = ?1", nativeQuery = true)
+ @Query(value = "SELECT * FROM Users u WHERE u.status = ?1", nativeQuery = true)
User findUserByStatusNative(Integer status);
@Query("SELECT u FROM User u WHERE u.status = ?1 and u.name = ?2")
@@ -36,7 +39,7 @@ public interface UserRepository extends JpaRepository , UserRepos
@Query("SELECT u FROM User u WHERE u.status = :status and u.name = :name")
User findUserByStatusAndNameNamedParams(@Param("status") Integer status, @Param("name") String name);
- @Query(value = "SELECT * FROM USERS.Users u WHERE u.status = :status AND u.name = :name", nativeQuery = true)
+ @Query(value = "SELECT * FROM Users u WHERE u.status = :status AND u.name = :name", nativeQuery = true)
User findUserByStatusAndNameNamedParamsNative(@Param("status") Integer status, @Param("name") String name);
@Query("SELECT u FROM User u WHERE u.status = :status and u.name = :name")
@@ -48,7 +51,7 @@ public interface UserRepository extends JpaRepository , UserRepos
@Query("SELECT u FROM User u WHERE u.name like :name%")
User findUserByNameLikeNamedParam(@Param("name") String name);
- @Query(value = "SELECT * FROM USERS.users u WHERE u.name LIKE ?1%", nativeQuery = true)
+ @Query(value = "SELECT * FROM users u WHERE u.name LIKE ?1%", nativeQuery = true)
User findUserByNameLikeNative(String name);
@Query(value = "SELECT u FROM User u")
@@ -57,7 +60,7 @@ public interface UserRepository extends JpaRepository , UserRepos
@Query(value = "SELECT u FROM User u ORDER BY id")
Page findAllUsersWithPagination(Pageable pageable);
- @Query(value = "SELECT * FROM USERS.Users ORDER BY id", countQuery = "SELECT count(*) FROM USERS.Users", nativeQuery = true)
+ @Query(value = "SELECT * FROM Users ORDER BY id", countQuery = "SELECT count(*) FROM Users", nativeQuery = true)
Page findAllUsersWithPaginationNative(Pageable pageable);
@Modifying
@@ -65,6 +68,32 @@ public interface UserRepository extends JpaRepository , UserRepos
int updateUserSetStatusForName(@Param("status") Integer status, @Param("name") String name);
@Modifying
- @Query(value = "UPDATE USERS.Users u SET u.status = ? WHERE u.name = ?", nativeQuery = true)
+ @Query(value = "UPDATE Users u SET u.status = ? WHERE u.name = ?", nativeQuery = true)
int updateUserSetStatusForNameNative(Integer status, String name);
+
+ @Query(value = "INSERT INTO Users (name, age, email, status, active) VALUES (:name, :age, :email, :status, :active)", nativeQuery = true)
+ @Modifying
+ void insertUser(@Param("name") String name, @Param("age") Integer age, @Param("email") String email, @Param("status") Integer status, @Param("active") boolean active);
+
+ @Modifying
+ @Query(value = "UPDATE Users u SET status = ? WHERE u.name = ?", nativeQuery = true)
+ int updateUserSetStatusForNameNativePostgres(Integer status, String name);
+
+ @Query(value = "SELECT u FROM User u WHERE u.name IN :names")
+ List findUserByNameList(@Param("names") Collection names);
+
+ void deleteAllByCreationDateAfter(LocalDate date);
+
+ @Modifying(clearAutomatically = true, flushAutomatically = true)
+ @Query("update User u set u.active = false where u.lastLoginDate < :date")
+ void deactivateUsersNotLoggedInSince(@Param("date") LocalDate date);
+
+ @Modifying(clearAutomatically = true, flushAutomatically = true)
+ @Query("delete from User u where u.active = false")
+ int deleteDeactivatedUsers();
+
+ @Modifying(clearAutomatically = true, flushAutomatically = true)
+ @Query(value = "alter table Users add column deleted int(1) not null default 0", nativeQuery = true)
+ void addDeletedColumn();
+
}
diff --git a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/user/UserRepositoryCustom.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/user/UserRepositoryCustom.java
index 72c1fd5d00..0f29cd656e 100644
--- a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/user/UserRepositoryCustom.java
+++ b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/user/UserRepositoryCustom.java
@@ -1,10 +1,14 @@
package com.baeldung.dao.repositories.user;
+import java.util.Collection;
import java.util.List;
import java.util.Set;
+import java.util.function.Predicate;
import com.baeldung.domain.user.User;
public interface UserRepositoryCustom {
List findUserByEmails(Set emails);
+
+ List findAllUsersByPredicates(Collection> predicates);
}
diff --git a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/user/UserRepositoryCustomImpl.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/user/UserRepositoryCustomImpl.java
index 9f841caf68..7b2a7ab123 100644
--- a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/user/UserRepositoryCustomImpl.java
+++ b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/user/UserRepositoryCustomImpl.java
@@ -1,8 +1,11 @@
package com.baeldung.dao.repositories.user;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.List;
import java.util.Set;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
@@ -40,4 +43,15 @@ public class UserRepositoryCustomImpl implements UserRepositoryCustom {
.getResultList();
}
+ @Override
+ public List findAllUsersByPredicates(Collection> predicates) {
+ List allUsers = entityManager.createQuery("select u from User u", User.class).getResultList();
+ Stream allUsersStream = allUsers.stream();
+ for (java.util.function.Predicate predicate : predicates) {
+ allUsersStream = allUsersStream.filter(predicate);
+ }
+
+ return allUsersStream.collect(Collectors.toList());
+ }
+
}
diff --git a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/domain/user/Possession.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/domain/user/Possession.java
index 614e13df36..b1427c0270 100644
--- a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/domain/user/Possession.java
+++ b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/domain/user/Possession.java
@@ -1,13 +1,9 @@
package com.baeldung.domain.user;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.Table;
+import javax.persistence.*;
@Entity
-@Table(schema = "users")
+@Table
public class Possession {
@Id
diff --git a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/domain/user/User.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/domain/user/User.java
index 3a8b617d9a..7109271eeb 100644
--- a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/domain/user/User.java
+++ b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/domain/user/User.java
@@ -1,16 +1,21 @@
package com.baeldung.domain.user;
import javax.persistence.*;
+import java.time.LocalDate;
import java.util.List;
+import java.util.Objects;
@Entity
-@Table(name = "users", schema = "users")
+@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String name;
+ private LocalDate creationDate;
+ private LocalDate lastLoginDate;
+ private boolean active;
private int age;
@Column(unique = true, nullable = false)
private String email;
@@ -22,10 +27,12 @@ public class User {
super();
}
- public User(String name, String email, Integer status) {
+ public User(String name, LocalDate creationDate, String email, Integer status) {
this.name = name;
+ this.creationDate = creationDate;
this.email = email;
this.status = status;
+ this.active = true;
}
public int getId() {
@@ -44,6 +51,10 @@ public class User {
this.name = name;
}
+ public LocalDate getCreationDate() {
+ return creationDate;
+ }
+
public String getEmail() {
return email;
}
@@ -83,4 +94,37 @@ public class User {
return builder.toString();
}
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ User user = (User) o;
+ return id == user.id &&
+ age == user.age &&
+ Objects.equals(name, user.name) &&
+ Objects.equals(creationDate, user.creationDate) &&
+ Objects.equals(email, user.email) &&
+ Objects.equals(status, user.status);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(id, name, creationDate, age, email, status);
+ }
+
+ public LocalDate getLastLoginDate() {
+ return lastLoginDate;
+ }
+
+ public void setLastLoginDate(LocalDate lastLoginDate) {
+ this.lastLoginDate = lastLoginDate;
+ }
+
+ public boolean isActive() {
+ return active;
+ }
+
+ public void setActive(boolean active) {
+ this.active = active;
+ }
}
\ No newline at end of file
diff --git a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/passenger/Passenger.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/passenger/Passenger.java
index 24ae47e597..a96b1edb20 100644
--- a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/passenger/Passenger.java
+++ b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/passenger/Passenger.java
@@ -25,15 +25,15 @@ class Passenger {
@Basic(optional = false)
@Column(nullable = false)
- private int seatNumber;
+ private Integer seatNumber;
- private Passenger(String firstName, String lastName, int seatNumber) {
+ private Passenger(String firstName, String lastName, Integer seatNumber) {
this.firstName = firstName;
this.lastName = lastName;
this.seatNumber = seatNumber;
}
- static Passenger from(String firstName, String lastName, int seatNumber) {
+ static Passenger from(String firstName, String lastName, Integer seatNumber) {
return new Passenger(firstName, lastName, seatNumber);
}
@@ -76,7 +76,7 @@ class Passenger {
return lastName;
}
- int getSeatNumber() {
+ Integer getSeatNumber() {
return seatNumber;
}
}
diff --git a/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/dao/repositories/UserRepositoryCommon.java b/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/dao/repositories/UserRepositoryCommon.java
new file mode 100644
index 0000000000..abd758cec2
--- /dev/null
+++ b/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/dao/repositories/UserRepositoryCommon.java
@@ -0,0 +1,544 @@
+package com.baeldung.dao.repositories;
+
+import com.baeldung.dao.repositories.user.UserRepository;
+import com.baeldung.domain.user.User;
+import org.junit.After;
+import org.junit.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Sort;
+import org.springframework.data.jpa.domain.JpaSort;
+import org.springframework.data.mapping.PropertyReferenceException;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.persistence.EntityManager;
+import javax.persistence.Query;
+import java.time.LocalDate;
+import java.util.*;
+import java.util.function.Predicate;
+import java.util.stream.Stream;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.Assert.*;
+
+class UserRepositoryCommon {
+
+ final String USER_EMAIL = "email@example.com";
+ final String USER_EMAIL2 = "email2@example.com";
+ final String USER_EMAIL3 = "email3@example.com";
+ final String USER_EMAIL4 = "email4@example.com";
+ final Integer INACTIVE_STATUS = 0;
+ final Integer ACTIVE_STATUS = 1;
+ final String USER_EMAIL5 = "email5@example.com";
+ final String USER_EMAIL6 = "email6@example.com";
+ final String USER_NAME_ADAM = "Adam";
+ final String USER_NAME_PETER = "Peter";
+
+ @Autowired
+ protected UserRepository userRepository;
+ @Autowired
+ private EntityManager entityManager;
+
+ @Test
+ @Transactional
+ public void givenUsersWithSameNameInDB_WhenFindAllByName_ThenReturnStreamOfUsers() {
+ User user1 = new User();
+ user1.setName(USER_NAME_ADAM);
+ user1.setEmail(USER_EMAIL);
+ userRepository.save(user1);
+
+ User user2 = new User();
+ user2.setName(USER_NAME_ADAM);
+ user2.setEmail(USER_EMAIL2);
+ userRepository.save(user2);
+
+ User user3 = new User();
+ user3.setName(USER_NAME_ADAM);
+ user3.setEmail(USER_EMAIL3);
+ userRepository.save(user3);
+
+ User user4 = new User();
+ user4.setName("SAMPLE");
+ user4.setEmail(USER_EMAIL4);
+ userRepository.save(user4);
+
+ try (Stream foundUsersStream = userRepository.findAllByName(USER_NAME_ADAM)) {
+ assertThat(foundUsersStream.count()).isEqualTo(3l);
+ }
+ }
+
+ @Test
+ public void givenUsersInDB_WhenFindAllWithQueryAnnotation_ThenReturnCollectionWithActiveUsers() {
+ User user1 = new User();
+ user1.setName(USER_NAME_ADAM);
+ user1.setEmail(USER_EMAIL);
+ user1.setStatus(ACTIVE_STATUS);
+ userRepository.save(user1);
+
+ User user2 = new User();
+ user2.setName(USER_NAME_ADAM);
+ user2.setEmail(USER_EMAIL2);
+ user2.setStatus(ACTIVE_STATUS);
+ userRepository.save(user2);
+
+ User user3 = new User();
+ user3.setName(USER_NAME_ADAM);
+ user3.setEmail(USER_EMAIL3);
+ user3.setStatus(INACTIVE_STATUS);
+ userRepository.save(user3);
+
+ Collection allActiveUsers = userRepository.findAllActiveUsers();
+
+ assertThat(allActiveUsers.size()).isEqualTo(2);
+ }
+
+ @Test
+ public void givenUsersInDB_WhenFindAllWithQueryAnnotationNative_ThenReturnCollectionWithActiveUsers() {
+ User user1 = new User();
+ user1.setName(USER_NAME_ADAM);
+ user1.setEmail(USER_EMAIL);
+ user1.setStatus(ACTIVE_STATUS);
+ userRepository.save(user1);
+
+ User user2 = new User();
+ user2.setName(USER_NAME_ADAM);
+ user2.setEmail(USER_EMAIL2);
+ user2.setStatus(ACTIVE_STATUS);
+ userRepository.save(user2);
+
+ User user3 = new User();
+ user3.setName(USER_NAME_ADAM);
+ user3.setEmail(USER_EMAIL3);
+ user3.setStatus(INACTIVE_STATUS);
+ userRepository.save(user3);
+
+ Collection allActiveUsers = userRepository.findAllActiveUsersNative();
+
+ assertThat(allActiveUsers.size()).isEqualTo(2);
+ }
+
+ @Test
+ public void givenUserInDB_WhenFindUserByStatusWithQueryAnnotation_ThenReturnActiveUser() {
+ User user = new User();
+ user.setName(USER_NAME_ADAM);
+ user.setEmail(USER_EMAIL);
+ user.setStatus(ACTIVE_STATUS);
+ userRepository.save(user);
+
+ User userByStatus = userRepository.findUserByStatus(ACTIVE_STATUS);
+
+ assertThat(userByStatus.getName()).isEqualTo(USER_NAME_ADAM);
+ }
+
+ @Test
+ public void givenUserInDB_WhenFindUserByStatusWithQueryAnnotationNative_ThenReturnActiveUser() {
+ User user = new User();
+ user.setName(USER_NAME_ADAM);
+ user.setEmail(USER_EMAIL);
+ user.setStatus(ACTIVE_STATUS);
+ userRepository.save(user);
+
+ User userByStatus = userRepository.findUserByStatusNative(ACTIVE_STATUS);
+
+ assertThat(userByStatus.getName()).isEqualTo(USER_NAME_ADAM);
+ }
+
+ @Test
+ public void givenUsersInDB_WhenFindUserByStatusAndNameWithQueryAnnotationIndexedParams_ThenReturnOneUser() {
+ User user = new User();
+ user.setName(USER_NAME_ADAM);
+ user.setEmail(USER_EMAIL);
+ user.setStatus(ACTIVE_STATUS);
+ userRepository.save(user);
+
+ User user2 = new User();
+ user2.setName(USER_NAME_PETER);
+ user2.setEmail(USER_EMAIL2);
+ user2.setStatus(ACTIVE_STATUS);
+ userRepository.save(user2);
+
+ User userByStatus = userRepository.findUserByStatusAndName(ACTIVE_STATUS, USER_NAME_ADAM);
+
+ assertThat(userByStatus.getName()).isEqualTo(USER_NAME_ADAM);
+ }
+
+ @Test
+ public void givenUsersInDB_WhenFindUserByStatusAndNameWithQueryAnnotationNamedParams_ThenReturnOneUser() {
+ User user = new User();
+ user.setName(USER_NAME_ADAM);
+ user.setEmail(USER_EMAIL);
+ user.setStatus(ACTIVE_STATUS);
+ userRepository.save(user);
+
+ User user2 = new User();
+ user2.setName(USER_NAME_PETER);
+ user2.setEmail(USER_EMAIL2);
+ user2.setStatus(ACTIVE_STATUS);
+ userRepository.save(user2);
+
+ User userByStatus = userRepository.findUserByStatusAndNameNamedParams(ACTIVE_STATUS, USER_NAME_ADAM);
+
+ assertThat(userByStatus.getName()).isEqualTo(USER_NAME_ADAM);
+ }
+
+ @Test
+ public void givenUsersInDB_WhenFindUserByStatusAndNameWithQueryAnnotationNativeNamedParams_ThenReturnOneUser() {
+ User user = new User();
+ user.setName(USER_NAME_ADAM);
+ user.setEmail(USER_EMAIL);
+ user.setStatus(ACTIVE_STATUS);
+ userRepository.save(user);
+
+ User user2 = new User();
+ user2.setName(USER_NAME_PETER);
+ user2.setEmail(USER_EMAIL2);
+ user2.setStatus(ACTIVE_STATUS);
+ userRepository.save(user2);
+
+ User userByStatus = userRepository.findUserByStatusAndNameNamedParamsNative(ACTIVE_STATUS, USER_NAME_ADAM);
+
+ assertThat(userByStatus.getName()).isEqualTo(USER_NAME_ADAM);
+ }
+
+ @Test
+ public void givenUsersInDB_WhenFindUserByStatusAndNameWithQueryAnnotationNamedParamsCustomNames_ThenReturnOneUser() {
+ User user = new User();
+ user.setName(USER_NAME_ADAM);
+ user.setEmail(USER_EMAIL);
+ user.setStatus(ACTIVE_STATUS);
+ userRepository.save(user);
+
+ User user2 = new User();
+ user2.setName(USER_NAME_PETER);
+ user2.setEmail(USER_EMAIL2);
+ user2.setStatus(ACTIVE_STATUS);
+ userRepository.save(user2);
+
+ User userByStatus = userRepository.findUserByUserStatusAndUserName(ACTIVE_STATUS, USER_NAME_ADAM);
+
+ assertThat(userByStatus.getName()).isEqualTo(USER_NAME_ADAM);
+ }
+
+ @Test
+ public void givenUsersInDB_WhenFindUserByNameLikeWithQueryAnnotationIndexedParams_ThenReturnUser() {
+ User user = new User();
+ user.setName(USER_NAME_ADAM);
+ user.setEmail(USER_EMAIL);
+ user.setStatus(ACTIVE_STATUS);
+ userRepository.save(user);
+
+ User userByStatus = userRepository.findUserByNameLike("Ad");
+
+ assertThat(userByStatus.getName()).isEqualTo(USER_NAME_ADAM);
+ }
+
+ @Test
+ public void givenUsersInDB_WhenFindUserByNameLikeWithQueryAnnotationNamedParams_ThenReturnUser() {
+ User user = new User();
+ user.setName(USER_NAME_ADAM);
+ user.setEmail(USER_EMAIL);
+ user.setStatus(ACTIVE_STATUS);
+ userRepository.save(user);
+
+ User userByStatus = userRepository.findUserByNameLikeNamedParam("Ad");
+
+ assertThat(userByStatus.getName()).isEqualTo(USER_NAME_ADAM);
+ }
+
+ @Test
+ public void givenUsersInDB_WhenFindUserByNameLikeWithQueryAnnotationNative_ThenReturnUser() {
+ User user = new User();
+ user.setName(USER_NAME_ADAM);
+ user.setEmail(USER_EMAIL);
+ user.setStatus(ACTIVE_STATUS);
+ userRepository.save(user);
+
+ User userByStatus = userRepository.findUserByNameLikeNative("Ad");
+
+ assertThat(userByStatus.getName()).isEqualTo(USER_NAME_ADAM);
+ }
+
+ @Test
+ public void givenUsersInDB_WhenFindAllWithSortByName_ThenReturnUsersSorted() {
+ userRepository.save(new User(USER_NAME_ADAM, LocalDate.now(), USER_EMAIL, ACTIVE_STATUS));
+ userRepository.save(new User(USER_NAME_PETER, LocalDate.now(), USER_EMAIL2, ACTIVE_STATUS));
+ userRepository.save(new User("SAMPLE", LocalDate.now(), USER_EMAIL3, INACTIVE_STATUS));
+
+ List usersSortByName = userRepository.findAll(new Sort(Sort.Direction.ASC, "name"));
+
+ assertThat(usersSortByName.get(0)
+ .getName()).isEqualTo(USER_NAME_ADAM);
+ }
+
+ @Test(expected = PropertyReferenceException.class)
+ public void givenUsersInDB_WhenFindAllSortWithFunction_ThenThrowException() {
+ userRepository.save(new User(USER_NAME_ADAM, LocalDate.now(), USER_EMAIL, ACTIVE_STATUS));
+ userRepository.save(new User(USER_NAME_PETER, LocalDate.now(), USER_EMAIL2, ACTIVE_STATUS));
+ userRepository.save(new User("SAMPLE", LocalDate.now(), USER_EMAIL3, INACTIVE_STATUS));
+
+ userRepository.findAll(new Sort(Sort.Direction.ASC, "name"));
+
+ List usersSortByNameLength = userRepository.findAll(new Sort("LENGTH(name)"));
+
+ assertThat(usersSortByNameLength.get(0)
+ .getName()).isEqualTo(USER_NAME_ADAM);
+ }
+
+ @Test
+ public void givenUsersInDB_WhenFindAllSortWithFunctionQueryAnnotationJPQL_ThenReturnUsersSorted() {
+ userRepository.save(new User(USER_NAME_ADAM, LocalDate.now(), USER_EMAIL, ACTIVE_STATUS));
+ userRepository.save(new User(USER_NAME_PETER, LocalDate.now(), USER_EMAIL2, ACTIVE_STATUS));
+ userRepository.save(new User("SAMPLE", LocalDate.now(), USER_EMAIL3, INACTIVE_STATUS));
+
+ userRepository.findAllUsers(new Sort("name"));
+
+ List usersSortByNameLength = userRepository.findAllUsers(JpaSort.unsafe("LENGTH(name)"));
+
+ assertThat(usersSortByNameLength.get(0)
+ .getName()).isEqualTo(USER_NAME_ADAM);
+ }
+
+ @Test
+ public void givenUsersInDB_WhenFindAllWithPageRequestQueryAnnotationJPQL_ThenReturnPageOfUsers() {
+ userRepository.save(new User(USER_NAME_ADAM, LocalDate.now(), USER_EMAIL, ACTIVE_STATUS));
+ userRepository.save(new User(USER_NAME_PETER, LocalDate.now(), USER_EMAIL2, ACTIVE_STATUS));
+ userRepository.save(new User("SAMPLE", LocalDate.now(), USER_EMAIL3, INACTIVE_STATUS));
+ userRepository.save(new User("SAMPLE1", LocalDate.now(), USER_EMAIL4, INACTIVE_STATUS));
+ userRepository.save(new User("SAMPLE2", LocalDate.now(), USER_EMAIL5, INACTIVE_STATUS));
+ userRepository.save(new User("SAMPLE3", LocalDate.now(), USER_EMAIL6, INACTIVE_STATUS));
+
+ Page usersPage = userRepository.findAllUsersWithPagination(new PageRequest(1, 3));
+
+ assertThat(usersPage.getContent()
+ .get(0)
+ .getName()).isEqualTo("SAMPLE1");
+ }
+
+ @Test
+ public void givenUsersInDB_WhenFindAllWithPageRequestQueryAnnotationNative_ThenReturnPageOfUsers() {
+ userRepository.save(new User(USER_NAME_ADAM, LocalDate.now(), USER_EMAIL, ACTIVE_STATUS));
+ userRepository.save(new User(USER_NAME_PETER, LocalDate.now(), USER_EMAIL2, ACTIVE_STATUS));
+ userRepository.save(new User("SAMPLE", LocalDate.now(), USER_EMAIL3, INACTIVE_STATUS));
+ userRepository.save(new User("SAMPLE1", LocalDate.now(), USER_EMAIL4, INACTIVE_STATUS));
+ userRepository.save(new User("SAMPLE2", LocalDate.now(), USER_EMAIL5, INACTIVE_STATUS));
+ userRepository.save(new User("SAMPLE3", LocalDate.now(), USER_EMAIL6, INACTIVE_STATUS));
+
+ Page usersSortByNameLength = userRepository.findAllUsersWithPaginationNative(new PageRequest(1, 3));
+
+ assertThat(usersSortByNameLength.getContent()
+ .get(0)
+ .getName()).isEqualTo(USER_NAME_PETER);
+ }
+
+ @Test
+ @Transactional
+ public void givenUsersInDB_WhenUpdateStatusForNameModifyingQueryAnnotationJPQL_ThenModifyMatchingUsers() {
+ userRepository.save(new User("SAMPLE", LocalDate.now(), USER_EMAIL, ACTIVE_STATUS));
+ userRepository.save(new User("SAMPLE1", LocalDate.now(), USER_EMAIL2, ACTIVE_STATUS));
+ userRepository.save(new User("SAMPLE", LocalDate.now(), USER_EMAIL3, ACTIVE_STATUS));
+ userRepository.save(new User("SAMPLE3", LocalDate.now(), USER_EMAIL4, ACTIVE_STATUS));
+
+ int updatedUsersSize = userRepository.updateUserSetStatusForName(INACTIVE_STATUS, "SAMPLE");
+
+ assertThat(updatedUsersSize).isEqualTo(2);
+ }
+
+ @Test
+ public void givenUsersInDB_WhenFindByEmailsWithDynamicQuery_ThenReturnCollection() {
+
+ User user1 = new User();
+ user1.setEmail(USER_EMAIL);
+ userRepository.save(user1);
+
+ User user2 = new User();
+ user2.setEmail(USER_EMAIL2);
+ userRepository.save(user2);
+
+ User user3 = new User();
+ user3.setEmail(USER_EMAIL3);
+ userRepository.save(user3);
+
+ Set emails = new HashSet<>();
+ emails.add(USER_EMAIL2);
+ emails.add(USER_EMAIL3);
+
+ Collection usersWithEmails = userRepository.findUserByEmails(emails);
+
+ assertThat(usersWithEmails.size()).isEqualTo(2);
+ }
+
+ @Test
+ public void givenUsersInDBWhenFindByNameListReturnCollection() {
+
+ User user1 = new User();
+ user1.setName(USER_NAME_ADAM);
+ user1.setEmail(USER_EMAIL);
+ userRepository.save(user1);
+
+ User user2 = new User();
+ user2.setName(USER_NAME_PETER);
+ user2.setEmail(USER_EMAIL2);
+ userRepository.save(user2);
+
+ List names = Arrays.asList(USER_NAME_ADAM, USER_NAME_PETER);
+
+ List usersWithNames = userRepository.findUserByNameList(names);
+
+ assertThat(usersWithNames.size()).isEqualTo(2);
+ }
+
+
+ @Test
+ @Transactional
+ public void whenInsertedWithQuery_ThenUserIsPersisted() {
+ userRepository.insertUser(USER_NAME_ADAM, 1, USER_EMAIL, ACTIVE_STATUS, true);
+ userRepository.insertUser(USER_NAME_PETER, 1, USER_EMAIL2, ACTIVE_STATUS, true);
+
+ User userAdam = userRepository.findUserByNameLike(USER_NAME_ADAM);
+ User userPeter = userRepository.findUserByNameLike(USER_NAME_PETER);
+
+ assertThat(userAdam).isNotNull();
+ assertThat(userAdam.getEmail()).isEqualTo(USER_EMAIL);
+ assertThat(userPeter).isNotNull();
+ assertThat(userPeter.getEmail()).isEqualTo(USER_EMAIL2);
+ }
+
+
+ @Test
+ @Transactional
+ public void givenTwoUsers_whenFindByNameUsr01_ThenUserUsr01() {
+ User usr01 = new User("usr01", LocalDate.now(), "usr01@baeldung.com", 1);
+ User usr02 = new User("usr02", LocalDate.now(), "usr02@baeldung.com", 1);
+
+ userRepository.save(usr01);
+ userRepository.save(usr02);
+
+ try (Stream users = userRepository.findAllByName("usr01")) {
+ assertTrue(users.allMatch(usr -> usr.equals(usr01)));
+ }
+ }
+
+ @Test
+ @Transactional
+ public void givenTwoUsers_whenFindByNameUsr00_ThenNoUsers() {
+ User usr01 = new User("usr01", LocalDate.now(), "usr01@baeldung.com", 1);
+ User usr02 = new User("usr02", LocalDate.now(), "usr02@baeldung.com", 1);
+
+ userRepository.save(usr01);
+ userRepository.save(usr02);
+
+ try (Stream users = userRepository.findAllByName("usr00")) {
+ assertEquals(0, users.count());
+ }
+ }
+
+ @Test
+ public void givenTwoUsers_whenFindUsersWithGmailAddress_ThenUserUsr02() {
+ User usr01 = new User("usr01", LocalDate.now(), "usr01@baeldung.com", 1);
+ User usr02 = new User("usr02", LocalDate.now(), "usr02@gmail.com", 1);
+
+ userRepository.save(usr01);
+ userRepository.save(usr02);
+
+ List users = userRepository.findUsersWithGmailAddress();
+ assertEquals(1, users.size());
+ assertEquals(usr02, users.get(0));
+ }
+
+ @Test
+ @Transactional
+ public void givenTwoUsers_whenDeleteAllByCreationDateAfter_ThenOneUserRemains() {
+ User usr01 = new User("usr01", LocalDate.of(2018, 1, 1), "usr01@baeldung.com", 1);
+ User usr02 = new User("usr02", LocalDate.of(2018, 6, 1), "usr02@baeldung.com", 1);
+
+ userRepository.save(usr01);
+ userRepository.save(usr02);
+
+ userRepository.deleteAllByCreationDateAfter(LocalDate.of(2018, 5, 1));
+
+ List users = userRepository.findAll();
+
+ assertEquals(1, users.size());
+ assertEquals(usr01, users.get(0));
+ }
+
+ @Test
+ public void givenTwoUsers_whenFindAllUsersByPredicates_ThenUserUsr01() {
+ User usr01 = new User("usr01", LocalDate.of(2018, 1, 1), "usr01@baeldung.com", 1);
+ User usr02 = new User("usr02", LocalDate.of(2018, 6, 1), "usr02@baeldung.org", 1);
+
+ userRepository.save(usr01);
+ userRepository.save(usr02);
+
+ List> predicates = new ArrayList<>();
+ predicates.add(usr -> usr.getCreationDate().isAfter(LocalDate.of(2017, 12, 31)));
+ predicates.add(usr -> usr.getEmail().endsWith(".com"));
+
+ List users = userRepository.findAllUsersByPredicates(predicates);
+
+ assertEquals(1, users.size());
+ assertEquals(usr01, users.get(0));
+ }
+
+ @Test
+ @Transactional
+ public void givenTwoUsers_whenDeactivateUsersNotLoggedInSince_ThenUserUsr02Deactivated() {
+ User usr01 = new User("usr01", LocalDate.of(2018, 1, 1), "usr01@baeldung.com", 1);
+ usr01.setLastLoginDate(LocalDate.now());
+ User usr02 = new User("usr02", LocalDate.of(2018, 6, 1), "usr02@baeldung.org", 1);
+ usr02.setLastLoginDate(LocalDate.of(2018, 7, 20));
+
+ userRepository.save(usr01);
+ userRepository.save(usr02);
+
+ userRepository.deactivateUsersNotLoggedInSince(LocalDate.of(2018, 8, 1));
+
+ List users = userRepository.findAllUsers(Sort.by(Sort.Order.asc("name")));
+ assertTrue(users.get(0).isActive());
+ assertFalse(users.get(1).isActive());
+ }
+
+ @Test
+ @Transactional
+ public void givenTwoUsers_whenDeleteDeactivatedUsers_ThenUserUsr02Deleted() {
+ User usr01 = new User("usr01", LocalDate.of(2018, 1, 1), "usr01@baeldung.com", 1);
+ usr01.setLastLoginDate(LocalDate.now());
+ User usr02 = new User("usr02", LocalDate.of(2018, 6, 1), "usr02@baeldung.com", 0);
+ usr02.setLastLoginDate(LocalDate.of(2018, 7, 20));
+ usr02.setActive(false);
+
+ userRepository.save(usr01);
+ userRepository.save(usr02);
+
+ int deletedUsersCount = userRepository.deleteDeactivatedUsers();
+
+ List users = userRepository.findAll();
+ assertEquals(1, users.size());
+ assertEquals(usr01, users.get(0));
+ assertEquals(1, deletedUsersCount);
+ }
+
+ @Test
+ @Transactional
+ public void givenTwoUsers_whenAddDeletedColumn_ThenUsersHaveDeletedColumn() {
+ User usr01 = new User("usr01", LocalDate.of(2018, 1, 1), "usr01@baeldung.com", 1);
+ usr01.setLastLoginDate(LocalDate.now());
+ User usr02 = new User("usr02", LocalDate.of(2018, 6, 1), "usr02@baeldung.org", 1);
+ usr02.setLastLoginDate(LocalDate.of(2018, 7, 20));
+ usr02.setActive(false);
+
+ userRepository.save(usr01);
+ userRepository.save(usr02);
+
+ userRepository.addDeletedColumn();
+
+ Query nativeQuery = entityManager.createNativeQuery("select deleted from USERS where NAME = 'usr01'");
+ assertEquals(0, nativeQuery.getResultList().get(0));
+ }
+
+ @After
+ public void cleanUp() {
+ userRepository.deleteAll();
+ }
+}
diff --git a/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/dao/repositories/UserRepositoryIntegrationTest.java b/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/dao/repositories/UserRepositoryIntegrationTest.java
index b05086d00e..09f937c8f2 100644
--- a/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/dao/repositories/UserRepositoryIntegrationTest.java
+++ b/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/dao/repositories/UserRepositoryIntegrationTest.java
@@ -1,27 +1,15 @@
package com.baeldung.dao.repositories;
import com.baeldung.config.PersistenceConfiguration;
-import com.baeldung.dao.repositories.user.UserRepository;
import com.baeldung.domain.user.User;
-import org.junit.After;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.data.domain.Page;
-import org.springframework.data.domain.PageRequest;
-import org.springframework.data.domain.Sort;
-import org.springframework.data.jpa.domain.JpaSort;
-import org.springframework.data.mapping.PropertyReferenceException;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.transaction.annotation.Transactional;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import java.util.stream.Stream;
+import java.time.LocalDate;
import static org.assertj.core.api.Assertions.assertThat;
@@ -31,369 +19,19 @@ import static org.assertj.core.api.Assertions.assertThat;
@RunWith(SpringRunner.class)
@SpringBootTest(classes = PersistenceConfiguration.class)
@DirtiesContext
-public class UserRepositoryIntegrationTest {
-
- private final String USER_NAME_ADAM = "Adam";
- private final String USER_NAME_PETER = "Peter";
-
- private final String USER_EMAIL = "email@example.com";
- private final String USER_EMAIL2 = "email2@example.com";
- private final String USER_EMAIL3 = "email3@example.com";
- private final String USER_EMAIL4 = "email4@example.com";
- private final String USER_EMAIL5 = "email5@example.com";
- private final String USER_EMAIL6 = "email6@example.com";
-
- private final Integer INACTIVE_STATUS = 0;
- private final Integer ACTIVE_STATUS = 1;
-
- @Autowired
- private UserRepository userRepository;
-
- @Test
- @Transactional
- public void givenUsersWithSameNameInDBWhenFindAllByNameThenReturnStreamOfUsers() {
- User user1 = new User();
- user1.setName(USER_NAME_ADAM);
- user1.setEmail(USER_EMAIL);
- userRepository.save(user1);
-
- User user2 = new User();
- user2.setName(USER_NAME_ADAM);
- user2.setEmail(USER_EMAIL2);
- userRepository.save(user2);
-
- User user3 = new User();
- user3.setName(USER_NAME_ADAM);
- user3.setEmail(USER_EMAIL3);
- userRepository.save(user3);
-
- User user4 = new User();
- user4.setName("SAMPLE");
- user4.setEmail(USER_EMAIL4);
- userRepository.save(user4);
-
- try (Stream foundUsersStream = userRepository.findAllByName(USER_NAME_ADAM)) {
- assertThat(foundUsersStream.count()).isEqualTo(3l);
- }
- }
-
- @Test
- public void givenUsersInDBWhenFindAllWithQueryAnnotationThenReturnCollectionWithActiveUsers() {
- User user1 = new User();
- user1.setName(USER_NAME_ADAM);
- user1.setEmail(USER_EMAIL);
- user1.setStatus(ACTIVE_STATUS);
- userRepository.save(user1);
-
- User user2 = new User();
- user2.setName(USER_NAME_ADAM);
- user2.setEmail(USER_EMAIL2);
- user2.setStatus(ACTIVE_STATUS);
- userRepository.save(user2);
-
- User user3 = new User();
- user3.setName(USER_NAME_ADAM);
- user3.setEmail(USER_EMAIL3);
- user3.setStatus(INACTIVE_STATUS);
- userRepository.save(user3);
-
- Collection allActiveUsers = userRepository.findAllActiveUsers();
-
- assertThat(allActiveUsers.size()).isEqualTo(2);
- }
-
- @Test
- public void givenUsersInDBWhenFindAllWithQueryAnnotationNativeThenReturnCollectionWithActiveUsers() {
- User user1 = new User();
- user1.setName(USER_NAME_ADAM);
- user1.setEmail(USER_EMAIL);
- user1.setStatus(ACTIVE_STATUS);
- userRepository.save(user1);
-
- User user2 = new User();
- user2.setName(USER_NAME_ADAM);
- user2.setEmail(USER_EMAIL2);
- user2.setStatus(ACTIVE_STATUS);
- userRepository.save(user2);
-
- User user3 = new User();
- user3.setName(USER_NAME_ADAM);
- user3.setEmail(USER_EMAIL3);
- user3.setStatus(INACTIVE_STATUS);
- userRepository.save(user3);
-
- Collection allActiveUsers = userRepository.findAllActiveUsersNative();
-
- assertThat(allActiveUsers.size()).isEqualTo(2);
- }
-
- @Test
- public void givenUserInDBWhenFindUserByStatusWithQueryAnnotationThenReturnActiveUser() {
- User user = new User();
- user.setName(USER_NAME_ADAM);
- user.setEmail(USER_EMAIL);
- user.setStatus(ACTIVE_STATUS);
- userRepository.save(user);
-
- User userByStatus = userRepository.findUserByStatus(ACTIVE_STATUS);
-
- assertThat(userByStatus.getName()).isEqualTo(USER_NAME_ADAM);
- }
-
- @Test
- public void givenUserInDBWhenFindUserByStatusWithQueryAnnotationNativeThenReturnActiveUser() {
- User user = new User();
- user.setName(USER_NAME_ADAM);
- user.setEmail(USER_EMAIL);
- user.setStatus(ACTIVE_STATUS);
- userRepository.save(user);
-
- User userByStatus = userRepository.findUserByStatusNative(ACTIVE_STATUS);
-
- assertThat(userByStatus.getName()).isEqualTo(USER_NAME_ADAM);
- }
-
- @Test
- public void givenUsersInDBWhenFindUserByStatusAndNameWithQueryAnnotationIndexedParamsThenReturnOneUser() {
- User user = new User();
- user.setName(USER_NAME_ADAM);
- user.setEmail(USER_EMAIL);
- user.setStatus(ACTIVE_STATUS);
- userRepository.save(user);
-
- User user2 = new User();
- user2.setName(USER_NAME_PETER);
- user2.setEmail(USER_EMAIL2);
- user2.setStatus(ACTIVE_STATUS);
- userRepository.save(user2);
-
- User userByStatus = userRepository.findUserByStatusAndName(ACTIVE_STATUS, USER_NAME_ADAM);
-
- assertThat(userByStatus.getName()).isEqualTo(USER_NAME_ADAM);
- }
-
- @Test
- public void givenUsersInDBWhenFindUserByStatusAndNameWithQueryAnnotationNamedParamsThenReturnOneUser() {
- User user = new User();
- user.setName(USER_NAME_ADAM);
- user.setEmail(USER_EMAIL);
- user.setStatus(ACTIVE_STATUS);
- userRepository.save(user);
-
- User user2 = new User();
- user2.setName(USER_NAME_PETER);
- user2.setEmail(USER_EMAIL2);
- user2.setStatus(ACTIVE_STATUS);
- userRepository.save(user2);
-
- User userByStatus = userRepository.findUserByStatusAndNameNamedParams(ACTIVE_STATUS, USER_NAME_ADAM);
-
- assertThat(userByStatus.getName()).isEqualTo(USER_NAME_ADAM);
- }
-
- @Test
- public void givenUsersInDBWhenFindUserByStatusAndNameWithQueryAnnotationNativeNamedParamsThenReturnOneUser() {
- User user = new User();
- user.setName(USER_NAME_ADAM);
- user.setEmail(USER_EMAIL);
- user.setStatus(ACTIVE_STATUS);
- userRepository.save(user);
-
- User user2 = new User();
- user2.setName(USER_NAME_PETER);
- user2.setEmail(USER_EMAIL2);
- user2.setStatus(ACTIVE_STATUS);
- userRepository.save(user2);
-
- User userByStatus = userRepository.findUserByStatusAndNameNamedParamsNative(ACTIVE_STATUS, USER_NAME_ADAM);
-
- assertThat(userByStatus.getName()).isEqualTo(USER_NAME_ADAM);
- }
-
- @Test
- public void givenUsersInDBWhenFindUserByStatusAndNameWithQueryAnnotationNamedParamsCustomNamesThenReturnOneUser() {
- User user = new User();
- user.setName(USER_NAME_ADAM);
- user.setEmail(USER_EMAIL);
- user.setStatus(ACTIVE_STATUS);
- userRepository.save(user);
-
- User user2 = new User();
- user2.setName(USER_NAME_PETER);
- user2.setEmail(USER_EMAIL2);
- user2.setStatus(ACTIVE_STATUS);
- userRepository.save(user2);
-
- User userByStatus = userRepository.findUserByUserStatusAndUserName(ACTIVE_STATUS, USER_NAME_ADAM);
-
- assertThat(userByStatus.getName()).isEqualTo(USER_NAME_ADAM);
- }
-
- @Test
- public void givenUsersInDBWhenFindUserByNameLikeWithQueryAnnotationIndexedParamsThenReturnUser() {
- User user = new User();
- user.setName(USER_NAME_ADAM);
- user.setEmail(USER_EMAIL);
- user.setStatus(ACTIVE_STATUS);
- userRepository.save(user);
-
- User userByStatus = userRepository.findUserByNameLike("Ad");
-
- assertThat(userByStatus.getName()).isEqualTo(USER_NAME_ADAM);
- }
-
- @Test
- public void givenUsersInDBWhenFindUserByNameLikeWithQueryAnnotationNamedParamsThenReturnUser() {
- User user = new User();
- user.setName(USER_NAME_ADAM);
- user.setEmail(USER_EMAIL);
- user.setStatus(ACTIVE_STATUS);
- userRepository.save(user);
-
- User userByStatus = userRepository.findUserByNameLikeNamedParam("Ad");
-
- assertThat(userByStatus.getName()).isEqualTo(USER_NAME_ADAM);
- }
-
- @Test
- public void givenUsersInDBWhenFindUserByNameLikeWithQueryAnnotationNativeThenReturnUser() {
- User user = new User();
- user.setName(USER_NAME_ADAM);
- user.setEmail(USER_EMAIL);
- user.setStatus(ACTIVE_STATUS);
- userRepository.save(user);
-
- User userByStatus = userRepository.findUserByNameLikeNative("Ad");
-
- assertThat(userByStatus.getName()).isEqualTo(USER_NAME_ADAM);
- }
-
- @Test
- public void givenUsersInDBWhenFindAllWithSortByNameThenReturnUsersSorted() {
- userRepository.save(new User(USER_NAME_ADAM, USER_EMAIL, ACTIVE_STATUS));
- userRepository.save(new User(USER_NAME_PETER, USER_EMAIL2, ACTIVE_STATUS));
- userRepository.save(new User("SAMPLE", USER_EMAIL3, INACTIVE_STATUS));
-
- List usersSortByName = userRepository.findAll(new Sort(Sort.Direction.ASC, "name"));
-
- assertThat(usersSortByName.get(0)
- .getName()).isEqualTo(USER_NAME_ADAM);
- }
-
- @Test(expected = PropertyReferenceException.class)
- public void givenUsersInDBWhenFindAllSortWithFunctionThenThrowException() {
- userRepository.save(new User(USER_NAME_ADAM, USER_EMAIL, ACTIVE_STATUS));
- userRepository.save(new User(USER_NAME_PETER, USER_EMAIL2, ACTIVE_STATUS));
- userRepository.save(new User("SAMPLE", USER_EMAIL3, INACTIVE_STATUS));
-
- userRepository.findAll(new Sort(Sort.Direction.ASC, "name"));
-
- List usersSortByNameLength = userRepository.findAll(new Sort("LENGTH(name)"));
-
- assertThat(usersSortByNameLength.get(0)
- .getName()).isEqualTo(USER_NAME_ADAM);
- }
-
- @Test
- public void givenUsersInDBWhenFindAllSortWithFunctionQueryAnnotationJPQLThenReturnUsersSorted() {
- userRepository.save(new User(USER_NAME_ADAM, USER_EMAIL, ACTIVE_STATUS));
- userRepository.save(new User(USER_NAME_PETER, USER_EMAIL2, ACTIVE_STATUS));
- userRepository.save(new User("SAMPLE", USER_EMAIL3, INACTIVE_STATUS));
-
- userRepository.findAllUsers(new Sort("name"));
-
- List usersSortByNameLength = userRepository.findAllUsers(JpaSort.unsafe("LENGTH(name)"));
-
- assertThat(usersSortByNameLength.get(0)
- .getName()).isEqualTo(USER_NAME_ADAM);
- }
-
- @Test
- public void givenUsersInDBWhenFindAllWithPageRequestQueryAnnotationJPQLThenReturnPageOfUsers() {
- userRepository.save(new User(USER_NAME_ADAM, USER_EMAIL, ACTIVE_STATUS));
- userRepository.save(new User(USER_NAME_PETER, USER_EMAIL2, ACTIVE_STATUS));
- userRepository.save(new User("SAMPLE", USER_EMAIL3, INACTIVE_STATUS));
- userRepository.save(new User("SAMPLE1", USER_EMAIL4, INACTIVE_STATUS));
- userRepository.save(new User("SAMPLE2", USER_EMAIL5, INACTIVE_STATUS));
- userRepository.save(new User("SAMPLE3", USER_EMAIL6, INACTIVE_STATUS));
-
- Page usersPage = userRepository.findAllUsersWithPagination(new PageRequest(1, 3));
-
- assertThat(usersPage.getContent()
- .get(0)
- .getName()).isEqualTo("SAMPLE1");
- }
-
- @Test
- public void givenUsersInDBWhenFindAllWithPageRequestQueryAnnotationNativeThenReturnPageOfUsers() {
- userRepository.save(new User(USER_NAME_ADAM, USER_EMAIL, ACTIVE_STATUS));
- userRepository.save(new User(USER_NAME_PETER, USER_EMAIL2, ACTIVE_STATUS));
- userRepository.save(new User("SAMPLE", USER_EMAIL3, INACTIVE_STATUS));
- userRepository.save(new User("SAMPLE1", USER_EMAIL4, INACTIVE_STATUS));
- userRepository.save(new User("SAMPLE2", USER_EMAIL5, INACTIVE_STATUS));
- userRepository.save(new User("SAMPLE3", USER_EMAIL6, INACTIVE_STATUS));
-
- Page usersSortByNameLength = userRepository.findAllUsersWithPaginationNative(new PageRequest(1, 3));
-
- assertThat(usersSortByNameLength.getContent()
- .get(0)
- .getName()).isEqualTo("SAMPLE1");
- }
-
- @Test
- @Transactional
- public void givenUsersInDBWhenUpdateStatusForNameModifyingQueryAnnotationJPQLThenModifyMatchingUsers() {
- userRepository.save(new User("SAMPLE", USER_EMAIL, ACTIVE_STATUS));
- userRepository.save(new User("SAMPLE1", USER_EMAIL2, ACTIVE_STATUS));
- userRepository.save(new User("SAMPLE", USER_EMAIL3, ACTIVE_STATUS));
- userRepository.save(new User("SAMPLE3", USER_EMAIL4, ACTIVE_STATUS));
-
- int updatedUsersSize = userRepository.updateUserSetStatusForName(INACTIVE_STATUS, "SAMPLE");
-
- assertThat(updatedUsersSize).isEqualTo(2);
- }
+public class UserRepositoryIntegrationTest extends UserRepositoryCommon {
@Test
@Transactional
public void givenUsersInDBWhenUpdateStatusForNameModifyingQueryAnnotationNativeThenModifyMatchingUsers() {
- userRepository.save(new User("SAMPLE", USER_EMAIL, ACTIVE_STATUS));
- userRepository.save(new User("SAMPLE1", USER_EMAIL2, ACTIVE_STATUS));
- userRepository.save(new User("SAMPLE", USER_EMAIL3, ACTIVE_STATUS));
- userRepository.save(new User("SAMPLE3", USER_EMAIL4, ACTIVE_STATUS));
+ userRepository.save(new User("SAMPLE", LocalDate.now(), USER_EMAIL, ACTIVE_STATUS));
+ userRepository.save(new User("SAMPLE1", LocalDate.now(), USER_EMAIL2, ACTIVE_STATUS));
+ userRepository.save(new User("SAMPLE", LocalDate.now(), USER_EMAIL3, ACTIVE_STATUS));
+ userRepository.save(new User("SAMPLE3", LocalDate.now(), USER_EMAIL4, ACTIVE_STATUS));
userRepository.flush();
int updatedUsersSize = userRepository.updateUserSetStatusForNameNative(INACTIVE_STATUS, "SAMPLE");
assertThat(updatedUsersSize).isEqualTo(2);
}
-
- @Test
- public void givenUsersInDBWhenFindByEmailsWithDynamicQueryThenReturnCollection() {
-
- User user1 = new User();
- user1.setEmail(USER_EMAIL);
- userRepository.save(user1);
-
- User user2 = new User();
- user2.setEmail(USER_EMAIL2);
- userRepository.save(user2);
-
- User user3 = new User();
- user3.setEmail(USER_EMAIL3);
- userRepository.save(user3);
-
- Set emails = new HashSet<>();
- emails.add(USER_EMAIL2);
- emails.add(USER_EMAIL3);
-
- Collection usersWithEmails = userRepository.findUserByEmails(emails);
-
- assertThat(usersWithEmails.size()).isEqualTo(2);
- }
-
- @After
- public void cleanUp() {
- userRepository.deleteAll();
- }
-
}
diff --git a/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/dao/repositories/UserRepositoryTCAutoIntegrationTest.java b/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/dao/repositories/UserRepositoryTCAutoIntegrationTest.java
new file mode 100644
index 0000000000..6a851823e3
--- /dev/null
+++ b/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/dao/repositories/UserRepositoryTCAutoIntegrationTest.java
@@ -0,0 +1,42 @@
+package com.baeldung.dao.repositories;
+
+import com.baeldung.domain.user.User;
+import com.baeldung.util.BaeldungPostgresqlContainer;
+import org.junit.ClassRule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.ActiveProfiles;
+import org.springframework.test.context.junit4.SpringRunner;
+import org.springframework.transaction.annotation.Transactional;
+import org.testcontainers.containers.PostgreSQLContainer;
+
+import java.time.LocalDate;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+/**
+ * Created by adam.
+ */
+@RunWith(SpringRunner.class)
+@SpringBootTest
+@ActiveProfiles({"tc", "tc-auto"})
+public class UserRepositoryTCAutoIntegrationTest extends UserRepositoryCommon {
+
+ @ClassRule
+ public static PostgreSQLContainer postgreSQLContainer = BaeldungPostgresqlContainer.getInstance();
+
+ @Test
+ @Transactional
+ public void givenUsersInDB_WhenUpdateStatusForNameModifyingQueryAnnotationNativePostgres_ThenModifyMatchingUsers() {
+ userRepository.save(new User("SAMPLE", LocalDate.now(), USER_EMAIL, ACTIVE_STATUS));
+ userRepository.save(new User("SAMPLE1", LocalDate.now(), USER_EMAIL2, ACTIVE_STATUS));
+ userRepository.save(new User("SAMPLE", LocalDate.now(), USER_EMAIL3, ACTIVE_STATUS));
+ userRepository.save(new User("SAMPLE3", LocalDate.now(), USER_EMAIL4, ACTIVE_STATUS));
+ userRepository.flush();
+
+ int updatedUsersSize = userRepository.updateUserSetStatusForNameNativePostgres(INACTIVE_STATUS, "SAMPLE");
+
+ assertThat(updatedUsersSize).isEqualTo(2);
+ }
+}
diff --git a/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/dao/repositories/UserRepositoryTCIntegrationTest.java b/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/dao/repositories/UserRepositoryTCIntegrationTest.java
new file mode 100644
index 0000000000..c300a07ab9
--- /dev/null
+++ b/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/dao/repositories/UserRepositoryTCIntegrationTest.java
@@ -0,0 +1,57 @@
+package com.baeldung.dao.repositories;
+
+import com.baeldung.domain.user.User;
+import org.junit.ClassRule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.test.util.TestPropertyValues;
+import org.springframework.context.ApplicationContextInitializer;
+import org.springframework.context.ConfigurableApplicationContext;
+import org.springframework.test.context.ActiveProfiles;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringRunner;
+import org.springframework.transaction.annotation.Transactional;
+import org.testcontainers.containers.PostgreSQLContainer;
+
+import java.time.LocalDate;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest
+@ActiveProfiles("tc")
+@ContextConfiguration(initializers = {UserRepositoryTCIntegrationTest.Initializer.class})
+public class UserRepositoryTCIntegrationTest extends UserRepositoryCommon {
+
+ @ClassRule
+ public static PostgreSQLContainer postgreSQLContainer = new PostgreSQLContainer("postgres:11.1")
+ .withDatabaseName("integration-tests-db")
+ .withUsername("sa")
+ .withPassword("sa");
+
+ @Test
+ @Transactional
+ public void givenUsersInDB_WhenUpdateStatusForNameModifyingQueryAnnotationNative_ThenModifyMatchingUsers() {
+ userRepository.save(new User("SAMPLE", LocalDate.now(), USER_EMAIL, ACTIVE_STATUS));
+ userRepository.save(new User("SAMPLE1", LocalDate.now(), USER_EMAIL2, ACTIVE_STATUS));
+ userRepository.save(new User("SAMPLE", LocalDate.now(), USER_EMAIL3, ACTIVE_STATUS));
+ userRepository.save(new User("SAMPLE3", LocalDate.now(), USER_EMAIL4, ACTIVE_STATUS));
+ userRepository.flush();
+
+ int updatedUsersSize = userRepository.updateUserSetStatusForNameNativePostgres(INACTIVE_STATUS, "SAMPLE");
+
+ assertThat(updatedUsersSize).isEqualTo(2);
+ }
+
+ static class Initializer
+ implements ApplicationContextInitializer {
+ public void initialize(ConfigurableApplicationContext configurableApplicationContext) {
+ TestPropertyValues.of(
+ "spring.datasource.url=" + postgreSQLContainer.getJdbcUrl(),
+ "spring.datasource.username=" + postgreSQLContainer.getUsername(),
+ "spring.datasource.password=" + postgreSQLContainer.getPassword()
+ ).applyTo(configurableApplicationContext.getEnvironment());
+ }
+ }
+}
diff --git a/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/dao/repositories/impl/CustomItemRepositoryIntegrationTest.java b/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/dao/repositories/impl/CustomItemRepositoryIntegrationTest.java
new file mode 100644
index 0000000000..c5fb7fa25f
--- /dev/null
+++ b/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/dao/repositories/impl/CustomItemRepositoryIntegrationTest.java
@@ -0,0 +1,94 @@
+package com.baeldung.dao.repositories.impl;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+
+import java.util.List;
+
+import javax.persistence.EntityManager;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
+import org.springframework.test.context.junit4.SpringRunner;
+import org.springframework.util.CollectionUtils;
+
+import com.baeldung.config.PersistenceConfiguration;
+import com.baeldung.config.PersistenceProductConfiguration;
+import com.baeldung.config.PersistenceUserConfiguration;
+import com.baeldung.dao.repositories.CustomItemRepository;
+import com.baeldung.domain.Item;
+
+@RunWith(SpringRunner.class)
+@DataJpaTest(excludeAutoConfiguration = { PersistenceConfiguration.class, PersistenceUserConfiguration.class, PersistenceProductConfiguration.class })
+public class CustomItemRepositoryIntegrationTest {
+
+ @Autowired
+ CustomItemRepository customItemRepositoryImpl;
+
+ @Autowired
+ EntityManager entityManager;
+
+ @Before
+ public void setUp() {
+
+ Item firstItem = new Item();
+ firstItem.setColor("blue");
+ firstItem.setGrade("C");
+ firstItem.setId(10l);
+
+ entityManager.persist(firstItem);
+
+ Item secondItem = new Item();
+ secondItem.setColor("red");
+ secondItem.setGrade("C");
+ secondItem.setId(11l);
+
+ entityManager.persist(secondItem);
+
+ Item thirdItem = new Item();
+ thirdItem.setColor("blue");
+ thirdItem.setGrade("A");
+ thirdItem.setId(12l);
+
+ entityManager.persist(thirdItem);
+
+ Item fourthItem = new Item();
+ fourthItem.setColor("red");
+ fourthItem.setGrade("D");
+ fourthItem.setId(13l);
+
+ entityManager.persist(fourthItem);
+ }
+
+ @Test
+ public void givenItems_whenFindItemsByColorAndGrade_thenReturnItems() {
+
+ List- items = customItemRepositoryImpl.findItemsByColorAndGrade();
+
+ assertFalse("No items found", CollectionUtils.isEmpty(items));
+ assertEquals("There should be only one item", 1, items.size());
+
+ Item item = items.get(0);
+
+ assertEquals("this item do not have blue color", "blue", item.getColor());
+ assertEquals("this item does not belong to A grade", "A", item.getGrade());
+ }
+
+ @Test
+ public void givenItems_whenFindItemByColorOrGrade_thenReturnItems() {
+
+ List
- items = customItemRepositoryImpl.findItemByColorOrGrade();
+
+ assertFalse("No items found", CollectionUtils.isEmpty(items));
+ assertEquals("There should be only one item", 1, items.size());
+
+ Item item = items.get(0);
+
+ assertEquals("this item do not have red color", "red", item.getColor());
+ assertEquals("this item does not belong to D grade", "D", item.getGrade());
+ }
+
+}
diff --git a/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/passenger/PassengerRepositoryIntegrationTest.java b/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/passenger/PassengerRepositoryIntegrationTest.java
index c57e771345..8cd19cec03 100644
--- a/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/passenger/PassengerRepositoryIntegrationTest.java
+++ b/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/passenger/PassengerRepositoryIntegrationTest.java
@@ -1,23 +1,29 @@
package com.baeldung.passenger;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.contains;
+import static org.hamcrest.core.IsNot.not;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.util.List;
+import java.util.Optional;
+
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
+import org.springframework.data.domain.Example;
+import org.springframework.data.domain.ExampleMatcher;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.test.context.junit4.SpringRunner;
-import javax.persistence.EntityManager;
-import javax.persistence.PersistenceContext;
-import java.util.List;
-
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.Matchers.contains;
-import static org.junit.Assert.assertEquals;
-
@DataJpaTest
@RunWith(SpringRunner.class)
public class PassengerRepositoryIntegrationTest {
@@ -45,7 +51,7 @@ public class PassengerRepositoryIntegrationTest {
assertEquals(1, passengers.size());
Passenger actual = passengers.get(0);
- assertEquals(actual, expected);
+ assertEquals(expected, actual);
}
@Test
@@ -54,16 +60,17 @@ public class PassengerRepositoryIntegrationTest {
Passenger actual = repository.findFirstByOrderBySeatNumberAsc();
- assertEquals(actual, expected);
+ assertEquals(expected, actual);
}
@Test
public void givenSeveralPassengersWhenFindPageSortedByThenThePassengerInTheFirstFilledSeatIsReturned() {
Passenger expected = Passenger.from("Fred", "Bloggs", 22);
- Page
page = repository.findAll(PageRequest.of(0, 1, Sort.by(Sort.Direction.ASC, "seatNumber")));
+ Page page = repository.findAll(PageRequest.of(0, 1,
+ Sort.by(Sort.Direction.ASC, "seatNumber")));
- assertEquals(page.getContent().size(), 1);
+ assertEquals(1, page.getContent().size());
Passenger actual = page.getContent().get(0);
assertEquals(expected, actual);
@@ -94,5 +101,69 @@ public class PassengerRepositoryIntegrationTest {
assertThat(passengers, contains(fred, ricki, jill, siya, eve));
}
+
+ @Test
+ public void givenPassengers_whenFindByExampleDefaultMatcher_thenExpectedReturned() {
+ Example example = Example.of(Passenger.from("Fred", "Bloggs", null));
+
+ Optional actual = repository.findOne(example);
+
+ assertTrue(actual.isPresent());
+ assertEquals(Passenger.from("Fred", "Bloggs", 22), actual.get());
+ }
+
+ @Test
+ public void givenPassengers_whenFindByExampleCaseInsensitiveMatcher_thenExpectedReturned() {
+ ExampleMatcher caseInsensitiveExampleMatcher = ExampleMatcher.matchingAll().withIgnoreCase();
+ Example example = Example.of(Passenger.from("fred", "bloggs", null),
+ caseInsensitiveExampleMatcher);
+
+ Optional actual = repository.findOne(example);
+
+ assertTrue(actual.isPresent());
+ assertEquals(Passenger.from("Fred", "Bloggs", 22), actual.get());
+ }
+
+ @Test
+ public void givenPassengers_whenFindByExampleCustomMatcher_thenExpectedReturned() {
+ Passenger jill = Passenger.from("Jill", "Smith", 50);
+ Passenger eve = Passenger.from("Eve", "Jackson", 95);
+ Passenger fred = Passenger.from("Fred", "Bloggs", 22);
+ Passenger siya = Passenger.from("Siya", "Kolisi", 85);
+ Passenger ricki = Passenger.from("Ricki", "Bobbie", 36);
+
+ ExampleMatcher customExampleMatcher = ExampleMatcher.matchingAny().withMatcher("firstName",
+ ExampleMatcher.GenericPropertyMatchers.contains().ignoreCase()).withMatcher("lastName",
+ ExampleMatcher.GenericPropertyMatchers.contains().ignoreCase());
+
+ Example example = Example.of(Passenger.from("e", "s", null),
+ customExampleMatcher);
+
+ List passengers = repository.findAll(example);
+
+ assertThat(passengers, contains(jill, eve, fred, siya));
+ assertThat(passengers, not(contains(ricki)));
+ }
+
+ @Test
+ public void givenPassengers_whenFindByIgnoringMatcher_thenExpectedReturned() {
+ Passenger jill = Passenger.from("Jill", "Smith", 50);
+ Passenger eve = Passenger.from("Eve", "Jackson", 95);
+ Passenger fred = Passenger.from("Fred", "Bloggs", 22);
+ Passenger siya = Passenger.from("Siya", "Kolisi", 85);
+ Passenger ricki = Passenger.from("Ricki", "Bobbie", 36);
+ ExampleMatcher ignoringExampleMatcher = ExampleMatcher.matchingAny().withMatcher("lastName",
+ ExampleMatcher.GenericPropertyMatchers.startsWith().ignoreCase()).withIgnorePaths("firstName", "seatNumber");
+
+ Example example = Example.of(Passenger.from(null, "b", null),
+ ignoringExampleMatcher);
+
+ List passengers = repository.findAll(example);
+
+ assertThat(passengers, contains(fred, ricki));
+ assertThat(passengers, not(contains(jill)));
+ assertThat(passengers, not(contains(eve)));
+ assertThat(passengers, not(contains(siya)));
+ }
}
diff --git a/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/util/BaeldungPostgresqlContainer.java b/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/util/BaeldungPostgresqlContainer.java
new file mode 100644
index 0000000000..e5ad2dd448
--- /dev/null
+++ b/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/util/BaeldungPostgresqlContainer.java
@@ -0,0 +1,35 @@
+package com.baeldung.util;
+
+import org.testcontainers.containers.PostgreSQLContainer;
+
+public class BaeldungPostgresqlContainer extends PostgreSQLContainer {
+
+ private static final String IMAGE_VERSION = "postgres:11.1";
+
+ private static BaeldungPostgresqlContainer container;
+
+
+ private BaeldungPostgresqlContainer() {
+ super(IMAGE_VERSION);
+ }
+
+ public static BaeldungPostgresqlContainer getInstance() {
+ if (container == null) {
+ container = new BaeldungPostgresqlContainer();
+ }
+ return container;
+ }
+
+ @Override
+ public void start() {
+ super.start();
+ System.setProperty("DB_URL", container.getJdbcUrl());
+ System.setProperty("DB_USERNAME", container.getUsername());
+ System.setProperty("DB_PASSWORD", container.getPassword());
+ }
+
+ @Override
+ public void stop() {
+ //do nothing, JVM handles shut down
+ }
+}
diff --git a/persistence-modules/spring-data-jpa/src/test/resources/application-tc-auto.properties b/persistence-modules/spring-data-jpa/src/test/resources/application-tc-auto.properties
new file mode 100644
index 0000000000..c3005d861f
--- /dev/null
+++ b/persistence-modules/spring-data-jpa/src/test/resources/application-tc-auto.properties
@@ -0,0 +1,4 @@
+# configuration for test containers testing
+spring.datasource.url=${DB_URL}
+spring.datasource.username=${DB_USERNAME}
+spring.datasource.password=${DB_PASSWORD}
diff --git a/persistence-modules/spring-data-jpa/src/test/resources/application-tc.properties b/persistence-modules/spring-data-jpa/src/test/resources/application-tc.properties
new file mode 100644
index 0000000000..3bf8693d53
--- /dev/null
+++ b/persistence-modules/spring-data-jpa/src/test/resources/application-tc.properties
@@ -0,0 +1,4 @@
+# configuration for Test Containers testing
+spring.datasource.driver-class-name=org.postgresql.Driver
+spring.jpa.hibernate.ddl-auto=create-drop
+spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults=false
diff --git a/persistence-modules/spring-data-mongodb/pom.xml b/persistence-modules/spring-data-mongodb/pom.xml
index c1faf72103..7156cdf071 100644
--- a/persistence-modules/spring-data-mongodb/pom.xml
+++ b/persistence-modules/spring-data-mongodb/pom.xml
@@ -23,7 +23,6 @@
spring-data-releasetrain
Lovelace-SR3
pom
- import
diff --git a/persistence-modules/spring-data-solr/pom.xml b/persistence-modules/spring-data-solr/pom.xml
index dcba80b49a..82539b0ca8 100644
--- a/persistence-modules/spring-data-solr/pom.xml
+++ b/persistence-modules/spring-data-solr/pom.xml
@@ -4,8 +4,8 @@
com.baeldung
spring-data-solr
0.0.1-SNAPSHOT
- jar
spring-data-solr
+ jar
com.baeldung
diff --git a/persistence-modules/spring-hibernate-5/README.md b/persistence-modules/spring-hibernate-5/README.md
index 5e287919f1..c48e58fcca 100644
--- a/persistence-modules/spring-hibernate-5/README.md
+++ b/persistence-modules/spring-hibernate-5/README.md
@@ -2,4 +2,4 @@
- [Hibernate Many to Many Annotation Tutorial](http://www.baeldung.com/hibernate-many-to-many)
- [Programmatic Transactions in the Spring TestContext Framework](http://www.baeldung.com/spring-test-programmatic-transactions)
-- [Hibernate Criteria Queries](http://www.baeldung.com/hibernate-criteria-queries)
+- [JPA Criteria Queries](http://www.baeldung.com/hibernate-criteria-queries)
diff --git a/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/criteria/HibernateCriteriaIntegrationTest.java b/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/criteria/HibernateCriteriaIntegrationTest.java
index 723b097305..c3805bac57 100644
--- a/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/criteria/HibernateCriteriaIntegrationTest.java
+++ b/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/criteria/HibernateCriteriaIntegrationTest.java
@@ -1,17 +1,24 @@
package com.baeldung.hibernate.criteria;
import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.util.List;
import org.hibernate.Session;
+import org.hibernate.Transaction;
import org.junit.Test;
import com.baeldung.hibernate.criteria.model.Item;
import com.baeldung.hibernate.criteria.util.HibernateUtil;
import com.baeldung.hibernate.criteria.view.ApplicationView;
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaDelete;
+import javax.persistence.criteria.CriteriaUpdate;
+import javax.persistence.criteria.Root;
+
public class HibernateCriteriaIntegrationTest {
final private ApplicationView av = new ApplicationView();
@@ -179,4 +186,51 @@ public class HibernateCriteriaIntegrationTest {
session.close();
assertArrayEquals(expectedPriceBetweenItems, av.betweenCriteria());
}
+
+ @Test
+ public void givenNewItemPrice_whenCriteriaUpdate_thenReturnAffectedResult() {
+
+ int oldPrice = 10, newPrice = 20;
+
+ Session session = HibernateUtil.getHibernateSession();
+
+ Item item = new Item(12, "Test Item 12", "This is a description");
+ item.setItemPrice(oldPrice);
+ session.save(item);
+
+ CriteriaBuilder cb = session.getCriteriaBuilder();
+ CriteriaUpdate- criteriaUpdate = cb.createCriteriaUpdate(Item.class);
+ Root
- root = criteriaUpdate.from(Item.class);
+ criteriaUpdate.set("itemPrice", newPrice);
+ criteriaUpdate.where(cb.equal(root.get("itemPrice"), oldPrice));
+
+ Transaction transaction = session.beginTransaction();
+ session.createQuery(criteriaUpdate).executeUpdate();
+ transaction.commit();
+
+ Item updatedItem = session.createQuery("FROM Item WHERE itemPrice = " + newPrice, Item.class).getSingleResult();
+ session.refresh(updatedItem);
+ assertEquals(newPrice, updatedItem.getItemPrice().intValue());
+ }
+
+ @Test
+ public void givenTargetItemPrice_whenCriteriaDelete_thenDeleteMatched() {
+
+ int targetPrice = 1000;
+
+ Session session = HibernateUtil.getHibernateSession();
+ CriteriaBuilder cb = session.getCriteriaBuilder();
+ CriteriaDelete
- criteriaDelete = cb.createCriteriaDelete(Item.class);
+ Root
- root = criteriaDelete.from(Item.class);
+ criteriaDelete.where(cb.greaterThan(root.get("itemPrice"), targetPrice));
+
+ Transaction transaction = session.beginTransaction();
+ session.createQuery(criteriaDelete).executeUpdate();
+ transaction.commit();
+
+ List
- deletedItem = session.createQuery("FROM Item WHERE itemPrice > " + targetPrice, Item.class).list();
+ assertTrue(deletedItem.isEmpty());
+
+ }
+
}
diff --git a/persistence-modules/spring-hibernate4/README.md b/persistence-modules/spring-hibernate4/README.md
index 57a341ed45..f2553ad229 100644
--- a/persistence-modules/spring-hibernate4/README.md
+++ b/persistence-modules/spring-hibernate4/README.md
@@ -3,8 +3,8 @@
## Spring with Hibernate 4 Example Project
### Relevant Articles:
-- [Hibernate 4 with Spring](http://www.baeldung.com/hibernate-4-spring)
-- [The DAO with Spring 3 and Hibernate](http://www.baeldung.com/persistence-layer-with-spring-and-hibernate)
+- [Guide to Hibernate 4 with Spring](http://www.baeldung.com/hibernate-4-spring)
+- [The DAO with Spring and Hibernate](http://www.baeldung.com/persistence-layer-with-spring-and-hibernate)
- [Hibernate Pagination](http://www.baeldung.com/hibernate-pagination)
- [Sorting with Hibernate](http://www.baeldung.com/hibernate-sort)
- [Stored Procedures with Hibernate](http://www.baeldung.com/stored-procedures-with-hibernate-tutorial)
diff --git a/persistence-modules/spring-jpa/README.md b/persistence-modules/spring-jpa/README.md
index e6f91ac016..2f2a27e4ac 100644
--- a/persistence-modules/spring-jpa/README.md
+++ b/persistence-modules/spring-jpa/README.md
@@ -4,8 +4,8 @@
### Relevant Articles:
-- [Spring 3 and JPA with Hibernate](http://www.baeldung.com/2011/12/13/the-persistence-layer-with-spring-3-1-and-jpa/)
-- [Transactions with Spring 3 and JPA](http://www.baeldung.com/2011/12/26/transaction-configuration-with-jpa-and-spring-3-1/)
+- [A Guide to JPA with Spring](https://www.baeldung.com/the-persistence-layer-with-spring-and-jpa)
+- [Transactions with Spring and JPA](https://www.baeldung.com/transaction-configuration-with-jpa-and-spring)
- [The DAO with JPA and Spring](http://www.baeldung.com/spring-dao-jpa)
- [JPA Pagination](http://www.baeldung.com/jpa-pagination)
- [Sorting with JPA](http://www.baeldung.com/jpa-sort)
@@ -15,12 +15,12 @@
- [Self-Contained Testing Using an In-Memory Database](http://www.baeldung.com/spring-jpa-test-in-memory-database)
- [A Guide to Spring AbstractRoutingDatasource](http://www.baeldung.com/spring-abstract-routing-data-source)
- [A Guide to Hibernate with Spring 4](http://www.baeldung.com/the-persistence-layer-with-spring-and-jpa)
-- [Testing REST with multiple MIME types](http://www.baeldung.com/testing-rest-api-with-multiple-media-types)
- [Obtaining Auto-generated Keys in Spring JDBC](http://www.baeldung.com/spring-jdbc-autogenerated-keys)
- [Transactions with Spring 4 and JPA](http://www.baeldung.com/transaction-configuration-with-jpa-and-spring)
- [Use Criteria Queries in a Spring Data Application](https://www.baeldung.com/spring-data-criteria-queries)
- [Many-To-Many Relationship in JPA](https://www.baeldung.com/jpa-many-to-many)
+
### Eclipse Config
After importing the project into Eclipse, you may see the following error:
"No persistence xml file found in project"
diff --git a/persistence-modules/spring-jpa/pom.xml b/persistence-modules/spring-jpa/pom.xml
index 400811b582..29a6996791 100644
--- a/persistence-modules/spring-jpa/pom.xml
+++ b/persistence-modules/spring-jpa/pom.xml
@@ -3,8 +3,8 @@
4.0.0
spring-jpa
0.1-SNAPSHOT
- war
spring-jpa
+ war
com.baeldung
diff --git a/persistence-modules/spring-jpa/src/test/java/com/baeldung/SpringContextIntegrationTest.java b/persistence-modules/spring-jpa/src/test/java/com/baeldung/SpringContextIntegrationTest.java
new file mode 100644
index 0000000000..aa85128628
--- /dev/null
+++ b/persistence-modules/spring-jpa/src/test/java/com/baeldung/SpringContextIntegrationTest.java
@@ -0,0 +1,19 @@
+package com.baeldung;
+
+import org.baeldung.config.PersistenceJPAConfigL2Cache;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.test.context.support.AnnotationConfigContextLoader;
+import org.springframework.test.context.web.WebAppConfiguration;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(classes = { PersistenceJPAConfigL2Cache.class }, loader = AnnotationConfigContextLoader.class)
+@WebAppConfiguration
+public class SpringContextIntegrationTest {
+
+ @Test
+ public void whenSpringContextIsBootstrapped_thenNoExceptions() {
+ }
+}
diff --git a/pom.xml b/pom.xml
index 1c0738cafb..d26b96ea8e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -367,10 +367,11 @@
axon
azure
+ blade
+
bootique
- cas/cas-secured-app
- cas/cas-server
+ cas
cdi
checker-plugin
core-groovy
@@ -410,7 +411,7 @@
feign
flyway-cdi-extension
-
+ geotools
google-cloud
google-web-toolkit
@@ -420,9 +421,7 @@
gson
guava
guava-collections
- guava-modules/guava-18
- guava-modules/guava-19
- guava-modules/guava-21
+ guava-modules
guice
@@ -473,15 +472,13 @@
kotlin-libraries
+ libraries
libraries-data
libraries-apache-commons
libraries-security
libraries-server
linkrest
- logging-modules/log4j
- logging-modules/log4j2
- logging-modules/logback
- logging-modules/log-mdc
+ logging-modules
lombok
lucene
@@ -512,45 +509,7 @@
protobuffer
- persistence-modules/activejdbc
- persistence-modules/apache-cayenne
- persistence-modules/core-java-persistence
- persistence-modules/deltaspike
- persistence-modules/flyway
- persistence-modules/hbase
- persistence-modules/hibernate5
- persistence-modules/hibernate-ogm
- persistence-modules/influxdb
- persistence-modules/java-cassandra
- persistence-modules/java-cockroachdb
- persistence-modules/java-jdbi
- persistence-modules/java-jpa
- persistence-modules/jnosql
- persistence-modules/liquibase
- persistence-modules/orientdb
- persistence-modules/querydsl
- persistence-modules/redis
- persistence-modules/solr
- persistence-modules/spring-boot-h2/spring-boot-h2-database
- persistence-modules/spring-boot-persistence
- persistence-modules/spring-boot-persistence-mongodb
- persistence-modules/spring-data-cassandra
- persistence-modules/spring-data-cassandra-reactive
- persistence-modules/spring-data-couchbase-2
- persistence-modules/spring-data-dynamodb
- persistence-modules/spring-data-eclipselink
-
- persistence-modules/spring-data-gemfire
- persistence-modules/spring-data-jpa
- persistence-modules/spring-data-keyvalue
- persistence-modules/spring-data-mongodb
- persistence-modules/spring-data-neo4j
- persistence-modules/spring-data-redis
- persistence-modules/spring-data-solr
- persistence-modules/spring-hibernate-3
- persistence-modules/spring-hibernate-5
- persistence-modules/spring-hibernate4
- persistence-modules/spring-jpa
+ persistence-modules
rabbitmq
@@ -558,15 +517,13 @@
reactor-core
rest-with-spark-java
resteasy
-
+ restx
- rule-engines/easy-rules
- rule-engines/openl-tablets
- rule-engines/rulebook
+ rule-engines
rsocket
rxjava
- rxjava-2
-
+ rxjava-2
+ software-security/sql-injection-samples
@@ -714,23 +671,17 @@
spring-rest-simple
spring-resttemplate
spring-roo
-
spring-security-acl
spring-security-angular/server
spring-security-cache-control
- spring-security-client/spring-security-jsp-authentication
- spring-security-client/spring-security-jsp-authorize
- spring-security-client/spring-security-jsp-config
- spring-security-client/spring-security-mvc
- spring-security-client/spring-security-thymeleaf-authentication
- spring-security-client/spring-security-thymeleaf-authorize
- spring-security-client/spring-security-thymeleaf-config
+ spring-security-client
spring-security-core
spring-security-mvc-boot
spring-security-mvc-custom
spring-security-mvc-digest-auth
+ spring-security-mvc-jsonview
spring-security-mvc-ldap
spring-security-mvc-login
spring-security-mvc-persisted-remember-me
@@ -747,6 +698,7 @@
spring-security-x509
spring-session
spring-sleuth
+ spring-soap
spring-social-login
spring-spel
spring-state-machine
@@ -769,24 +721,7 @@
structurizr
struts-2
- testing-modules/gatling
- testing-modules/groovy-spock
- testing-modules/junit-5
- testing-modules/junit5-migration
- testing-modules/load-testing-comparison
- testing-modules/mockito
- testing-modules/mockito-2
- testing-modules/mocks
- testing-modules/mockserver
- testing-modules/parallel-tests-junit
- testing-modules/rest-assured
- testing-modules/rest-testing
-
- testing-modules/selenium-junit-testng
- testing-modules/spring-testing
- testing-modules/test-containers
- testing-modules/testing
- testing-modules/testng
+ testing-modules
twilio
Twitter4J
@@ -845,8 +780,7 @@
spring-apache-camel
spring-batch
spring-bom
- spring-boot-admin/spring-boot-admin-client
- spring-boot-admin/spring-boot-admin-server
+ spring-boot-admin
spring-boot-bootstrap
spring-boot-bootstrap
spring-boot-camel
@@ -858,22 +792,18 @@
spring-boot-jasypt
spring-boot-keycloak
spring-boot-mvc
- spring-boot-property-exp/property-exp-custom-config
- spring-boot-property-exp/property-exp-default-config
+ spring-boot-property-exp
spring-boot-vue
spring-cloud
spring-cloud/spring-cloud-archaius/basic-config
spring-cloud/spring-cloud-archaius/extra-configs
spring-cloud/spring-cloud-bootstrap/config
- spring-cloud/spring-cloud-contract/spring-cloud-contract-consumer
- spring-cloud/spring-cloud-contract/spring-cloud-contract-producer
+ spring-cloud/spring-cloud-contract
spring-cloud/spring-cloud-gateway
spring-cloud/spring-cloud-kubernetes/demo-backend
spring-cloud/spring-cloud-rest/spring-cloud-rest-config-server
spring-cloud/spring-cloud-ribbon-client
- spring-cloud/spring-cloud-security/auth-client
- spring-cloud/spring-cloud-security/auth-resource
- spring-cloud/spring-cloud-security/auth-server
+ spring-cloud/spring-cloud-security
spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit
spring-cloud/spring-cloud-task/springcloudtasksink
spring-cloud/spring-cloud-zookeeper
@@ -921,13 +851,7 @@
spring-security-acl
spring-security-angular
spring-security-cache-control
- spring-security-client/spring-security-jsp-authentication
- spring-security-client/spring-security-jsp-authorize
- spring-security-client/spring-security-jsp-config
- spring-security-client/spring-security-mvc
- spring-security-client/spring-security-thymeleaf-authentication
- spring-security-client/spring-security-thymeleaf-authorize
- spring-security-client/spring-security-thymeleaf-config
+ spring-security-client
spring-security-core
spring-security-mvc-boot
spring-security-mvc-custom
@@ -937,14 +861,11 @@
spring-security-mvc-session
spring-security-mvc-socket
spring-security-rest
- spring-security-sso/spring-security-sso-auth-server
- spring-security-sso/spring-security-sso-ui
- spring-security-sso/spring-security-sso-ui-2
+ spring-security-sso
spring-security-thymeleaf/spring-security-thymeleaf-authentication
spring-security-thymeleaf/spring-security-thymeleaf-authorize
spring-security-thymeleaf/spring-security-thymeleaf-config
- spring-security-x509/spring-security-x509-basic-auth
- spring-security-x509/spring-security-x509-client-auth
+ spring-security-x509
spring-session/spring-session-jdbc
spring-sleuth
spring-social-login
@@ -1000,6 +921,7 @@
core-java-concurrency-advanced
core-kotlin
+ core-kotlin-2
jenkins/hello-world
jhipster
@@ -1085,8 +1007,7 @@
bootique
- cas/cas-secured-app
- cas/cas-server
+ cas
cdi
checker-plugin
core-groovy
@@ -1125,7 +1046,7 @@
feign
flyway-cdi-extension
-
+ geotools
google-cloud
google-web-toolkit
@@ -1135,9 +1056,7 @@
gson
guava
guava-collections
- guava-modules/guava-18
- guava-modules/guava-19
- guava-modules/guava-21
+ guava-modules
guice
@@ -1188,15 +1107,13 @@
kotlin-libraries
+ libraries
libraries-data
libraries-apache-commons
libraries-security
libraries-server
linkrest
- logging-modules/log4j
- logging-modules/log4j2
- logging-modules/logback
- logging-modules/log-mdc
+ logging-modules
lombok
lucene
@@ -1227,57 +1144,17 @@
protobuffer
- persistence-modules/activejdbc
- persistence-modules/apache-cayenne
- persistence-modules/core-java-persistence
- persistence-modules/deltaspike
- persistence-modules/flyway
- persistence-modules/hbase
- persistence-modules/hibernate5
- persistence-modules/hibernate-ogm
- persistence-modules/influxdb
- persistence-modules/java-cassandra
- persistence-modules/java-cockroachdb
- persistence-modules/java-jdbi
- persistence-modules/java-jpa
- persistence-modules/jnosql
- persistence-modules/liquibase
- persistence-modules/orientdb
- persistence-modules/querydsl
- persistence-modules/redis
- persistence-modules/solr
- persistence-modules/spring-boot-h2/spring-boot-h2-database
- persistence-modules/spring-boot-persistence
- persistence-modules/spring-boot-persistence-mongodb
- persistence-modules/spring-data-cassandra
- persistence-modules/spring-data-cassandra-reactive
- persistence-modules/spring-data-couchbase-2
- persistence-modules/spring-data-dynamodb
- persistence-modules/spring-data-eclipselink
-
- persistence-modules/spring-data-gemfire
- persistence-modules/spring-data-jpa
- persistence-modules/spring-data-keyvalue
- persistence-modules/spring-data-mongodb
- persistence-modules/spring-data-neo4j
- persistence-modules/spring-data-redis
- persistence-modules/spring-data-solr
- persistence-modules/spring-hibernate-3
- persistence-modules/spring-hibernate-5
- persistence-modules/spring-hibernate4
- persistence-modules/spring-jpa
-
+ persistence-modules
+
rabbitmq
ratpack
reactor-core
rest-with-spark-java
resteasy
-
+ restx
- rule-engines/easy-rules
- rule-engines/openl-tablets
- rule-engines/rulebook
+ rule-engines
rsocket
rxjava
rxjava-2
@@ -1428,13 +1305,7 @@
spring-security-angular/server
spring-security-cache-control
- spring-security-client/spring-security-jsp-authentication
- spring-security-client/spring-security-jsp-authorize
- spring-security-client/spring-security-jsp-config
- spring-security-client/spring-security-mvc
- spring-security-client/spring-security-thymeleaf-authentication
- spring-security-client/spring-security-thymeleaf-authorize
- spring-security-client/spring-security-thymeleaf-config
+ spring-security-client
spring-security-core
spring-security-mvc-boot
@@ -1456,6 +1327,7 @@
spring-security-x509
spring-session
spring-sleuth
+ spring-soap
spring-social-login
spring-spel
spring-state-machine
@@ -1478,24 +1350,7 @@
structurizr
struts-2
- testing-modules/gatling
- testing-modules/groovy-spock
- testing-modules/junit-5
- testing-modules/junit5-migration
- testing-modules/load-testing-comparison
- testing-modules/mockito
- testing-modules/mockito-2
- testing-modules/mocks
- testing-modules/mockserver
- testing-modules/parallel-tests-junit
- testing-modules/rest-assured
- testing-modules/rest-testing
-
- testing-modules/selenium-junit-testng
- testing-modules/spring-testing
- testing-modules/test-containers
- testing-modules/testing
- testing-modules/testng
+ testing-modules
twilio
Twitter4J
@@ -1551,6 +1406,7 @@
core-java
core-java-concurrency-advanced
core-kotlin
+ core-kotlin-2
jenkins/hello-world
jhipster
@@ -1587,7 +1443,7 @@
UTF-8
UTF-8
- refs/heads/master
+ refs/remotes/origin/master
true
false
false
@@ -1622,7 +1478,7 @@
2.3.1
1.9.13
1.2
- 2.9.7
+ 2.9.7
1.3
1.2.0
5.2.0
@@ -1633,5 +1489,6 @@
2.3
3.8
+ 1.16.12
diff --git a/ratpack/README.md b/ratpack/README.md
index dded42fab6..14bc3f6c74 100644
--- a/ratpack/README.md
+++ b/ratpack/README.md
@@ -5,3 +5,4 @@
- [Ratpack Integration with Spring Boot](http://www.baeldung.com/ratpack-spring-boot)
- [Ratpack with Hystrix](http://www.baeldung.com/ratpack-hystrix)
- [Ratpack HTTP Client](https://www.baeldung.com/ratpack-http-client)
+- [Ratpack with RxJava](https://www.baeldung.com/ratpack-rxjava)
diff --git a/ratpack/pom.xml b/ratpack/pom.xml
index 7de11e6955..a4389275b6 100644
--- a/ratpack/pom.xml
+++ b/ratpack/pom.xml
@@ -3,9 +3,9 @@
4.0.0
com.baeldung
ratpack
- jar
1.0-SNAPSHOT
ratpack
+ jar
http://maven.apache.org
diff --git a/ratpack/src/main/java/com/baeldung/model/Movie.java b/ratpack/src/main/java/com/baeldung/model/Movie.java
new file mode 100644
index 0000000000..6618e9bbb7
--- /dev/null
+++ b/ratpack/src/main/java/com/baeldung/model/Movie.java
@@ -0,0 +1,47 @@
+package com.baeldung.model;
+/**
+ *
+ *POJO class for Movie object
+ */
+public class Movie {
+
+ private String name;
+
+ private String year;
+
+ private String director;
+
+ private Double rating;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getYear() {
+ return year;
+ }
+
+ public void setYear(String year) {
+ this.year = year;
+ }
+
+ public String getDirector() {
+ return director;
+ }
+
+ public void setDirector(String director) {
+ this.director = director;
+ }
+
+ public Double getRating() {
+ return rating;
+ }
+
+ public void setRating(Double rating) {
+ this.rating = rating;
+ }
+}
diff --git a/ratpack/src/main/java/com/baeldung/rxjava/RatpackErrorHandlingApp.java b/ratpack/src/main/java/com/baeldung/rxjava/RatpackErrorHandlingApp.java
new file mode 100644
index 0000000000..7d2eba56fb
--- /dev/null
+++ b/ratpack/src/main/java/com/baeldung/rxjava/RatpackErrorHandlingApp.java
@@ -0,0 +1,27 @@
+package com.baeldung.rxjava;
+
+import ratpack.error.ServerErrorHandler;
+import ratpack.rx.RxRatpack;
+import ratpack.server.RatpackServer;
+import rx.Observable;
+
+public class RatpackErrorHandlingApp {
+
+ /**
+ * Try hitting http://localhost:5050/error to see the error handler in action
+ * @param args
+ * @throws Exception
+ */
+
+ public static void main(String[] args) throws Exception {
+ RxRatpack.initialize();
+ RatpackServer.start(def -> def.registryOf(regSpec -> regSpec.add(ServerErrorHandler.class, (ctx, throwable) -> {
+ ctx.render("Error caught by handler : " + throwable.getMessage());
+ }))
+ .handlers(chain -> chain.get("error", ctx -> {
+ Observable. error(new Exception("Error from observable"))
+ .subscribe(s -> {
+ });
+ })));
+ }
+}
diff --git a/ratpack/src/main/java/com/baeldung/rxjava/RatpackObserveApp.java b/ratpack/src/main/java/com/baeldung/rxjava/RatpackObserveApp.java
new file mode 100644
index 0000000000..d5ef105207
--- /dev/null
+++ b/ratpack/src/main/java/com/baeldung/rxjava/RatpackObserveApp.java
@@ -0,0 +1,44 @@
+package com.baeldung.rxjava;
+
+import java.util.List;
+
+import com.baeldung.model.Movie;
+import com.baeldung.rxjava.service.MoviePromiseService;
+import com.baeldung.rxjava.service.impl.MoviePromiseServiceImpl;
+
+import ratpack.exec.Promise;
+import ratpack.handling.Handler;
+import ratpack.jackson.Jackson;
+import ratpack.rx.RxRatpack;
+import ratpack.server.RatpackServer;
+
+public class RatpackObserveApp {
+ /**
+ * Try hitting http://localhost:5050/movies or http://localhost:5050/movie to see the application in action.
+ *
+ * @param args
+ * @throws Exception
+ */
+ public static void main(String[] args) throws Exception {
+ RxRatpack.initialize();
+
+ Handler moviePromiseHandler = ctx -> {
+ MoviePromiseService promiseSvc = ctx.get(MoviePromiseService.class);
+ Promise moviePromise = promiseSvc.getMovie();
+ RxRatpack.observe(moviePromise)
+ .subscribe(movie -> ctx.render(Jackson.json(movie)));
+ };
+
+ Handler moviesPromiseHandler = ctx -> {
+ MoviePromiseService promiseSvc = ctx.get(MoviePromiseService.class);
+ Promise> moviePromises = promiseSvc.getMovies();
+ RxRatpack.observeEach(moviePromises)
+ .toList()
+ .subscribe(movie -> ctx.render(Jackson.json(movie)));
+ };
+
+ RatpackServer.start(def -> def.registryOf(regSpec -> regSpec.add(MoviePromiseService.class, new MoviePromiseServiceImpl()))
+ .handlers(chain -> chain.get("movie", moviePromiseHandler)
+ .get("movies", moviesPromiseHandler)));
+ }
+}
diff --git a/ratpack/src/main/java/com/baeldung/rxjava/RatpackParallelismApp.java b/ratpack/src/main/java/com/baeldung/rxjava/RatpackParallelismApp.java
new file mode 100644
index 0000000000..033c3e73b5
--- /dev/null
+++ b/ratpack/src/main/java/com/baeldung/rxjava/RatpackParallelismApp.java
@@ -0,0 +1,36 @@
+package com.baeldung.rxjava;
+
+import com.baeldung.model.Movie;
+import com.baeldung.rxjava.service.MovieObservableService;
+import com.baeldung.rxjava.service.impl.MovieObservableServiceImpl;
+
+import ratpack.jackson.Jackson;
+import ratpack.rx.RxRatpack;
+import ratpack.server.RatpackServer;
+import rx.Observable;
+
+public class RatpackParallelismApp {
+
+ /**
+ * Try hitting http://localhost:5050/movies to see the application in action.
+ *
+ * @param args
+ * @throws Exception
+ */
+ public static void main(String[] args) throws Exception {
+ RxRatpack.initialize();
+ RatpackServer.start(def -> def.registryOf(regSpec -> regSpec.add(MovieObservableService.class, new MovieObservableServiceImpl()))
+ .handlers(chain -> chain.get("movies", ctx -> {
+ MovieObservableService movieSvc = ctx.get(MovieObservableService.class);
+ Observable movieObs = movieSvc.getMovies();
+ Observable upperCasedNames = movieObs.compose(RxRatpack::forkEach)
+ .map(movie -> movie.getName()
+ .toUpperCase())
+ .serialize();
+ RxRatpack.promise(upperCasedNames)
+ .then(movie -> {
+ ctx.render(Jackson.json(movie));
+ });
+ })));
+ }
+}
diff --git a/ratpack/src/main/java/com/baeldung/rxjava/RatpackPromiseApp.java b/ratpack/src/main/java/com/baeldung/rxjava/RatpackPromiseApp.java
new file mode 100644
index 0000000000..8a9c00b788
--- /dev/null
+++ b/ratpack/src/main/java/com/baeldung/rxjava/RatpackPromiseApp.java
@@ -0,0 +1,43 @@
+package com.baeldung.rxjava;
+
+import com.baeldung.model.Movie;
+import com.baeldung.rxjava.service.MovieObservableService;
+import com.baeldung.rxjava.service.impl.MovieObservableServiceImpl;
+
+import ratpack.handling.Handler;
+import ratpack.jackson.Jackson;
+import ratpack.rx.RxRatpack;
+import ratpack.server.RatpackServer;
+import rx.Observable;
+
+public class RatpackPromiseApp {
+
+ /**
+ * Try hitting http://localhost:5050/movies or http://localhost:5050/movie to see the application in action.
+ *
+ * @param args
+ * @throws Exception
+ */
+ public static void main(String[] args) throws Exception {
+ RxRatpack.initialize();
+
+ Handler movieHandler = (ctx) -> {
+ MovieObservableService movieSvc = ctx.get(MovieObservableService.class);
+ Observable movieObs = movieSvc.getMovie();
+ RxRatpack.promiseSingle(movieObs)
+ .then(movie -> ctx.render(Jackson.json(movie)));
+ };
+
+ Handler moviesHandler = (ctx) -> {
+ MovieObservableService movieSvc = ctx.get(MovieObservableService.class);
+ Observable movieObs = movieSvc.getMovies();
+ RxRatpack.promise(movieObs)
+ .then(movie -> ctx.render(Jackson.json(movie)));
+ };
+
+ RatpackServer.start(def -> def.registryOf(rSpec -> rSpec.add(MovieObservableService.class, new MovieObservableServiceImpl()))
+ .handlers(chain -> chain.get("movie", movieHandler)
+ .get("movies", moviesHandler)));
+ }
+
+}
diff --git a/ratpack/src/main/java/com/baeldung/rxjava/service/MovieObservableService.java b/ratpack/src/main/java/com/baeldung/rxjava/service/MovieObservableService.java
new file mode 100644
index 0000000000..75a90faa44
--- /dev/null
+++ b/ratpack/src/main/java/com/baeldung/rxjava/service/MovieObservableService.java
@@ -0,0 +1,13 @@
+package com.baeldung.rxjava.service;
+
+import com.baeldung.model.Movie;
+
+import rx.Observable;
+
+public interface MovieObservableService {
+
+ Observable getMovies();
+
+ Observable getMovie();
+
+}
diff --git a/ratpack/src/main/java/com/baeldung/rxjava/service/MoviePromiseService.java b/ratpack/src/main/java/com/baeldung/rxjava/service/MoviePromiseService.java
new file mode 100644
index 0000000000..fc58993d73
--- /dev/null
+++ b/ratpack/src/main/java/com/baeldung/rxjava/service/MoviePromiseService.java
@@ -0,0 +1,15 @@
+package com.baeldung.rxjava.service;
+
+import java.util.List;
+
+import com.baeldung.model.Movie;
+
+import ratpack.exec.Promise;
+
+public interface MoviePromiseService {
+
+ Promise> getMovies();
+
+ Promise getMovie();
+
+}
diff --git a/ratpack/src/main/java/com/baeldung/rxjava/service/impl/MovieObservableServiceImpl.java b/ratpack/src/main/java/com/baeldung/rxjava/service/impl/MovieObservableServiceImpl.java
new file mode 100644
index 0000000000..817a33d857
--- /dev/null
+++ b/ratpack/src/main/java/com/baeldung/rxjava/service/impl/MovieObservableServiceImpl.java
@@ -0,0 +1,35 @@
+package com.baeldung.rxjava.service.impl;
+
+import com.baeldung.model.Movie;
+import com.baeldung.rxjava.service.MovieObservableService;
+
+import rx.Observable;
+
+public class MovieObservableServiceImpl implements MovieObservableService {
+
+ @Override
+ public Observable getMovie() {
+ Movie movie = new Movie();
+ movie.setName("The Godfather");
+ movie.setYear("1972");
+ movie.setDirector("Coppola");
+ movie.setRating(9.2);
+ return Observable.just(movie);
+ }
+
+ @Override
+ public Observable getMovies() {
+ Movie movie = new Movie();
+ movie.setName("The Godfather");
+ movie.setYear("1972");
+ movie.setDirector("Coppola");
+ movie.setRating(9.2);
+ Movie movie2 = new Movie();
+ movie2.setName("The Godfather Part 2");
+ movie2.setYear("1974");
+ movie2.setDirector("Coppola");
+ movie2.setRating(9.0);
+ return Observable.just(movie, movie2);
+
+ }
+}
diff --git a/ratpack/src/main/java/com/baeldung/rxjava/service/impl/MoviePromiseServiceImpl.java b/ratpack/src/main/java/com/baeldung/rxjava/service/impl/MoviePromiseServiceImpl.java
new file mode 100644
index 0000000000..a66b1e79d6
--- /dev/null
+++ b/ratpack/src/main/java/com/baeldung/rxjava/service/impl/MoviePromiseServiceImpl.java
@@ -0,0 +1,41 @@
+package com.baeldung.rxjava.service.impl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.baeldung.model.Movie;
+import com.baeldung.rxjava.service.MoviePromiseService;
+
+import ratpack.exec.Promise;
+
+public class MoviePromiseServiceImpl implements MoviePromiseService {
+
+ @Override
+ public Promise getMovie() {
+ Movie movie = new Movie();
+ movie.setName("The Godfather");
+ movie.setYear("1972");
+ movie.setDirector("Coppola");
+ movie.setRating(9.2);
+ return Promise.value(movie);
+ }
+
+ @Override
+ public Promise> getMovies() {
+ Movie movie = new Movie();
+ movie.setName("The Godfather");
+ movie.setYear("1972");
+ movie.setDirector("Coppola");
+ movie.setRating(9.2);
+ Movie movie2 = new Movie();
+ movie2.setName("The Godfather Part 2");
+ movie2.setYear("1974");
+ movie2.setDirector("Coppola");
+ movie2.setRating(9.0);
+ List movies = new ArrayList<>();
+ movies.add(movie);
+ movies.add(movie2);
+ return Promise.value(movies);
+ }
+
+}
diff --git a/rest-with-spark-java/pom.xml b/rest-with-spark-java/pom.xml
index f7c91f8827..fc78ac6b86 100644
--- a/rest-with-spark-java/pom.xml
+++ b/rest-with-spark-java/pom.xml
@@ -23,19 +23,17 @@
com.fasterxml.jackson.core
jackson-core
- ${jackson-core.version}
+ ${jackson.version}
com.fasterxml.jackson.core
jackson-databind
- ${jackson-databind.version}
+ ${jackson.version}
2.5.4
- 2.9.7
- 2.9.7
diff --git a/resteasy/bin/pom.xml b/resteasy/bin/pom.xml
index f8cdc20360..15d8b5bd18 100644
--- a/resteasy/bin/pom.xml
+++ b/resteasy/bin/pom.xml
@@ -2,18 +2,11 @@
4.0.0
-
com.baeldung
resteasy-tutorial
1.0
war
-
- 3.0.19.Final
- 2.5
- 1.6.1
-
-
com.baeldung
resteasy-tutorial
@@ -80,4 +73,10 @@
${commons-io.version}
+
+
+ 3.0.19.Final
+ 2.5
+ 1.6.1
+
\ No newline at end of file
diff --git a/resteasy/pom.xml b/resteasy/pom.xml
index 31a6ed485a..ca4124abca 100644
--- a/resteasy/pom.xml
+++ b/resteasy/pom.xml
@@ -5,8 +5,8 @@
com.baeldung
resteasy
1.0
- war
resteasy
+ war
com.baeldung
diff --git a/restx/pom.xml b/restx/pom.xml
index c6233b968c..10c843a208 100644
--- a/restx/pom.xml
+++ b/restx/pom.xml
@@ -3,17 +3,10 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
-
restx
0.1-SNAPSHOT
+ restx
war
- restx-demo
-
-
- 1.8
- 1.8
- 0.35-rc4
-
com.baeldung
@@ -106,7 +99,7 @@
ch.qos.logback
logback-classic
- 1.0.13
+ ${logback-classic.version}
io.restx
@@ -117,10 +110,11 @@
junit
junit
- 4.11
+ ${junit.version}
test
+
@@ -152,4 +146,11 @@
+
+
+ 1.8
+ 1.8
+ 0.35-rc4
+ 1.2.3
+
diff --git a/restx/src/main/java/restx/demo/rest/HelloResource.java b/restx/src/main/java/restx/demo/rest/HelloResource.java
index 5cb2c2a5e6..115212ddf9 100644
--- a/restx/src/main/java/restx/demo/rest/HelloResource.java
+++ b/restx/src/main/java/restx/demo/rest/HelloResource.java
@@ -3,6 +3,8 @@ package restx.demo.rest;
import restx.demo.domain.Message;
import restx.demo.Roles;
import org.joda.time.DateTime;
+import org.joda.time.DateTimeZone;
+
import restx.annotations.GET;
import restx.annotations.POST;
import restx.annotations.RestxResource;
@@ -29,7 +31,7 @@ public class HelloResource {
return new Message().setMessage(String.format(
"hello %s, it's %s",
RestxSession.current().getPrincipal().get().getName(),
- DateTime.now().toString("HH:mm:ss")));
+ DateTime.now(DateTimeZone.UTC).toString("HH:mm:ss")));
}
/**
@@ -44,7 +46,7 @@ public class HelloResource {
public Message helloPublic(String who) {
return new Message().setMessage(String.format(
"hello %s, it's %s",
- who, DateTime.now().toString("HH:mm:ss")));
+ who, DateTime.now(DateTimeZone.UTC).toString("HH:mm:ss")));
}
public static class MyPOJO {
diff --git a/restx/src/test/resources/specs/hello/should_admin_say_hello.spec.yaml b/restx/src/test/resources/specs/hello/should_admin_say_hello.spec.yaml
index 1b7b8f0f90..7a8bd9119f 100644
--- a/restx/src/test/resources/specs/hello/should_admin_say_hello.spec.yaml
+++ b/restx/src/test/resources/specs/hello/should_admin_say_hello.spec.yaml
@@ -7,4 +7,4 @@ wts:
GET message
$RestxSession: {"_expires":"2013-09-27T01:18:00.822+02:00","principal":"admin","sessionKey":"e2b4430f-9541-4602-9a3a-413d17c56a6b"}
then: |
- {"message":"hello admin, it's 01:18:00"}
+ {"message":"hello admin, it's 23:18:00"}
diff --git a/restx/src/test/resources/specs/hello/should_anyone_say_hello.spec.yaml b/restx/src/test/resources/specs/hello/should_anyone_say_hello.spec.yaml
index 29b6faca34..d23e5ae6bf 100644
--- a/restx/src/test/resources/specs/hello/should_anyone_say_hello.spec.yaml
+++ b/restx/src/test/resources/specs/hello/should_anyone_say_hello.spec.yaml
@@ -5,4 +5,4 @@ wts:
- when: |
GET hello?who=xavier
then: |
- {"message":"hello xavier, it's 01:18:00"}
+ {"message":"hello xavier, it's 23:18:00"}
diff --git a/restx/src/test/resources/specs/hello/should_user1_say_hello.spec.yaml b/restx/src/test/resources/specs/hello/should_user1_say_hello.spec.yaml
index 791a3a2776..2db8a01003 100644
--- a/restx/src/test/resources/specs/hello/should_user1_say_hello.spec.yaml
+++ b/restx/src/test/resources/specs/hello/should_user1_say_hello.spec.yaml
@@ -7,4 +7,4 @@ wts:
GET message
$RestxSession: {"_expires":"2013-09-27T01:18:00.822+02:00","principal":"user1","sessionKey":"e2b4430f-9541-4602-9a3a-413d17c56a6b"}
then: |
- {"message":"hello user1, it's 01:18:00"}
+ {"message":"hello user1, it's 23:18:00"}
diff --git a/rsocket/pom.xml b/rsocket/pom.xml
index 8b04a31583..d2182719c2 100644
--- a/rsocket/pom.xml
+++ b/rsocket/pom.xml
@@ -4,51 +4,61 @@
rsocket
0.0.1-SNAPSHOT
rsocket
+ jar
-
+
com.baeldung
parent-modules
1.0.0-SNAPSHOT
- jar
-
+
io.rsocket
rsocket-core
- 0.11.13
+ ${rsocket.version}
io.rsocket
rsocket-transport-netty
- 0.11.13
+ ${rsocket.version}
junit
junit
- 4.12
+ ${junit.version}
test
org.hamcrest
hamcrest-core
- 1.3
+ ${hamcrest.version}
test
ch.qos.logback
logback-classic
- 1.2.3
+ ${logback.version}
ch.qos.logback
logback-core
- 1.2.3
+ ${logback.version}
org.slf4j
slf4j-api
- 1.7.25
+ ${slf4j-api.version}
-
\ No newline at end of file
+
+
+ 1.8
+ 1.8
+ 3.0.1
+ 0.11.13
+ 1.3
+ 1.2.3
+ 1.7.25
+
+
diff --git a/rule-engines/pom.xml b/rule-engines/pom.xml
new file mode 100644
index 0000000000..2ce82ed22b
--- /dev/null
+++ b/rule-engines/pom.xml
@@ -0,0 +1,22 @@
+
+
+ 4.0.0
+ rule-engines
+ rule-engines
+ pom
+
+
+ com.baeldung
+ parent-modules
+ 1.0.0-SNAPSHOT
+ ..
+
+
+
+ easy-rules
+ openl-tablets
+ rulebook
+
+
+
diff --git a/rxjava-2/pom.xml b/rxjava-2/pom.xml
index 3038c20037..47d16ec8dd 100644
--- a/rxjava-2/pom.xml
+++ b/rxjava-2/pom.xml
@@ -3,8 +3,8 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
-
rxjava-2
+ rxjava-2
1.0-SNAPSHOT
diff --git a/saas/pom.xml b/saas/pom.xml
index 2abc932497..35de34ea72 100644
--- a/saas/pom.xml
+++ b/saas/pom.xml
@@ -4,8 +4,8 @@
com.baeldung
saas
0.1.0-SNAPSHOT
- jar
saas
+ jar
com.baeldung
diff --git a/software-security/sql-injection-samples/.gitignore b/software-security/sql-injection-samples/.gitignore
new file mode 100644
index 0000000000..82eca336e3
--- /dev/null
+++ b/software-security/sql-injection-samples/.gitignore
@@ -0,0 +1,25 @@
+/target/
+!.mvn/wrapper/maven-wrapper.jar
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### NetBeans ###
+/nbproject/private/
+/build/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
\ No newline at end of file
diff --git a/software-security/sql-injection-samples/README.md b/software-security/sql-injection-samples/README.md
new file mode 100644
index 0000000000..7a077074ac
--- /dev/null
+++ b/software-security/sql-injection-samples/README.md
@@ -0,0 +1,3 @@
+## Relevant articles:
+
+- [SQL Injection and How to Prevent It?](https://www.baeldung.com/sql-injection)
diff --git a/software-security/sql-injection-samples/pom.xml b/software-security/sql-injection-samples/pom.xml
new file mode 100644
index 0000000000..5b33c674d4
--- /dev/null
+++ b/software-security/sql-injection-samples/pom.xml
@@ -0,0 +1,73 @@
+
+
+ 4.0.0
+ com.baeldung
+ sql-injection-samples
+ 0.0.1-SNAPSHOT
+ sql-injection-samples
+ Sample SQL Injection tests
+
+
+ parent-boot-2
+ com.baeldung
+ 0.0.1-SNAPSHOT
+ ../../parent-boot-2
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-jdbc
+
+
+
+ org.apache.derby
+ derby
+ runtime
+
+
+ org.springframework.boot
+ spring-boot-configuration-processor
+ true
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+ org.projectlombok
+ lombok
+ provided
+
+
+
+ org.springframework.boot
+ spring-boot-starter-data-jpa
+
+
+
+ org.hibernate
+ hibernate-jpamodelgen
+
+
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
+
+ 1.8
+
+
+
\ No newline at end of file
diff --git a/software-security/sql-injection-samples/src/main/java/com/baeldung/examples/security/sql/Account.java b/software-security/sql-injection-samples/src/main/java/com/baeldung/examples/security/sql/Account.java
new file mode 100644
index 0000000000..3f077d5592
--- /dev/null
+++ b/software-security/sql-injection-samples/src/main/java/com/baeldung/examples/security/sql/Account.java
@@ -0,0 +1,34 @@
+/**
+ *
+ */
+package com.baeldung.examples.security.sql;
+
+import java.math.BigDecimal;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+import lombok.Data;
+
+/**
+ * @author Philippe
+ *
+ */
+@Entity
+@Table(name="Accounts")
+@Data
+public class Account {
+
+ @Id
+ @GeneratedValue(strategy=GenerationType.IDENTITY)
+ private Long id;
+
+ private String customerId;
+ private String accNumber;
+ private String branchId;
+ private BigDecimal balance;
+
+}
diff --git a/software-security/sql-injection-samples/src/main/java/com/baeldung/examples/security/sql/AccountDAO.java b/software-security/sql-injection-samples/src/main/java/com/baeldung/examples/security/sql/AccountDAO.java
new file mode 100644
index 0000000000..c7285e5fd3
--- /dev/null
+++ b/software-security/sql-injection-samples/src/main/java/com/baeldung/examples/security/sql/AccountDAO.java
@@ -0,0 +1,298 @@
+/**
+ *
+ */
+package com.baeldung.examples.security.sql;
+
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.AbstractMap;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import javax.persistence.EntityManager;
+import javax.persistence.Query;
+import javax.persistence.TypedQuery;
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Order;
+import javax.persistence.criteria.Root;
+import javax.persistence.metamodel.SingularAttribute;
+import javax.sql.DataSource;
+
+import org.springframework.stereotype.Component;
+
+/**
+ * @author Philippe
+ *
+ */
+@Component
+public class AccountDAO {
+
+ private final DataSource dataSource;
+ private final EntityManager em;
+
+ public AccountDAO(DataSource dataSource, EntityManager em) {
+ this.dataSource = dataSource;
+ this.em = em;
+ }
+
+ /**
+ * Return all accounts owned by a given customer,given his/her external id
+ *
+ * @param customerId
+ * @return
+ */
+ public List unsafeFindAccountsByCustomerId(String customerId) {
+
+ String sql = "select " + "customer_id,acc_number,branch_id,balance from Accounts where customer_id = '" + customerId + "'";
+
+ try (Connection c = dataSource.getConnection();
+ ResultSet rs = c.createStatement()
+ .executeQuery(sql)) {
+ List accounts = new ArrayList<>();
+ while (rs.next()) {
+ AccountDTO acc = AccountDTO.builder()
+ .customerId(rs.getString("customer_id"))
+ .branchId(rs.getString("branch_id"))
+ .accNumber(rs.getString("acc_number"))
+ .balance(rs.getBigDecimal("balance"))
+ .build();
+
+ accounts.add(acc);
+ }
+
+ return accounts;
+ } catch (SQLException ex) {
+ throw new RuntimeException(ex);
+ }
+ }
+
+ /**
+ * Return all accounts owned by a given customer,given his/her external id - JPA version
+ *
+ * @param customerId
+ * @return
+ */
+ public List unsafeJpaFindAccountsByCustomerId(String customerId) {
+ String jql = "from Account where customerId = '" + customerId + "'";
+ TypedQuery q = em.createQuery(jql, Account.class);
+ return q.getResultList()
+ .stream()
+ .map(a -> AccountDTO.builder()
+ .accNumber(a.getAccNumber())
+ .balance(a.getBalance())
+ .branchId(a.getAccNumber())
+ .customerId(a.getCustomerId())
+ .build())
+ .collect(Collectors.toList());
+ }
+
+ /**
+ * Return all accounts owned by a given customer,given his/her external id
+ *
+ * @param customerId
+ * @return
+ */
+ public List safeFindAccountsByCustomerId(String customerId) {
+
+ String sql = "select customer_id, branch_id,acc_number,balance from Accounts where customer_id = ?";
+
+ try (Connection c = dataSource.getConnection(); PreparedStatement p = c.prepareStatement(sql)) {
+ p.setString(1, customerId);
+ ResultSet rs = p.executeQuery();
+ List accounts = new ArrayList<>();
+ while (rs.next()) {
+ AccountDTO acc = AccountDTO.builder()
+ .customerId(rs.getString("customerId"))
+ .branchId(rs.getString("branch_id"))
+ .accNumber(rs.getString("acc_number"))
+ .balance(rs.getBigDecimal("balance"))
+ .build();
+
+ accounts.add(acc);
+ }
+ return accounts;
+ } catch (SQLException ex) {
+ throw new RuntimeException(ex);
+ }
+ }
+
+ /**
+ * Return all accounts owned by a given customer,given his/her external id - JPA version
+ *
+ * @param customerId
+ * @return
+ */
+ public List safeJpaFindAccountsByCustomerId(String customerId) {
+
+ String jql = "from Account where customerId = :customerId";
+ TypedQuery q = em.createQuery(jql, Account.class)
+ .setParameter("customerId", customerId);
+
+ return q.getResultList()
+ .stream()
+ .map(a -> AccountDTO.builder()
+ .accNumber(a.getAccNumber())
+ .balance(a.getBalance())
+ .branchId(a.getAccNumber())
+ .customerId(a.getCustomerId())
+ .build())
+ .collect(Collectors.toList());
+ }
+
+ /**
+ * Return all accounts owned by a given customer,given his/her external id - JPA version
+ *
+ * @param customerId
+ * @return
+ */
+ public List safeJpaCriteriaFindAccountsByCustomerId(String customerId) {
+
+ CriteriaBuilder cb = em.getCriteriaBuilder();
+ CriteriaQuery cq = cb.createQuery(Account.class);
+ Root root = cq.from(Account.class);
+ cq.select(root)
+ .where(cb.equal(root.get(Account_.customerId), customerId));
+
+ TypedQuery q = em.createQuery(cq);
+
+ return q.getResultList()
+ .stream()
+ .map(a -> AccountDTO.builder()
+ .accNumber(a.getAccNumber())
+ .balance(a.getBalance())
+ .branchId(a.getAccNumber())
+ .customerId(a.getCustomerId())
+ .build())
+ .collect(Collectors.toList());
+ }
+
+ private static final Set VALID_COLUMNS_FOR_ORDER_BY = Stream.of("acc_number", "branch_id", "balance")
+ .collect(Collectors.toCollection(HashSet::new));
+
+
+ /**
+ * Return all accounts owned by a given customer,given his/her external id
+ *
+ * @param customerId
+ * @return
+ */
+ public List safeFindAccountsByCustomerId(String customerId, String orderBy) {
+
+ String sql = "select " + "customer_id,acc_number,branch_id,balance from Accounts where customer_id = ? ";
+
+ if (VALID_COLUMNS_FOR_ORDER_BY.contains(orderBy)) {
+ sql = sql + " order by " + orderBy;
+ } else {
+ throw new IllegalArgumentException("Nice try!");
+ }
+
+ try (Connection c = dataSource.getConnection(); PreparedStatement p = c.prepareStatement(sql)) {
+
+ p.setString(1, customerId);
+ ResultSet rs = p.executeQuery();
+ List accounts = new ArrayList<>();
+ while (rs.next()) {
+ AccountDTO acc = AccountDTO.builder()
+ .customerId(rs.getString("customerId"))
+ .branchId(rs.getString("branch_id"))
+ .accNumber(rs.getString("acc_number"))
+ .balance(rs.getBigDecimal("balance"))
+ .build();
+
+ accounts.add(acc);
+ }
+
+ return accounts;
+ } catch (SQLException ex) {
+ throw new RuntimeException(ex);
+ }
+ }
+
+
+ private static final Map> VALID_JPA_COLUMNS_FOR_ORDER_BY = Stream.of(
+ new AbstractMap.SimpleEntry<>(Account_.ACC_NUMBER, Account_.accNumber),
+ new AbstractMap.SimpleEntry<>(Account_.BRANCH_ID, Account_.branchId),
+ new AbstractMap.SimpleEntry<>(Account_.BALANCE, Account_.balance)
+ )
+ .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
+
+ /**
+ * Return all accounts owned by a given customer,given his/her external id
+ *
+ * @param customerId
+ * @return
+ */
+ public List safeJpaFindAccountsByCustomerId(String customerId, String orderBy) {
+
+SingularAttribute orderByAttribute = VALID_JPA_COLUMNS_FOR_ORDER_BY.get(orderBy);
+if ( orderByAttribute == null) {
+ throw new IllegalArgumentException("Nice try!");
+}
+
+CriteriaBuilder cb = em.getCriteriaBuilder();
+CriteriaQuery cq = cb.createQuery(Account.class);
+Root root = cq.from(Account.class);
+cq.select(root)
+ .where(cb.equal(root.get(Account_.customerId), customerId))
+ .orderBy(cb.asc(root.get(orderByAttribute)));
+
+TypedQuery q = em.createQuery(cq);
+
+ return q.getResultList()
+ .stream()
+ .map(a -> AccountDTO.builder()
+ .accNumber(a.getAccNumber())
+ .balance(a.getBalance())
+ .branchId(a.getAccNumber())
+ .customerId(a.getCustomerId())
+ .build())
+ .collect(Collectors.toList());
+
+ }
+
+ /**
+ * Invalid placeholder usage example
+ *
+ * @param tableName
+ * @return
+ */
+ public Long wrongCountRecordsByTableName(String tableName) {
+
+ try (Connection c = dataSource.getConnection(); PreparedStatement p = c.prepareStatement("select count(*) from ?")) {
+
+ p.setString(1, tableName);
+ ResultSet rs = p.executeQuery();
+ rs.next();
+ return rs.getLong(1);
+
+ } catch (SQLException ex) {
+ throw new RuntimeException(ex);
+ }
+ }
+
+ /**
+ * Invalid placeholder usage example - JPA
+ *
+ * @param tableName
+ * @return
+ */
+ public Long wrongJpaCountRecordsByTableName(String tableName) {
+
+ String jql = "select count(*) from :tableName";
+ TypedQuery q = em.createQuery(jql, Long.class)
+ .setParameter("tableName", tableName);
+
+ return q.getSingleResult();
+
+ }
+
+}
diff --git a/software-security/sql-injection-samples/src/main/java/com/baeldung/examples/security/sql/AccountDTO.java b/software-security/sql-injection-samples/src/main/java/com/baeldung/examples/security/sql/AccountDTO.java
new file mode 100644
index 0000000000..2e6fa04af4
--- /dev/null
+++ b/software-security/sql-injection-samples/src/main/java/com/baeldung/examples/security/sql/AccountDTO.java
@@ -0,0 +1,16 @@
+package com.baeldung.examples.security.sql;
+
+import java.math.BigDecimal;
+
+import lombok.Builder;
+import lombok.Data;
+
+@Data
+@Builder
+public class AccountDTO {
+
+ private String customerId;
+ private String accNumber;
+ private String branchId;
+ private BigDecimal balance;
+}
diff --git a/software-security/sql-injection-samples/src/main/java/com/baeldung/examples/security/sql/SqlInjectionSamplesApplication.java b/software-security/sql-injection-samples/src/main/java/com/baeldung/examples/security/sql/SqlInjectionSamplesApplication.java
new file mode 100644
index 0000000000..c1083ae3de
--- /dev/null
+++ b/software-security/sql-injection-samples/src/main/java/com/baeldung/examples/security/sql/SqlInjectionSamplesApplication.java
@@ -0,0 +1,14 @@
+package com.baeldung.examples.security.sql;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class SqlInjectionSamplesApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(SqlInjectionSamplesApplication.class, args);
+ }
+
+}
+
diff --git a/java-streams/src/main/java/com/baeldung/stream/sum/. .. b/software-security/sql-injection-samples/src/main/resources/application.properties
similarity index 100%
rename from java-streams/src/main/java/com/baeldung/stream/sum/. ..
rename to software-security/sql-injection-samples/src/main/resources/application.properties
diff --git a/software-security/sql-injection-samples/src/test/java/com/baeldung/examples/security/sql/SqlInjectionSamplesApplicationUnitTest.java b/software-security/sql-injection-samples/src/test/java/com/baeldung/examples/security/sql/SqlInjectionSamplesApplicationUnitTest.java
new file mode 100644
index 0000000000..f61b738abc
--- /dev/null
+++ b/software-security/sql-injection-samples/src/test/java/com/baeldung/examples/security/sql/SqlInjectionSamplesApplicationUnitTest.java
@@ -0,0 +1,92 @@
+package com.baeldung.examples.security.sql;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.util.List;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.ActiveProfiles;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import com.baeldung.examples.security.sql.AccountDAO;
+import com.baeldung.examples.security.sql.AccountDTO;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest
+@ActiveProfiles({ "test" })
+public class SqlInjectionSamplesApplicationUnitTest {
+
+ @Autowired
+ private AccountDAO target;
+
+ @Test
+ public void givenAVulnerableMethod_whenValidCustomerId_thenReturnSingleAccount() {
+
+ List accounts = target.unsafeFindAccountsByCustomerId("C1");
+ assertThat(accounts).isNotNull();
+ assertThat(accounts).isNotEmpty();
+ assertThat(accounts).hasSize(1);
+ }
+
+ @Test
+ public void givenAVulnerableMethod_whenHackedCustomerId_thenReturnAllAccounts() {
+
+ List accounts = target.unsafeFindAccountsByCustomerId("C1' or '1'='1");
+ assertThat(accounts).isNotNull();
+ assertThat(accounts).isNotEmpty();
+ assertThat(accounts).hasSize(3);
+ }
+
+ @Test
+ public void givenAVulnerableJpaMethod_whenHackedCustomerId_thenReturnAllAccounts() {
+
+ List accounts = target.unsafeJpaFindAccountsByCustomerId("C1' or '1'='1");
+ assertThat(accounts).isNotNull();
+ assertThat(accounts).isNotEmpty();
+ assertThat(accounts).hasSize(3);
+ }
+
+ @Test
+ public void givenASafeMethod_whenHackedCustomerId_thenReturnNoAccounts() {
+
+ List accounts = target.safeFindAccountsByCustomerId("C1' or '1'='1");
+ assertThat(accounts).isNotNull();
+ assertThat(accounts).isEmpty();
+ }
+
+ @Test
+ public void givenASafeJpaMethod_whenHackedCustomerId_thenReturnNoAccounts() {
+
+ List accounts = target.safeJpaFindAccountsByCustomerId("C1' or '1'='1");
+ assertThat(accounts).isNotNull();
+ assertThat(accounts).isEmpty();
+ }
+
+
+ @Test
+ public void givenASafeJpaCriteriaMethod_whenHackedCustomerId_thenReturnNoAccounts() {
+
+ List accounts = target.safeJpaCriteriaFindAccountsByCustomerId("C1' or '1'='1");
+ assertThat(accounts).isNotNull();
+ assertThat(accounts).isEmpty();
+ }
+
+ @Test(expected = IllegalArgumentException.class)
+ public void givenASafeMethod_whenInvalidOrderBy_thenThroweException() {
+ target.safeFindAccountsByCustomerId("C1", "INVALID");
+ }
+
+ @Test(expected = Exception.class)
+ public void givenWrongPlaceholderUsageMethod_whenNormalCall_thenThrowsException() {
+ target.wrongCountRecordsByTableName("Accounts");
+ }
+
+ @Test(expected = Exception.class)
+ public void givenWrongJpaPlaceholderUsageMethod_whenNormalCall_thenThrowsException() {
+ target.wrongJpaCountRecordsByTableName("Accounts");
+ }
+
+}
diff --git a/software-security/sql-injection-samples/src/test/resources/application-test.yml b/software-security/sql-injection-samples/src/test/resources/application-test.yml
new file mode 100644
index 0000000000..3af3f58bff
--- /dev/null
+++ b/software-security/sql-injection-samples/src/test/resources/application-test.yml
@@ -0,0 +1,18 @@
+#
+# Test profile configuration
+#
+spring:
+ liquibase:
+ change-log: db/changelog/db.changelog-master.xml
+
+ jpa:
+ hibernate:
+ ddl-auto: none
+
+ datasource:
+ initialization-mode: embedded
+
+logging:
+ level:
+ sql: DEBUG
+
\ No newline at end of file
diff --git a/software-security/sql-injection-samples/src/test/resources/data.sql b/software-security/sql-injection-samples/src/test/resources/data.sql
new file mode 100644
index 0000000000..586618a07f
--- /dev/null
+++ b/software-security/sql-injection-samples/src/test/resources/data.sql
@@ -0,0 +1,4 @@
+insert into Accounts(customer_id,acc_number,branch_id,balance) values ('C1','0001',1,1000.00);
+insert into Accounts(customer_id,acc_number,branch_id,balance) values ('C2','0002',1,500.00);
+insert into Accounts(customer_id,acc_number,branch_id,balance) values ('C3','0003',1,501.00);
+
diff --git a/software-security/sql-injection-samples/src/test/resources/schema.sql b/software-security/sql-injection-samples/src/test/resources/schema.sql
new file mode 100644
index 0000000000..cfc4c44f98
--- /dev/null
+++ b/software-security/sql-injection-samples/src/test/resources/schema.sql
@@ -0,0 +1,7 @@
+create table Accounts (
+ id BIGINT NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1),
+ customer_id varchar(16) not null,
+ acc_number varchar(16) not null,
+ branch_id decimal(8,0),
+ balance decimal(16,4)
+);
diff --git a/spark-java/README.md b/spark-java/README.md
index 711607bd4e..5abe78263c 100644
--- a/spark-java/README.md
+++ b/spark-java/README.md
@@ -3,4 +3,4 @@
## Spark Java Framework Tutorial Sample Project
### Relevant Articles
-- [Intro to Spark Java Framework](http://www.baeldung.com/spark-framework-rest-api)
+- [Building an API With the Spark Java Framework](http://www.baeldung.com/spark-framework-rest-api)
diff --git a/spring-4/pom.xml b/spring-4/pom.xml
index 60f1555d8f..eb64c1839f 100644
--- a/spring-4/pom.xml
+++ b/spring-4/pom.xml
@@ -3,8 +3,8 @@
4.0.0
spring-4
spring-4
- jar
spring-4
+ jar
parent-boot-1
diff --git a/spring-4/src/test/java/org/baeldung/SpringContextIntegrationTest.java b/spring-4/src/test/java/org/baeldung/SpringContextIntegrationTest.java
index 9dfac2bd9e..d646e22511 100644
--- a/spring-4/src/test/java/org/baeldung/SpringContextIntegrationTest.java
+++ b/spring-4/src/test/java/org/baeldung/SpringContextIntegrationTest.java
@@ -2,13 +2,16 @@ package org.baeldung;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.test.context.junit4.SpringRunner;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.test.context.web.WebAppConfiguration;
import com.baeldung.flips.ApplicationConfig;
-@RunWith(SpringRunner.class)
-@SpringBootTest(classes = ApplicationConfig.class)
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(classes = ApplicationConfig.class)
+@WebAppConfiguration
public class SpringContextIntegrationTest {
@Test
diff --git a/spring-5-mvc/pom.xml b/spring-5-mvc/pom.xml
index f5346a0fa0..5fb8f66f71 100644
--- a/spring-5-mvc/pom.xml
+++ b/spring-5-mvc/pom.xml
@@ -5,9 +5,9 @@
com.baeldung
spring-5-mvc
0.0.1-SNAPSHOT
- jar
spring-5-mvc
spring 5 MVC sample project about new features
+ jar
com.baeldung
diff --git a/spring-5-reactive-client/pom.xml b/spring-5-reactive-client/pom.xml
index 6e39743ed0..1b71815eb4 100644
--- a/spring-5-reactive-client/pom.xml
+++ b/spring-5-reactive-client/pom.xml
@@ -2,10 +2,9 @@
4.0.0
-
spring-5-reactive-client
- jar
spring-5-reactive-client
+ jar
spring 5 sample project about new features
diff --git a/spring-5-reactive-oauth/README.md b/spring-5-reactive-oauth/README.md
index 0f27cf5d20..ec5176670b 100644
--- a/spring-5-reactive-oauth/README.md
+++ b/spring-5-reactive-oauth/README.md
@@ -1,3 +1,4 @@
### Relevant Articles:
- [Spring Security OAuth Login with WebFlux](https://www.baeldung.com/spring-oauth-login-webflux)
+- [Spring WebClient and OAuth2 Support](https://www.baeldung.com/spring-webclient-oauth2)
diff --git a/spring-5-reactive-oauth/pom.xml b/spring-5-reactive-oauth/pom.xml
index 73809681f2..ff076985e4 100644
--- a/spring-5-reactive-oauth/pom.xml
+++ b/spring-5-reactive-oauth/pom.xml
@@ -2,27 +2,19 @@
4.0.0
-
com.baeldung.reactive.oauth
spring-5-reactive-oauth
1.0.0-SNAPSHOT
- jar
-
spring-5-reactive-oauth
+ jar
WebFluc and Spring Security OAuth
- org.springframework.boot
- spring-boot-starter-parent
- 2.1.0.RELEASE
-
-
-
-
- UTF-8
- UTF-8
- 1.8
-
+ parent-boot-2
+ com.baeldung
+ 0.0.1-SNAPSHOT
+ ../parent-boot-2
+
@@ -62,11 +54,11 @@
org.apache.maven.plugins
maven-surefire-plugin
- 2.20.1
true
**/*IntegrationTest.java
+ **/*LiveTest.java
@@ -74,4 +66,11 @@
+
+ UTF-8
+ UTF-8
+ 1.8
+ 2.1.0.RELEASE
+
+
diff --git a/spring-5-reactive-security/pom.xml b/spring-5-reactive-security/pom.xml
index 3b64b9b3ac..72a73a86ce 100644
--- a/spring-5-reactive-security/pom.xml
+++ b/spring-5-reactive-security/pom.xml
@@ -2,12 +2,11 @@
4.0.0
-
com.baeldung
spring-5-reactive-security
0.0.1-SNAPSHOT
- jar
spring-5-reactive-security
+ jar
spring 5 security sample project about new features
diff --git a/spring-5-reactive/README.md b/spring-5-reactive/README.md
index c39bb616f8..ef2f7d07eb 100644
--- a/spring-5-reactive/README.md
+++ b/spring-5-reactive/README.md
@@ -7,7 +7,7 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring
- [Introduction to the Functional Web Framework in Spring 5](http://www.baeldung.com/spring-5-functional-web)
- [Spring 5 WebClient](http://www.baeldung.com/spring-5-webclient)
-- [Exploring the Spring 5 MVC URL Matching Improvements](http://www.baeldung.com/spring-5-mvc-url-matching)
+- [Exploring the Spring 5 WebFlux URL Matching](http://www.baeldung.com/spring-5-mvc-url-matching)
- [Reactive WebSockets with Spring 5](http://www.baeldung.com/spring-5-reactive-websockets)
- [Spring Webflux Filters](http://www.baeldung.com/spring-webflux-filters)
- [How to Set a Header on a Response with Spring 5](http://www.baeldung.com/spring-response-header)
diff --git a/spring-5-reactive/pom.xml b/spring-5-reactive/pom.xml
index 63cc185afe..8d5324a673 100644
--- a/spring-5-reactive/pom.xml
+++ b/spring-5-reactive/pom.xml
@@ -2,12 +2,11 @@
4.0.0
-
com.baeldung
spring-5-reactive
0.0.1-SNAPSHOT
- jar
spring-5-reactive
+ jar
spring 5 sample project about new features
@@ -125,6 +124,28 @@
+
+ maven-resources-plugin
+ 3.0.1
+
+
+ copy-resources
+ validate
+
+ copy-resources
+
+
+
+
+ src/main/assets
+ true
+
+
+ ${basedir}/target/classes/assets
+
+
+
+
org.springframework.boot
spring-boot-maven-plugin
diff --git a/spring-5-reactive/src/main/assets/index.html b/spring-5-reactive/src/main/assets/index.html
new file mode 100644
index 0000000000..047514df1c
--- /dev/null
+++ b/spring-5-reactive/src/main/assets/index.html
@@ -0,0 +1,10 @@
+
+
+
+
+ Baeldung: Static Content in Spring WebFlux
+
+
+Example Spring Web Flux and web resources configuration
+
+
\ No newline at end of file
diff --git a/spring-5-reactive/src/main/java/com/baeldung/staticcontent/StaticContentApplication.java b/spring-5-reactive/src/main/java/com/baeldung/staticcontent/StaticContentApplication.java
new file mode 100644
index 0000000000..31a3de4927
--- /dev/null
+++ b/spring-5-reactive/src/main/java/com/baeldung/staticcontent/StaticContentApplication.java
@@ -0,0 +1,28 @@
+package com.baeldung.staticcontent;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.Bean;
+import org.springframework.security.config.web.server.ServerHttpSecurity;
+import org.springframework.security.web.server.SecurityWebFilterChain;
+
+import java.util.Collections;
+
+@SpringBootApplication
+public class StaticContentApplication {
+
+ public static void main(String[] args) {
+ SpringApplication app = new SpringApplication(StaticContentApplication.class);
+ app.setDefaultProperties(Collections.singletonMap("server.port", "8084"));
+ app.run(args);
+ }
+
+ @Bean
+ public SecurityWebFilterChain staticContentSpringSecurityFilterChain(ServerHttpSecurity http) {
+ http.authorizeExchange()
+ .anyExchange()
+ .permitAll();
+ return http.build();
+ }
+
+}
diff --git a/spring-5-reactive/src/main/java/com/baeldung/staticcontent/StaticContentConfig.java b/spring-5-reactive/src/main/java/com/baeldung/staticcontent/StaticContentConfig.java
new file mode 100644
index 0000000000..1fbb9958e7
--- /dev/null
+++ b/spring-5-reactive/src/main/java/com/baeldung/staticcontent/StaticContentConfig.java
@@ -0,0 +1,35 @@
+package com.baeldung.staticcontent;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.io.ClassPathResource;
+import org.springframework.core.io.Resource;
+import org.springframework.http.MediaType;
+import org.springframework.web.reactive.function.server.RouterFunction;
+import org.springframework.web.reactive.function.server.RouterFunctions;
+import org.springframework.web.reactive.function.server.ServerResponse;
+
+import static org.springframework.web.reactive.function.server.RequestPredicates.GET;
+import static org.springframework.web.reactive.function.server.RouterFunctions.route;
+import static org.springframework.web.reactive.function.server.ServerResponse.ok;
+
+@Configuration
+public class StaticContentConfig {
+
+ @Bean
+ public RouterFunction htmlRouter(@Value("classpath:/public/index.html") Resource html) {
+ return route(
+ GET("/"),
+ request -> ok()
+ .contentType(MediaType.TEXT_HTML)
+ .syncBody(html)
+ );
+ }
+
+ @Bean
+ public RouterFunction imgRouter() {
+ return RouterFunctions.resources("/img/**", new ClassPathResource("img/"));
+ }
+
+}
diff --git a/spring-5-reactive/src/main/resources/application-assets-custom-location.properties b/spring-5-reactive/src/main/resources/application-assets-custom-location.properties
new file mode 100644
index 0000000000..9a2dbb04d9
--- /dev/null
+++ b/spring-5-reactive/src/main/resources/application-assets-custom-location.properties
@@ -0,0 +1,3 @@
+# Use in Static content Example
+spring.webflux.static-path-pattern = /assets/**
+spring.resources.static-locations = classpath:/assets/
\ No newline at end of file
diff --git a/spring-5-reactive/src/main/resources/img/example-image.png b/spring-5-reactive/src/main/resources/img/example-image.png
new file mode 100644
index 0000000000..2fa6c7b8c5
Binary files /dev/null and b/spring-5-reactive/src/main/resources/img/example-image.png differ
diff --git a/spring-5-reactive/src/main/resources/public/index.html b/spring-5-reactive/src/main/resources/public/index.html
new file mode 100644
index 0000000000..7a3b9413cd
--- /dev/null
+++ b/spring-5-reactive/src/main/resources/public/index.html
@@ -0,0 +1,10 @@
+
+
+
+
+ Baeldung: Static Content in Spring WebFlux
+
+
+Example HTML file
+
+
\ No newline at end of file
diff --git a/spring-5-reactive/src/test/java/com/baeldung/staticcontent/StaticContentCustomLocationIntegrationTest.java b/spring-5-reactive/src/test/java/com/baeldung/staticcontent/StaticContentCustomLocationIntegrationTest.java
new file mode 100644
index 0000000000..f40ff83738
--- /dev/null
+++ b/spring-5-reactive/src/test/java/com/baeldung/staticcontent/StaticContentCustomLocationIntegrationTest.java
@@ -0,0 +1,39 @@
+package com.baeldung.staticcontent;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+import org.springframework.test.context.ActiveProfiles;
+import org.springframework.test.context.junit4.SpringRunner;
+import org.springframework.test.web.reactive.server.WebTestClient;
+
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+@ActiveProfiles("assets-custom-location")
+public class StaticContentCustomLocationIntegrationTest {
+
+ @Autowired
+ private WebTestClient client;
+
+ @Test
+ public void whenRequestingHtmlFileFromCustomLocation_thenReturnThisFileAndTextHtmlContentType() throws Exception {
+ client.get()
+ .uri("/assets/index.html")
+ .exchange()
+ .expectStatus().isOk()
+ .expectHeader().valueEquals(HttpHeaders.CONTENT_TYPE, MediaType.TEXT_HTML_VALUE);
+ }
+
+ @Test
+ public void whenRequestingMissingStaticResource_thenReturnNotFoundStatus() throws Exception {
+ client.get()
+ .uri("/assets/unknown.png")
+ .exchange()
+ .expectStatus().isNotFound();
+ }
+
+}
\ No newline at end of file
diff --git a/spring-5-reactive/src/test/java/com/baeldung/staticcontent/StaticContentDefaultLocationIntegrationTest.java b/spring-5-reactive/src/test/java/com/baeldung/staticcontent/StaticContentDefaultLocationIntegrationTest.java
new file mode 100644
index 0000000000..820d6e13ef
--- /dev/null
+++ b/spring-5-reactive/src/test/java/com/baeldung/staticcontent/StaticContentDefaultLocationIntegrationTest.java
@@ -0,0 +1,46 @@
+package com.baeldung.staticcontent;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+import org.springframework.test.context.junit4.SpringRunner;
+import org.springframework.test.web.reactive.server.WebTestClient;
+
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+public class StaticContentDefaultLocationIntegrationTest {
+
+ @Autowired
+ private WebTestClient client;
+
+ @Test
+ public void whenRequestingHtmlFileFromDefaultLocation_thenReturnThisFileAndTextHtmlContentType() throws Exception {
+ client.get()
+ .uri("/index.html")
+ .exchange()
+ .expectStatus().isOk()
+ .expectHeader().valueEquals(HttpHeaders.CONTENT_TYPE, MediaType.TEXT_HTML_VALUE);
+ }
+
+ @Test
+ public void whenRequestingPngImageFromImgLocation_thenReturnThisFileAndImagePngContentType() throws Exception {
+ client.get()
+ .uri("/img/example-image.png")
+ .exchange()
+ .expectStatus().isOk()
+ .expectHeader().valueEquals(HttpHeaders.CONTENT_TYPE, MediaType.IMAGE_PNG_VALUE);
+ }
+
+ @Test
+ public void whenRequestingMissingStaticResource_thenReturnNotFoundStatus() throws Exception {
+ client.get()
+ .uri("/unknown.png")
+ .exchange()
+ .expectStatus().isNotFound();
+ }
+
+}
\ No newline at end of file
diff --git a/spring-5-security-oauth/pom.xml b/spring-5-security-oauth/pom.xml
index 59150a153f..d9a1e3094e 100644
--- a/spring-5-security-oauth/pom.xml
+++ b/spring-5-security-oauth/pom.xml
@@ -4,8 +4,8 @@
com.baeldung
spring-5-security-oauth
0.0.1-SNAPSHOT
- jar
spring-5-security-oauth
+ jar
spring 5 security oauth sample project
diff --git a/spring-5-security/pom.xml b/spring-5-security/pom.xml
index c26e370381..413337633f 100644
--- a/spring-5-security/pom.xml
+++ b/spring-5-security/pom.xml
@@ -4,8 +4,8 @@
com.baeldung
spring-5-security
0.0.1-SNAPSHOT
- jar
spring-5-security
+ jar
spring 5 security sample project
@@ -16,7 +16,6 @@
-
org.springframework.boot
spring-boot-starter-security
diff --git a/spring-5/pom.xml b/spring-5/pom.xml
index 58c14475e0..6e4162fbcc 100644
--- a/spring-5/pom.xml
+++ b/spring-5/pom.xml
@@ -6,8 +6,8 @@
com.baeldung
spring-5
0.0.1-SNAPSHOT
- jar
spring-5
+ jar
spring 5 sample project about new features
@@ -156,7 +156,6 @@
4.1
${project.build.directory}/generated-snippets
2.21.0
-
diff --git a/spring-activiti/pom.xml b/spring-activiti/pom.xml
index 4e21c5b032..3d67a2ab7b 100644
--- a/spring-activiti/pom.xml
+++ b/spring-activiti/pom.xml
@@ -3,8 +3,8 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
spring-activiti
- jar
spring-activiti
+ jar
Demo project for Spring Boot
diff --git a/spring-all/README.md b/spring-all/README.md
index 0d78efdcf2..81dd435007 100644
--- a/spring-all/README.md
+++ b/spring-all/README.md
@@ -11,11 +11,11 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring
### Relevant articles:
- [Guide to Spring @Autowired](http://www.baeldung.com/spring-autowire)
-- [Properties with Spring](http://www.baeldung.com/properties-with-spring) - checkout the `org.baeldung.properties` package for all scenarios of properties injection and usage
+- [Properties with Spring and Spring Boot](http://www.baeldung.com/properties-with-spring) - checkout the `org.baeldung.properties` package for all scenarios of properties injection and usage
- [Spring Profiles](http://www.baeldung.com/spring-profiles)
- [A Spring Custom Annotation for a Better DAO](http://www.baeldung.com/spring-annotation-bean-pre-processor)
- [What's New in Spring 4.3?](http://www.baeldung.com/whats-new-in-spring-4-3)
-- [Guide To Running Logic on Startup in Spring](http://www.baeldung.com/running-setup-logic-on-startup-in-spring)
+- [Running Setup Data on Startup in Spring](http://www.baeldung.com/running-setup-logic-on-startup-in-spring)
- [Quick Guide to Spring Controllers](http://www.baeldung.com/spring-controllers)
- [Quick Guide to Spring Bean Scopes](http://www.baeldung.com/spring-bean-scopes)
- [Introduction To Ehcache](http://www.baeldung.com/ehcache)
@@ -28,7 +28,7 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring
- [Model, ModelMap, and ModelView in Spring MVC](http://www.baeldung.com/spring-mvc-model-model-map-model-view)
- [A Guide To Caching in Spring](http://www.baeldung.com/spring-cache-tutorial)
- [How To Do @Async in Spring](http://www.baeldung.com/spring-async)
-- [Quick Guide to the Spring @Order Annotation](http://www.baeldung.com/spring-order)
+- [@Order in Spring](http://www.baeldung.com/spring-order)
- [Spring Web Contexts](http://www.baeldung.com/spring-web-contexts)
- [Spring Cache – Creating a Custom KeyGenerator](http://www.baeldung.com/spring-cache-custom-keygenerator)
- [Spring @Primary Annotation](http://www.baeldung.com/spring-primary)
diff --git a/spring-all/pom.xml b/spring-all/pom.xml
index 77c7e74e08..5872fbdac5 100644
--- a/spring-all/pom.xml
+++ b/spring-all/pom.xml
@@ -160,12 +160,12 @@
net.javacrumbs.shedlock
shedlock-spring
- 2.1.0
+ ${shedlock.version}
net.javacrumbs.shedlock
shedlock-provider-jdbc-template
- 2.1.0
+ ${shedlock.version}
@@ -243,7 +243,7 @@
3.6
3.6.1
6.6.0
-
+ 2.1.0
3.22.0-GA
diff --git a/spring-amqp/pom.xml b/spring-amqp/pom.xml
index e08a4243b3..c021bd49ff 100755
--- a/spring-amqp/pom.xml
+++ b/spring-amqp/pom.xml
@@ -4,8 +4,8 @@
com.baeldung
spring-amqp
0.1-SNAPSHOT
- jar
spring-amqp
+ jar
Introduction to Spring-AMQP
diff --git a/spring-aop/pom.xml b/spring-aop/pom.xml
index 9e2f97916a..a1e2ffd534 100644
--- a/spring-aop/pom.xml
+++ b/spring-aop/pom.xml
@@ -2,8 +2,8 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
spring-aop
- war
spring-aop
+ war
parent-boot-2
diff --git a/spring-apache-camel/pom.xml b/spring-apache-camel/pom.xml
index 662b3f899c..3e76c0c7f1 100644
--- a/spring-apache-camel/pom.xml
+++ b/spring-apache-camel/pom.xml
@@ -3,9 +3,9 @@
4.0.0
org.apache.camel
spring-apache-camel
- jar
1.0-SNAPSHOT
spring-apache-camel
+ jar
http://maven.apache.org
diff --git a/spring-batch/pom.xml b/spring-batch/pom.xml
index cfd725b2bd..e81078568b 100644
--- a/spring-batch/pom.xml
+++ b/spring-batch/pom.xml
@@ -4,8 +4,8 @@
com.baeldung
spring-batch
0.1-SNAPSHOT
- jar
spring-batch
+ jar
http://maven.apache.org
diff --git a/spring-boot-admin/spring-boot-admin-client/pom.xml b/spring-boot-admin/spring-boot-admin-client/pom.xml
index ea03d6ef6d..7563a01172 100644
--- a/spring-boot-admin/spring-boot-admin-client/pom.xml
+++ b/spring-boot-admin/spring-boot-admin-client/pom.xml
@@ -4,9 +4,9 @@
4.0.0
spring-boot-admin-client
0.0.1-SNAPSHOT
- jar
spring-boot-admin-client
Spring Boot Admin Client
+ jar
spring-boot-admin
diff --git a/spring-boot-admin/spring-boot-admin-server/pom.xml b/spring-boot-admin/spring-boot-admin-server/pom.xml
index d8e7bb5574..d429d9289f 100644
--- a/spring-boot-admin/spring-boot-admin-server/pom.xml
+++ b/spring-boot-admin/spring-boot-admin-server/pom.xml
@@ -4,9 +4,9 @@
4.0.0
spring-boot-admin-server
0.0.1-SNAPSHOT
- jar
spring-boot-admin-server
Spring Boot Admin Server
+ jar
spring-boot-admin
diff --git a/spring-boot-angular-ecommerce/pom.xml b/spring-boot-angular-ecommerce/pom.xml
index dc92a91d02..a5296eade8 100644
--- a/spring-boot-angular-ecommerce/pom.xml
+++ b/spring-boot-angular-ecommerce/pom.xml
@@ -2,12 +2,10 @@
4.0.0
-
spring-boot-angular-ecommerce
0.0.1-SNAPSHOT
- jar
-
spring-boot-angular-ecommerce
+ jar
Spring Boot Angular E-commerce Appliciation
diff --git a/spring-boot-angular/pom.xml b/spring-boot-angular/pom.xml
new file mode 100644
index 0000000000..6ea98eb3d0
--- /dev/null
+++ b/spring-boot-angular/pom.xml
@@ -0,0 +1,50 @@
+
+
+ 4.0.0
+ com.baeldung.springbootangular
+ spring-boot-angular
+ spring-boot-angular
+ 1.0
+ jar
+
+ parent-boot-2
+ com.baeldung
+ 0.0.1-SNAPSHOT
+ ../../parent-boot-2
+
+
+ 1.8
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-data-jpa
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ com.h2database
+ h2
+ 1.4.197
+ runtime
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
+
diff --git a/spring-boot-angular/src/main/java/com/baeldung/angularclient/.angular-cli.json b/spring-boot-angular/src/main/java/com/baeldung/angularclient/.angular-cli.json
new file mode 100644
index 0000000000..3de2a62f41
--- /dev/null
+++ b/spring-boot-angular/src/main/java/com/baeldung/angularclient/.angular-cli.json
@@ -0,0 +1,60 @@
+{
+ "$schema": "./node_modules/@angular/cli/lib/config/schema.json",
+ "project": {
+ "name": "sampleapp"
+ },
+ "apps": [
+ {
+ "root": "src",
+ "outDir": "dist",
+ "assets": [
+ "assets",
+ "favicon.ico"
+ ],
+ "index": "index.html",
+ "main": "main.ts",
+ "polyfills": "polyfills.ts",
+ "test": "test.ts",
+ "tsconfig": "tsconfig.app.json",
+ "testTsconfig": "tsconfig.spec.json",
+ "prefix": "app",
+ "styles": [
+ "styles.css"
+ ],
+ "scripts": [],
+ "environmentSource": "environments/environment.ts",
+ "environments": {
+ "dev": "environments/environment.ts",
+ "prod": "environments/environment.prod.ts"
+ }
+ }
+ ],
+ "e2e": {
+ "protractor": {
+ "config": "./protractor.conf.js"
+ }
+ },
+ "lint": [
+ {
+ "project": "src/tsconfig.app.json",
+ "exclude": "**/node_modules/**"
+ },
+ {
+ "project": "src/tsconfig.spec.json",
+ "exclude": "**/node_modules/**"
+ },
+ {
+ "project": "e2e/tsconfig.e2e.json",
+ "exclude": "**/node_modules/**"
+ }
+ ],
+ "test": {
+ "karma": {
+ "config": "./karma.conf.js"
+ }
+ },
+ "defaults": {
+ "styleExt": "css",
+ "component": {}
+ }
+}
diff --git a/spring-boot-angular/src/main/java/com/baeldung/angularclient/.editorconfig b/spring-boot-angular/src/main/java/com/baeldung/angularclient/.editorconfig
new file mode 100644
index 0000000000..6e87a003da
--- /dev/null
+++ b/spring-boot-angular/src/main/java/com/baeldung/angularclient/.editorconfig
@@ -0,0 +1,13 @@
+# Editor configuration, see http://editorconfig.org
+root = true
+
+[*]
+charset = utf-8
+indent_style = space
+indent_size = 2
+insert_final_newline = true
+trim_trailing_whitespace = true
+
+[*.md]
+max_line_length = off
+trim_trailing_whitespace = false
diff --git a/spring-boot-angular/src/main/java/com/baeldung/angularclient/.gitignore b/spring-boot-angular/src/main/java/com/baeldung/angularclient/.gitignore
new file mode 100644
index 0000000000..eabf65e51a
--- /dev/null
+++ b/spring-boot-angular/src/main/java/com/baeldung/angularclient/.gitignore
@@ -0,0 +1,44 @@
+# See http://help.github.com/ignore-files/ for more about ignoring files.
+
+# compiled output
+/dist
+/dist-server
+/tmp
+/out-tsc
+
+# dependencies
+/node_modules
+
+# IDEs and editors
+/.idea
+.project
+.classpath
+.c9/
+*.launch
+.settings/
+*.sublime-workspace
+
+# IDE - VSCode
+.vscode/*
+!.vscode/settings.json
+!.vscode/tasks.json
+!.vscode/launch.json
+!.vscode/extensions.json
+
+# misc
+/.sass-cache
+/connect.lock
+/coverage
+/libpeerconnection.log
+npm-debug.log
+yarn-error.log
+testem.log
+/typings
+
+# e2e
+/e2e/*.js
+/e2e/*.map
+
+# System Files
+.DS_Store
+Thumbs.db
diff --git a/spring-boot-angular/src/main/java/com/baeldung/angularclient/README.md b/spring-boot-angular/src/main/java/com/baeldung/angularclient/README.md
new file mode 100644
index 0000000000..6fec59bc13
--- /dev/null
+++ b/spring-boot-angular/src/main/java/com/baeldung/angularclient/README.md
@@ -0,0 +1,27 @@
+# Sampleapp
+
+This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 1.7.4.
+
+## Development server
+
+Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The app will automatically reload if you change any of the source files.
+
+## Code scaffolding
+
+Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module`.
+
+## Build
+
+Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory. Use the `-prod` flag for a production build.
+
+## Running unit tests
+
+Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io).
+
+## Running end-to-end tests
+
+Run `ng e2e` to execute the end-to-end tests via [Protractor](http://www.protractortest.org/).
+
+## Further help
+
+To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI README](https://github.com/angular/angular-cli/blob/master/README.md).
diff --git a/spring-boot-angular/src/main/java/com/baeldung/angularclient/e2e/app.e2e-spec.ts b/spring-boot-angular/src/main/java/com/baeldung/angularclient/e2e/app.e2e-spec.ts
new file mode 100644
index 0000000000..d72f8a4e91
--- /dev/null
+++ b/spring-boot-angular/src/main/java/com/baeldung/angularclient/e2e/app.e2e-spec.ts
@@ -0,0 +1,14 @@
+import { AppPage } from './app.po';
+
+describe('sampleapp App', () => {
+ let page: AppPage;
+
+ beforeEach(() => {
+ page = new AppPage();
+ });
+
+ it('should display welcome message', () => {
+ page.navigateTo();
+ expect(page.getParagraphText()).toEqual('Welcome to app!');
+ });
+});
diff --git a/spring-boot-angular/src/main/java/com/baeldung/angularclient/e2e/app.po.ts b/spring-boot-angular/src/main/java/com/baeldung/angularclient/e2e/app.po.ts
new file mode 100644
index 0000000000..82ea75ba50
--- /dev/null
+++ b/spring-boot-angular/src/main/java/com/baeldung/angularclient/e2e/app.po.ts
@@ -0,0 +1,11 @@
+import { browser, by, element } from 'protractor';
+
+export class AppPage {
+ navigateTo() {
+ return browser.get('/');
+ }
+
+ getParagraphText() {
+ return element(by.css('app-root h1')).getText();
+ }
+}
diff --git a/spring-boot-angular/src/main/java/com/baeldung/angularclient/e2e/tsconfig.e2e.json b/spring-boot-angular/src/main/java/com/baeldung/angularclient/e2e/tsconfig.e2e.json
new file mode 100644
index 0000000000..1d9e5edf09
--- /dev/null
+++ b/spring-boot-angular/src/main/java/com/baeldung/angularclient/e2e/tsconfig.e2e.json
@@ -0,0 +1,14 @@
+{
+ "extends": "../tsconfig.json",
+ "compilerOptions": {
+ "outDir": "../out-tsc/e2e",
+ "baseUrl": "./",
+ "module": "commonjs",
+ "target": "es5",
+ "types": [
+ "jasmine",
+ "jasminewd2",
+ "node"
+ ]
+ }
+}
diff --git a/spring-boot-angular/src/main/java/com/baeldung/angularclient/karma.conf.js b/spring-boot-angular/src/main/java/com/baeldung/angularclient/karma.conf.js
new file mode 100644
index 0000000000..af139fada3
--- /dev/null
+++ b/spring-boot-angular/src/main/java/com/baeldung/angularclient/karma.conf.js
@@ -0,0 +1,33 @@
+// Karma configuration file, see link for more information
+// https://karma-runner.github.io/1.0/config/configuration-file.html
+
+module.exports = function (config) {
+ config.set({
+ basePath: '',
+ frameworks: ['jasmine', '@angular/cli'],
+ plugins: [
+ require('karma-jasmine'),
+ require('karma-chrome-launcher'),
+ require('karma-jasmine-html-reporter'),
+ require('karma-coverage-istanbul-reporter'),
+ require('@angular/cli/plugins/karma')
+ ],
+ client:{
+ clearContext: false // leave Jasmine Spec Runner output visible in browser
+ },
+ coverageIstanbulReporter: {
+ reports: [ 'html', 'lcovonly' ],
+ fixWebpackSourcePaths: true
+ },
+ angularCli: {
+ environment: 'dev'
+ },
+ reporters: ['progress', 'kjhtml'],
+ port: 9876,
+ colors: true,
+ logLevel: config.LOG_INFO,
+ autoWatch: true,
+ browsers: ['Chrome'],
+ singleRun: false
+ });
+};
diff --git a/spring-boot-angular/src/main/java/com/baeldung/angularclient/package-lock.json b/spring-boot-angular/src/main/java/com/baeldung/angularclient/package-lock.json
new file mode 100644
index 0000000000..9ddc0a9ae0
--- /dev/null
+++ b/spring-boot-angular/src/main/java/com/baeldung/angularclient/package-lock.json
@@ -0,0 +1,12627 @@
+{
+ "name": "sampleapp",
+ "version": "0.0.0",
+ "lockfileVersion": 1,
+ "requires": true,
+ "dependencies": {
+ "@angular-devkit/build-optimizer": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.3.2.tgz",
+ "integrity": "sha512-U0BCZtThq5rUfY08shHXpxe8ZhSsiYB/cJjUvAWRTs/ORrs8pbngS6xwseQws8d/vHoVrtqGD9GU9h8AmFRERQ==",
+ "dev": true,
+ "requires": {
+ "loader-utils": "^1.1.0",
+ "source-map": "^0.5.6",
+ "typescript": "~2.6.2",
+ "webpack-sources": "^1.0.1"
+ },
+ "dependencies": {
+ "typescript": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.6.2.tgz",
+ "integrity": "sha1-PFtv1/beCRQmkCfwPAlGdY92c6Q=",
+ "dev": true
+ }
+ }
+ },
+ "@angular-devkit/core": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-0.3.2.tgz",
+ "integrity": "sha512-zABk/iP7YX5SVbmK4e+IX7j2d0D37MQJQiKgWdV3JzfvVJhNJzddiirtT980pIafoq+KyvTgVwXtc+vnux0oeQ==",
+ "dev": true,
+ "requires": {
+ "ajv": "~5.5.1",
+ "chokidar": "^1.7.0",
+ "rxjs": "^5.5.6",
+ "source-map": "^0.5.6"
+ },
+ "dependencies": {
+ "ajv": {
+ "version": "5.5.2",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
+ "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
+ "dev": true,
+ "requires": {
+ "co": "^4.6.0",
+ "fast-deep-equal": "^1.0.0",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.3.0"
+ }
+ }
+ }
+ },
+ "@angular-devkit/schematics": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-0.3.2.tgz",
+ "integrity": "sha512-B6zZoqvHaTJy+vVdA6EtlxnCdGMa5elCa4j9lQLC3JI8DLvMXUWkCIPVbPzJ/GSRR9nsKWpvYMYaJyfBDUqfhw==",
+ "dev": true,
+ "requires": {
+ "@ngtools/json-schema": "^1.1.0",
+ "rxjs": "^5.5.6"
+ }
+ },
+ "@angular/animations": {
+ "version": "5.2.11",
+ "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-5.2.11.tgz",
+ "integrity": "sha512-J7wKHkFn3wV28/Y1Qm4yjGXVCwXzj1JR5DRjGDTFnxTRacUFx7Nj0ApGhN0b2+V0NOvgxQOvEW415Y22kGoblw==",
+ "requires": {
+ "tslib": "^1.7.1"
+ }
+ },
+ "@angular/cli": {
+ "version": "1.7.4",
+ "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-1.7.4.tgz",
+ "integrity": "sha512-URdb1QtnQf+Ievy93wjq7gE81s25BkWUwJFPey+YkphBA3G1lbCAQPiEh2pntBwaIKavgEuCw+Sf2YZdgTVhDA==",
+ "dev": true,
+ "requires": {
+ "@angular-devkit/build-optimizer": "0.3.2",
+ "@angular-devkit/core": "0.3.2",
+ "@angular-devkit/schematics": "0.3.2",
+ "@ngtools/json-schema": "1.2.0",
+ "@ngtools/webpack": "1.10.2",
+ "@schematics/angular": "0.3.2",
+ "@schematics/package-update": "0.3.2",
+ "ajv": "^6.1.1",
+ "autoprefixer": "^7.2.3",
+ "cache-loader": "^1.2.0",
+ "chalk": "~2.2.0",
+ "circular-dependency-plugin": "^4.2.1",
+ "clean-css": "^4.1.11",
+ "common-tags": "^1.3.1",
+ "copy-webpack-plugin": "~4.4.1",
+ "core-object": "^3.1.0",
+ "denodeify": "^1.2.1",
+ "ember-cli-string-utils": "^1.0.0",
+ "extract-text-webpack-plugin": "^3.0.2",
+ "file-loader": "^1.1.5",
+ "fs-extra": "^4.0.0",
+ "glob": "^7.0.3",
+ "html-webpack-plugin": "^2.29.0",
+ "istanbul-instrumenter-loader": "^3.0.0",
+ "karma-source-map-support": "^1.2.0",
+ "less": "^2.7.2",
+ "less-loader": "^4.0.5",
+ "license-webpack-plugin": "^1.0.0",
+ "loader-utils": "1.1.0",
+ "lodash": "^4.11.1",
+ "memory-fs": "^0.4.1",
+ "minimatch": "^3.0.4",
+ "node-modules-path": "^1.0.0",
+ "node-sass": "^4.7.2",
+ "nopt": "^4.0.1",
+ "opn": "~5.1.0",
+ "portfinder": "~1.0.12",
+ "postcss": "^6.0.16",
+ "postcss-import": "^11.0.0",
+ "postcss-loader": "^2.0.10",
+ "postcss-url": "^7.1.2",
+ "raw-loader": "^0.5.1",
+ "resolve": "^1.1.7",
+ "rxjs": "^5.5.6",
+ "sass-loader": "^6.0.6",
+ "semver": "^5.1.0",
+ "silent-error": "^1.0.0",
+ "source-map-support": "^0.4.1",
+ "style-loader": "^0.19.1",
+ "stylus": "^0.54.5",
+ "stylus-loader": "^3.0.1",
+ "uglifyjs-webpack-plugin": "^1.1.8",
+ "url-loader": "^0.6.2",
+ "webpack": "~3.11.0",
+ "webpack-dev-middleware": "~1.12.0",
+ "webpack-dev-server": "~2.11.0",
+ "webpack-merge": "^4.1.0",
+ "webpack-sources": "^1.0.0",
+ "webpack-subresource-integrity": "^1.0.1"
+ }
+ },
+ "@angular/common": {
+ "version": "5.2.11",
+ "resolved": "https://registry.npmjs.org/@angular/common/-/common-5.2.11.tgz",
+ "integrity": "sha512-LniJjGAeftUJDJh+2+LEjltcGen08C/VMxQ/eUYmesytKy1sN+MWzh3GbpKfEWtWmyUsYTG9lAAJNo3L3jPwsw==",
+ "requires": {
+ "tslib": "^1.7.1"
+ }
+ },
+ "@angular/compiler": {
+ "version": "5.2.11",
+ "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-5.2.11.tgz",
+ "integrity": "sha512-ICvB1ud1mxaXUYLb8vhJqiLhGBVocAZGxoHTglv6hMkbrRYcnlB3FZJFOzBvtj+krkd1jamoYLI43UAmesqQ6Q==",
+ "requires": {
+ "tslib": "^1.7.1"
+ }
+ },
+ "@angular/compiler-cli": {
+ "version": "5.2.11",
+ "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-5.2.11.tgz",
+ "integrity": "sha512-dwrQ0yxoCM/XzKzlm7pTsyg4/6ECjT9emZufGj8t12bLMO8NDn1IJOsqXJA1+onEgQKhlr0Ziwi+96TvDTb1Cg==",
+ "dev": true,
+ "requires": {
+ "chokidar": "^1.4.2",
+ "minimist": "^1.2.0",
+ "reflect-metadata": "^0.1.2",
+ "tsickle": "^0.27.2"
+ },
+ "dependencies": {
+ "minimist": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+ "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+ "dev": true
+ }
+ }
+ },
+ "@angular/core": {
+ "version": "5.2.11",
+ "resolved": "https://registry.npmjs.org/@angular/core/-/core-5.2.11.tgz",
+ "integrity": "sha512-h2vpvXNAdOqKzbVaZcHnHGMT5A8uDnizk6FgGq6SPyw9s3d+/VxZ9LJaPjUk3g2lICA7og1tUel+2YfF971MlQ==",
+ "requires": {
+ "tslib": "^1.7.1"
+ }
+ },
+ "@angular/forms": {
+ "version": "5.2.11",
+ "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-5.2.11.tgz",
+ "integrity": "sha512-wBllFlIubPclAFRXUc84Kc7TMeKOftzrQraVZ7ooTNeFLLa/FZLN2K8HGyRde8X/XDsMu1XAmjNfkz++spwTzA==",
+ "requires": {
+ "tslib": "^1.7.1"
+ }
+ },
+ "@angular/http": {
+ "version": "5.2.11",
+ "resolved": "https://registry.npmjs.org/@angular/http/-/http-5.2.11.tgz",
+ "integrity": "sha512-eR7wNXh1+6MpcQNb3sq4bJVX03dx50Wl3kpPG+Q7N1VSL0oPQSobaTrR17ac3oFCEfSJn6kkUCqtUXha6wcNHg==",
+ "requires": {
+ "tslib": "^1.7.1"
+ }
+ },
+ "@angular/language-service": {
+ "version": "5.2.11",
+ "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-5.2.11.tgz",
+ "integrity": "sha512-tgnFAhwBmUs1W0dmcmlBmUlMaOgkoyuSdrcF23lz8W5+nSLb+LnbH5a3blU2NVqA4ESvLKQkPW5dpKa/LuhrPQ==",
+ "dev": true
+ },
+ "@angular/platform-browser": {
+ "version": "5.2.11",
+ "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-5.2.11.tgz",
+ "integrity": "sha512-6YZ4IpBFqXx88vEzBZG2WWnaSYXbFWDgG0iT+bZPHAfwsbmqbcMcs7Ogu+XZ4VmK02dTqbrFh7U4P2W+sqrzow==",
+ "requires": {
+ "tslib": "^1.7.1"
+ }
+ },
+ "@angular/platform-browser-dynamic": {
+ "version": "5.2.11",
+ "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-5.2.11.tgz",
+ "integrity": "sha512-5kKPNULcXNwkyBjpHfF+pq+Yxi8Zl866YSOK9t8txoiQ9Ctw97kMkEJcTetk6MJgBp/NP3YyjtoTAm8oXLerug==",
+ "requires": {
+ "tslib": "^1.7.1"
+ }
+ },
+ "@angular/router": {
+ "version": "5.2.11",
+ "resolved": "https://registry.npmjs.org/@angular/router/-/router-5.2.11.tgz",
+ "integrity": "sha512-NT8xYl7Vr3qPygisek3PlXqNROEjg48GXOEsDEc7c8lDBo3EB9Tf328fWJD0GbLtXZNhmmNNxwIe+qqPFFhFAA==",
+ "requires": {
+ "tslib": "^1.7.1"
+ }
+ },
+ "@ngtools/json-schema": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@ngtools/json-schema/-/json-schema-1.2.0.tgz",
+ "integrity": "sha512-pMh+HDc6mOjUO3agRfB1tInimo7hf67u+0Cska2bfXFe6oU7rSMnr5PLVtiZVgwMoBHpx/6XjBymvcnWPo2Uzg==",
+ "dev": true
+ },
+ "@ngtools/webpack": {
+ "version": "1.10.2",
+ "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-1.10.2.tgz",
+ "integrity": "sha512-3u2zg2rarG3qNLSukBClGADWuq/iNn5SQtlSeAbfKzwBeyLGbF0gN1z1tVx1Bcr8YwFzR6NdRePQmJGcoqq1fg==",
+ "dev": true,
+ "requires": {
+ "chalk": "~2.2.0",
+ "enhanced-resolve": "^3.1.0",
+ "loader-utils": "^1.0.2",
+ "magic-string": "^0.22.3",
+ "semver": "^5.3.0",
+ "source-map": "^0.5.6",
+ "tree-kill": "^1.0.0",
+ "webpack-sources": "^1.1.0"
+ }
+ },
+ "@schematics/angular": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-0.3.2.tgz",
+ "integrity": "sha512-Elrk0BA951s0ScFZU0AWrpUeJBYVR52DZ1QTIO5R0AhwEd1PW4olI8szPLGQlVW5Sd6H0FA/fyFLIvn2r9v6Rw==",
+ "dev": true,
+ "requires": {
+ "typescript": "~2.6.2"
+ },
+ "dependencies": {
+ "typescript": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.6.2.tgz",
+ "integrity": "sha1-PFtv1/beCRQmkCfwPAlGdY92c6Q=",
+ "dev": true
+ }
+ }
+ },
+ "@schematics/package-update": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/@schematics/package-update/-/package-update-0.3.2.tgz",
+ "integrity": "sha512-7aVP4994Hu8vRdTTohXkfGWEwLhrdNP3EZnWyBootm5zshWqlQojUGweZe5zwewsKcixeVOiy2YtW+aI4aGSLA==",
+ "dev": true,
+ "requires": {
+ "rxjs": "^5.5.6",
+ "semver": "^5.3.0",
+ "semver-intersect": "^1.1.2"
+ }
+ },
+ "@types/jasmine": {
+ "version": "2.8.16",
+ "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-2.8.16.tgz",
+ "integrity": "sha512-056oRlBBp7MDzr+HoU5su099s/s7wjZ3KcHxLfv+Byqb9MwdLUvsfLgw1VS97hsh3ddxSPyQu+olHMnoVTUY6g==",
+ "dev": true
+ },
+ "@types/jasminewd2": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/@types/jasminewd2/-/jasminewd2-2.0.6.tgz",
+ "integrity": "sha512-2ZOKrxb8bKRmP/po5ObYnRDgFE4i+lQiEB27bAMmtMWLgJSqlIDqlLx6S0IRorpOmOPRQ6O80NujTmQAtBkeNw==",
+ "dev": true,
+ "requires": {
+ "@types/jasmine": "*"
+ }
+ },
+ "@types/node": {
+ "version": "6.0.118",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.118.tgz",
+ "integrity": "sha512-N33cKXGSqhOYaPiT4xUGsYlPPDwFtQM/6QxJxuMXA/7BcySW+lkn2yigWP7vfs4daiL/7NJNU6DMCqg5N4B+xQ==",
+ "dev": true
+ },
+ "@types/q": {
+ "version": "0.0.32",
+ "resolved": "https://registry.npmjs.org/@types/q/-/q-0.0.32.tgz",
+ "integrity": "sha1-vShOV8hPEyXacCur/IKlMoGQwMU=",
+ "dev": true
+ },
+ "@types/selenium-webdriver": {
+ "version": "2.53.43",
+ "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-2.53.43.tgz",
+ "integrity": "sha512-UBYHWph6P3tutkbXpW6XYg9ZPbTKjw/YC2hGG1/GEvWwTbvezBUv3h+mmUFw79T3RFPnmedpiXdOBbXX+4l0jg==",
+ "dev": true
+ },
+ "@types/strip-bom": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz",
+ "integrity": "sha1-FKjsOVbC6B7bdSB5CuzyHCkK69I=",
+ "dev": true
+ },
+ "@types/strip-json-comments": {
+ "version": "0.0.30",
+ "resolved": "https://registry.npmjs.org/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz",
+ "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==",
+ "dev": true
+ },
+ "abbrev": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
+ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
+ "dev": true
+ },
+ "accepts": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz",
+ "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=",
+ "dev": true,
+ "requires": {
+ "mime-types": "~2.1.18",
+ "negotiator": "0.6.1"
+ }
+ },
+ "acorn": {
+ "version": "5.7.3",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz",
+ "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==",
+ "dev": true
+ },
+ "acorn-dynamic-import": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz",
+ "integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=",
+ "dev": true,
+ "requires": {
+ "acorn": "^4.0.3"
+ },
+ "dependencies": {
+ "acorn": {
+ "version": "4.0.13",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz",
+ "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=",
+ "dev": true
+ }
+ }
+ },
+ "addressparser": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/addressparser/-/addressparser-1.0.1.tgz",
+ "integrity": "sha1-R6++GiqSYhkdtoOOT9HTm0CCF0Y=",
+ "dev": true,
+ "optional": true
+ },
+ "adm-zip": {
+ "version": "0.4.13",
+ "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.13.tgz",
+ "integrity": "sha512-fERNJX8sOXfel6qCBCMPvZLzENBEhZTzKqg6vrOW5pvoEaQuJhRU4ndTAh6lHOxn1I6jnz2NHra56ZODM751uw==",
+ "dev": true
+ },
+ "after": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz",
+ "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=",
+ "dev": true
+ },
+ "agent-base": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz",
+ "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==",
+ "dev": true,
+ "requires": {
+ "es6-promisify": "^5.0.0"
+ }
+ },
+ "ajv": {
+ "version": "6.7.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.7.0.tgz",
+ "integrity": "sha512-RZXPviBTtfmtka9n9sy1N5M5b82CbxWIR6HIis4s3WQTXDJamc/0gpCWNGz6EWdWp4DOfjzJfhz/AS9zVPjjWg==",
+ "dev": true,
+ "requires": {
+ "fast-deep-equal": "^2.0.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "dependencies": {
+ "fast-deep-equal": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
+ "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=",
+ "dev": true
+ },
+ "json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true
+ }
+ }
+ },
+ "ajv-keywords": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.3.0.tgz",
+ "integrity": "sha512-CMzN9S62ZOO4sA/mJZIO4S++ZM7KFWzH3PPWkveLhy4OZ9i1/VatgwWMD46w/XbGCBy7Ye0gCk+Za6mmyfKK7g==",
+ "dev": true
+ },
+ "align-text": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz",
+ "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=",
+ "dev": true,
+ "requires": {
+ "kind-of": "^3.0.2",
+ "longest": "^1.0.1",
+ "repeat-string": "^1.5.2"
+ }
+ },
+ "amdefine": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
+ "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=",
+ "dev": true
+ },
+ "amqplib": {
+ "version": "0.5.3",
+ "resolved": "https://registry.npmjs.org/amqplib/-/amqplib-0.5.3.tgz",
+ "integrity": "sha512-ZOdUhMxcF+u62rPI+hMtU1NBXSDFQ3eCJJrenamtdQ7YYwh7RZJHOIM1gonVbZ5PyVdYH4xqBPje9OYqk7fnqw==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "bitsyntax": "~0.1.0",
+ "bluebird": "^3.5.2",
+ "buffer-more-ints": "~1.0.0",
+ "readable-stream": "1.x >=1.1.9",
+ "safe-buffer": "~5.1.2",
+ "url-parse": "~1.4.3"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+ "dev": true,
+ "optional": true
+ },
+ "readable-stream": {
+ "version": "1.1.14",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
+ "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.1",
+ "isarray": "0.0.1",
+ "string_decoder": "~0.10.x"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+ "dev": true,
+ "optional": true
+ }
+ }
+ },
+ "ansi-html": {
+ "version": "0.0.7",
+ "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz",
+ "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=",
+ "dev": true
+ },
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
+ },
+ "anymatch": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz",
+ "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==",
+ "dev": true,
+ "requires": {
+ "micromatch": "^2.1.5",
+ "normalize-path": "^2.0.0"
+ }
+ },
+ "app-root-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-2.1.0.tgz",
+ "integrity": "sha1-mL9lmTJ+zqGZMJhm6BQDaP0uZGo=",
+ "dev": true
+ },
+ "append-transform": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz",
+ "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=",
+ "dev": true,
+ "requires": {
+ "default-require-extensions": "^1.0.0"
+ }
+ },
+ "aproba": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
+ "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==",
+ "dev": true
+ },
+ "are-we-there-yet": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz",
+ "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==",
+ "dev": true,
+ "requires": {
+ "delegates": "^1.0.0",
+ "readable-stream": "^2.0.6"
+ }
+ },
+ "argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "dev": true,
+ "requires": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "arr-diff": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz",
+ "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=",
+ "dev": true,
+ "requires": {
+ "arr-flatten": "^1.0.1"
+ }
+ },
+ "arr-flatten": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
+ "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
+ "dev": true
+ },
+ "arr-union": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
+ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
+ "dev": true
+ },
+ "array-find-index": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz",
+ "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=",
+ "dev": true
+ },
+ "array-flatten": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz",
+ "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==",
+ "dev": true
+ },
+ "array-includes": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz",
+ "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.2",
+ "es-abstract": "^1.7.0"
+ }
+ },
+ "array-slice": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz",
+ "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=",
+ "dev": true
+ },
+ "array-union": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
+ "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
+ "dev": true,
+ "requires": {
+ "array-uniq": "^1.0.1"
+ }
+ },
+ "array-uniq": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
+ "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=",
+ "dev": true
+ },
+ "array-unique": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz",
+ "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=",
+ "dev": true
+ },
+ "arraybuffer.slice": {
+ "version": "0.0.7",
+ "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz",
+ "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==",
+ "dev": true
+ },
+ "arrify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
+ "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=",
+ "dev": true
+ },
+ "asap": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
+ "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=",
+ "dev": true,
+ "optional": true
+ },
+ "asn1": {
+ "version": "0.2.4",
+ "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
+ "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
+ "dev": true,
+ "requires": {
+ "safer-buffer": "~2.1.0"
+ }
+ },
+ "asn1.js": {
+ "version": "4.10.1",
+ "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz",
+ "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==",
+ "dev": true,
+ "requires": {
+ "bn.js": "^4.0.0",
+ "inherits": "^2.0.1",
+ "minimalistic-assert": "^1.0.0"
+ }
+ },
+ "assert": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz",
+ "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=",
+ "dev": true,
+ "requires": {
+ "util": "0.10.3"
+ },
+ "dependencies": {
+ "inherits": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
+ "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=",
+ "dev": true
+ },
+ "util": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz",
+ "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=",
+ "dev": true,
+ "requires": {
+ "inherits": "2.0.1"
+ }
+ }
+ }
+ },
+ "assert-plus": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz",
+ "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=",
+ "dev": true,
+ "optional": true
+ },
+ "assign-symbols": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
+ "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
+ "dev": true
+ },
+ "ast-types": {
+ "version": "0.11.7",
+ "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.11.7.tgz",
+ "integrity": "sha512-2mP3TwtkY/aTv5X3ZsMpNAbOnyoC/aMJwJSoaELPkHId0nSQgFcnU4dRW3isxiz7+zBexk0ym3WNVjMiQBnJSw==",
+ "dev": true,
+ "optional": true
+ },
+ "async": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz",
+ "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==",
+ "dev": true,
+ "requires": {
+ "lodash": "^4.17.10"
+ }
+ },
+ "async-each": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz",
+ "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=",
+ "dev": true
+ },
+ "async-foreach": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz",
+ "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=",
+ "dev": true,
+ "optional": true
+ },
+ "async-limiter": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz",
+ "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==",
+ "dev": true
+ },
+ "asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
+ "dev": true
+ },
+ "atob": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
+ "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==",
+ "dev": true
+ },
+ "autoprefixer": {
+ "version": "7.2.6",
+ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-7.2.6.tgz",
+ "integrity": "sha512-Iq8TRIB+/9eQ8rbGhcP7ct5cYb/3qjNYAR2SnzLCEcwF6rvVOax8+9+fccgXk4bEhQGjOZd5TLhsksmAdsbGqQ==",
+ "dev": true,
+ "requires": {
+ "browserslist": "^2.11.3",
+ "caniuse-lite": "^1.0.30000805",
+ "normalize-range": "^0.1.2",
+ "num2fraction": "^1.2.2",
+ "postcss": "^6.0.17",
+ "postcss-value-parser": "^3.2.3"
+ }
+ },
+ "aws-sign2": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz",
+ "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=",
+ "dev": true,
+ "optional": true
+ },
+ "aws4": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz",
+ "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==",
+ "dev": true
+ },
+ "axios": {
+ "version": "0.15.3",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-0.15.3.tgz",
+ "integrity": "sha1-LJ1jiy4ZGgjqHWzJiOrda6W9wFM=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "follow-redirects": "1.0.0"
+ },
+ "dependencies": {
+ "follow-redirects": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.0.0.tgz",
+ "integrity": "sha1-jjQpjL0uF28lTv/sdaHHjMhJ/Tc=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "debug": "^2.2.0"
+ }
+ }
+ }
+ },
+ "babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+ "dev": true,
+ "requires": {
+ "chalk": "^1.1.3",
+ "esutils": "^2.0.2",
+ "js-tokens": "^3.0.2"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^2.2.1",
+ "escape-string-regexp": "^1.0.2",
+ "has-ansi": "^2.0.0",
+ "strip-ansi": "^3.0.0",
+ "supports-color": "^2.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true
+ }
+ }
+ },
+ "babel-generator": {
+ "version": "6.26.1",
+ "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz",
+ "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==",
+ "dev": true,
+ "requires": {
+ "babel-messages": "^6.23.0",
+ "babel-runtime": "^6.26.0",
+ "babel-types": "^6.26.0",
+ "detect-indent": "^4.0.0",
+ "jsesc": "^1.3.0",
+ "lodash": "^4.17.4",
+ "source-map": "^0.5.7",
+ "trim-right": "^1.0.1"
+ }
+ },
+ "babel-messages": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
+ "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "^6.22.0"
+ }
+ },
+ "babel-runtime": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
+ "dev": true,
+ "requires": {
+ "core-js": "^2.4.0",
+ "regenerator-runtime": "^0.11.0"
+ }
+ },
+ "babel-template": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz",
+ "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "^6.26.0",
+ "babel-traverse": "^6.26.0",
+ "babel-types": "^6.26.0",
+ "babylon": "^6.18.0",
+ "lodash": "^4.17.4"
+ }
+ },
+ "babel-traverse": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "^6.26.0",
+ "babel-messages": "^6.23.0",
+ "babel-runtime": "^6.26.0",
+ "babel-types": "^6.26.0",
+ "babylon": "^6.18.0",
+ "debug": "^2.6.8",
+ "globals": "^9.18.0",
+ "invariant": "^2.2.2",
+ "lodash": "^4.17.4"
+ }
+ },
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "^6.26.0",
+ "esutils": "^2.0.2",
+ "lodash": "^4.17.4",
+ "to-fast-properties": "^1.0.3"
+ }
+ },
+ "babylon": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
+ "dev": true
+ },
+ "backo2": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz",
+ "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=",
+ "dev": true
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+ "dev": true
+ },
+ "base": {
+ "version": "0.11.2",
+ "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
+ "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
+ "dev": true,
+ "requires": {
+ "cache-base": "^1.0.1",
+ "class-utils": "^0.3.5",
+ "component-emitter": "^1.2.1",
+ "define-property": "^1.0.0",
+ "isobject": "^3.0.1",
+ "mixin-deep": "^1.2.0",
+ "pascalcase": "^0.1.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^1.0.0"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "^1.0.0",
+ "is-data-descriptor": "^1.0.0",
+ "kind-of": "^6.0.2"
+ }
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ },
+ "kind-of": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+ "dev": true
+ }
+ }
+ },
+ "base64-arraybuffer": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz",
+ "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=",
+ "dev": true
+ },
+ "base64-js": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz",
+ "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==",
+ "dev": true
+ },
+ "base64id": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz",
+ "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=",
+ "dev": true
+ },
+ "batch": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz",
+ "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=",
+ "dev": true
+ },
+ "bcrypt-pbkdf": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
+ "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
+ "dev": true,
+ "requires": {
+ "tweetnacl": "^0.14.3"
+ }
+ },
+ "better-assert": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz",
+ "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=",
+ "dev": true,
+ "requires": {
+ "callsite": "1.0.0"
+ }
+ },
+ "big.js": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz",
+ "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==",
+ "dev": true
+ },
+ "binary-extensions": {
+ "version": "1.12.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.12.0.tgz",
+ "integrity": "sha512-DYWGk01lDcxeS/K9IHPGWfT8PsJmbXRtRd2Sx72Tnb8pcYZQFF1oSDb8hJtS1vhp212q1Rzi5dUf9+nq0o9UIg==",
+ "dev": true
+ },
+ "bitsyntax": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/bitsyntax/-/bitsyntax-0.1.0.tgz",
+ "integrity": "sha512-ikAdCnrloKmFOugAfxWws89/fPc+nw0OOG1IzIE72uSOg/A3cYptKCjSUhDTuj7fhsJtzkzlv7l3b8PzRHLN0Q==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "buffer-more-ints": "~1.0.0",
+ "debug": "~2.6.9",
+ "safe-buffer": "~5.1.2"
+ }
+ },
+ "bl": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/bl/-/bl-1.1.2.tgz",
+ "integrity": "sha1-/cqHGplxOqANGeO7ukHER4emU5g=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "readable-stream": "~2.0.5"
+ },
+ "dependencies": {
+ "process-nextick-args": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz",
+ "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=",
+ "dev": true,
+ "optional": true
+ },
+ "readable-stream": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz",
+ "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.1",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~1.0.6",
+ "string_decoder": "~0.10.x",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+ "dev": true,
+ "optional": true
+ }
+ }
+ },
+ "blob": {
+ "version": "0.0.5",
+ "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz",
+ "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==",
+ "dev": true
+ },
+ "block-stream": {
+ "version": "0.0.9",
+ "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz",
+ "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "inherits": "~2.0.0"
+ }
+ },
+ "blocking-proxy": {
+ "version": "0.0.5",
+ "resolved": "https://registry.npmjs.org/blocking-proxy/-/blocking-proxy-0.0.5.tgz",
+ "integrity": "sha1-RikF4Nz76pcPQao3Ij3anAexkSs=",
+ "dev": true,
+ "requires": {
+ "minimist": "^1.2.0"
+ },
+ "dependencies": {
+ "minimist": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+ "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+ "dev": true
+ }
+ }
+ },
+ "bluebird": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.3.tgz",
+ "integrity": "sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw==",
+ "dev": true
+ },
+ "bn.js": {
+ "version": "4.11.8",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz",
+ "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==",
+ "dev": true
+ },
+ "body-parser": {
+ "version": "1.18.3",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz",
+ "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=",
+ "dev": true,
+ "requires": {
+ "bytes": "3.0.0",
+ "content-type": "~1.0.4",
+ "debug": "2.6.9",
+ "depd": "~1.1.2",
+ "http-errors": "~1.6.3",
+ "iconv-lite": "0.4.23",
+ "on-finished": "~2.3.0",
+ "qs": "6.5.2",
+ "raw-body": "2.3.3",
+ "type-is": "~1.6.16"
+ },
+ "dependencies": {
+ "qs": {
+ "version": "6.5.2",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
+ "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
+ "dev": true
+ }
+ }
+ },
+ "bonjour": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz",
+ "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=",
+ "dev": true,
+ "requires": {
+ "array-flatten": "^2.1.0",
+ "deep-equal": "^1.0.1",
+ "dns-equal": "^1.0.0",
+ "dns-txt": "^2.0.2",
+ "multicast-dns": "^6.0.1",
+ "multicast-dns-service-types": "^1.1.0"
+ }
+ },
+ "boolbase": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
+ "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=",
+ "dev": true
+ },
+ "boom": {
+ "version": "2.10.1",
+ "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz",
+ "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=",
+ "dev": true,
+ "requires": {
+ "hoek": "2.x.x"
+ }
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "braces": {
+ "version": "1.8.5",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz",
+ "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=",
+ "dev": true,
+ "requires": {
+ "expand-range": "^1.8.1",
+ "preserve": "^0.2.0",
+ "repeat-element": "^1.1.2"
+ }
+ },
+ "brorand": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
+ "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=",
+ "dev": true
+ },
+ "browserify-aes": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz",
+ "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==",
+ "dev": true,
+ "requires": {
+ "buffer-xor": "^1.0.3",
+ "cipher-base": "^1.0.0",
+ "create-hash": "^1.1.0",
+ "evp_bytestokey": "^1.0.3",
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "browserify-cipher": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz",
+ "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==",
+ "dev": true,
+ "requires": {
+ "browserify-aes": "^1.0.4",
+ "browserify-des": "^1.0.0",
+ "evp_bytestokey": "^1.0.0"
+ }
+ },
+ "browserify-des": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz",
+ "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==",
+ "dev": true,
+ "requires": {
+ "cipher-base": "^1.0.1",
+ "des.js": "^1.0.0",
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.1.2"
+ }
+ },
+ "browserify-rsa": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz",
+ "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=",
+ "dev": true,
+ "requires": {
+ "bn.js": "^4.1.0",
+ "randombytes": "^2.0.1"
+ }
+ },
+ "browserify-sign": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz",
+ "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=",
+ "dev": true,
+ "requires": {
+ "bn.js": "^4.1.1",
+ "browserify-rsa": "^4.0.0",
+ "create-hash": "^1.1.0",
+ "create-hmac": "^1.1.2",
+ "elliptic": "^6.0.0",
+ "inherits": "^2.0.1",
+ "parse-asn1": "^5.0.0"
+ }
+ },
+ "browserify-zlib": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz",
+ "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==",
+ "dev": true,
+ "requires": {
+ "pako": "~1.0.5"
+ }
+ },
+ "browserslist": {
+ "version": "2.11.3",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.11.3.tgz",
+ "integrity": "sha512-yWu5cXT7Av6mVwzWc8lMsJMHWn4xyjSuGYi4IozbVTLUOEYPSagUB8kiMDUHA1fS3zjr8nkxkn9jdvug4BBRmA==",
+ "dev": true,
+ "requires": {
+ "caniuse-lite": "^1.0.30000792",
+ "electron-to-chromium": "^1.3.30"
+ }
+ },
+ "buffer": {
+ "version": "4.9.1",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz",
+ "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=",
+ "dev": true,
+ "requires": {
+ "base64-js": "^1.0.2",
+ "ieee754": "^1.1.4",
+ "isarray": "^1.0.0"
+ }
+ },
+ "buffer-alloc": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz",
+ "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==",
+ "dev": true,
+ "requires": {
+ "buffer-alloc-unsafe": "^1.1.0",
+ "buffer-fill": "^1.0.0"
+ }
+ },
+ "buffer-alloc-unsafe": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz",
+ "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==",
+ "dev": true
+ },
+ "buffer-fill": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz",
+ "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=",
+ "dev": true
+ },
+ "buffer-from": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
+ "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
+ "dev": true
+ },
+ "buffer-indexof": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz",
+ "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==",
+ "dev": true
+ },
+ "buffer-more-ints": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/buffer-more-ints/-/buffer-more-ints-1.0.0.tgz",
+ "integrity": "sha512-EMetuGFz5SLsT0QTnXzINh4Ksr+oo4i+UGTXEshiGCQWnsgSs7ZhJ8fzlwQ+OzEMs0MpDAMr1hxnblp5a4vcHg==",
+ "dev": true
+ },
+ "buffer-xor": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
+ "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=",
+ "dev": true
+ },
+ "buildmail": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/buildmail/-/buildmail-4.0.1.tgz",
+ "integrity": "sha1-h393OLeHKYccmhBeO4N9K+EaenI=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "addressparser": "1.0.1",
+ "libbase64": "0.1.0",
+ "libmime": "3.0.0",
+ "libqp": "1.1.0",
+ "nodemailer-fetch": "1.6.0",
+ "nodemailer-shared": "1.1.0",
+ "punycode": "1.4.1"
+ },
+ "dependencies": {
+ "punycode": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
+ "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
+ "dev": true,
+ "optional": true
+ }
+ }
+ },
+ "builtin-modules": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
+ "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=",
+ "dev": true
+ },
+ "builtin-status-codes": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz",
+ "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=",
+ "dev": true
+ },
+ "bytes": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
+ "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=",
+ "dev": true
+ },
+ "cacache": {
+ "version": "10.0.4",
+ "resolved": "https://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz",
+ "integrity": "sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==",
+ "dev": true,
+ "requires": {
+ "bluebird": "^3.5.1",
+ "chownr": "^1.0.1",
+ "glob": "^7.1.2",
+ "graceful-fs": "^4.1.11",
+ "lru-cache": "^4.1.1",
+ "mississippi": "^2.0.0",
+ "mkdirp": "^0.5.1",
+ "move-concurrently": "^1.0.1",
+ "promise-inflight": "^1.0.1",
+ "rimraf": "^2.6.2",
+ "ssri": "^5.2.4",
+ "unique-filename": "^1.1.0",
+ "y18n": "^4.0.0"
+ }
+ },
+ "cache-base": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
+ "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
+ "dev": true,
+ "requires": {
+ "collection-visit": "^1.0.0",
+ "component-emitter": "^1.2.1",
+ "get-value": "^2.0.6",
+ "has-value": "^1.0.0",
+ "isobject": "^3.0.1",
+ "set-value": "^2.0.0",
+ "to-object-path": "^0.3.0",
+ "union-value": "^1.0.0",
+ "unset-value": "^1.0.0"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ }
+ }
+ },
+ "cache-loader": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/cache-loader/-/cache-loader-1.2.5.tgz",
+ "integrity": "sha512-enWKEQ4kO3YreDFd7AtVRjtJBmNiqh/X9hVDReu0C4qm8gsGmySkwuWtdc+N5O+vq5FzxL1mIZc30NyXCB7o/Q==",
+ "dev": true,
+ "requires": {
+ "loader-utils": "^1.1.0",
+ "mkdirp": "^0.5.1",
+ "neo-async": "^2.5.0",
+ "schema-utils": "^0.4.2"
+ }
+ },
+ "callsite": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz",
+ "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=",
+ "dev": true
+ },
+ "camel-case": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz",
+ "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=",
+ "dev": true,
+ "requires": {
+ "no-case": "^2.2.0",
+ "upper-case": "^1.1.1"
+ }
+ },
+ "camelcase": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
+ "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=",
+ "dev": true
+ },
+ "camelcase-keys": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz",
+ "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=",
+ "dev": true,
+ "requires": {
+ "camelcase": "^2.0.0",
+ "map-obj": "^1.0.0"
+ }
+ },
+ "caniuse-lite": {
+ "version": "1.0.30000932",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000932.tgz",
+ "integrity": "sha512-4bghJFItvzz8m0T3lLZbacmEY9X1Z2AtIzTr7s7byqZIOumASfr4ynDx7rtm0J85nDmx8vsgR6vnaSoeU8Oh0A==",
+ "dev": true
+ },
+ "caseless": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
+ "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
+ "dev": true
+ },
+ "center-align": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz",
+ "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=",
+ "dev": true,
+ "requires": {
+ "align-text": "^0.1.3",
+ "lazy-cache": "^1.0.3"
+ }
+ },
+ "chalk": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.2.2.tgz",
+ "integrity": "sha512-LvixLAQ4MYhbf7hgL4o5PeK32gJKvVzDRiSNIApDofQvyhl8adgG2lJVXn4+ekQoK7HL9RF8lqxwerpe0x2pCw==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.1.0",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^4.0.0"
+ }
+ },
+ "chokidar": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz",
+ "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=",
+ "dev": true,
+ "requires": {
+ "anymatch": "^1.3.0",
+ "async-each": "^1.0.0",
+ "fsevents": "^1.0.0",
+ "glob-parent": "^2.0.0",
+ "inherits": "^2.0.1",
+ "is-binary-path": "^1.0.0",
+ "is-glob": "^2.0.0",
+ "path-is-absolute": "^1.0.0",
+ "readdirp": "^2.0.0"
+ }
+ },
+ "chownr": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz",
+ "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==",
+ "dev": true
+ },
+ "cipher-base": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz",
+ "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==",
+ "dev": true,
+ "requires": {
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "circular-dependency-plugin": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/circular-dependency-plugin/-/circular-dependency-plugin-4.4.0.tgz",
+ "integrity": "sha512-yEFtUNUYT4jBykEX5ZOHw+5goA3glGZr9wAXIQqoyakjz5H5TeUmScnWRc52douAhb9eYzK3s7V6bXfNnjFdzg==",
+ "dev": true
+ },
+ "circular-json": {
+ "version": "0.5.9",
+ "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.5.9.tgz",
+ "integrity": "sha512-4ivwqHpIFJZBuhN3g/pEcdbnGUywkBblloGbkglyloVjjR3uT6tieI89MVOfbP2tHX5sgb01FuLgAOzebNlJNQ==",
+ "dev": true
+ },
+ "class-utils": {
+ "version": "0.3.6",
+ "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
+ "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
+ "dev": true,
+ "requires": {
+ "arr-union": "^3.1.0",
+ "define-property": "^0.2.5",
+ "isobject": "^3.0.0",
+ "static-extend": "^0.1.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^0.1.0"
+ }
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ }
+ }
+ },
+ "clean-css": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.1.tgz",
+ "integrity": "sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g==",
+ "dev": true,
+ "requires": {
+ "source-map": "~0.6.0"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ }
+ }
+ },
+ "cliui": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
+ "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=",
+ "dev": true,
+ "requires": {
+ "string-width": "^1.0.1",
+ "strip-ansi": "^3.0.1",
+ "wrap-ansi": "^2.0.0"
+ }
+ },
+ "clone": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
+ "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=",
+ "dev": true
+ },
+ "clone-deep": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-2.0.2.tgz",
+ "integrity": "sha512-SZegPTKjCgpQH63E+eN6mVEEPdQBOUzjyJm5Pora4lrwWRFS8I0QAxV/KD6vV/i0WuijHZWQC1fMsPEdxfdVCQ==",
+ "dev": true,
+ "requires": {
+ "for-own": "^1.0.0",
+ "is-plain-object": "^2.0.4",
+ "kind-of": "^6.0.0",
+ "shallow-clone": "^1.0.0"
+ },
+ "dependencies": {
+ "for-own": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz",
+ "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=",
+ "dev": true,
+ "requires": {
+ "for-in": "^1.0.1"
+ }
+ },
+ "kind-of": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+ "dev": true
+ }
+ }
+ },
+ "co": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
+ "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=",
+ "dev": true
+ },
+ "code-point-at": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
+ "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
+ "dev": true
+ },
+ "codelyzer": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-4.5.0.tgz",
+ "integrity": "sha512-oO6vCkjqsVrEsmh58oNlnJkRXuA30hF8cdNAQV9DytEalDwyOFRvHMnlKFzmOStNerOmPGZU9GAHnBo4tGvtiQ==",
+ "dev": true,
+ "requires": {
+ "app-root-path": "^2.1.0",
+ "css-selector-tokenizer": "^0.7.0",
+ "cssauron": "^1.4.0",
+ "semver-dsl": "^1.0.1",
+ "source-map": "^0.5.7",
+ "sprintf-js": "^1.1.1"
+ },
+ "dependencies": {
+ "sprintf-js": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz",
+ "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==",
+ "dev": true
+ }
+ }
+ },
+ "collection-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
+ "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
+ "dev": true,
+ "requires": {
+ "map-visit": "^1.0.0",
+ "object-visit": "^1.0.0"
+ }
+ },
+ "color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dev": true,
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+ "dev": true
+ },
+ "colors": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz",
+ "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=",
+ "dev": true
+ },
+ "combine-lists": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/combine-lists/-/combine-lists-1.0.1.tgz",
+ "integrity": "sha1-RYwH4J4NkA/Ci3Cj/sLazR0st/Y=",
+ "dev": true,
+ "requires": {
+ "lodash": "^4.5.0"
+ }
+ },
+ "combined-stream": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz",
+ "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==",
+ "dev": true,
+ "requires": {
+ "delayed-stream": "~1.0.0"
+ }
+ },
+ "commander": {
+ "version": "2.17.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz",
+ "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==",
+ "dev": true
+ },
+ "common-tags": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz",
+ "integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==",
+ "dev": true
+ },
+ "commondir": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
+ "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=",
+ "dev": true
+ },
+ "component-bind": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz",
+ "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=",
+ "dev": true
+ },
+ "component-emitter": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
+ "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=",
+ "dev": true
+ },
+ "component-inherit": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz",
+ "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=",
+ "dev": true
+ },
+ "compressible": {
+ "version": "2.0.15",
+ "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.15.tgz",
+ "integrity": "sha512-4aE67DL33dSW9gw4CI2H/yTxqHLNcxp0yS6jB+4h+wr3e43+1z7vm0HU9qXOH8j+qjKuL8+UtkOxYQSMq60Ylw==",
+ "dev": true,
+ "requires": {
+ "mime-db": ">= 1.36.0 < 2"
+ }
+ },
+ "compression": {
+ "version": "1.7.3",
+ "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.3.tgz",
+ "integrity": "sha512-HSjyBG5N1Nnz7tF2+O7A9XUhyjru71/fwgNb7oIsEVHR0WShfs2tIS/EySLgiTe98aOK18YDlMXpzjCXY/n9mg==",
+ "dev": true,
+ "requires": {
+ "accepts": "~1.3.5",
+ "bytes": "3.0.0",
+ "compressible": "~2.0.14",
+ "debug": "2.6.9",
+ "on-headers": "~1.0.1",
+ "safe-buffer": "5.1.2",
+ "vary": "~1.1.2"
+ }
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "concat-stream": {
+ "version": "1.6.2",
+ "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
+ "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
+ "dev": true,
+ "requires": {
+ "buffer-from": "^1.0.0",
+ "inherits": "^2.0.3",
+ "readable-stream": "^2.2.2",
+ "typedarray": "^0.0.6"
+ }
+ },
+ "connect": {
+ "version": "3.6.6",
+ "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz",
+ "integrity": "sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ=",
+ "dev": true,
+ "requires": {
+ "debug": "2.6.9",
+ "finalhandler": "1.1.0",
+ "parseurl": "~1.3.2",
+ "utils-merge": "1.0.1"
+ },
+ "dependencies": {
+ "finalhandler": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz",
+ "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=",
+ "dev": true,
+ "requires": {
+ "debug": "2.6.9",
+ "encodeurl": "~1.0.1",
+ "escape-html": "~1.0.3",
+ "on-finished": "~2.3.0",
+ "parseurl": "~1.3.2",
+ "statuses": "~1.3.1",
+ "unpipe": "~1.0.0"
+ }
+ },
+ "statuses": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz",
+ "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=",
+ "dev": true
+ }
+ }
+ },
+ "connect-history-api-fallback": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz",
+ "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==",
+ "dev": true
+ },
+ "console-browserify": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz",
+ "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=",
+ "dev": true,
+ "requires": {
+ "date-now": "^0.1.4"
+ }
+ },
+ "console-control-strings": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
+ "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=",
+ "dev": true
+ },
+ "constants-browserify": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz",
+ "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=",
+ "dev": true
+ },
+ "content-disposition": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz",
+ "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=",
+ "dev": true
+ },
+ "content-type": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
+ "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
+ "dev": true
+ },
+ "convert-source-map": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz",
+ "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "~5.1.1"
+ }
+ },
+ "cookie": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz",
+ "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=",
+ "dev": true
+ },
+ "cookie-signature": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
+ "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=",
+ "dev": true
+ },
+ "copy-concurrently": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz",
+ "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==",
+ "dev": true,
+ "requires": {
+ "aproba": "^1.1.1",
+ "fs-write-stream-atomic": "^1.0.8",
+ "iferr": "^0.1.5",
+ "mkdirp": "^0.5.1",
+ "rimraf": "^2.5.4",
+ "run-queue": "^1.0.0"
+ }
+ },
+ "copy-descriptor": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
+ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
+ "dev": true
+ },
+ "copy-webpack-plugin": {
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-4.4.3.tgz",
+ "integrity": "sha512-v4THQ24Tks2NkyOvZuFDgZVfDD9YaA9rwYLZTrWg2GHIA8lrH5DboEyeoorh5Skki+PUbgSmnsCwhMWqYrQZrA==",
+ "dev": true,
+ "requires": {
+ "cacache": "^10.0.1",
+ "find-cache-dir": "^1.0.0",
+ "globby": "^7.1.1",
+ "is-glob": "^4.0.0",
+ "loader-utils": "^1.1.0",
+ "minimatch": "^3.0.4",
+ "p-limit": "^1.0.0",
+ "serialize-javascript": "^1.4.0"
+ },
+ "dependencies": {
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+ "dev": true
+ },
+ "is-glob": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz",
+ "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "^2.1.1"
+ }
+ }
+ }
+ },
+ "core-js": {
+ "version": "2.6.3",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.3.tgz",
+ "integrity": "sha512-l00tmFFZOBHtYhN4Cz7k32VM7vTn3rE2ANjQDxdEN6zmXZ/xq1jQuutnmHvMG1ZJ7xd72+TA5YpUK8wz3rWsfQ=="
+ },
+ "core-object": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/core-object/-/core-object-3.1.5.tgz",
+ "integrity": "sha512-sA2/4+/PZ/KV6CKgjrVrrUVBKCkdDO02CUlQ0YKTQoYUwPYNOtOAcWlbYhd5v/1JqYaA6oZ4sDlOU4ppVw6Wbg==",
+ "dev": true,
+ "requires": {
+ "chalk": "^2.0.0"
+ }
+ },
+ "core-util-is": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
+ "dev": true
+ },
+ "cosmiconfig": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-4.0.0.tgz",
+ "integrity": "sha512-6e5vDdrXZD+t5v0L8CrurPeybg4Fmf+FCSYxXKYVAqLUtyCSbuyqE059d0kDthTNRzKVjL7QMgNpEUlsoYH3iQ==",
+ "dev": true,
+ "requires": {
+ "is-directory": "^0.3.1",
+ "js-yaml": "^3.9.0",
+ "parse-json": "^4.0.0",
+ "require-from-string": "^2.0.1"
+ },
+ "dependencies": {
+ "parse-json": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
+ "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
+ "dev": true,
+ "requires": {
+ "error-ex": "^1.3.1",
+ "json-parse-better-errors": "^1.0.1"
+ }
+ }
+ }
+ },
+ "create-ecdh": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz",
+ "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==",
+ "dev": true,
+ "requires": {
+ "bn.js": "^4.1.0",
+ "elliptic": "^6.0.0"
+ }
+ },
+ "create-hash": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz",
+ "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==",
+ "dev": true,
+ "requires": {
+ "cipher-base": "^1.0.1",
+ "inherits": "^2.0.1",
+ "md5.js": "^1.3.4",
+ "ripemd160": "^2.0.1",
+ "sha.js": "^2.4.0"
+ }
+ },
+ "create-hmac": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz",
+ "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==",
+ "dev": true,
+ "requires": {
+ "cipher-base": "^1.0.3",
+ "create-hash": "^1.1.0",
+ "inherits": "^2.0.1",
+ "ripemd160": "^2.0.0",
+ "safe-buffer": "^5.0.1",
+ "sha.js": "^2.4.8"
+ }
+ },
+ "cross-spawn": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz",
+ "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "lru-cache": "^4.0.1",
+ "which": "^1.2.9"
+ }
+ },
+ "cryptiles": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz",
+ "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "boom": "2.x.x"
+ }
+ },
+ "crypto-browserify": {
+ "version": "3.12.0",
+ "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz",
+ "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==",
+ "dev": true,
+ "requires": {
+ "browserify-cipher": "^1.0.0",
+ "browserify-sign": "^4.0.0",
+ "create-ecdh": "^4.0.0",
+ "create-hash": "^1.1.0",
+ "create-hmac": "^1.1.0",
+ "diffie-hellman": "^5.0.0",
+ "inherits": "^2.0.1",
+ "pbkdf2": "^3.0.3",
+ "public-encrypt": "^4.0.0",
+ "randombytes": "^2.0.0",
+ "randomfill": "^1.0.3"
+ }
+ },
+ "css-parse": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-1.7.0.tgz",
+ "integrity": "sha1-Mh9s9zeCpv91ERE5D8BeLGV9jJs=",
+ "dev": true
+ },
+ "css-select": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz",
+ "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=",
+ "dev": true,
+ "requires": {
+ "boolbase": "~1.0.0",
+ "css-what": "2.1",
+ "domutils": "1.5.1",
+ "nth-check": "~1.0.1"
+ }
+ },
+ "css-selector-tokenizer": {
+ "version": "0.7.1",
+ "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.1.tgz",
+ "integrity": "sha512-xYL0AMZJ4gFzJQsHUKa5jiWWi2vH77WVNg7JYRyewwj6oPh4yb/y6Y9ZCw9dsj/9UauMhtuxR+ogQd//EdEVNA==",
+ "dev": true,
+ "requires": {
+ "cssesc": "^0.1.0",
+ "fastparse": "^1.1.1",
+ "regexpu-core": "^1.0.0"
+ }
+ },
+ "css-what": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.2.tgz",
+ "integrity": "sha512-wan8dMWQ0GUeF7DGEPVjhHemVW/vy6xUYmFzRY8RYqgA0JtXC9rJmbScBjqSu6dg9q0lwPQy6ZAmJVr3PPTvqQ==",
+ "dev": true
+ },
+ "cssauron": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/cssauron/-/cssauron-1.4.0.tgz",
+ "integrity": "sha1-pmAt/34EqDBtwNuaVR6S6LVmKtg=",
+ "dev": true,
+ "requires": {
+ "through": "X.X.X"
+ }
+ },
+ "cssesc": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz",
+ "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=",
+ "dev": true
+ },
+ "cuint": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/cuint/-/cuint-0.2.2.tgz",
+ "integrity": "sha1-QICG1AlVDCYxFVYZ6fp7ytw7mRs=",
+ "dev": true
+ },
+ "currently-unhandled": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz",
+ "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=",
+ "dev": true,
+ "requires": {
+ "array-find-index": "^1.0.1"
+ }
+ },
+ "custom-event": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz",
+ "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=",
+ "dev": true
+ },
+ "cyclist": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz",
+ "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=",
+ "dev": true
+ },
+ "d": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz",
+ "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=",
+ "dev": true,
+ "requires": {
+ "es5-ext": "^0.10.9"
+ }
+ },
+ "dashdash": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
+ "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
+ "dev": true,
+ "requires": {
+ "assert-plus": "^1.0.0"
+ },
+ "dependencies": {
+ "assert-plus": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+ "dev": true
+ }
+ }
+ },
+ "data-uri-to-buffer": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-2.0.0.tgz",
+ "integrity": "sha512-YbKCNLPPP4inc0E5If4OaalBc7gpaM2MRv77Pv2VThVComLKfbGYtJcdDCViDyp1Wd4SebhHLz94vp91zbK6bw==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "@types/node": "^8.0.7"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "8.10.39",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.39.tgz",
+ "integrity": "sha512-rE7fktr02J8ybFf6eysife+WF+L4sAHWzw09DgdCebEu+qDwMvv4zl6Bc+825ttGZP73kCKxa3dhJOoGJ8+5mA==",
+ "dev": true,
+ "optional": true
+ }
+ }
+ },
+ "date-format": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/date-format/-/date-format-1.2.0.tgz",
+ "integrity": "sha1-YV6CjiM90aubua4JUODOzPpuytg=",
+ "dev": true
+ },
+ "date-now": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz",
+ "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=",
+ "dev": true
+ },
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "decamelize": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
+ "dev": true
+ },
+ "decode-uri-component": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
+ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
+ "dev": true
+ },
+ "deep-equal": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz",
+ "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=",
+ "dev": true
+ },
+ "deep-is": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
+ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
+ "dev": true,
+ "optional": true
+ },
+ "default-require-extensions": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz",
+ "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=",
+ "dev": true,
+ "requires": {
+ "strip-bom": "^2.0.0"
+ }
+ },
+ "define-properties": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
+ "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
+ "dev": true,
+ "requires": {
+ "object-keys": "^1.0.12"
+ }
+ },
+ "define-property": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
+ "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^1.0.2",
+ "isobject": "^3.0.1"
+ },
+ "dependencies": {
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "^1.0.0",
+ "is-data-descriptor": "^1.0.0",
+ "kind-of": "^6.0.2"
+ }
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ },
+ "kind-of": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+ "dev": true
+ }
+ }
+ },
+ "degenerator": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-1.0.4.tgz",
+ "integrity": "sha1-/PSQo37OJmRk2cxDGrmMWBnO0JU=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "ast-types": "0.x.x",
+ "escodegen": "1.x.x",
+ "esprima": "3.x.x"
+ },
+ "dependencies": {
+ "esprima": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
+ "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=",
+ "dev": true,
+ "optional": true
+ }
+ }
+ },
+ "del": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz",
+ "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=",
+ "dev": true,
+ "requires": {
+ "globby": "^6.1.0",
+ "is-path-cwd": "^1.0.0",
+ "is-path-in-cwd": "^1.0.0",
+ "p-map": "^1.1.1",
+ "pify": "^3.0.0",
+ "rimraf": "^2.2.8"
+ },
+ "dependencies": {
+ "globby": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz",
+ "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=",
+ "dev": true,
+ "requires": {
+ "array-union": "^1.0.1",
+ "glob": "^7.0.3",
+ "object-assign": "^4.0.1",
+ "pify": "^2.0.0",
+ "pinkie-promise": "^2.0.0"
+ },
+ "dependencies": {
+ "pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+ "dev": true
+ }
+ }
+ }
+ }
+ },
+ "delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
+ "dev": true
+ },
+ "delegates": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
+ "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=",
+ "dev": true
+ },
+ "denodeify": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/denodeify/-/denodeify-1.2.1.tgz",
+ "integrity": "sha1-OjYof1A05pnnV3kBBSwubJQlFjE=",
+ "dev": true
+ },
+ "depd": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
+ "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
+ "dev": true
+ },
+ "des.js": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz",
+ "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=",
+ "dev": true,
+ "requires": {
+ "inherits": "^2.0.1",
+ "minimalistic-assert": "^1.0.0"
+ }
+ },
+ "destroy": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
+ "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=",
+ "dev": true
+ },
+ "detect-indent": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
+ "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
+ "dev": true,
+ "requires": {
+ "repeating": "^2.0.0"
+ }
+ },
+ "detect-node": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz",
+ "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==",
+ "dev": true
+ },
+ "di": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz",
+ "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=",
+ "dev": true
+ },
+ "diff": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
+ "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==",
+ "dev": true
+ },
+ "diffie-hellman": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
+ "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==",
+ "dev": true,
+ "requires": {
+ "bn.js": "^4.1.0",
+ "miller-rabin": "^4.0.0",
+ "randombytes": "^2.0.0"
+ }
+ },
+ "dir-glob": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz",
+ "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==",
+ "dev": true,
+ "requires": {
+ "path-type": "^3.0.0"
+ }
+ },
+ "dns-equal": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz",
+ "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=",
+ "dev": true
+ },
+ "dns-packet": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz",
+ "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==",
+ "dev": true,
+ "requires": {
+ "ip": "^1.1.0",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "dns-txt": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz",
+ "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=",
+ "dev": true,
+ "requires": {
+ "buffer-indexof": "^1.0.0"
+ }
+ },
+ "dom-converter": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz",
+ "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==",
+ "dev": true,
+ "requires": {
+ "utila": "~0.4"
+ }
+ },
+ "dom-serialize": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz",
+ "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=",
+ "dev": true,
+ "requires": {
+ "custom-event": "~1.0.0",
+ "ent": "~2.2.0",
+ "extend": "^3.0.0",
+ "void-elements": "^2.0.0"
+ }
+ },
+ "dom-serializer": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz",
+ "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=",
+ "dev": true,
+ "requires": {
+ "domelementtype": "~1.1.1",
+ "entities": "~1.1.1"
+ },
+ "dependencies": {
+ "domelementtype": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz",
+ "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=",
+ "dev": true
+ }
+ }
+ },
+ "domain-browser": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz",
+ "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==",
+ "dev": true
+ },
+ "domelementtype": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz",
+ "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==",
+ "dev": true
+ },
+ "domhandler": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.1.0.tgz",
+ "integrity": "sha1-0mRvXlf2w7qxHPbLBdPArPdBJZQ=",
+ "dev": true,
+ "requires": {
+ "domelementtype": "1"
+ }
+ },
+ "domutils": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz",
+ "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=",
+ "dev": true,
+ "requires": {
+ "dom-serializer": "0",
+ "domelementtype": "1"
+ }
+ },
+ "double-ended-queue": {
+ "version": "2.1.0-0",
+ "resolved": "https://registry.npmjs.org/double-ended-queue/-/double-ended-queue-2.1.0-0.tgz",
+ "integrity": "sha1-ED01J/0xUo9AGIEwyEHv3XgmTlw=",
+ "dev": true,
+ "optional": true
+ },
+ "duplexify": {
+ "version": "3.6.1",
+ "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.1.tgz",
+ "integrity": "sha512-vM58DwdnKmty+FSPzT14K9JXb90H+j5emaR4KYbr2KTIz00WHGbWOe5ghQTx233ZCLZtrGDALzKwcjEtSt35mA==",
+ "dev": true,
+ "requires": {
+ "end-of-stream": "^1.0.0",
+ "inherits": "^2.0.1",
+ "readable-stream": "^2.0.0",
+ "stream-shift": "^1.0.0"
+ }
+ },
+ "ecc-jsbn": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
+ "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
+ "dev": true,
+ "requires": {
+ "jsbn": "~0.1.0",
+ "safer-buffer": "^2.1.0"
+ }
+ },
+ "ee-first": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=",
+ "dev": true
+ },
+ "ejs": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.6.1.tgz",
+ "integrity": "sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ==",
+ "dev": true
+ },
+ "electron-to-chromium": {
+ "version": "1.3.109",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.109.tgz",
+ "integrity": "sha512-1qhgVZD9KIULMyeBkbjU/dWmm30zpPUfdWZfVO3nPhbtqMHJqHr4Ua5wBcWtAymVFrUCuAJxjMF1OhG+bR21Ow==",
+ "dev": true
+ },
+ "elliptic": {
+ "version": "6.4.1",
+ "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.1.tgz",
+ "integrity": "sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ==",
+ "dev": true,
+ "requires": {
+ "bn.js": "^4.4.0",
+ "brorand": "^1.0.1",
+ "hash.js": "^1.0.0",
+ "hmac-drbg": "^1.0.0",
+ "inherits": "^2.0.1",
+ "minimalistic-assert": "^1.0.0",
+ "minimalistic-crypto-utils": "^1.0.0"
+ }
+ },
+ "ember-cli-string-utils": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/ember-cli-string-utils/-/ember-cli-string-utils-1.1.0.tgz",
+ "integrity": "sha1-ObZ3/CgF9VFzc1N2/O8njqpEUqE=",
+ "dev": true
+ },
+ "emojis-list": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz",
+ "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=",
+ "dev": true
+ },
+ "encodeurl": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
+ "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=",
+ "dev": true
+ },
+ "end-of-stream": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz",
+ "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==",
+ "dev": true,
+ "requires": {
+ "once": "^1.4.0"
+ }
+ },
+ "engine.io": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.1.5.tgz",
+ "integrity": "sha512-D06ivJkYxyRrcEe0bTpNnBQNgP9d3xog+qZlLbui8EsMr/DouQpf5o9FzJnWYHEYE0YsFHllUv2R1dkgYZXHcA==",
+ "dev": true,
+ "requires": {
+ "accepts": "~1.3.4",
+ "base64id": "1.0.0",
+ "cookie": "0.3.1",
+ "debug": "~3.1.0",
+ "engine.io-parser": "~2.1.0",
+ "uws": "~9.14.0",
+ "ws": "~3.3.1"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ }
+ }
+ },
+ "engine.io-client": {
+ "version": "3.1.6",
+ "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.1.6.tgz",
+ "integrity": "sha512-hnuHsFluXnsKOndS4Hv6SvUrgdYx1pk2NqfaDMW+GWdgfU3+/V25Cj7I8a0x92idSpa5PIhJRKxPvp9mnoLsfg==",
+ "dev": true,
+ "requires": {
+ "component-emitter": "1.2.1",
+ "component-inherit": "0.0.3",
+ "debug": "~3.1.0",
+ "engine.io-parser": "~2.1.1",
+ "has-cors": "1.1.0",
+ "indexof": "0.0.1",
+ "parseqs": "0.0.5",
+ "parseuri": "0.0.5",
+ "ws": "~3.3.1",
+ "xmlhttprequest-ssl": "~1.5.4",
+ "yeast": "0.1.2"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ }
+ }
+ },
+ "engine.io-parser": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.3.tgz",
+ "integrity": "sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA==",
+ "dev": true,
+ "requires": {
+ "after": "0.8.2",
+ "arraybuffer.slice": "~0.0.7",
+ "base64-arraybuffer": "0.1.5",
+ "blob": "0.0.5",
+ "has-binary2": "~1.0.2"
+ }
+ },
+ "enhanced-resolve": {
+ "version": "3.4.1",
+ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz",
+ "integrity": "sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.2",
+ "memory-fs": "^0.4.0",
+ "object-assign": "^4.0.1",
+ "tapable": "^0.2.7"
+ }
+ },
+ "ent": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz",
+ "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=",
+ "dev": true
+ },
+ "entities": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz",
+ "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==",
+ "dev": true
+ },
+ "errno": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz",
+ "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==",
+ "dev": true,
+ "requires": {
+ "prr": "~1.0.1"
+ }
+ },
+ "error-ex": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
+ "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
+ "dev": true,
+ "requires": {
+ "is-arrayish": "^0.2.1"
+ }
+ },
+ "es-abstract": {
+ "version": "1.13.0",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz",
+ "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==",
+ "dev": true,
+ "requires": {
+ "es-to-primitive": "^1.2.0",
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "is-callable": "^1.1.4",
+ "is-regex": "^1.0.4",
+ "object-keys": "^1.0.12"
+ }
+ },
+ "es-to-primitive": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz",
+ "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==",
+ "dev": true,
+ "requires": {
+ "is-callable": "^1.1.4",
+ "is-date-object": "^1.0.1",
+ "is-symbol": "^1.0.2"
+ }
+ },
+ "es5-ext": {
+ "version": "0.10.47",
+ "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.47.tgz",
+ "integrity": "sha512-/1TItLfj+TTfWoeRcDn/0FbGV6SNo4R+On2GGVucPU/j3BWnXE2Co8h8CTo4Tu34gFJtnmwS9xiScKs4EjZhdw==",
+ "dev": true,
+ "requires": {
+ "es6-iterator": "~2.0.3",
+ "es6-symbol": "~3.1.1",
+ "next-tick": "1"
+ }
+ },
+ "es6-iterator": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz",
+ "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=",
+ "dev": true,
+ "requires": {
+ "d": "1",
+ "es5-ext": "^0.10.35",
+ "es6-symbol": "^3.1.1"
+ }
+ },
+ "es6-map": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz",
+ "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=",
+ "dev": true,
+ "requires": {
+ "d": "1",
+ "es5-ext": "~0.10.14",
+ "es6-iterator": "~2.0.1",
+ "es6-set": "~0.1.5",
+ "es6-symbol": "~3.1.1",
+ "event-emitter": "~0.3.5"
+ }
+ },
+ "es6-promise": {
+ "version": "4.2.5",
+ "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.5.tgz",
+ "integrity": "sha512-n6wvpdE43VFtJq+lUDYDBFUwV8TZbuGXLV4D6wKafg13ldznKsyEvatubnmUe31zcvelSzOHF+XbaT+Bl9ObDg==",
+ "dev": true
+ },
+ "es6-promisify": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz",
+ "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=",
+ "dev": true,
+ "requires": {
+ "es6-promise": "^4.0.3"
+ }
+ },
+ "es6-set": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz",
+ "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=",
+ "dev": true,
+ "requires": {
+ "d": "1",
+ "es5-ext": "~0.10.14",
+ "es6-iterator": "~2.0.1",
+ "es6-symbol": "3.1.1",
+ "event-emitter": "~0.3.5"
+ }
+ },
+ "es6-symbol": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz",
+ "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=",
+ "dev": true,
+ "requires": {
+ "d": "1",
+ "es5-ext": "~0.10.14"
+ }
+ },
+ "es6-weak-map": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz",
+ "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=",
+ "dev": true,
+ "requires": {
+ "d": "1",
+ "es5-ext": "^0.10.14",
+ "es6-iterator": "^2.0.1",
+ "es6-symbol": "^3.1.1"
+ }
+ },
+ "escape-html": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+ "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=",
+ "dev": true
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true
+ },
+ "escodegen": {
+ "version": "1.11.0",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.11.0.tgz",
+ "integrity": "sha512-IeMV45ReixHS53K/OmfKAIztN/igDHzTJUhZM3k1jMhIZWjk45SMwAtBsEXiJp3vSPmTcu6CXn7mDvFHRN66fw==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "esprima": "^3.1.3",
+ "estraverse": "^4.2.0",
+ "esutils": "^2.0.2",
+ "optionator": "^0.8.1",
+ "source-map": "~0.6.1"
+ },
+ "dependencies": {
+ "esprima": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
+ "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=",
+ "dev": true,
+ "optional": true
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "optional": true
+ }
+ }
+ },
+ "escope": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz",
+ "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=",
+ "dev": true,
+ "requires": {
+ "es6-map": "^0.1.3",
+ "es6-weak-map": "^2.0.1",
+ "esrecurse": "^4.1.0",
+ "estraverse": "^4.1.1"
+ }
+ },
+ "esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "dev": true
+ },
+ "esrecurse": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz",
+ "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==",
+ "dev": true,
+ "requires": {
+ "estraverse": "^4.1.0"
+ }
+ },
+ "estraverse": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
+ "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
+ "dev": true
+ },
+ "esutils": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
+ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
+ "dev": true
+ },
+ "etag": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
+ "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=",
+ "dev": true
+ },
+ "event-emitter": {
+ "version": "0.3.5",
+ "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz",
+ "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=",
+ "dev": true,
+ "requires": {
+ "d": "1",
+ "es5-ext": "~0.10.14"
+ }
+ },
+ "eventemitter3": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.0.tgz",
+ "integrity": "sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA==",
+ "dev": true
+ },
+ "events": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/events/-/events-3.0.0.tgz",
+ "integrity": "sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==",
+ "dev": true
+ },
+ "eventsource": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-0.1.6.tgz",
+ "integrity": "sha1-Cs7ehJ7X3RzMMsgRuxG5RNTykjI=",
+ "dev": true,
+ "requires": {
+ "original": ">=0.0.5"
+ }
+ },
+ "evp_bytestokey": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz",
+ "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==",
+ "dev": true,
+ "requires": {
+ "md5.js": "^1.3.4",
+ "safe-buffer": "^5.1.1"
+ }
+ },
+ "execa": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz",
+ "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=",
+ "dev": true,
+ "requires": {
+ "cross-spawn": "^5.0.1",
+ "get-stream": "^3.0.0",
+ "is-stream": "^1.1.0",
+ "npm-run-path": "^2.0.0",
+ "p-finally": "^1.0.0",
+ "signal-exit": "^3.0.0",
+ "strip-eof": "^1.0.0"
+ },
+ "dependencies": {
+ "cross-spawn": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
+ "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
+ "dev": true,
+ "requires": {
+ "lru-cache": "^4.0.1",
+ "shebang-command": "^1.2.0",
+ "which": "^1.2.9"
+ }
+ }
+ }
+ },
+ "exit": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
+ "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=",
+ "dev": true
+ },
+ "expand-braces": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/expand-braces/-/expand-braces-0.1.2.tgz",
+ "integrity": "sha1-SIsdHSRRyz06axks/AMPRMWFX+o=",
+ "dev": true,
+ "requires": {
+ "array-slice": "^0.2.3",
+ "array-unique": "^0.2.1",
+ "braces": "^0.1.2"
+ },
+ "dependencies": {
+ "braces": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-0.1.5.tgz",
+ "integrity": "sha1-wIVxEIUpHYt1/ddOqw+FlygHEeY=",
+ "dev": true,
+ "requires": {
+ "expand-range": "^0.1.0"
+ }
+ },
+ "expand-range": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-0.1.1.tgz",
+ "integrity": "sha1-TLjtoJk8pW+k9B/ELzy7TMrf8EQ=",
+ "dev": true,
+ "requires": {
+ "is-number": "^0.1.1",
+ "repeat-string": "^0.2.2"
+ }
+ },
+ "is-number": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-0.1.1.tgz",
+ "integrity": "sha1-aaevEWlj1HIG7JvZtIoUIW8eOAY=",
+ "dev": true
+ },
+ "repeat-string": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-0.2.2.tgz",
+ "integrity": "sha1-x6jTI2BoNiBZp+RlH8aITosftK4=",
+ "dev": true
+ }
+ }
+ },
+ "expand-brackets": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz",
+ "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=",
+ "dev": true,
+ "requires": {
+ "is-posix-bracket": "^0.1.0"
+ }
+ },
+ "expand-range": {
+ "version": "1.8.2",
+ "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz",
+ "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=",
+ "dev": true,
+ "requires": {
+ "fill-range": "^2.1.0"
+ }
+ },
+ "express": {
+ "version": "4.16.4",
+ "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz",
+ "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==",
+ "dev": true,
+ "requires": {
+ "accepts": "~1.3.5",
+ "array-flatten": "1.1.1",
+ "body-parser": "1.18.3",
+ "content-disposition": "0.5.2",
+ "content-type": "~1.0.4",
+ "cookie": "0.3.1",
+ "cookie-signature": "1.0.6",
+ "debug": "2.6.9",
+ "depd": "~1.1.2",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "finalhandler": "1.1.1",
+ "fresh": "0.5.2",
+ "merge-descriptors": "1.0.1",
+ "methods": "~1.1.2",
+ "on-finished": "~2.3.0",
+ "parseurl": "~1.3.2",
+ "path-to-regexp": "0.1.7",
+ "proxy-addr": "~2.0.4",
+ "qs": "6.5.2",
+ "range-parser": "~1.2.0",
+ "safe-buffer": "5.1.2",
+ "send": "0.16.2",
+ "serve-static": "1.13.2",
+ "setprototypeof": "1.1.0",
+ "statuses": "~1.4.0",
+ "type-is": "~1.6.16",
+ "utils-merge": "1.0.1",
+ "vary": "~1.1.2"
+ },
+ "dependencies": {
+ "array-flatten": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
+ "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=",
+ "dev": true
+ },
+ "qs": {
+ "version": "6.5.2",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
+ "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
+ "dev": true
+ }
+ }
+ },
+ "extend": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
+ "dev": true
+ },
+ "extend-shallow": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+ "dev": true,
+ "requires": {
+ "assign-symbols": "^1.0.0",
+ "is-extendable": "^1.0.1"
+ },
+ "dependencies": {
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dev": true,
+ "requires": {
+ "is-plain-object": "^2.0.4"
+ }
+ }
+ }
+ },
+ "extglob": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz",
+ "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "^1.0.0"
+ }
+ },
+ "extract-text-webpack-plugin": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extract-text-webpack-plugin/-/extract-text-webpack-plugin-3.0.2.tgz",
+ "integrity": "sha512-bt/LZ4m5Rqt/Crl2HiKuAl/oqg0psx1tsTLkvWbJen1CtD+fftkZhMaQ9HOtY2gWsl2Wq+sABmMVi9z3DhKWQQ==",
+ "dev": true,
+ "requires": {
+ "async": "^2.4.1",
+ "loader-utils": "^1.1.0",
+ "schema-utils": "^0.3.0",
+ "webpack-sources": "^1.0.1"
+ },
+ "dependencies": {
+ "ajv": {
+ "version": "5.5.2",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
+ "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
+ "dev": true,
+ "requires": {
+ "co": "^4.6.0",
+ "fast-deep-equal": "^1.0.0",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.3.0"
+ }
+ },
+ "schema-utils": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz",
+ "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=",
+ "dev": true,
+ "requires": {
+ "ajv": "^5.0.0"
+ }
+ }
+ }
+ },
+ "extsprintf": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
+ "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
+ "dev": true
+ },
+ "fast-deep-equal": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz",
+ "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=",
+ "dev": true
+ },
+ "fast-json-stable-stringify": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
+ "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=",
+ "dev": true
+ },
+ "fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+ "dev": true,
+ "optional": true
+ },
+ "fastparse": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz",
+ "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==",
+ "dev": true
+ },
+ "faye-websocket": {
+ "version": "0.10.0",
+ "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz",
+ "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=",
+ "dev": true,
+ "requires": {
+ "websocket-driver": ">=0.5.1"
+ }
+ },
+ "file-loader": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-1.1.11.tgz",
+ "integrity": "sha512-TGR4HU7HUsGg6GCOPJnFk06RhWgEWFLAGWiT6rcD+GRC2keU3s9RGJ+b3Z6/U73jwwNb2gKLJ7YCrp+jvU4ALg==",
+ "dev": true,
+ "requires": {
+ "loader-utils": "^1.0.2",
+ "schema-utils": "^0.4.5"
+ }
+ },
+ "file-uri-to-path": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
+ "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==",
+ "dev": true,
+ "optional": true
+ },
+ "filename-regex": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz",
+ "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=",
+ "dev": true
+ },
+ "fileset": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz",
+ "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=",
+ "dev": true,
+ "requires": {
+ "glob": "^7.0.3",
+ "minimatch": "^3.0.3"
+ }
+ },
+ "fill-range": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz",
+ "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==",
+ "dev": true,
+ "requires": {
+ "is-number": "^2.1.0",
+ "isobject": "^2.0.0",
+ "randomatic": "^3.0.0",
+ "repeat-element": "^1.1.2",
+ "repeat-string": "^1.5.2"
+ }
+ },
+ "finalhandler": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz",
+ "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==",
+ "dev": true,
+ "requires": {
+ "debug": "2.6.9",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "on-finished": "~2.3.0",
+ "parseurl": "~1.3.2",
+ "statuses": "~1.4.0",
+ "unpipe": "~1.0.0"
+ }
+ },
+ "find-cache-dir": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz",
+ "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=",
+ "dev": true,
+ "requires": {
+ "commondir": "^1.0.1",
+ "make-dir": "^1.0.0",
+ "pkg-dir": "^2.0.0"
+ }
+ },
+ "find-up": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
+ "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
+ "dev": true,
+ "requires": {
+ "locate-path": "^2.0.0"
+ }
+ },
+ "flush-write-stream": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz",
+ "integrity": "sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw==",
+ "dev": true,
+ "requires": {
+ "inherits": "^2.0.1",
+ "readable-stream": "^2.0.4"
+ }
+ },
+ "follow-redirects": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.6.1.tgz",
+ "integrity": "sha512-t2JCjbzxQpWvbhts3l6SH1DKzSrx8a+SsaVf4h6bG4kOXUuPYS/kg2Lr4gQSb7eemaHqJkOThF1BGyjlUkO1GQ==",
+ "dev": true,
+ "requires": {
+ "debug": "=3.1.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ }
+ }
+ },
+ "for-in": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
+ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
+ "dev": true
+ },
+ "for-own": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz",
+ "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=",
+ "dev": true,
+ "requires": {
+ "for-in": "^1.0.1"
+ }
+ },
+ "forever-agent": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
+ "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
+ "dev": true
+ },
+ "form-data": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz",
+ "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.5",
+ "mime-types": "^2.1.12"
+ }
+ },
+ "forwarded": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
+ "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=",
+ "dev": true
+ },
+ "fragment-cache": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
+ "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
+ "dev": true,
+ "requires": {
+ "map-cache": "^0.2.2"
+ }
+ },
+ "fresh": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
+ "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=",
+ "dev": true
+ },
+ "from2": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz",
+ "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=",
+ "dev": true,
+ "requires": {
+ "inherits": "^2.0.1",
+ "readable-stream": "^2.0.0"
+ }
+ },
+ "fs-access": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz",
+ "integrity": "sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o=",
+ "dev": true,
+ "requires": {
+ "null-check": "^1.0.0"
+ }
+ },
+ "fs-extra": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz",
+ "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.2",
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.0"
+ }
+ },
+ "fs-write-stream-atomic": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz",
+ "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.2",
+ "iferr": "^0.1.5",
+ "imurmurhash": "^0.1.4",
+ "readable-stream": "1 || 2"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "fsevents": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.7.tgz",
+ "integrity": "sha512-Pxm6sI2MeBD7RdD12RYsqaP0nMiwx8eZBXCa6z2L+mRHm2DYrOYwihmhjpkdjUHwQhslWQjRpEgNq4XvBmaAuw==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "nan": "^2.9.2",
+ "node-pre-gyp": "^0.10.0"
+ },
+ "dependencies": {
+ "abbrev": {
+ "version": "1.1.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "ansi-regex": {
+ "version": "2.1.1",
+ "bundled": true,
+ "dev": true
+ },
+ "aproba": {
+ "version": "1.2.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "are-we-there-yet": {
+ "version": "1.1.5",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "delegates": "^1.0.0",
+ "readable-stream": "^2.0.6"
+ }
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "bundled": true,
+ "dev": true
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "chownr": {
+ "version": "1.1.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "code-point-at": {
+ "version": "1.1.0",
+ "bundled": true,
+ "dev": true
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "bundled": true,
+ "dev": true
+ },
+ "console-control-strings": {
+ "version": "1.1.0",
+ "bundled": true,
+ "dev": true
+ },
+ "core-util-is": {
+ "version": "1.0.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "debug": {
+ "version": "2.6.9",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "deep-extend": {
+ "version": "0.6.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "delegates": {
+ "version": "1.0.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "detect-libc": {
+ "version": "1.0.3",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "fs-minipass": {
+ "version": "1.2.5",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "minipass": "^2.2.1"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "gauge": {
+ "version": "2.7.4",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "aproba": "^1.0.3",
+ "console-control-strings": "^1.0.0",
+ "has-unicode": "^2.0.0",
+ "object-assign": "^4.1.0",
+ "signal-exit": "^3.0.0",
+ "string-width": "^1.0.1",
+ "strip-ansi": "^3.0.1",
+ "wide-align": "^1.1.0"
+ }
+ },
+ "glob": {
+ "version": "7.1.3",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ }
+ },
+ "has-unicode": {
+ "version": "2.0.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "iconv-lite": {
+ "version": "0.4.24",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ }
+ },
+ "ignore-walk": {
+ "version": "3.0.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "minimatch": "^3.0.4"
+ }
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "bundled": true,
+ "dev": true
+ },
+ "ini": {
+ "version": "1.3.5",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "is-fullwidth-code-point": {
+ "version": "1.0.0",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "number-is-nan": "^1.0.0"
+ }
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "brace-expansion": "^1.1.7"
+ }
+ },
+ "minimist": {
+ "version": "0.0.8",
+ "bundled": true,
+ "dev": true
+ },
+ "minipass": {
+ "version": "2.3.5",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "safe-buffer": "^5.1.2",
+ "yallist": "^3.0.0"
+ }
+ },
+ "minizlib": {
+ "version": "1.2.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "minipass": "^2.2.1"
+ }
+ },
+ "mkdirp": {
+ "version": "0.5.1",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "minimist": "0.0.8"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "needle": {
+ "version": "2.2.4",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "debug": "^2.1.2",
+ "iconv-lite": "^0.4.4",
+ "sax": "^1.2.4"
+ }
+ },
+ "node-pre-gyp": {
+ "version": "0.10.3",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "detect-libc": "^1.0.2",
+ "mkdirp": "^0.5.1",
+ "needle": "^2.2.1",
+ "nopt": "^4.0.1",
+ "npm-packlist": "^1.1.6",
+ "npmlog": "^4.0.2",
+ "rc": "^1.2.7",
+ "rimraf": "^2.6.1",
+ "semver": "^5.3.0",
+ "tar": "^4"
+ }
+ },
+ "nopt": {
+ "version": "4.0.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "abbrev": "1",
+ "osenv": "^0.1.4"
+ }
+ },
+ "npm-bundled": {
+ "version": "1.0.5",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "npm-packlist": {
+ "version": "1.2.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "ignore-walk": "^3.0.1",
+ "npm-bundled": "^1.0.1"
+ }
+ },
+ "npmlog": {
+ "version": "4.1.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "are-we-there-yet": "~1.1.2",
+ "console-control-strings": "~1.1.0",
+ "gauge": "~2.7.3",
+ "set-blocking": "~2.0.0"
+ }
+ },
+ "number-is-nan": {
+ "version": "1.0.1",
+ "bundled": true,
+ "dev": true
+ },
+ "object-assign": {
+ "version": "4.1.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "once": {
+ "version": "1.4.0",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "wrappy": "1"
+ }
+ },
+ "os-homedir": {
+ "version": "1.0.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "os-tmpdir": {
+ "version": "1.0.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "osenv": {
+ "version": "0.1.5",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "os-homedir": "^1.0.0",
+ "os-tmpdir": "^1.0.0"
+ }
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "process-nextick-args": {
+ "version": "2.0.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "rc": {
+ "version": "1.2.8",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "deep-extend": "^0.6.0",
+ "ini": "~1.3.0",
+ "minimist": "^1.2.0",
+ "strip-json-comments": "~2.0.1"
+ },
+ "dependencies": {
+ "minimist": {
+ "version": "1.2.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ }
+ }
+ },
+ "readable-stream": {
+ "version": "2.3.6",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "rimraf": {
+ "version": "2.6.3",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "glob": "^7.1.3"
+ }
+ },
+ "safe-buffer": {
+ "version": "5.1.2",
+ "bundled": true,
+ "dev": true
+ },
+ "safer-buffer": {
+ "version": "2.1.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "sax": {
+ "version": "1.2.4",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "semver": {
+ "version": "5.6.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "set-blocking": {
+ "version": "2.0.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "signal-exit": {
+ "version": "3.0.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "string-width": {
+ "version": "1.0.2",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "code-point-at": "^1.0.0",
+ "is-fullwidth-code-point": "^1.0.0",
+ "strip-ansi": "^3.0.0"
+ }
+ },
+ "string_decoder": {
+ "version": "1.1.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "safe-buffer": "~5.1.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^2.0.0"
+ }
+ },
+ "strip-json-comments": {
+ "version": "2.0.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "tar": {
+ "version": "4.4.8",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "chownr": "^1.1.1",
+ "fs-minipass": "^1.2.5",
+ "minipass": "^2.3.4",
+ "minizlib": "^1.1.1",
+ "mkdirp": "^0.5.0",
+ "safe-buffer": "^5.1.2",
+ "yallist": "^3.0.2"
+ }
+ },
+ "util-deprecate": {
+ "version": "1.0.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "wide-align": {
+ "version": "1.1.3",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "string-width": "^1.0.2 || 2"
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "bundled": true,
+ "dev": true
+ },
+ "yallist": {
+ "version": "3.0.3",
+ "bundled": true,
+ "dev": true
+ }
+ }
+ },
+ "fstream": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz",
+ "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.2",
+ "inherits": "~2.0.0",
+ "mkdirp": ">=0.5 0",
+ "rimraf": "2"
+ }
+ },
+ "ftp": {
+ "version": "0.3.10",
+ "resolved": "https://registry.npmjs.org/ftp/-/ftp-0.3.10.tgz",
+ "integrity": "sha1-kZfYYa2BQvPmPVqDv+TFn3MwiF0=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "readable-stream": "1.1.x",
+ "xregexp": "2.0.0"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+ "dev": true,
+ "optional": true
+ },
+ "readable-stream": {
+ "version": "1.1.14",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
+ "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.1",
+ "isarray": "0.0.1",
+ "string_decoder": "~0.10.x"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+ "dev": true,
+ "optional": true
+ }
+ }
+ },
+ "function-bind": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
+ "dev": true
+ },
+ "gauge": {
+ "version": "2.7.4",
+ "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
+ "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
+ "dev": true,
+ "requires": {
+ "aproba": "^1.0.3",
+ "console-control-strings": "^1.0.0",
+ "has-unicode": "^2.0.0",
+ "object-assign": "^4.1.0",
+ "signal-exit": "^3.0.0",
+ "string-width": "^1.0.1",
+ "strip-ansi": "^3.0.1",
+ "wide-align": "^1.1.0"
+ }
+ },
+ "gaze": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz",
+ "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "globule": "^1.0.0"
+ }
+ },
+ "generate-function": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz",
+ "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "is-property": "^1.0.2"
+ }
+ },
+ "generate-object-property": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz",
+ "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "is-property": "^1.0.0"
+ }
+ },
+ "get-caller-file": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz",
+ "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==",
+ "dev": true
+ },
+ "get-stdin": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz",
+ "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=",
+ "dev": true
+ },
+ "get-stream": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
+ "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=",
+ "dev": true
+ },
+ "get-uri": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-2.0.3.tgz",
+ "integrity": "sha512-x5j6Ks7FOgLD/GlvjKwgu7wdmMR55iuRHhn8hj/+gA+eSbxQvZ+AEomq+3MgVEZj1vpi738QahGbCCSIDtXtkw==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "data-uri-to-buffer": "2",
+ "debug": "4",
+ "extend": "~3.0.2",
+ "file-uri-to-path": "1",
+ "ftp": "~0.3.10",
+ "readable-stream": "3"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+ "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "ms": "^2.1.1"
+ }
+ },
+ "ms": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
+ "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
+ "dev": true,
+ "optional": true
+ },
+ "readable-stream": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.1.1.tgz",
+ "integrity": "sha512-DkN66hPyqDhnIQ6Jcsvx9bFjhw214O4poMBcIMgPVpQvNy9a0e0Uhg5SqySyDKAmUlwt8LonTBz1ezOnM8pUdA==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ }
+ }
+ }
+ },
+ "get-value": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
+ "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
+ "dev": true
+ },
+ "getpass": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
+ "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
+ "dev": true,
+ "requires": {
+ "assert-plus": "^1.0.0"
+ },
+ "dependencies": {
+ "assert-plus": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+ "dev": true
+ }
+ }
+ },
+ "glob": {
+ "version": "7.1.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
+ "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ }
+ },
+ "glob-base": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz",
+ "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=",
+ "dev": true,
+ "requires": {
+ "glob-parent": "^2.0.0",
+ "is-glob": "^2.0.0"
+ }
+ },
+ "glob-parent": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz",
+ "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=",
+ "dev": true,
+ "requires": {
+ "is-glob": "^2.0.0"
+ }
+ },
+ "globals": {
+ "version": "9.18.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
+ "dev": true
+ },
+ "globby": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz",
+ "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=",
+ "dev": true,
+ "requires": {
+ "array-union": "^1.0.1",
+ "dir-glob": "^2.0.0",
+ "glob": "^7.1.2",
+ "ignore": "^3.3.5",
+ "pify": "^3.0.0",
+ "slash": "^1.0.0"
+ }
+ },
+ "globule": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.1.tgz",
+ "integrity": "sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "glob": "~7.1.1",
+ "lodash": "~4.17.10",
+ "minimatch": "~3.0.2"
+ }
+ },
+ "graceful-fs": {
+ "version": "4.1.15",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz",
+ "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==",
+ "dev": true
+ },
+ "handle-thing": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-1.2.5.tgz",
+ "integrity": "sha1-/Xqtcmvxpf0W38KbL3pmAdJxOcQ=",
+ "dev": true
+ },
+ "handlebars": {
+ "version": "4.0.12",
+ "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.12.tgz",
+ "integrity": "sha512-RhmTekP+FZL+XNhwS1Wf+bTTZpdLougwt5pcgA1tuz6Jcx0fpH/7z0qd71RKnZHBCxIRBHfBOnio4gViPemNzA==",
+ "dev": true,
+ "requires": {
+ "async": "^2.5.0",
+ "optimist": "^0.6.1",
+ "source-map": "^0.6.1",
+ "uglify-js": "^3.1.4"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ }
+ }
+ },
+ "har-schema": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz",
+ "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=",
+ "dev": true,
+ "optional": true
+ },
+ "har-validator": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz",
+ "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "ajv": "^4.9.1",
+ "har-schema": "^1.0.5"
+ },
+ "dependencies": {
+ "ajv": {
+ "version": "4.11.8",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz",
+ "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "co": "^4.6.0",
+ "json-stable-stringify": "^1.0.1"
+ }
+ }
+ }
+ },
+ "has": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+ "dev": true,
+ "requires": {
+ "function-bind": "^1.1.1"
+ }
+ },
+ "has-ansi": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^2.0.0"
+ }
+ },
+ "has-binary2": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz",
+ "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==",
+ "dev": true,
+ "requires": {
+ "isarray": "2.0.1"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz",
+ "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=",
+ "dev": true
+ }
+ }
+ },
+ "has-cors": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz",
+ "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz",
+ "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=",
+ "dev": true
+ },
+ "has-symbols": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz",
+ "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=",
+ "dev": true
+ },
+ "has-unicode": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
+ "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=",
+ "dev": true
+ },
+ "has-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
+ "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
+ "dev": true,
+ "requires": {
+ "get-value": "^2.0.6",
+ "has-values": "^1.0.0",
+ "isobject": "^3.0.0"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ }
+ }
+ },
+ "has-values": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
+ "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
+ "dev": true,
+ "requires": {
+ "is-number": "^3.0.0",
+ "kind-of": "^4.0.0"
+ },
+ "dependencies": {
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "dev": true,
+ "requires": {
+ "kind-of": "^3.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "kind-of": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
+ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "hash-base": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz",
+ "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=",
+ "dev": true,
+ "requires": {
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "hash.js": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz",
+ "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==",
+ "dev": true,
+ "requires": {
+ "inherits": "^2.0.3",
+ "minimalistic-assert": "^1.0.1"
+ }
+ },
+ "hawk": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz",
+ "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "boom": "2.x.x",
+ "cryptiles": "2.x.x",
+ "hoek": "2.x.x",
+ "sntp": "1.x.x"
+ }
+ },
+ "he": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
+ "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
+ "dev": true
+ },
+ "hipchat-notifier": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/hipchat-notifier/-/hipchat-notifier-1.1.0.tgz",
+ "integrity": "sha1-ttJJdVQ3wZEII2d5nTupoPI7Ix4=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "lodash": "^4.0.0",
+ "request": "^2.0.0"
+ }
+ },
+ "hmac-drbg": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
+ "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=",
+ "dev": true,
+ "requires": {
+ "hash.js": "^1.0.3",
+ "minimalistic-assert": "^1.0.0",
+ "minimalistic-crypto-utils": "^1.0.1"
+ }
+ },
+ "hoek": {
+ "version": "2.16.3",
+ "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz",
+ "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=",
+ "dev": true
+ },
+ "homedir-polyfill": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz",
+ "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=",
+ "dev": true,
+ "requires": {
+ "parse-passwd": "^1.0.0"
+ }
+ },
+ "hosted-git-info": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz",
+ "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==",
+ "dev": true
+ },
+ "hpack.js": {
+ "version": "2.1.6",
+ "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz",
+ "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=",
+ "dev": true,
+ "requires": {
+ "inherits": "^2.0.1",
+ "obuf": "^1.0.0",
+ "readable-stream": "^2.0.1",
+ "wbuf": "^1.1.0"
+ }
+ },
+ "html-entities": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz",
+ "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=",
+ "dev": true
+ },
+ "html-minifier": {
+ "version": "3.5.21",
+ "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz",
+ "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==",
+ "dev": true,
+ "requires": {
+ "camel-case": "3.0.x",
+ "clean-css": "4.2.x",
+ "commander": "2.17.x",
+ "he": "1.2.x",
+ "param-case": "2.1.x",
+ "relateurl": "0.2.x",
+ "uglify-js": "3.4.x"
+ }
+ },
+ "html-webpack-plugin": {
+ "version": "2.30.1",
+ "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-2.30.1.tgz",
+ "integrity": "sha1-f5xCG36pHsRg9WUn1430hO51N9U=",
+ "dev": true,
+ "requires": {
+ "bluebird": "^3.4.7",
+ "html-minifier": "^3.2.3",
+ "loader-utils": "^0.2.16",
+ "lodash": "^4.17.3",
+ "pretty-error": "^2.0.2",
+ "toposort": "^1.0.0"
+ },
+ "dependencies": {
+ "loader-utils": {
+ "version": "0.2.17",
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz",
+ "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=",
+ "dev": true,
+ "requires": {
+ "big.js": "^3.1.3",
+ "emojis-list": "^2.0.0",
+ "json5": "^0.5.0",
+ "object-assign": "^4.0.1"
+ }
+ }
+ }
+ },
+ "htmlparser2": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.3.0.tgz",
+ "integrity": "sha1-zHDQWln2VC5D8OaFyYLhTJJKnv4=",
+ "dev": true,
+ "requires": {
+ "domelementtype": "1",
+ "domhandler": "2.1",
+ "domutils": "1.1",
+ "readable-stream": "1.0"
+ },
+ "dependencies": {
+ "domutils": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.1.6.tgz",
+ "integrity": "sha1-vdw94Jm5ou+sxRxiPyj0FuzFdIU=",
+ "dev": true,
+ "requires": {
+ "domelementtype": "1"
+ }
+ },
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "1.0.34",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
+ "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
+ "dev": true,
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.1",
+ "isarray": "0.0.1",
+ "string_decoder": "~0.10.x"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+ "dev": true
+ }
+ }
+ },
+ "http-deceiver": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz",
+ "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=",
+ "dev": true
+ },
+ "http-errors": {
+ "version": "1.6.3",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
+ "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=",
+ "dev": true,
+ "requires": {
+ "depd": "~1.1.2",
+ "inherits": "2.0.3",
+ "setprototypeof": "1.1.0",
+ "statuses": ">= 1.4.0 < 2"
+ }
+ },
+ "http-parser-js": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.0.tgz",
+ "integrity": "sha512-cZdEF7r4gfRIq7ezX9J0T+kQmJNOub71dWbgAXVHDct80TKP4MCETtZQ31xyv38UwgzkWPYF/Xc0ge55dW9Z9w==",
+ "dev": true
+ },
+ "http-proxy": {
+ "version": "1.17.0",
+ "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz",
+ "integrity": "sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g==",
+ "dev": true,
+ "requires": {
+ "eventemitter3": "^3.0.0",
+ "follow-redirects": "^1.0.0",
+ "requires-port": "^1.0.0"
+ }
+ },
+ "http-proxy-agent": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz",
+ "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==",
+ "dev": true,
+ "requires": {
+ "agent-base": "4",
+ "debug": "3.1.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ }
+ }
+ },
+ "http-proxy-middleware": {
+ "version": "0.17.4",
+ "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.17.4.tgz",
+ "integrity": "sha1-ZC6ISIUdZvCdTxJJEoRtuutBuDM=",
+ "dev": true,
+ "requires": {
+ "http-proxy": "^1.16.2",
+ "is-glob": "^3.1.0",
+ "lodash": "^4.17.2",
+ "micromatch": "^2.3.11"
+ },
+ "dependencies": {
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+ "dev": true
+ },
+ "is-glob": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "^2.1.0"
+ }
+ }
+ }
+ },
+ "http-signature": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz",
+ "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "assert-plus": "^0.2.0",
+ "jsprim": "^1.2.2",
+ "sshpk": "^1.7.0"
+ }
+ },
+ "httpntlm": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/httpntlm/-/httpntlm-1.6.1.tgz",
+ "integrity": "sha1-rQFScUOi6Hc8+uapb1hla7UqNLI=",
+ "dev": true,
+ "requires": {
+ "httpreq": ">=0.4.22",
+ "underscore": "~1.7.0"
+ }
+ },
+ "httpreq": {
+ "version": "0.4.24",
+ "resolved": "https://registry.npmjs.org/httpreq/-/httpreq-0.4.24.tgz",
+ "integrity": "sha1-QzX/2CzZaWaKOUZckprGHWOTYn8=",
+ "dev": true
+ },
+ "https-browserify": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz",
+ "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=",
+ "dev": true
+ },
+ "https-proxy-agent": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz",
+ "integrity": "sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==",
+ "dev": true,
+ "requires": {
+ "agent-base": "^4.1.0",
+ "debug": "^3.1.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "3.2.6",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
+ "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
+ "dev": true,
+ "requires": {
+ "ms": "^2.1.1"
+ }
+ },
+ "ms": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
+ "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
+ "dev": true
+ }
+ }
+ },
+ "iconv-lite": {
+ "version": "0.4.23",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz",
+ "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==",
+ "dev": true,
+ "requires": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ }
+ },
+ "ieee754": {
+ "version": "1.1.12",
+ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz",
+ "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==",
+ "dev": true
+ },
+ "iferr": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz",
+ "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=",
+ "dev": true
+ },
+ "ignore": {
+ "version": "3.3.10",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz",
+ "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==",
+ "dev": true
+ },
+ "image-size": {
+ "version": "0.5.5",
+ "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz",
+ "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=",
+ "dev": true,
+ "optional": true
+ },
+ "import-cwd": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz",
+ "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=",
+ "dev": true,
+ "requires": {
+ "import-from": "^2.1.0"
+ }
+ },
+ "import-from": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz",
+ "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=",
+ "dev": true,
+ "requires": {
+ "resolve-from": "^3.0.0"
+ }
+ },
+ "import-local": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz",
+ "integrity": "sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==",
+ "dev": true,
+ "requires": {
+ "pkg-dir": "^2.0.0",
+ "resolve-cwd": "^2.0.0"
+ }
+ },
+ "imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
+ "dev": true
+ },
+ "in-publish": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.0.tgz",
+ "integrity": "sha1-4g/146KvwmkDILbcVSaCqcf631E=",
+ "dev": true,
+ "optional": true
+ },
+ "indent-string": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz",
+ "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=",
+ "dev": true,
+ "requires": {
+ "repeating": "^2.0.0"
+ }
+ },
+ "indexof": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz",
+ "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=",
+ "dev": true
+ },
+ "inflection": {
+ "version": "1.12.0",
+ "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.12.0.tgz",
+ "integrity": "sha1-ogCTVlbW9fa8TcdQLhrstwMihBY=",
+ "dev": true,
+ "optional": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "requires": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+ "dev": true
+ },
+ "ini": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
+ "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
+ "dev": true
+ },
+ "internal-ip": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-1.2.0.tgz",
+ "integrity": "sha1-rp+/k7mEh4eF1QqN4bNWlWBYz1w=",
+ "dev": true,
+ "requires": {
+ "meow": "^3.3.0"
+ }
+ },
+ "interpret": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz",
+ "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==",
+ "dev": true
+ },
+ "invariant": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
+ "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
+ "dev": true,
+ "requires": {
+ "loose-envify": "^1.0.0"
+ }
+ },
+ "invert-kv": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz",
+ "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=",
+ "dev": true
+ },
+ "ip": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz",
+ "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=",
+ "dev": true
+ },
+ "ipaddr.js": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz",
+ "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=",
+ "dev": true
+ },
+ "is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "dev": true,
+ "requires": {
+ "kind-of": "^3.0.2"
+ }
+ },
+ "is-arrayish": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
+ "dev": true
+ },
+ "is-binary-path": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
+ "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
+ "dev": true,
+ "requires": {
+ "binary-extensions": "^1.0.0"
+ }
+ },
+ "is-buffer": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
+ "dev": true
+ },
+ "is-builtin-module": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz",
+ "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=",
+ "dev": true,
+ "requires": {
+ "builtin-modules": "^1.0.0"
+ }
+ },
+ "is-callable": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz",
+ "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==",
+ "dev": true
+ },
+ "is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "dev": true,
+ "requires": {
+ "kind-of": "^3.0.2"
+ }
+ },
+ "is-date-object": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz",
+ "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=",
+ "dev": true
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "^0.1.6",
+ "is-data-descriptor": "^0.1.4",
+ "kind-of": "^5.0.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true
+ }
+ }
+ },
+ "is-directory": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz",
+ "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=",
+ "dev": true
+ },
+ "is-dotfile": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz",
+ "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=",
+ "dev": true
+ },
+ "is-equal-shallow": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz",
+ "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=",
+ "dev": true,
+ "requires": {
+ "is-primitive": "^2.0.0"
+ }
+ },
+ "is-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
+ "dev": true
+ },
+ "is-extglob": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
+ "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
+ "dev": true
+ },
+ "is-finite": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
+ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
+ "dev": true,
+ "requires": {
+ "number-is-nan": "^1.0.0"
+ }
+ },
+ "is-fullwidth-code-point": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+ "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
+ "dev": true,
+ "requires": {
+ "number-is-nan": "^1.0.0"
+ }
+ },
+ "is-glob": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
+ "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "^1.0.0"
+ }
+ },
+ "is-my-ip-valid": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz",
+ "integrity": "sha512-gmh/eWXROncUzRnIa1Ubrt5b8ep/MGSnfAUI3aRp+sqTCs1tv1Isl8d8F6JmkN3dXKc3ehZMrtiPN9eL03NuaQ==",
+ "dev": true,
+ "optional": true
+ },
+ "is-my-json-valid": {
+ "version": "2.19.0",
+ "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.19.0.tgz",
+ "integrity": "sha512-mG0f/unGX1HZ5ep4uhRaPOS8EkAY8/j6mDRMJrutq4CqhoJWYp7qAlonIPy3TV7p3ju4TK9fo/PbnoksWmsp5Q==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "generate-function": "^2.0.0",
+ "generate-object-property": "^1.1.0",
+ "is-my-ip-valid": "^1.0.0",
+ "jsonpointer": "^4.0.0",
+ "xtend": "^4.0.0"
+ }
+ },
+ "is-number": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz",
+ "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=",
+ "dev": true,
+ "requires": {
+ "kind-of": "^3.0.2"
+ }
+ },
+ "is-path-cwd": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz",
+ "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=",
+ "dev": true
+ },
+ "is-path-in-cwd": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz",
+ "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==",
+ "dev": true,
+ "requires": {
+ "is-path-inside": "^1.0.0"
+ }
+ },
+ "is-path-inside": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz",
+ "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=",
+ "dev": true,
+ "requires": {
+ "path-is-inside": "^1.0.1"
+ }
+ },
+ "is-plain-object": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+ "dev": true,
+ "requires": {
+ "isobject": "^3.0.1"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ }
+ }
+ },
+ "is-posix-bracket": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz",
+ "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=",
+ "dev": true
+ },
+ "is-primitive": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz",
+ "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=",
+ "dev": true
+ },
+ "is-property": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz",
+ "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=",
+ "dev": true
+ },
+ "is-regex": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz",
+ "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=",
+ "dev": true,
+ "requires": {
+ "has": "^1.0.1"
+ }
+ },
+ "is-stream": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
+ "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=",
+ "dev": true
+ },
+ "is-symbol": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz",
+ "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==",
+ "dev": true,
+ "requires": {
+ "has-symbols": "^1.0.0"
+ }
+ },
+ "is-typedarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+ "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
+ "dev": true
+ },
+ "is-utf8": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
+ "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=",
+ "dev": true
+ },
+ "is-windows": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
+ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
+ "dev": true
+ },
+ "is-wsl": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz",
+ "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=",
+ "dev": true
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "dev": true
+ },
+ "isbinaryfile": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.3.tgz",
+ "integrity": "sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==",
+ "dev": true,
+ "requires": {
+ "buffer-alloc": "^1.2.0"
+ }
+ },
+ "isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
+ "dev": true
+ },
+ "isobject": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+ "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+ "dev": true,
+ "requires": {
+ "isarray": "1.0.0"
+ }
+ },
+ "isstream": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
+ "dev": true
+ },
+ "istanbul-api": {
+ "version": "1.3.7",
+ "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.3.7.tgz",
+ "integrity": "sha512-4/ApBnMVeEPG3EkSzcw25wDe4N66wxwn+KKn6b47vyek8Xb3NBAcg4xfuQbS7BqcZuTX4wxfD5lVagdggR3gyA==",
+ "dev": true,
+ "requires": {
+ "async": "^2.1.4",
+ "fileset": "^2.0.2",
+ "istanbul-lib-coverage": "^1.2.1",
+ "istanbul-lib-hook": "^1.2.2",
+ "istanbul-lib-instrument": "^1.10.2",
+ "istanbul-lib-report": "^1.1.5",
+ "istanbul-lib-source-maps": "^1.2.6",
+ "istanbul-reports": "^1.5.1",
+ "js-yaml": "^3.7.0",
+ "mkdirp": "^0.5.1",
+ "once": "^1.4.0"
+ }
+ },
+ "istanbul-instrumenter-loader": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/istanbul-instrumenter-loader/-/istanbul-instrumenter-loader-3.0.1.tgz",
+ "integrity": "sha512-a5SPObZgS0jB/ixaKSMdn6n/gXSrK2S6q/UfRJBT3e6gQmVjwZROTODQsYW5ZNwOu78hG62Y3fWlebaVOL0C+w==",
+ "dev": true,
+ "requires": {
+ "convert-source-map": "^1.5.0",
+ "istanbul-lib-instrument": "^1.7.3",
+ "loader-utils": "^1.1.0",
+ "schema-utils": "^0.3.0"
+ },
+ "dependencies": {
+ "ajv": {
+ "version": "5.5.2",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
+ "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
+ "dev": true,
+ "requires": {
+ "co": "^4.6.0",
+ "fast-deep-equal": "^1.0.0",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.3.0"
+ }
+ },
+ "schema-utils": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz",
+ "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=",
+ "dev": true,
+ "requires": {
+ "ajv": "^5.0.0"
+ }
+ }
+ }
+ },
+ "istanbul-lib-coverage": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz",
+ "integrity": "sha512-PzITeunAgyGbtY1ibVIUiV679EFChHjoMNRibEIobvmrCRaIgwLxNucOSimtNWUhEib/oO7QY2imD75JVgCJWQ==",
+ "dev": true
+ },
+ "istanbul-lib-hook": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.2.2.tgz",
+ "integrity": "sha512-/Jmq7Y1VeHnZEQ3TL10VHyb564mn6VrQXHchON9Jf/AEcmQ3ZIiyD1BVzNOKTZf/G3gE+kiGK6SmpF9y3qGPLw==",
+ "dev": true,
+ "requires": {
+ "append-transform": "^0.4.0"
+ }
+ },
+ "istanbul-lib-instrument": {
+ "version": "1.10.2",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.2.tgz",
+ "integrity": "sha512-aWHxfxDqvh/ZlxR8BBaEPVSWDPUkGD63VjGQn3jcw8jCp7sHEMKcrj4xfJn/ABzdMEHiQNyvDQhqm5o8+SQg7A==",
+ "dev": true,
+ "requires": {
+ "babel-generator": "^6.18.0",
+ "babel-template": "^6.16.0",
+ "babel-traverse": "^6.18.0",
+ "babel-types": "^6.18.0",
+ "babylon": "^6.18.0",
+ "istanbul-lib-coverage": "^1.2.1",
+ "semver": "^5.3.0"
+ }
+ },
+ "istanbul-lib-report": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.5.tgz",
+ "integrity": "sha512-UsYfRMoi6QO/doUshYNqcKJqVmFe9w51GZz8BS3WB0lYxAllQYklka2wP9+dGZeHYaWIdcXUx8JGdbqaoXRXzw==",
+ "dev": true,
+ "requires": {
+ "istanbul-lib-coverage": "^1.2.1",
+ "mkdirp": "^0.5.1",
+ "path-parse": "^1.0.5",
+ "supports-color": "^3.1.2"
+ },
+ "dependencies": {
+ "has-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+ "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+ "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+ "dev": true,
+ "requires": {
+ "has-flag": "^1.0.0"
+ }
+ }
+ }
+ },
+ "istanbul-lib-source-maps": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.6.tgz",
+ "integrity": "sha512-TtbsY5GIHgbMsMiRw35YBHGpZ1DVFEO19vxxeiDMYaeOFOCzfnYVxvl6pOUIZR4dtPhAGpSMup8OyF8ubsaqEg==",
+ "dev": true,
+ "requires": {
+ "debug": "^3.1.0",
+ "istanbul-lib-coverage": "^1.2.1",
+ "mkdirp": "^0.5.1",
+ "rimraf": "^2.6.1",
+ "source-map": "^0.5.3"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "3.2.6",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
+ "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
+ "dev": true,
+ "requires": {
+ "ms": "^2.1.1"
+ }
+ },
+ "ms": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
+ "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
+ "dev": true
+ }
+ }
+ },
+ "istanbul-reports": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.5.1.tgz",
+ "integrity": "sha512-+cfoZ0UXzWjhAdzosCPP3AN8vvef8XDkWtTfgaN+7L3YTpNYITnCaEkceo5SEYy644VkHka/P1FvkWvrG/rrJw==",
+ "dev": true,
+ "requires": {
+ "handlebars": "^4.0.3"
+ }
+ },
+ "jasmine": {
+ "version": "2.99.0",
+ "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-2.99.0.tgz",
+ "integrity": "sha1-jKctEC5jm4Z8ZImFbg4YqceqQrc=",
+ "dev": true,
+ "requires": {
+ "exit": "^0.1.2",
+ "glob": "^7.0.6",
+ "jasmine-core": "~2.99.0"
+ },
+ "dependencies": {
+ "jasmine-core": {
+ "version": "2.99.1",
+ "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.99.1.tgz",
+ "integrity": "sha1-5kAN8ea1bhMLYcS80JPap/boyhU=",
+ "dev": true
+ }
+ }
+ },
+ "jasmine-core": {
+ "version": "2.8.0",
+ "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.8.0.tgz",
+ "integrity": "sha1-vMl5rh+f0FcB5F5S5l06XWPxok4=",
+ "dev": true
+ },
+ "jasmine-spec-reporter": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/jasmine-spec-reporter/-/jasmine-spec-reporter-4.2.1.tgz",
+ "integrity": "sha512-FZBoZu7VE5nR7Nilzy+Np8KuVIOxF4oXDPDknehCYBDE080EnlPu0afdZNmpGDBRCUBv3mj5qgqCRmk6W/K8vg==",
+ "dev": true,
+ "requires": {
+ "colors": "1.1.2"
+ }
+ },
+ "jasminewd2": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/jasminewd2/-/jasminewd2-2.2.0.tgz",
+ "integrity": "sha1-43zwsX8ZnM4jvqcbIDk5Uka07E4=",
+ "dev": true
+ },
+ "js-base64": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.1.tgz",
+ "integrity": "sha512-M7kLczedRMYX4L8Mdh4MzyAMM9O5osx+4FcOQuTvr3A9F2D9S5JXheN0ewNbrvK2UatkTRhL5ejGmGSjNMiZuw==",
+ "dev": true,
+ "optional": true
+ },
+ "js-tokens": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
+ "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
+ "dev": true
+ },
+ "js-yaml": {
+ "version": "3.12.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.1.tgz",
+ "integrity": "sha512-um46hB9wNOKlwkHgiuyEVAybXBjwFUV0Z/RaHJblRd9DXltue9FTYvzCr9ErQrK9Adz5MU4gHWVaNUfdmrC8qA==",
+ "dev": true,
+ "requires": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ }
+ },
+ "jsbn": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
+ "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
+ "dev": true
+ },
+ "jsesc": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
+ "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=",
+ "dev": true
+ },
+ "json-loader": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz",
+ "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==",
+ "dev": true
+ },
+ "json-parse-better-errors": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
+ "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
+ "dev": true
+ },
+ "json-schema": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
+ "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=",
+ "dev": true
+ },
+ "json-schema-traverse": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz",
+ "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=",
+ "dev": true
+ },
+ "json-stable-stringify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz",
+ "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "jsonify": "~0.0.0"
+ }
+ },
+ "json-stringify-safe": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
+ "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
+ "dev": true
+ },
+ "json3": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz",
+ "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=",
+ "dev": true
+ },
+ "json5": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
+ "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=",
+ "dev": true
+ },
+ "jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "jsonify": {
+ "version": "0.0.0",
+ "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz",
+ "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=",
+ "dev": true,
+ "optional": true
+ },
+ "jsonpointer": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz",
+ "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=",
+ "dev": true,
+ "optional": true
+ },
+ "jsprim": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
+ "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
+ "dev": true,
+ "requires": {
+ "assert-plus": "1.0.0",
+ "extsprintf": "1.3.0",
+ "json-schema": "0.2.3",
+ "verror": "1.10.0"
+ },
+ "dependencies": {
+ "assert-plus": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+ "dev": true
+ }
+ }
+ },
+ "karma": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/karma/-/karma-2.0.5.tgz",
+ "integrity": "sha512-rECezBeY7mjzGUWhFlB7CvPHgkHJLXyUmWg+6vHCEsdWNUTnmiS6jRrIMcJEWgU2DUGZzGWG0bTRVky8fsDTOA==",
+ "dev": true,
+ "requires": {
+ "bluebird": "^3.3.0",
+ "body-parser": "^1.16.1",
+ "chokidar": "^2.0.3",
+ "colors": "^1.1.0",
+ "combine-lists": "^1.0.0",
+ "connect": "^3.6.0",
+ "core-js": "^2.2.0",
+ "di": "^0.0.1",
+ "dom-serialize": "^2.2.0",
+ "expand-braces": "^0.1.1",
+ "glob": "^7.1.1",
+ "graceful-fs": "^4.1.2",
+ "http-proxy": "^1.13.0",
+ "isbinaryfile": "^3.0.0",
+ "lodash": "^4.17.4",
+ "log4js": "^2.5.3",
+ "mime": "^1.3.4",
+ "minimatch": "^3.0.2",
+ "optimist": "^0.6.1",
+ "qjobs": "^1.1.4",
+ "range-parser": "^1.2.0",
+ "rimraf": "^2.6.0",
+ "safe-buffer": "^5.0.1",
+ "socket.io": "2.0.4",
+ "source-map": "^0.6.1",
+ "tmp": "0.0.33",
+ "useragent": "2.2.1"
+ },
+ "dependencies": {
+ "anymatch": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
+ "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
+ "dev": true,
+ "requires": {
+ "micromatch": "^3.1.4",
+ "normalize-path": "^2.1.1"
+ }
+ },
+ "arr-diff": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+ "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
+ "dev": true
+ },
+ "array-unique": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
+ "dev": true
+ },
+ "braces": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+ "dev": true,
+ "requires": {
+ "arr-flatten": "^1.1.0",
+ "array-unique": "^0.3.2",
+ "extend-shallow": "^2.0.1",
+ "fill-range": "^4.0.0",
+ "isobject": "^3.0.1",
+ "repeat-element": "^1.1.2",
+ "snapdragon": "^0.8.1",
+ "snapdragon-node": "^2.0.1",
+ "split-string": "^3.0.2",
+ "to-regex": "^3.0.1"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ }
+ }
+ },
+ "chokidar": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz",
+ "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==",
+ "dev": true,
+ "requires": {
+ "anymatch": "^2.0.0",
+ "async-each": "^1.0.0",
+ "braces": "^2.3.0",
+ "fsevents": "^1.2.2",
+ "glob-parent": "^3.1.0",
+ "inherits": "^2.0.1",
+ "is-binary-path": "^1.0.0",
+ "is-glob": "^4.0.0",
+ "lodash.debounce": "^4.0.8",
+ "normalize-path": "^2.1.1",
+ "path-is-absolute": "^1.0.0",
+ "readdirp": "^2.0.0",
+ "upath": "^1.0.5"
+ }
+ },
+ "expand-brackets": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
+ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
+ "dev": true,
+ "requires": {
+ "debug": "^2.3.3",
+ "define-property": "^0.2.5",
+ "extend-shallow": "^2.0.1",
+ "posix-character-classes": "^0.1.0",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^0.1.0"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "dev": true,
+ "requires": {
+ "kind-of": "^3.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "dev": true,
+ "requires": {
+ "kind-of": "^3.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "^0.1.6",
+ "is-data-descriptor": "^0.1.4",
+ "kind-of": "^5.0.0"
+ }
+ },
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true
+ }
+ }
+ },
+ "extglob": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
+ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
+ "dev": true,
+ "requires": {
+ "array-unique": "^0.3.2",
+ "define-property": "^1.0.0",
+ "expand-brackets": "^2.1.4",
+ "extend-shallow": "^2.0.1",
+ "fragment-cache": "^0.2.1",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^1.0.0"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ }
+ }
+ },
+ "fill-range": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "^2.0.1",
+ "is-number": "^3.0.0",
+ "repeat-string": "^1.6.1",
+ "to-regex-range": "^2.1.0"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ }
+ }
+ },
+ "glob-parent": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
+ "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
+ "dev": true,
+ "requires": {
+ "is-glob": "^3.1.0",
+ "path-dirname": "^1.0.0"
+ },
+ "dependencies": {
+ "is-glob": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "^2.1.0"
+ }
+ }
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "^1.0.0",
+ "is-data-descriptor": "^1.0.0",
+ "kind-of": "^6.0.2"
+ }
+ },
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+ "dev": true
+ },
+ "is-glob": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz",
+ "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "^2.1.1"
+ }
+ },
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "dev": true,
+ "requires": {
+ "kind-of": "^3.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ },
+ "kind-of": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+ "dev": true
+ },
+ "micromatch": {
+ "version": "3.1.10",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+ "dev": true,
+ "requires": {
+ "arr-diff": "^4.0.0",
+ "array-unique": "^0.3.2",
+ "braces": "^2.3.1",
+ "define-property": "^2.0.2",
+ "extend-shallow": "^3.0.2",
+ "extglob": "^2.0.4",
+ "fragment-cache": "^0.2.1",
+ "kind-of": "^6.0.2",
+ "nanomatch": "^1.2.9",
+ "object.pick": "^1.3.0",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.2"
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ }
+ }
+ },
+ "karma-chrome-launcher": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-2.2.0.tgz",
+ "integrity": "sha512-uf/ZVpAabDBPvdPdveyk1EPgbnloPvFFGgmRhYLTDH7gEB4nZdSBk8yTU47w1g/drLSx5uMOkjKk7IWKfWg/+w==",
+ "dev": true,
+ "requires": {
+ "fs-access": "^1.0.0",
+ "which": "^1.2.1"
+ }
+ },
+ "karma-coverage-istanbul-reporter": {
+ "version": "1.4.3",
+ "resolved": "https://registry.npmjs.org/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-1.4.3.tgz",
+ "integrity": "sha1-O13/RmT6W41RlrmInj9hwforgNk=",
+ "dev": true,
+ "requires": {
+ "istanbul-api": "^1.3.1",
+ "minimatch": "^3.0.4"
+ }
+ },
+ "karma-jasmine": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-1.1.2.tgz",
+ "integrity": "sha1-OU8rJf+0pkS5rabyLUQ+L9CIhsM=",
+ "dev": true
+ },
+ "karma-jasmine-html-reporter": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-0.2.2.tgz",
+ "integrity": "sha1-SKjl7xiAdhfuK14zwRlMNbQ5Ukw=",
+ "dev": true,
+ "requires": {
+ "karma-jasmine": "^1.0.2"
+ }
+ },
+ "karma-source-map-support": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.3.0.tgz",
+ "integrity": "sha512-HcPqdAusNez/ywa+biN4EphGz62MmQyPggUsDfsHqa7tSe4jdsxgvTKuDfIazjL+IOxpVWyT7Pr4dhAV+sxX5Q==",
+ "dev": true,
+ "requires": {
+ "source-map-support": "^0.5.5"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ },
+ "source-map-support": {
+ "version": "0.5.10",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.10.tgz",
+ "integrity": "sha512-YfQ3tQFTK/yzlGJuX8pTwa4tifQj4QS2Mj7UegOu8jAz59MqIiMGPXxQhVQiIMNzayuUSF/jEuVnfFF5JqybmQ==",
+ "dev": true,
+ "requires": {
+ "buffer-from": "^1.0.0",
+ "source-map": "^0.6.0"
+ }
+ }
+ }
+ },
+ "killable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz",
+ "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==",
+ "dev": true
+ },
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ },
+ "lazy-cache": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz",
+ "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=",
+ "dev": true
+ },
+ "lcid": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
+ "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=",
+ "dev": true,
+ "requires": {
+ "invert-kv": "^1.0.0"
+ }
+ },
+ "less": {
+ "version": "2.7.3",
+ "resolved": "https://registry.npmjs.org/less/-/less-2.7.3.tgz",
+ "integrity": "sha512-KPdIJKWcEAb02TuJtaLrhue0krtRLoRoo7x6BNJIBelO00t/CCdJQUnHW5V34OnHMWzIktSalJxRO+FvytQlCQ==",
+ "dev": true,
+ "requires": {
+ "errno": "^0.1.1",
+ "graceful-fs": "^4.1.2",
+ "image-size": "~0.5.0",
+ "mime": "^1.2.11",
+ "mkdirp": "^0.5.0",
+ "promise": "^7.1.1",
+ "request": "2.81.0",
+ "source-map": "^0.5.3"
+ }
+ },
+ "less-loader": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-4.1.0.tgz",
+ "integrity": "sha512-KNTsgCE9tMOM70+ddxp9yyt9iHqgmSs0yTZc5XH5Wo+g80RWRIYNqE58QJKm/yMud5wZEvz50ugRDuzVIkyahg==",
+ "dev": true,
+ "requires": {
+ "clone": "^2.1.1",
+ "loader-utils": "^1.1.0",
+ "pify": "^3.0.0"
+ }
+ },
+ "levn": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "prelude-ls": "~1.1.2",
+ "type-check": "~0.3.2"
+ }
+ },
+ "libbase64": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/libbase64/-/libbase64-0.1.0.tgz",
+ "integrity": "sha1-YjUag5VjrF/1vSbxL2Dpgwu3UeY=",
+ "dev": true
+ },
+ "libmime": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/libmime/-/libmime-3.0.0.tgz",
+ "integrity": "sha1-UaGp50SOy9Ms2lRCFnW7IbwJPaY=",
+ "dev": true,
+ "requires": {
+ "iconv-lite": "0.4.15",
+ "libbase64": "0.1.0",
+ "libqp": "1.1.0"
+ },
+ "dependencies": {
+ "iconv-lite": {
+ "version": "0.4.15",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.15.tgz",
+ "integrity": "sha1-/iZaIYrGpXz+hUkn6dBMGYJe3es=",
+ "dev": true
+ }
+ }
+ },
+ "libqp": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/libqp/-/libqp-1.1.0.tgz",
+ "integrity": "sha1-9ebgatdLeU+1tbZpiL9yjvHe2+g=",
+ "dev": true
+ },
+ "license-webpack-plugin": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-1.5.0.tgz",
+ "integrity": "sha512-Of/H79rZqm2aeg4RnP9SMSh19qkKemoLT5VaJV58uH5AxeYWEcBgGFs753JEJ/Hm6BPvQVfIlrrjoBwYj8p7Tw==",
+ "dev": true,
+ "requires": {
+ "ejs": "^2.5.7"
+ }
+ },
+ "load-json-file": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
+ "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.2",
+ "parse-json": "^2.2.0",
+ "pify": "^2.0.0",
+ "pinkie-promise": "^2.0.0",
+ "strip-bom": "^2.0.0"
+ },
+ "dependencies": {
+ "pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+ "dev": true
+ }
+ }
+ },
+ "loader-runner": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz",
+ "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==",
+ "dev": true
+ },
+ "loader-utils": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz",
+ "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=",
+ "dev": true,
+ "requires": {
+ "big.js": "^3.1.3",
+ "emojis-list": "^2.0.0",
+ "json5": "^0.5.0"
+ }
+ },
+ "locate-path": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
+ "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
+ "dev": true,
+ "requires": {
+ "p-locate": "^2.0.0",
+ "path-exists": "^3.0.0"
+ }
+ },
+ "lodash": {
+ "version": "4.17.11",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
+ "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==",
+ "dev": true
+ },
+ "lodash.assign": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz",
+ "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=",
+ "dev": true,
+ "optional": true
+ },
+ "lodash.clonedeep": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
+ "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=",
+ "dev": true
+ },
+ "lodash.debounce": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
+ "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=",
+ "dev": true
+ },
+ "lodash.mergewith": {
+ "version": "4.6.1",
+ "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz",
+ "integrity": "sha512-eWw5r+PYICtEBgrBE5hhlT6aAa75f411bgDz/ZL2KZqYV03USvucsxcHUIlGTDTECs1eunpI7HOV7U+WLDvNdQ==",
+ "dev": true,
+ "optional": true
+ },
+ "lodash.tail": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/lodash.tail/-/lodash.tail-4.1.1.tgz",
+ "integrity": "sha1-0jM6NtnncXyK0vfKyv7HwytERmQ=",
+ "dev": true
+ },
+ "log4js": {
+ "version": "2.11.0",
+ "resolved": "https://registry.npmjs.org/log4js/-/log4js-2.11.0.tgz",
+ "integrity": "sha512-z1XdwyGFg8/WGkOyF6DPJjivCWNLKrklGdViywdYnSKOvgtEBo2UyEMZS5sD2mZrQlU3TvO8wDWLc8mzE1ncBQ==",
+ "dev": true,
+ "requires": {
+ "amqplib": "^0.5.2",
+ "axios": "^0.15.3",
+ "circular-json": "^0.5.4",
+ "date-format": "^1.2.0",
+ "debug": "^3.1.0",
+ "hipchat-notifier": "^1.1.0",
+ "loggly": "^1.1.0",
+ "mailgun-js": "^0.18.0",
+ "nodemailer": "^2.5.0",
+ "redis": "^2.7.1",
+ "semver": "^5.5.0",
+ "slack-node": "~0.2.0",
+ "streamroller": "0.7.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "3.2.6",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
+ "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
+ "dev": true,
+ "requires": {
+ "ms": "^2.1.1"
+ }
+ },
+ "ms": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
+ "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
+ "dev": true
+ }
+ }
+ },
+ "loggly": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/loggly/-/loggly-1.1.1.tgz",
+ "integrity": "sha1-Cg/B0/o6XsRP3HuJe+uipGlc6+4=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "json-stringify-safe": "5.0.x",
+ "request": "2.75.x",
+ "timespan": "2.3.x"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true,
+ "optional": true
+ },
+ "caseless": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz",
+ "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=",
+ "dev": true,
+ "optional": true
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "ansi-styles": "^2.2.1",
+ "escape-string-regexp": "^1.0.2",
+ "has-ansi": "^2.0.0",
+ "strip-ansi": "^3.0.0",
+ "supports-color": "^2.0.0"
+ }
+ },
+ "form-data": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.0.0.tgz",
+ "integrity": "sha1-bwrrrcxdoWwT4ezBETfYX5uIOyU=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.5",
+ "mime-types": "^2.1.11"
+ }
+ },
+ "har-validator": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz",
+ "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "chalk": "^1.1.1",
+ "commander": "^2.9.0",
+ "is-my-json-valid": "^2.12.4",
+ "pinkie-promise": "^2.0.0"
+ }
+ },
+ "node-uuid": {
+ "version": "1.4.8",
+ "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz",
+ "integrity": "sha1-sEDrCSOWivq/jTL7HxfxFn/auQc=",
+ "dev": true,
+ "optional": true
+ },
+ "qs": {
+ "version": "6.2.3",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.2.3.tgz",
+ "integrity": "sha1-HPyyXBCpsrSDBT/zn138kjOQjP4=",
+ "dev": true,
+ "optional": true
+ },
+ "request": {
+ "version": "2.75.0",
+ "resolved": "https://registry.npmjs.org/request/-/request-2.75.0.tgz",
+ "integrity": "sha1-0rgmiihtoT6qXQGt9dGMyQ9lfZM=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "aws-sign2": "~0.6.0",
+ "aws4": "^1.2.1",
+ "bl": "~1.1.2",
+ "caseless": "~0.11.0",
+ "combined-stream": "~1.0.5",
+ "extend": "~3.0.0",
+ "forever-agent": "~0.6.1",
+ "form-data": "~2.0.0",
+ "har-validator": "~2.0.6",
+ "hawk": "~3.1.3",
+ "http-signature": "~1.1.0",
+ "is-typedarray": "~1.0.0",
+ "isstream": "~0.1.2",
+ "json-stringify-safe": "~5.0.1",
+ "mime-types": "~2.1.7",
+ "node-uuid": "~1.4.7",
+ "oauth-sign": "~0.8.1",
+ "qs": "~6.2.0",
+ "stringstream": "~0.0.4",
+ "tough-cookie": "~2.3.0",
+ "tunnel-agent": "~0.4.1"
+ }
+ },
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true,
+ "optional": true
+ },
+ "tunnel-agent": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz",
+ "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=",
+ "dev": true,
+ "optional": true
+ }
+ }
+ },
+ "loglevel": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.1.tgz",
+ "integrity": "sha1-4PyVEztu8nbNyIh82vJKpvFW+Po=",
+ "dev": true
+ },
+ "longest": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz",
+ "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=",
+ "dev": true
+ },
+ "loose-envify": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
+ "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+ "dev": true,
+ "requires": {
+ "js-tokens": "^3.0.0 || ^4.0.0"
+ }
+ },
+ "loud-rejection": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz",
+ "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=",
+ "dev": true,
+ "requires": {
+ "currently-unhandled": "^0.4.1",
+ "signal-exit": "^3.0.0"
+ }
+ },
+ "lower-case": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz",
+ "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=",
+ "dev": true
+ },
+ "lru-cache": {
+ "version": "4.1.5",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
+ "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
+ "dev": true,
+ "requires": {
+ "pseudomap": "^1.0.2",
+ "yallist": "^2.1.2"
+ }
+ },
+ "magic-string": {
+ "version": "0.22.5",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.22.5.tgz",
+ "integrity": "sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w==",
+ "dev": true,
+ "requires": {
+ "vlq": "^0.2.2"
+ }
+ },
+ "mailcomposer": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/mailcomposer/-/mailcomposer-4.0.1.tgz",
+ "integrity": "sha1-DhxEsqB890DuF9wUm6AJ8Zyt/rQ=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "buildmail": "4.0.1",
+ "libmime": "3.0.0"
+ }
+ },
+ "mailgun-js": {
+ "version": "0.18.1",
+ "resolved": "https://registry.npmjs.org/mailgun-js/-/mailgun-js-0.18.1.tgz",
+ "integrity": "sha512-lvuMP14u24HS2uBsJEnzSyPMxzU2b99tQsIx1o6QNjqxjk8b3WvR+vq5oG1mjqz/IBYo+5gF+uSoDS0RkMVHmg==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "async": "~2.6.0",
+ "debug": "~3.1.0",
+ "form-data": "~2.3.0",
+ "inflection": "~1.12.0",
+ "is-stream": "^1.1.0",
+ "path-proxy": "~1.0.0",
+ "promisify-call": "^2.0.2",
+ "proxy-agent": "~3.0.0",
+ "tsscmp": "~1.0.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "form-data": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
+ "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.6",
+ "mime-types": "^2.1.12"
+ }
+ }
+ }
+ },
+ "make-dir": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz",
+ "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==",
+ "dev": true,
+ "requires": {
+ "pify": "^3.0.0"
+ }
+ },
+ "make-error": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz",
+ "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==",
+ "dev": true
+ },
+ "map-cache": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
+ "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
+ "dev": true
+ },
+ "map-obj": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
+ "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
+ "dev": true
+ },
+ "map-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
+ "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
+ "dev": true,
+ "requires": {
+ "object-visit": "^1.0.0"
+ }
+ },
+ "math-random": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz",
+ "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==",
+ "dev": true
+ },
+ "md5.js": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz",
+ "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==",
+ "dev": true,
+ "requires": {
+ "hash-base": "^3.0.0",
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.1.2"
+ }
+ },
+ "media-typer": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
+ "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=",
+ "dev": true
+ },
+ "mem": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz",
+ "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=",
+ "dev": true,
+ "requires": {
+ "mimic-fn": "^1.0.0"
+ }
+ },
+ "memory-fs": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz",
+ "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=",
+ "dev": true,
+ "requires": {
+ "errno": "^0.1.3",
+ "readable-stream": "^2.0.1"
+ }
+ },
+ "meow": {
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
+ "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=",
+ "dev": true,
+ "requires": {
+ "camelcase-keys": "^2.0.0",
+ "decamelize": "^1.1.2",
+ "loud-rejection": "^1.0.0",
+ "map-obj": "^1.0.1",
+ "minimist": "^1.1.3",
+ "normalize-package-data": "^2.3.4",
+ "object-assign": "^4.0.1",
+ "read-pkg-up": "^1.0.1",
+ "redent": "^1.0.0",
+ "trim-newlines": "^1.0.0"
+ },
+ "dependencies": {
+ "minimist": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+ "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+ "dev": true
+ }
+ }
+ },
+ "merge-descriptors": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
+ "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=",
+ "dev": true
+ },
+ "methods": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
+ "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=",
+ "dev": true
+ },
+ "micromatch": {
+ "version": "2.3.11",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz",
+ "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=",
+ "dev": true,
+ "requires": {
+ "arr-diff": "^2.0.0",
+ "array-unique": "^0.2.1",
+ "braces": "^1.8.2",
+ "expand-brackets": "^0.1.4",
+ "extglob": "^0.3.1",
+ "filename-regex": "^2.0.0",
+ "is-extglob": "^1.0.0",
+ "is-glob": "^2.0.1",
+ "kind-of": "^3.0.2",
+ "normalize-path": "^2.0.1",
+ "object.omit": "^2.0.0",
+ "parse-glob": "^3.0.4",
+ "regex-cache": "^0.4.2"
+ }
+ },
+ "miller-rabin": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz",
+ "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==",
+ "dev": true,
+ "requires": {
+ "bn.js": "^4.0.0",
+ "brorand": "^1.0.1"
+ }
+ },
+ "mime": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+ "dev": true
+ },
+ "mime-db": {
+ "version": "1.37.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz",
+ "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==",
+ "dev": true
+ },
+ "mime-types": {
+ "version": "2.1.21",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz",
+ "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==",
+ "dev": true,
+ "requires": {
+ "mime-db": "~1.37.0"
+ }
+ },
+ "mimic-fn": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
+ "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==",
+ "dev": true
+ },
+ "minimalistic-assert": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
+ "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==",
+ "dev": true
+ },
+ "minimalistic-crypto-utils": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
+ "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=",
+ "dev": true
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "^1.1.7"
+ }
+ },
+ "minimist": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
+ "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
+ "dev": true
+ },
+ "mississippi": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-2.0.0.tgz",
+ "integrity": "sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==",
+ "dev": true,
+ "requires": {
+ "concat-stream": "^1.5.0",
+ "duplexify": "^3.4.2",
+ "end-of-stream": "^1.1.0",
+ "flush-write-stream": "^1.0.0",
+ "from2": "^2.1.0",
+ "parallel-transform": "^1.1.0",
+ "pump": "^2.0.1",
+ "pumpify": "^1.3.3",
+ "stream-each": "^1.1.0",
+ "through2": "^2.0.0"
+ }
+ },
+ "mixin-deep": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz",
+ "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==",
+ "dev": true,
+ "requires": {
+ "for-in": "^1.0.2",
+ "is-extendable": "^1.0.1"
+ },
+ "dependencies": {
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dev": true,
+ "requires": {
+ "is-plain-object": "^2.0.4"
+ }
+ }
+ }
+ },
+ "mixin-object": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz",
+ "integrity": "sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4=",
+ "dev": true,
+ "requires": {
+ "for-in": "^0.1.3",
+ "is-extendable": "^0.1.1"
+ },
+ "dependencies": {
+ "for-in": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz",
+ "integrity": "sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE=",
+ "dev": true
+ }
+ }
+ },
+ "mkdirp": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
+ "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
+ "dev": true,
+ "requires": {
+ "minimist": "0.0.8"
+ }
+ },
+ "move-concurrently": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz",
+ "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=",
+ "dev": true,
+ "requires": {
+ "aproba": "^1.1.1",
+ "copy-concurrently": "^1.0.0",
+ "fs-write-stream-atomic": "^1.0.8",
+ "mkdirp": "^0.5.1",
+ "rimraf": "^2.5.4",
+ "run-queue": "^1.0.3"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ },
+ "multicast-dns": {
+ "version": "6.2.3",
+ "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz",
+ "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==",
+ "dev": true,
+ "requires": {
+ "dns-packet": "^1.3.1",
+ "thunky": "^1.0.2"
+ }
+ },
+ "multicast-dns-service-types": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz",
+ "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=",
+ "dev": true
+ },
+ "nan": {
+ "version": "2.12.1",
+ "resolved": "https://registry.npmjs.org/nan/-/nan-2.12.1.tgz",
+ "integrity": "sha512-JY7V6lRkStKcKTvHO5NVSQRv+RV+FIL5pvDoLiAtSL9pKlC5x9PKQcZDsq7m4FO4d57mkhC6Z+QhAh3Jdk5JFw==",
+ "dev": true,
+ "optional": true
+ },
+ "nanomatch": {
+ "version": "1.2.13",
+ "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
+ "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==",
+ "dev": true,
+ "requires": {
+ "arr-diff": "^4.0.0",
+ "array-unique": "^0.3.2",
+ "define-property": "^2.0.2",
+ "extend-shallow": "^3.0.2",
+ "fragment-cache": "^0.2.1",
+ "is-windows": "^1.0.2",
+ "kind-of": "^6.0.2",
+ "object.pick": "^1.3.0",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.1"
+ },
+ "dependencies": {
+ "arr-diff": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+ "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
+ "dev": true
+ },
+ "array-unique": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
+ "dev": true
+ },
+ "kind-of": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+ "dev": true
+ }
+ }
+ },
+ "negotiator": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz",
+ "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=",
+ "dev": true
+ },
+ "neo-async": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.0.tgz",
+ "integrity": "sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA==",
+ "dev": true
+ },
+ "netmask": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/netmask/-/netmask-1.0.6.tgz",
+ "integrity": "sha1-ICl+idhvb2QA8lDZ9Pa0wZRfzTU=",
+ "dev": true,
+ "optional": true
+ },
+ "next-tick": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz",
+ "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=",
+ "dev": true
+ },
+ "no-case": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz",
+ "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==",
+ "dev": true,
+ "requires": {
+ "lower-case": "^1.1.1"
+ }
+ },
+ "node-forge": {
+ "version": "0.7.5",
+ "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.5.tgz",
+ "integrity": "sha512-MmbQJ2MTESTjt3Gi/3yG1wGpIMhUfcIypUCGtTizFR9IiccFwxSpfp0vtIZlkFclEqERemxfnSdZEMR9VqqEFQ==",
+ "dev": true
+ },
+ "node-gyp": {
+ "version": "3.8.0",
+ "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz",
+ "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "fstream": "^1.0.0",
+ "glob": "^7.0.3",
+ "graceful-fs": "^4.1.2",
+ "mkdirp": "^0.5.0",
+ "nopt": "2 || 3",
+ "npmlog": "0 || 1 || 2 || 3 || 4",
+ "osenv": "0",
+ "request": "^2.87.0",
+ "rimraf": "2",
+ "semver": "~5.3.0",
+ "tar": "^2.0.0",
+ "which": "1"
+ },
+ "dependencies": {
+ "assert-plus": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+ "dev": true,
+ "optional": true
+ },
+ "aws-sign2": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
+ "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
+ "dev": true,
+ "optional": true
+ },
+ "form-data": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
+ "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.6",
+ "mime-types": "^2.1.12"
+ }
+ },
+ "har-schema": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
+ "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
+ "dev": true,
+ "optional": true
+ },
+ "har-validator": {
+ "version": "5.1.3",
+ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz",
+ "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "ajv": "^6.5.5",
+ "har-schema": "^2.0.0"
+ }
+ },
+ "http-signature": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
+ "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "assert-plus": "^1.0.0",
+ "jsprim": "^1.2.2",
+ "sshpk": "^1.7.0"
+ }
+ },
+ "nopt": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
+ "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "abbrev": "1"
+ }
+ },
+ "oauth-sign": {
+ "version": "0.9.0",
+ "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
+ "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
+ "dev": true,
+ "optional": true
+ },
+ "performance-now": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
+ "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
+ "dev": true,
+ "optional": true
+ },
+ "punycode": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
+ "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
+ "dev": true,
+ "optional": true
+ },
+ "qs": {
+ "version": "6.5.2",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
+ "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
+ "dev": true,
+ "optional": true
+ },
+ "request": {
+ "version": "2.88.0",
+ "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz",
+ "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "aws-sign2": "~0.7.0",
+ "aws4": "^1.8.0",
+ "caseless": "~0.12.0",
+ "combined-stream": "~1.0.6",
+ "extend": "~3.0.2",
+ "forever-agent": "~0.6.1",
+ "form-data": "~2.3.2",
+ "har-validator": "~5.1.0",
+ "http-signature": "~1.2.0",
+ "is-typedarray": "~1.0.0",
+ "isstream": "~0.1.2",
+ "json-stringify-safe": "~5.0.1",
+ "mime-types": "~2.1.19",
+ "oauth-sign": "~0.9.0",
+ "performance-now": "^2.1.0",
+ "qs": "~6.5.2",
+ "safe-buffer": "^5.1.2",
+ "tough-cookie": "~2.4.3",
+ "tunnel-agent": "^0.6.0",
+ "uuid": "^3.3.2"
+ }
+ },
+ "semver": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz",
+ "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=",
+ "dev": true,
+ "optional": true
+ },
+ "tough-cookie": {
+ "version": "2.4.3",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz",
+ "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "psl": "^1.1.24",
+ "punycode": "^1.4.1"
+ }
+ }
+ }
+ },
+ "node-libs-browser": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.0.tgz",
+ "integrity": "sha512-5MQunG/oyOaBdttrL40dA7bUfPORLRWMUJLQtMg7nluxUvk5XwnLdL9twQHFAjRx/y7mIMkLKT9++qPbbk6BZA==",
+ "dev": true,
+ "requires": {
+ "assert": "^1.1.1",
+ "browserify-zlib": "^0.2.0",
+ "buffer": "^4.3.0",
+ "console-browserify": "^1.1.0",
+ "constants-browserify": "^1.0.0",
+ "crypto-browserify": "^3.11.0",
+ "domain-browser": "^1.1.1",
+ "events": "^3.0.0",
+ "https-browserify": "^1.0.0",
+ "os-browserify": "^0.3.0",
+ "path-browserify": "0.0.0",
+ "process": "^0.11.10",
+ "punycode": "^1.2.4",
+ "querystring-es3": "^0.2.0",
+ "readable-stream": "^2.3.3",
+ "stream-browserify": "^2.0.1",
+ "stream-http": "^2.7.2",
+ "string_decoder": "^1.0.0",
+ "timers-browserify": "^2.0.4",
+ "tty-browserify": "0.0.0",
+ "url": "^0.11.0",
+ "util": "^0.11.0",
+ "vm-browserify": "0.0.4"
+ },
+ "dependencies": {
+ "punycode": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
+ "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
+ "dev": true
+ }
+ }
+ },
+ "node-modules-path": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/node-modules-path/-/node-modules-path-1.0.2.tgz",
+ "integrity": "sha512-6Gbjq+d7uhkO7epaKi5DNgUJn7H0gEyA4Jg0Mo1uQOi3Rk50G83LtmhhFyw0LxnAFhtlspkiiw52ISP13qzcBg==",
+ "dev": true
+ },
+ "node-sass": {
+ "version": "4.11.0",
+ "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.11.0.tgz",
+ "integrity": "sha512-bHUdHTphgQJZaF1LASx0kAviPH7sGlcyNhWade4eVIpFp6tsn7SV8xNMTbsQFpEV9VXpnwTTnNYlfsZXgGgmkA==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "async-foreach": "^0.1.3",
+ "chalk": "^1.1.1",
+ "cross-spawn": "^3.0.0",
+ "gaze": "^1.0.0",
+ "get-stdin": "^4.0.1",
+ "glob": "^7.0.3",
+ "in-publish": "^2.0.0",
+ "lodash.assign": "^4.2.0",
+ "lodash.clonedeep": "^4.3.2",
+ "lodash.mergewith": "^4.6.0",
+ "meow": "^3.7.0",
+ "mkdirp": "^0.5.1",
+ "nan": "^2.10.0",
+ "node-gyp": "^3.8.0",
+ "npmlog": "^4.0.0",
+ "request": "^2.88.0",
+ "sass-graph": "^2.2.4",
+ "stdout-stream": "^1.4.0",
+ "true-case-path": "^1.0.2"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true,
+ "optional": true
+ },
+ "assert-plus": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+ "dev": true,
+ "optional": true
+ },
+ "aws-sign2": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
+ "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
+ "dev": true,
+ "optional": true
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "ansi-styles": "^2.2.1",
+ "escape-string-regexp": "^1.0.2",
+ "has-ansi": "^2.0.0",
+ "strip-ansi": "^3.0.0",
+ "supports-color": "^2.0.0"
+ }
+ },
+ "form-data": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
+ "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.6",
+ "mime-types": "^2.1.12"
+ }
+ },
+ "har-schema": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
+ "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
+ "dev": true,
+ "optional": true
+ },
+ "har-validator": {
+ "version": "5.1.3",
+ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz",
+ "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "ajv": "^6.5.5",
+ "har-schema": "^2.0.0"
+ }
+ },
+ "http-signature": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
+ "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "assert-plus": "^1.0.0",
+ "jsprim": "^1.2.2",
+ "sshpk": "^1.7.0"
+ }
+ },
+ "oauth-sign": {
+ "version": "0.9.0",
+ "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
+ "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
+ "dev": true,
+ "optional": true
+ },
+ "performance-now": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
+ "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
+ "dev": true,
+ "optional": true
+ },
+ "punycode": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
+ "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
+ "dev": true,
+ "optional": true
+ },
+ "qs": {
+ "version": "6.5.2",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
+ "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
+ "dev": true,
+ "optional": true
+ },
+ "request": {
+ "version": "2.88.0",
+ "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz",
+ "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "aws-sign2": "~0.7.0",
+ "aws4": "^1.8.0",
+ "caseless": "~0.12.0",
+ "combined-stream": "~1.0.6",
+ "extend": "~3.0.2",
+ "forever-agent": "~0.6.1",
+ "form-data": "~2.3.2",
+ "har-validator": "~5.1.0",
+ "http-signature": "~1.2.0",
+ "is-typedarray": "~1.0.0",
+ "isstream": "~0.1.2",
+ "json-stringify-safe": "~5.0.1",
+ "mime-types": "~2.1.19",
+ "oauth-sign": "~0.9.0",
+ "performance-now": "^2.1.0",
+ "qs": "~6.5.2",
+ "safe-buffer": "^5.1.2",
+ "tough-cookie": "~2.4.3",
+ "tunnel-agent": "^0.6.0",
+ "uuid": "^3.3.2"
+ }
+ },
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true,
+ "optional": true
+ },
+ "tough-cookie": {
+ "version": "2.4.3",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz",
+ "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "psl": "^1.1.24",
+ "punycode": "^1.4.1"
+ }
+ }
+ }
+ },
+ "nodemailer": {
+ "version": "2.7.2",
+ "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-2.7.2.tgz",
+ "integrity": "sha1-8kLmSa7q45tsftdA73sGHEBNMPk=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "libmime": "3.0.0",
+ "mailcomposer": "4.0.1",
+ "nodemailer-direct-transport": "3.3.2",
+ "nodemailer-shared": "1.1.0",
+ "nodemailer-smtp-pool": "2.8.2",
+ "nodemailer-smtp-transport": "2.7.2",
+ "socks": "1.1.9"
+ },
+ "dependencies": {
+ "smart-buffer": {
+ "version": "1.1.15",
+ "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-1.1.15.tgz",
+ "integrity": "sha1-fxFLW2X6s+KjWqd1uxLw0cZJvxY=",
+ "dev": true,
+ "optional": true
+ },
+ "socks": {
+ "version": "1.1.9",
+ "resolved": "https://registry.npmjs.org/socks/-/socks-1.1.9.tgz",
+ "integrity": "sha1-Yo1+TQSRJDVEWsC25Fk3bLPm1pE=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "ip": "^1.1.2",
+ "smart-buffer": "^1.0.4"
+ }
+ }
+ }
+ },
+ "nodemailer-direct-transport": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/nodemailer-direct-transport/-/nodemailer-direct-transport-3.3.2.tgz",
+ "integrity": "sha1-6W+vuQNYVglH5WkBfZfmBzilCoY=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "nodemailer-shared": "1.1.0",
+ "smtp-connection": "2.12.0"
+ }
+ },
+ "nodemailer-fetch": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/nodemailer-fetch/-/nodemailer-fetch-1.6.0.tgz",
+ "integrity": "sha1-ecSQihwPXzdbc/6IjamCj23JY6Q=",
+ "dev": true
+ },
+ "nodemailer-shared": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/nodemailer-shared/-/nodemailer-shared-1.1.0.tgz",
+ "integrity": "sha1-z1mU4v0mjQD1zw+nZ6CBae2wfsA=",
+ "dev": true,
+ "requires": {
+ "nodemailer-fetch": "1.6.0"
+ }
+ },
+ "nodemailer-smtp-pool": {
+ "version": "2.8.2",
+ "resolved": "https://registry.npmjs.org/nodemailer-smtp-pool/-/nodemailer-smtp-pool-2.8.2.tgz",
+ "integrity": "sha1-LrlNbPhXgLG0clzoU7nL1ejajHI=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "nodemailer-shared": "1.1.0",
+ "nodemailer-wellknown": "0.1.10",
+ "smtp-connection": "2.12.0"
+ }
+ },
+ "nodemailer-smtp-transport": {
+ "version": "2.7.2",
+ "resolved": "https://registry.npmjs.org/nodemailer-smtp-transport/-/nodemailer-smtp-transport-2.7.2.tgz",
+ "integrity": "sha1-A9ccdjFPFKx9vHvwM6am0W1n+3c=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "nodemailer-shared": "1.1.0",
+ "nodemailer-wellknown": "0.1.10",
+ "smtp-connection": "2.12.0"
+ }
+ },
+ "nodemailer-wellknown": {
+ "version": "0.1.10",
+ "resolved": "https://registry.npmjs.org/nodemailer-wellknown/-/nodemailer-wellknown-0.1.10.tgz",
+ "integrity": "sha1-WG24EB2zDLRDjrVGc3pBqtDPE9U=",
+ "dev": true
+ },
+ "nopt": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz",
+ "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=",
+ "dev": true,
+ "requires": {
+ "abbrev": "1",
+ "osenv": "^0.1.4"
+ }
+ },
+ "normalize-package-data": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.2.tgz",
+ "integrity": "sha512-YcMnjqeoUckXTPKZSAsPjUPLxH85XotbpqK3w4RyCwdFQSU5FxxBys8buehkSfg0j9fKvV1hn7O0+8reEgkAiw==",
+ "dev": true,
+ "requires": {
+ "hosted-git-info": "^2.1.4",
+ "is-builtin-module": "^1.0.0",
+ "semver": "2 || 3 || 4 || 5",
+ "validate-npm-package-license": "^3.0.1"
+ }
+ },
+ "normalize-path": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
+ "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
+ "dev": true,
+ "requires": {
+ "remove-trailing-separator": "^1.0.1"
+ }
+ },
+ "normalize-range": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
+ "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=",
+ "dev": true
+ },
+ "npm-run-path": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
+ "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
+ "dev": true,
+ "requires": {
+ "path-key": "^2.0.0"
+ }
+ },
+ "npmlog": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
+ "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
+ "dev": true,
+ "requires": {
+ "are-we-there-yet": "~1.1.2",
+ "console-control-strings": "~1.1.0",
+ "gauge": "~2.7.3",
+ "set-blocking": "~2.0.0"
+ }
+ },
+ "nth-check": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz",
+ "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==",
+ "dev": true,
+ "requires": {
+ "boolbase": "~1.0.0"
+ }
+ },
+ "null-check": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/null-check/-/null-check-1.0.0.tgz",
+ "integrity": "sha1-l33/1xdgErnsMNKjnbXPcqBDnt0=",
+ "dev": true
+ },
+ "num2fraction": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz",
+ "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=",
+ "dev": true
+ },
+ "number-is-nan": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
+ "dev": true
+ },
+ "oauth-sign": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz",
+ "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=",
+ "dev": true,
+ "optional": true
+ },
+ "object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
+ "dev": true
+ },
+ "object-component": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz",
+ "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=",
+ "dev": true
+ },
+ "object-copy": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
+ "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
+ "dev": true,
+ "requires": {
+ "copy-descriptor": "^0.1.0",
+ "define-property": "^0.2.5",
+ "kind-of": "^3.0.3"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^0.1.0"
+ }
+ }
+ }
+ },
+ "object-keys": {
+ "version": "1.0.12",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz",
+ "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==",
+ "dev": true
+ },
+ "object-visit": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
+ "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
+ "dev": true,
+ "requires": {
+ "isobject": "^3.0.0"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ }
+ }
+ },
+ "object.omit": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz",
+ "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=",
+ "dev": true,
+ "requires": {
+ "for-own": "^0.1.4",
+ "is-extendable": "^0.1.1"
+ }
+ },
+ "object.pick": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
+ "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
+ "dev": true,
+ "requires": {
+ "isobject": "^3.0.1"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ }
+ }
+ },
+ "obuf": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz",
+ "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==",
+ "dev": true
+ },
+ "on-finished": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
+ "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
+ "dev": true,
+ "requires": {
+ "ee-first": "1.1.1"
+ }
+ },
+ "on-headers": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz",
+ "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=",
+ "dev": true
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "requires": {
+ "wrappy": "1"
+ }
+ },
+ "opn": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/opn/-/opn-5.1.0.tgz",
+ "integrity": "sha512-iPNl7SyM8L30Rm1sjGdLLheyHVw5YXVfi3SKWJzBI7efxRwHojfRFjwE/OLM6qp9xJYMgab8WicTU1cPoY+Hpg==",
+ "dev": true,
+ "requires": {
+ "is-wsl": "^1.1.0"
+ }
+ },
+ "optimist": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz",
+ "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=",
+ "dev": true,
+ "requires": {
+ "minimist": "~0.0.1",
+ "wordwrap": "~0.0.2"
+ }
+ },
+ "optionator": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
+ "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "deep-is": "~0.1.3",
+ "fast-levenshtein": "~2.0.4",
+ "levn": "~0.3.0",
+ "prelude-ls": "~1.1.2",
+ "type-check": "~0.3.2",
+ "wordwrap": "~1.0.0"
+ },
+ "dependencies": {
+ "wordwrap": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+ "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
+ "dev": true,
+ "optional": true
+ }
+ }
+ },
+ "options": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz",
+ "integrity": "sha1-7CLTEoBrtT5zF3Pnza788cZDEo8=",
+ "dev": true
+ },
+ "original": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz",
+ "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==",
+ "dev": true,
+ "requires": {
+ "url-parse": "^1.4.3"
+ }
+ },
+ "os-browserify": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz",
+ "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=",
+ "dev": true
+ },
+ "os-homedir": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
+ "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
+ "dev": true
+ },
+ "os-locale": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz",
+ "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=",
+ "dev": true,
+ "requires": {
+ "lcid": "^1.0.0"
+ }
+ },
+ "os-tmpdir": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
+ "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
+ "dev": true
+ },
+ "osenv": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz",
+ "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==",
+ "dev": true,
+ "requires": {
+ "os-homedir": "^1.0.0",
+ "os-tmpdir": "^1.0.0"
+ }
+ },
+ "p-finally": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
+ "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=",
+ "dev": true
+ },
+ "p-limit": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
+ "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
+ "dev": true,
+ "requires": {
+ "p-try": "^1.0.0"
+ }
+ },
+ "p-locate": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
+ "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
+ "dev": true,
+ "requires": {
+ "p-limit": "^1.1.0"
+ }
+ },
+ "p-map": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz",
+ "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==",
+ "dev": true
+ },
+ "p-try": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
+ "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
+ "dev": true
+ },
+ "pac-proxy-agent": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-3.0.0.tgz",
+ "integrity": "sha512-AOUX9jES/EkQX2zRz0AW7lSx9jD//hQS8wFXBvcnd/J2Py9KaMJMqV/LPqJssj1tgGufotb2mmopGPR15ODv1Q==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "agent-base": "^4.2.0",
+ "debug": "^3.1.0",
+ "get-uri": "^2.0.0",
+ "http-proxy-agent": "^2.1.0",
+ "https-proxy-agent": "^2.2.1",
+ "pac-resolver": "^3.0.0",
+ "raw-body": "^2.2.0",
+ "socks-proxy-agent": "^4.0.1"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "3.2.6",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
+ "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "ms": "^2.1.1"
+ }
+ },
+ "ms": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
+ "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
+ "dev": true,
+ "optional": true
+ }
+ }
+ },
+ "pac-resolver": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-3.0.0.tgz",
+ "integrity": "sha512-tcc38bsjuE3XZ5+4vP96OfhOugrX+JcnpUbhfuc4LuXBLQhoTthOstZeoQJBDnQUDYzYmdImKsbz0xSl1/9qeA==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "co": "^4.6.0",
+ "degenerator": "^1.0.4",
+ "ip": "^1.1.5",
+ "netmask": "^1.0.6",
+ "thunkify": "^2.1.2"
+ }
+ },
+ "pako": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.8.tgz",
+ "integrity": "sha512-6i0HVbUfcKaTv+EG8ZTr75az7GFXcLYk9UyLEg7Notv/Ma+z/UG3TCoz6GiNeOrn1E/e63I0X/Hpw18jHOTUnA==",
+ "dev": true
+ },
+ "parallel-transform": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz",
+ "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=",
+ "dev": true,
+ "requires": {
+ "cyclist": "~0.2.2",
+ "inherits": "^2.0.3",
+ "readable-stream": "^2.1.5"
+ }
+ },
+ "param-case": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz",
+ "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=",
+ "dev": true,
+ "requires": {
+ "no-case": "^2.2.0"
+ }
+ },
+ "parse-asn1": {
+ "version": "5.1.3",
+ "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.3.tgz",
+ "integrity": "sha512-VrPoetlz7B/FqjBLD2f5wBVZvsZVLnRUrxVLfRYhGXCODa/NWE4p3Wp+6+aV3ZPL3KM7/OZmxDIwwijD7yuucg==",
+ "dev": true,
+ "requires": {
+ "asn1.js": "^4.0.0",
+ "browserify-aes": "^1.0.0",
+ "create-hash": "^1.1.0",
+ "evp_bytestokey": "^1.0.0",
+ "pbkdf2": "^3.0.3",
+ "safe-buffer": "^5.1.1"
+ }
+ },
+ "parse-glob": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz",
+ "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=",
+ "dev": true,
+ "requires": {
+ "glob-base": "^0.3.0",
+ "is-dotfile": "^1.0.0",
+ "is-extglob": "^1.0.0",
+ "is-glob": "^2.0.0"
+ }
+ },
+ "parse-json": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
+ "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
+ "dev": true,
+ "requires": {
+ "error-ex": "^1.2.0"
+ }
+ },
+ "parse-passwd": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz",
+ "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=",
+ "dev": true
+ },
+ "parseqs": {
+ "version": "0.0.5",
+ "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz",
+ "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=",
+ "dev": true,
+ "requires": {
+ "better-assert": "~1.0.0"
+ }
+ },
+ "parseuri": {
+ "version": "0.0.5",
+ "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz",
+ "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=",
+ "dev": true,
+ "requires": {
+ "better-assert": "~1.0.0"
+ }
+ },
+ "parseurl": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz",
+ "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=",
+ "dev": true
+ },
+ "pascalcase": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
+ "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
+ "dev": true
+ },
+ "path-browserify": {
+ "version": "0.0.0",
+ "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz",
+ "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=",
+ "dev": true
+ },
+ "path-dirname": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
+ "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=",
+ "dev": true
+ },
+ "path-exists": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+ "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
+ "dev": true
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true
+ },
+ "path-is-inside": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
+ "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=",
+ "dev": true
+ },
+ "path-key": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
+ "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
+ "dev": true
+ },
+ "path-parse": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
+ "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
+ "dev": true
+ },
+ "path-proxy": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/path-proxy/-/path-proxy-1.0.0.tgz",
+ "integrity": "sha1-GOijaFn8nS8aU7SN7hOFQ8Ag3l4=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "inflection": "~1.3.0"
+ },
+ "dependencies": {
+ "inflection": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.3.8.tgz",
+ "integrity": "sha1-y9Fg2p91sUw8xjV41POWeEvzAU4=",
+ "dev": true,
+ "optional": true
+ }
+ }
+ },
+ "path-to-regexp": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
+ "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=",
+ "dev": true
+ },
+ "path-type": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz",
+ "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==",
+ "dev": true,
+ "requires": {
+ "pify": "^3.0.0"
+ }
+ },
+ "pbkdf2": {
+ "version": "3.0.17",
+ "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz",
+ "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==",
+ "dev": true,
+ "requires": {
+ "create-hash": "^1.1.2",
+ "create-hmac": "^1.1.4",
+ "ripemd160": "^2.0.1",
+ "safe-buffer": "^5.0.1",
+ "sha.js": "^2.4.8"
+ }
+ },
+ "performance-now": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz",
+ "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=",
+ "dev": true,
+ "optional": true
+ },
+ "pify": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+ "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
+ "dev": true
+ },
+ "pinkie": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
+ "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
+ "dev": true
+ },
+ "pinkie-promise": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
+ "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
+ "dev": true,
+ "requires": {
+ "pinkie": "^2.0.0"
+ }
+ },
+ "pkg-dir": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz",
+ "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=",
+ "dev": true,
+ "requires": {
+ "find-up": "^2.1.0"
+ }
+ },
+ "portfinder": {
+ "version": "1.0.20",
+ "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.20.tgz",
+ "integrity": "sha512-Yxe4mTyDzTd59PZJY4ojZR8F+E5e97iq2ZOHPz3HDgSvYC5siNad2tLooQ5y5QHyQhc3xVqvyk/eNA3wuoa7Sw==",
+ "dev": true,
+ "requires": {
+ "async": "^1.5.2",
+ "debug": "^2.2.0",
+ "mkdirp": "0.5.x"
+ },
+ "dependencies": {
+ "async": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
+ "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
+ "dev": true
+ }
+ }
+ },
+ "posix-character-classes": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
+ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
+ "dev": true
+ },
+ "postcss": {
+ "version": "6.0.23",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz",
+ "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==",
+ "dev": true,
+ "requires": {
+ "chalk": "^2.4.1",
+ "source-map": "^0.6.1",
+ "supports-color": "^5.4.0"
+ },
+ "dependencies": {
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ }
+ }
+ },
+ "postcss-import": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-11.1.0.tgz",
+ "integrity": "sha512-5l327iI75POonjxkXgdRCUS+AlzAdBx4pOvMEhTKTCjb1p8IEeVR9yx3cPbmN7LIWJLbfnIXxAhoB4jpD0c/Cw==",
+ "dev": true,
+ "requires": {
+ "postcss": "^6.0.1",
+ "postcss-value-parser": "^3.2.3",
+ "read-cache": "^1.0.0",
+ "resolve": "^1.1.7"
+ }
+ },
+ "postcss-load-config": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.0.0.tgz",
+ "integrity": "sha512-V5JBLzw406BB8UIfsAWSK2KSwIJ5yoEIVFb4gVkXci0QdKgA24jLmHZ/ghe/GgX0lJ0/D1uUK1ejhzEY94MChQ==",
+ "dev": true,
+ "requires": {
+ "cosmiconfig": "^4.0.0",
+ "import-cwd": "^2.0.0"
+ }
+ },
+ "postcss-loader": {
+ "version": "2.1.6",
+ "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-2.1.6.tgz",
+ "integrity": "sha512-hgiWSc13xVQAq25cVw80CH0l49ZKlAnU1hKPOdRrNj89bokRr/bZF2nT+hebPPF9c9xs8c3gw3Fr2nxtmXYnNg==",
+ "dev": true,
+ "requires": {
+ "loader-utils": "^1.1.0",
+ "postcss": "^6.0.0",
+ "postcss-load-config": "^2.0.0",
+ "schema-utils": "^0.4.0"
+ }
+ },
+ "postcss-url": {
+ "version": "7.3.2",
+ "resolved": "https://registry.npmjs.org/postcss-url/-/postcss-url-7.3.2.tgz",
+ "integrity": "sha512-QMV5mA+pCYZQcUEPQkmor9vcPQ2MT+Ipuu8qdi1gVxbNiIiErEGft+eny1ak19qALoBkccS5AHaCaCDzh7b9MA==",
+ "dev": true,
+ "requires": {
+ "mime": "^1.4.1",
+ "minimatch": "^3.0.4",
+ "mkdirp": "^0.5.0",
+ "postcss": "^6.0.1",
+ "xxhashjs": "^0.2.1"
+ }
+ },
+ "postcss-value-parser": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+ "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+ "dev": true
+ },
+ "prelude-ls": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
+ "dev": true
+ },
+ "preserve": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz",
+ "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=",
+ "dev": true
+ },
+ "pretty-error": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz",
+ "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=",
+ "dev": true,
+ "requires": {
+ "renderkid": "^2.0.1",
+ "utila": "~0.4"
+ }
+ },
+ "process": {
+ "version": "0.11.10",
+ "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
+ "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=",
+ "dev": true
+ },
+ "process-nextick-args": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
+ "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==",
+ "dev": true
+ },
+ "promise": {
+ "version": "7.3.1",
+ "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz",
+ "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "asap": "~2.0.3"
+ }
+ },
+ "promise-inflight": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz",
+ "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=",
+ "dev": true
+ },
+ "promisify-call": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/promisify-call/-/promisify-call-2.0.4.tgz",
+ "integrity": "sha1-1IwtRWUszM1SgB3ey9UzptS9X7o=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "with-callback": "^1.0.2"
+ }
+ },
+ "protractor": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/protractor/-/protractor-5.1.2.tgz",
+ "integrity": "sha1-myIXQXCaTGLVzVPGqt1UpxE36V8=",
+ "dev": true,
+ "requires": {
+ "@types/node": "^6.0.46",
+ "@types/q": "^0.0.32",
+ "@types/selenium-webdriver": "~2.53.39",
+ "blocking-proxy": "0.0.5",
+ "chalk": "^1.1.3",
+ "glob": "^7.0.3",
+ "jasmine": "^2.5.3",
+ "jasminewd2": "^2.1.0",
+ "optimist": "~0.6.0",
+ "q": "1.4.1",
+ "saucelabs": "~1.3.0",
+ "selenium-webdriver": "3.0.1",
+ "source-map-support": "~0.4.0",
+ "webdriver-js-extender": "^1.0.0",
+ "webdriver-manager": "^12.0.6"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "assert-plus": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+ "dev": true
+ },
+ "aws-sign2": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
+ "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^2.2.1",
+ "escape-string-regexp": "^1.0.2",
+ "has-ansi": "^2.0.0",
+ "strip-ansi": "^3.0.0",
+ "supports-color": "^2.0.0"
+ }
+ },
+ "del": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz",
+ "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=",
+ "dev": true,
+ "requires": {
+ "globby": "^5.0.0",
+ "is-path-cwd": "^1.0.0",
+ "is-path-in-cwd": "^1.0.0",
+ "object-assign": "^4.0.1",
+ "pify": "^2.0.0",
+ "pinkie-promise": "^2.0.0",
+ "rimraf": "^2.2.8"
+ }
+ },
+ "form-data": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
+ "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
+ "dev": true,
+ "requires": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.6",
+ "mime-types": "^2.1.12"
+ }
+ },
+ "globby": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz",
+ "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=",
+ "dev": true,
+ "requires": {
+ "array-union": "^1.0.1",
+ "arrify": "^1.0.0",
+ "glob": "^7.0.3",
+ "object-assign": "^4.0.1",
+ "pify": "^2.0.0",
+ "pinkie-promise": "^2.0.0"
+ }
+ },
+ "har-schema": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
+ "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
+ "dev": true
+ },
+ "har-validator": {
+ "version": "5.1.3",
+ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz",
+ "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==",
+ "dev": true,
+ "requires": {
+ "ajv": "^6.5.5",
+ "har-schema": "^2.0.0"
+ }
+ },
+ "http-signature": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
+ "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
+ "dev": true,
+ "requires": {
+ "assert-plus": "^1.0.0",
+ "jsprim": "^1.2.2",
+ "sshpk": "^1.7.0"
+ }
+ },
+ "minimist": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+ "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+ "dev": true
+ },
+ "oauth-sign": {
+ "version": "0.9.0",
+ "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
+ "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
+ "dev": true
+ },
+ "performance-now": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
+ "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
+ "dev": true
+ },
+ "pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+ "dev": true
+ },
+ "punycode": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
+ "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
+ "dev": true
+ },
+ "qs": {
+ "version": "6.5.2",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
+ "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
+ "dev": true
+ },
+ "request": {
+ "version": "2.88.0",
+ "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz",
+ "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==",
+ "dev": true,
+ "requires": {
+ "aws-sign2": "~0.7.0",
+ "aws4": "^1.8.0",
+ "caseless": "~0.12.0",
+ "combined-stream": "~1.0.6",
+ "extend": "~3.0.2",
+ "forever-agent": "~0.6.1",
+ "form-data": "~2.3.2",
+ "har-validator": "~5.1.0",
+ "http-signature": "~1.2.0",
+ "is-typedarray": "~1.0.0",
+ "isstream": "~0.1.2",
+ "json-stringify-safe": "~5.0.1",
+ "mime-types": "~2.1.19",
+ "oauth-sign": "~0.9.0",
+ "performance-now": "^2.1.0",
+ "qs": "~6.5.2",
+ "safe-buffer": "^5.1.2",
+ "tough-cookie": "~2.4.3",
+ "tunnel-agent": "^0.6.0",
+ "uuid": "^3.3.2"
+ }
+ },
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true
+ },
+ "tough-cookie": {
+ "version": "2.4.3",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz",
+ "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==",
+ "dev": true,
+ "requires": {
+ "psl": "^1.1.24",
+ "punycode": "^1.4.1"
+ }
+ },
+ "webdriver-manager": {
+ "version": "12.1.1",
+ "resolved": "https://registry.npmjs.org/webdriver-manager/-/webdriver-manager-12.1.1.tgz",
+ "integrity": "sha512-L9TEQmZs6JbMMRQI1w60mfps265/NCr0toYJl7p/R2OAk6oXAfwI6jqYP7EWae+d7Ad2S2Aj4+rzxoSjqk3ZuA==",
+ "dev": true,
+ "requires": {
+ "adm-zip": "^0.4.9",
+ "chalk": "^1.1.1",
+ "del": "^2.2.0",
+ "glob": "^7.0.3",
+ "ini": "^1.3.4",
+ "minimist": "^1.2.0",
+ "q": "^1.4.1",
+ "request": "^2.87.0",
+ "rimraf": "^2.5.2",
+ "semver": "^5.3.0",
+ "xml2js": "^0.4.17"
+ }
+ }
+ }
+ },
+ "proxy-addr": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz",
+ "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==",
+ "dev": true,
+ "requires": {
+ "forwarded": "~0.1.2",
+ "ipaddr.js": "1.8.0"
+ }
+ },
+ "proxy-agent": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-3.0.3.tgz",
+ "integrity": "sha512-PXVVVuH9tiQuxQltFJVSnXWuDtNr+8aNBP6XVDDCDiUuDN8eRCm+ii4/mFWmXWEA0w8jjJSlePa4LXlM4jIzNA==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "agent-base": "^4.2.0",
+ "debug": "^3.1.0",
+ "http-proxy-agent": "^2.1.0",
+ "https-proxy-agent": "^2.2.1",
+ "lru-cache": "^4.1.2",
+ "pac-proxy-agent": "^3.0.0",
+ "proxy-from-env": "^1.0.0",
+ "socks-proxy-agent": "^4.0.1"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "3.2.6",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
+ "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "ms": "^2.1.1"
+ }
+ },
+ "ms": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
+ "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
+ "dev": true,
+ "optional": true
+ }
+ }
+ },
+ "proxy-from-env": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz",
+ "integrity": "sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4=",
+ "dev": true,
+ "optional": true
+ },
+ "prr": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
+ "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=",
+ "dev": true
+ },
+ "pseudomap": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
+ "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
+ "dev": true
+ },
+ "psl": {
+ "version": "1.1.31",
+ "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz",
+ "integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==",
+ "dev": true
+ },
+ "public-encrypt": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz",
+ "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==",
+ "dev": true,
+ "requires": {
+ "bn.js": "^4.1.0",
+ "browserify-rsa": "^4.0.0",
+ "create-hash": "^1.1.0",
+ "parse-asn1": "^5.0.0",
+ "randombytes": "^2.0.1",
+ "safe-buffer": "^5.1.2"
+ }
+ },
+ "pump": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz",
+ "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==",
+ "dev": true,
+ "requires": {
+ "end-of-stream": "^1.1.0",
+ "once": "^1.3.1"
+ }
+ },
+ "pumpify": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz",
+ "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==",
+ "dev": true,
+ "requires": {
+ "duplexify": "^3.6.0",
+ "inherits": "^2.0.3",
+ "pump": "^2.0.0"
+ }
+ },
+ "punycode": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
+ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
+ "dev": true
+ },
+ "q": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz",
+ "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=",
+ "dev": true
+ },
+ "qjobs": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz",
+ "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==",
+ "dev": true
+ },
+ "qs": {
+ "version": "6.4.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz",
+ "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=",
+ "dev": true,
+ "optional": true
+ },
+ "querystring": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
+ "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=",
+ "dev": true
+ },
+ "querystring-es3": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz",
+ "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=",
+ "dev": true
+ },
+ "querystringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.0.tgz",
+ "integrity": "sha512-sluvZZ1YiTLD5jsqZcDmFyV2EwToyXZBfpoVOmktMmW+VEnhgakFHnasVph65fOjGPTWN0Nw3+XQaSeMayr0kg==",
+ "dev": true
+ },
+ "randomatic": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz",
+ "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==",
+ "dev": true,
+ "requires": {
+ "is-number": "^4.0.0",
+ "kind-of": "^6.0.0",
+ "math-random": "^1.0.1"
+ },
+ "dependencies": {
+ "is-number": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
+ "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==",
+ "dev": true
+ },
+ "kind-of": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+ "dev": true
+ }
+ }
+ },
+ "randombytes": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz",
+ "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "^5.1.0"
+ }
+ },
+ "randomfill": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz",
+ "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==",
+ "dev": true,
+ "requires": {
+ "randombytes": "^2.0.5",
+ "safe-buffer": "^5.1.0"
+ }
+ },
+ "range-parser": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz",
+ "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=",
+ "dev": true
+ },
+ "raw-body": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz",
+ "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==",
+ "dev": true,
+ "requires": {
+ "bytes": "3.0.0",
+ "http-errors": "1.6.3",
+ "iconv-lite": "0.4.23",
+ "unpipe": "1.0.0"
+ }
+ },
+ "raw-loader": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-0.5.1.tgz",
+ "integrity": "sha1-DD0L6u2KAclm2Xh793goElKpeao=",
+ "dev": true
+ },
+ "read-cache": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
+ "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=",
+ "dev": true,
+ "requires": {
+ "pify": "^2.3.0"
+ },
+ "dependencies": {
+ "pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+ "dev": true
+ }
+ }
+ },
+ "read-pkg": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
+ "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
+ "dev": true,
+ "requires": {
+ "load-json-file": "^1.0.0",
+ "normalize-package-data": "^2.3.2",
+ "path-type": "^1.0.0"
+ },
+ "dependencies": {
+ "path-type": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
+ "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.2",
+ "pify": "^2.0.0",
+ "pinkie-promise": "^2.0.0"
+ }
+ },
+ "pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+ "dev": true
+ }
+ }
+ },
+ "read-pkg-up": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz",
+ "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
+ "dev": true,
+ "requires": {
+ "find-up": "^1.0.0",
+ "read-pkg": "^1.0.0"
+ },
+ "dependencies": {
+ "find-up": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
+ "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
+ "dev": true,
+ "requires": {
+ "path-exists": "^2.0.0",
+ "pinkie-promise": "^2.0.0"
+ }
+ },
+ "path-exists": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
+ "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
+ "dev": true,
+ "requires": {
+ "pinkie-promise": "^2.0.0"
+ }
+ }
+ }
+ },
+ "readable-stream": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
+ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
+ "dev": true,
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "readdirp": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz",
+ "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.11",
+ "micromatch": "^3.1.10",
+ "readable-stream": "^2.0.2"
+ },
+ "dependencies": {
+ "arr-diff": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+ "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
+ "dev": true
+ },
+ "array-unique": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
+ "dev": true
+ },
+ "braces": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+ "dev": true,
+ "requires": {
+ "arr-flatten": "^1.1.0",
+ "array-unique": "^0.3.2",
+ "extend-shallow": "^2.0.1",
+ "fill-range": "^4.0.0",
+ "isobject": "^3.0.1",
+ "repeat-element": "^1.1.2",
+ "snapdragon": "^0.8.1",
+ "snapdragon-node": "^2.0.1",
+ "split-string": "^3.0.2",
+ "to-regex": "^3.0.1"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ }
+ }
+ },
+ "expand-brackets": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
+ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
+ "dev": true,
+ "requires": {
+ "debug": "^2.3.3",
+ "define-property": "^0.2.5",
+ "extend-shallow": "^2.0.1",
+ "posix-character-classes": "^0.1.0",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^0.1.0"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "dev": true,
+ "requires": {
+ "kind-of": "^3.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "dev": true,
+ "requires": {
+ "kind-of": "^3.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "^0.1.6",
+ "is-data-descriptor": "^0.1.4",
+ "kind-of": "^5.0.0"
+ }
+ },
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true
+ }
+ }
+ },
+ "extglob": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
+ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
+ "dev": true,
+ "requires": {
+ "array-unique": "^0.3.2",
+ "define-property": "^1.0.0",
+ "expand-brackets": "^2.1.4",
+ "extend-shallow": "^2.0.1",
+ "fragment-cache": "^0.2.1",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^1.0.0"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ }
+ }
+ },
+ "fill-range": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "^2.0.1",
+ "is-number": "^3.0.0",
+ "repeat-string": "^1.6.1",
+ "to-regex-range": "^2.1.0"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ }
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "^1.0.0",
+ "is-data-descriptor": "^1.0.0",
+ "kind-of": "^6.0.2"
+ }
+ },
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "dev": true,
+ "requires": {
+ "kind-of": "^3.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ },
+ "kind-of": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+ "dev": true
+ },
+ "micromatch": {
+ "version": "3.1.10",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+ "dev": true,
+ "requires": {
+ "arr-diff": "^4.0.0",
+ "array-unique": "^0.3.2",
+ "braces": "^2.3.1",
+ "define-property": "^2.0.2",
+ "extend-shallow": "^3.0.2",
+ "extglob": "^2.0.4",
+ "fragment-cache": "^0.2.1",
+ "kind-of": "^6.0.2",
+ "nanomatch": "^1.2.9",
+ "object.pick": "^1.3.0",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.2"
+ }
+ }
+ }
+ },
+ "redent": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz",
+ "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=",
+ "dev": true,
+ "requires": {
+ "indent-string": "^2.1.0",
+ "strip-indent": "^1.0.1"
+ }
+ },
+ "redis": {
+ "version": "2.8.0",
+ "resolved": "https://registry.npmjs.org/redis/-/redis-2.8.0.tgz",
+ "integrity": "sha512-M1OkonEQwtRmZv4tEWF2VgpG0JWJ8Fv1PhlgT5+B+uNq2cA3Rt1Yt/ryoR+vQNOQcIEgdCdfH0jr3bDpihAw1A==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "double-ended-queue": "^2.1.0-0",
+ "redis-commands": "^1.2.0",
+ "redis-parser": "^2.6.0"
+ }
+ },
+ "redis-commands": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.4.0.tgz",
+ "integrity": "sha512-cu8EF+MtkwI4DLIT0x9P8qNTLFhQD4jLfxLR0cCNkeGzs87FN6879JOJwNQR/1zD7aSYNbU0hgsV9zGY71Itvw==",
+ "dev": true,
+ "optional": true
+ },
+ "redis-parser": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-2.6.0.tgz",
+ "integrity": "sha1-Uu0J2srBCPGmMcB+m2mUHnoZUEs=",
+ "dev": true,
+ "optional": true
+ },
+ "reflect-metadata": {
+ "version": "0.1.13",
+ "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz",
+ "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==",
+ "dev": true
+ },
+ "regenerate": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz",
+ "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==",
+ "dev": true
+ },
+ "regenerator-runtime": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+ "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
+ "dev": true
+ },
+ "regex-cache": {
+ "version": "0.4.4",
+ "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz",
+ "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==",
+ "dev": true,
+ "requires": {
+ "is-equal-shallow": "^0.1.3"
+ }
+ },
+ "regex-not": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
+ "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "^3.0.2",
+ "safe-regex": "^1.1.0"
+ }
+ },
+ "regexpu-core": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz",
+ "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=",
+ "dev": true,
+ "requires": {
+ "regenerate": "^1.2.1",
+ "regjsgen": "^0.2.0",
+ "regjsparser": "^0.1.4"
+ }
+ },
+ "regjsgen": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz",
+ "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=",
+ "dev": true
+ },
+ "regjsparser": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz",
+ "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=",
+ "dev": true,
+ "requires": {
+ "jsesc": "~0.5.0"
+ },
+ "dependencies": {
+ "jsesc": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
+ "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=",
+ "dev": true
+ }
+ }
+ },
+ "relateurl": {
+ "version": "0.2.7",
+ "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz",
+ "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=",
+ "dev": true
+ },
+ "remove-trailing-separator": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
+ "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=",
+ "dev": true
+ },
+ "renderkid": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.2.tgz",
+ "integrity": "sha512-FsygIxevi1jSiPY9h7vZmBFUbAOcbYm9UwyiLNdVsLRs/5We9Ob5NMPbGYUTWiLq5L+ezlVdE0A8bbME5CWTpg==",
+ "dev": true,
+ "requires": {
+ "css-select": "^1.1.0",
+ "dom-converter": "~0.2",
+ "htmlparser2": "~3.3.0",
+ "strip-ansi": "^3.0.0",
+ "utila": "^0.4.0"
+ }
+ },
+ "repeat-element": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz",
+ "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==",
+ "dev": true
+ },
+ "repeat-string": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
+ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
+ "dev": true
+ },
+ "repeating": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
+ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
+ "dev": true,
+ "requires": {
+ "is-finite": "^1.0.0"
+ }
+ },
+ "request": {
+ "version": "2.81.0",
+ "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz",
+ "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "aws-sign2": "~0.6.0",
+ "aws4": "^1.2.1",
+ "caseless": "~0.12.0",
+ "combined-stream": "~1.0.5",
+ "extend": "~3.0.0",
+ "forever-agent": "~0.6.1",
+ "form-data": "~2.1.1",
+ "har-validator": "~4.2.1",
+ "hawk": "~3.1.3",
+ "http-signature": "~1.1.0",
+ "is-typedarray": "~1.0.0",
+ "isstream": "~0.1.2",
+ "json-stringify-safe": "~5.0.1",
+ "mime-types": "~2.1.7",
+ "oauth-sign": "~0.8.1",
+ "performance-now": "^0.2.0",
+ "qs": "~6.4.0",
+ "safe-buffer": "^5.0.1",
+ "stringstream": "~0.0.4",
+ "tough-cookie": "~2.3.0",
+ "tunnel-agent": "^0.6.0",
+ "uuid": "^3.0.0"
+ }
+ },
+ "requestretry": {
+ "version": "1.13.0",
+ "resolved": "https://registry.npmjs.org/requestretry/-/requestretry-1.13.0.tgz",
+ "integrity": "sha512-Lmh9qMvnQXADGAQxsXHP4rbgO6pffCfuR8XUBdP9aitJcLQJxhp7YZK4xAVYXnPJ5E52mwrfiKQtKonPL8xsmg==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "extend": "^3.0.0",
+ "lodash": "^4.15.0",
+ "request": "^2.74.0",
+ "when": "^3.7.7"
+ },
+ "dependencies": {
+ "when": {
+ "version": "3.7.8",
+ "resolved": "https://registry.npmjs.org/when/-/when-3.7.8.tgz",
+ "integrity": "sha1-xxMLan6gRpPoQs3J56Hyqjmjn4I=",
+ "dev": true,
+ "optional": true
+ }
+ }
+ },
+ "require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
+ "dev": true
+ },
+ "require-from-string": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
+ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
+ "dev": true
+ },
+ "require-main-filename": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
+ "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=",
+ "dev": true
+ },
+ "requires-port": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
+ "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=",
+ "dev": true
+ },
+ "resolve": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz",
+ "integrity": "sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==",
+ "dev": true,
+ "requires": {
+ "path-parse": "^1.0.6"
+ }
+ },
+ "resolve-cwd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz",
+ "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=",
+ "dev": true,
+ "requires": {
+ "resolve-from": "^3.0.0"
+ }
+ },
+ "resolve-from": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz",
+ "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=",
+ "dev": true
+ },
+ "resolve-url": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
+ "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
+ "dev": true
+ },
+ "ret": {
+ "version": "0.1.15",
+ "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
+ "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
+ "dev": true
+ },
+ "right-align": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz",
+ "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=",
+ "dev": true,
+ "requires": {
+ "align-text": "^0.1.1"
+ }
+ },
+ "rimraf": {
+ "version": "2.6.3",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
+ "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
+ "dev": true,
+ "requires": {
+ "glob": "^7.1.3"
+ }
+ },
+ "ripemd160": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz",
+ "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==",
+ "dev": true,
+ "requires": {
+ "hash-base": "^3.0.0",
+ "inherits": "^2.0.1"
+ }
+ },
+ "run-queue": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz",
+ "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=",
+ "dev": true,
+ "requires": {
+ "aproba": "^1.1.1"
+ }
+ },
+ "rxjs": {
+ "version": "5.5.12",
+ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz",
+ "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==",
+ "requires": {
+ "symbol-observable": "1.0.1"
+ }
+ },
+ "safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+ "dev": true
+ },
+ "safe-regex": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
+ "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
+ "dev": true,
+ "requires": {
+ "ret": "~0.1.10"
+ }
+ },
+ "safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+ "dev": true
+ },
+ "sass-graph": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.4.tgz",
+ "integrity": "sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "glob": "^7.0.0",
+ "lodash": "^4.0.0",
+ "scss-tokenizer": "^0.2.3",
+ "yargs": "^7.0.0"
+ }
+ },
+ "sass-loader": {
+ "version": "6.0.7",
+ "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-6.0.7.tgz",
+ "integrity": "sha512-JoiyD00Yo1o61OJsoP2s2kb19L1/Y2p3QFcCdWdF6oomBGKVYuZyqHWemRBfQ2uGYsk+CH3eCguXNfpjzlcpaA==",
+ "dev": true,
+ "requires": {
+ "clone-deep": "^2.0.1",
+ "loader-utils": "^1.0.1",
+ "lodash.tail": "^4.1.1",
+ "neo-async": "^2.5.0",
+ "pify": "^3.0.0"
+ }
+ },
+ "saucelabs": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/saucelabs/-/saucelabs-1.3.0.tgz",
+ "integrity": "sha1-0kDoAJ33+ocwbsRXimm6O1xCT+4=",
+ "dev": true,
+ "requires": {
+ "https-proxy-agent": "^1.0.0"
+ },
+ "dependencies": {
+ "agent-base": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-2.1.1.tgz",
+ "integrity": "sha1-1t4Q1a9hMtW9aSQn1G/FOFOQlMc=",
+ "dev": true,
+ "requires": {
+ "extend": "~3.0.0",
+ "semver": "~5.0.1"
+ }
+ },
+ "https-proxy-agent": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-1.0.0.tgz",
+ "integrity": "sha1-NffabEjOTdv6JkiRrFk+5f+GceY=",
+ "dev": true,
+ "requires": {
+ "agent-base": "2",
+ "debug": "2",
+ "extend": "3"
+ }
+ },
+ "semver": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.0.3.tgz",
+ "integrity": "sha1-d0Zt5YnNXTyV8TiqeLxWmjy10no=",
+ "dev": true
+ }
+ }
+ },
+ "sax": {
+ "version": "0.5.8",
+ "resolved": "https://registry.npmjs.org/sax/-/sax-0.5.8.tgz",
+ "integrity": "sha1-1HLbIo6zMcJQaw6MFVJK25OdEsE=",
+ "dev": true
+ },
+ "schema-utils": {
+ "version": "0.4.7",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz",
+ "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==",
+ "dev": true,
+ "requires": {
+ "ajv": "^6.1.0",
+ "ajv-keywords": "^3.1.0"
+ }
+ },
+ "scss-tokenizer": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz",
+ "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "js-base64": "^2.1.8",
+ "source-map": "^0.4.2"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.4.4",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz",
+ "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "amdefine": ">=0.0.4"
+ }
+ }
+ }
+ },
+ "select-hose": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz",
+ "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=",
+ "dev": true
+ },
+ "selenium-webdriver": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-3.0.1.tgz",
+ "integrity": "sha1-ot6l2kqX9mcuiefKcnbO+jZRR6c=",
+ "dev": true,
+ "requires": {
+ "adm-zip": "^0.4.7",
+ "rimraf": "^2.5.4",
+ "tmp": "0.0.30",
+ "xml2js": "^0.4.17"
+ },
+ "dependencies": {
+ "tmp": {
+ "version": "0.0.30",
+ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.30.tgz",
+ "integrity": "sha1-ckGdSovn1s51FI/YsyTlk6cRwu0=",
+ "dev": true,
+ "requires": {
+ "os-tmpdir": "~1.0.1"
+ }
+ }
+ }
+ },
+ "selfsigned": {
+ "version": "1.10.4",
+ "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.4.tgz",
+ "integrity": "sha512-9AukTiDmHXGXWtWjembZ5NDmVvP2695EtpgbCsxCa68w3c88B+alqbmZ4O3hZ4VWGXeGWzEVdvqgAJD8DQPCDw==",
+ "dev": true,
+ "requires": {
+ "node-forge": "0.7.5"
+ }
+ },
+ "semver": {
+ "version": "5.6.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz",
+ "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==",
+ "dev": true
+ },
+ "semver-dsl": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/semver-dsl/-/semver-dsl-1.0.1.tgz",
+ "integrity": "sha1-02eN5VVeimH2Ke7QJTZq5fJzQKA=",
+ "dev": true,
+ "requires": {
+ "semver": "^5.3.0"
+ }
+ },
+ "semver-intersect": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/semver-intersect/-/semver-intersect-1.4.0.tgz",
+ "integrity": "sha512-d8fvGg5ycKAq0+I6nfWeCx6ffaWJCsBYU0H2Rq56+/zFePYfT8mXkB3tWBSjR5BerkHNZ5eTPIk1/LBYas35xQ==",
+ "dev": true,
+ "requires": {
+ "semver": "^5.0.0"
+ }
+ },
+ "send": {
+ "version": "0.16.2",
+ "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz",
+ "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==",
+ "dev": true,
+ "requires": {
+ "debug": "2.6.9",
+ "depd": "~1.1.2",
+ "destroy": "~1.0.4",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "fresh": "0.5.2",
+ "http-errors": "~1.6.2",
+ "mime": "1.4.1",
+ "ms": "2.0.0",
+ "on-finished": "~2.3.0",
+ "range-parser": "~1.2.0",
+ "statuses": "~1.4.0"
+ },
+ "dependencies": {
+ "mime": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz",
+ "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==",
+ "dev": true
+ }
+ }
+ },
+ "serialize-javascript": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.6.1.tgz",
+ "integrity": "sha512-A5MOagrPFga4YaKQSWHryl7AXvbQkEqpw4NNYMTNYUNV51bA8ABHgYFpqKx+YFFrw59xMV1qGH1R4AgoNIVgCw==",
+ "dev": true
+ },
+ "serve-index": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz",
+ "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=",
+ "dev": true,
+ "requires": {
+ "accepts": "~1.3.4",
+ "batch": "0.6.1",
+ "debug": "2.6.9",
+ "escape-html": "~1.0.3",
+ "http-errors": "~1.6.2",
+ "mime-types": "~2.1.17",
+ "parseurl": "~1.3.2"
+ }
+ },
+ "serve-static": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz",
+ "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==",
+ "dev": true,
+ "requires": {
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "parseurl": "~1.3.2",
+ "send": "0.16.2"
+ }
+ },
+ "set-blocking": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
+ "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
+ "dev": true
+ },
+ "set-value": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz",
+ "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "^2.0.1",
+ "is-extendable": "^0.1.1",
+ "is-plain-object": "^2.0.3",
+ "split-string": "^3.0.1"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ }
+ }
+ },
+ "setimmediate": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
+ "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=",
+ "dev": true
+ },
+ "setprototypeof": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
+ "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==",
+ "dev": true
+ },
+ "sha.js": {
+ "version": "2.4.11",
+ "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
+ "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
+ "dev": true,
+ "requires": {
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "shallow-clone": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-1.0.0.tgz",
+ "integrity": "sha512-oeXreoKR/SyNJtRJMAKPDSvd28OqEwG4eR/xc856cRGBII7gX9lvAqDxusPm0846z/w/hWYjI1NpKwJ00NHzRA==",
+ "dev": true,
+ "requires": {
+ "is-extendable": "^0.1.1",
+ "kind-of": "^5.0.0",
+ "mixin-object": "^2.0.1"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true
+ }
+ }
+ },
+ "shebang-command": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
+ "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
+ "dev": true,
+ "requires": {
+ "shebang-regex": "^1.0.0"
+ }
+ },
+ "shebang-regex": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
+ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
+ "dev": true
+ },
+ "signal-exit": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
+ "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
+ "dev": true
+ },
+ "silent-error": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/silent-error/-/silent-error-1.1.1.tgz",
+ "integrity": "sha512-n4iEKyNcg4v6/jpb3c0/iyH2G1nzUNl7Gpqtn/mHIJK9S/q/7MCfoO4rwVOoO59qPFIc0hVHvMbiOJ0NdtxKKw==",
+ "dev": true,
+ "requires": {
+ "debug": "^2.2.0"
+ }
+ },
+ "slack-node": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/slack-node/-/slack-node-0.2.0.tgz",
+ "integrity": "sha1-3kuN3aqLeT9h29KTgQT9q/N9+jA=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "requestretry": "^1.2.2"
+ }
+ },
+ "slash": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
+ "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=",
+ "dev": true
+ },
+ "smart-buffer": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.0.2.tgz",
+ "integrity": "sha512-JDhEpTKzXusOqXZ0BUIdH+CjFdO/CR3tLlf5CN34IypI+xMmXW1uB16OOY8z3cICbJlDAVJzNbwBhNO0wt9OAw==",
+ "dev": true
+ },
+ "smtp-connection": {
+ "version": "2.12.0",
+ "resolved": "https://registry.npmjs.org/smtp-connection/-/smtp-connection-2.12.0.tgz",
+ "integrity": "sha1-1275EnyyPCJZ7bHoNJwujV4tdME=",
+ "dev": true,
+ "requires": {
+ "httpntlm": "1.6.1",
+ "nodemailer-shared": "1.1.0"
+ }
+ },
+ "snapdragon": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
+ "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
+ "dev": true,
+ "requires": {
+ "base": "^0.11.1",
+ "debug": "^2.2.0",
+ "define-property": "^0.2.5",
+ "extend-shallow": "^2.0.1",
+ "map-cache": "^0.2.2",
+ "source-map": "^0.5.6",
+ "source-map-resolve": "^0.5.0",
+ "use": "^3.1.0"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^0.1.0"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ }
+ }
+ },
+ "snapdragon-node": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
+ "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
+ "dev": true,
+ "requires": {
+ "define-property": "^1.0.0",
+ "isobject": "^3.0.0",
+ "snapdragon-util": "^3.0.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^1.0.0"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "^1.0.0",
+ "is-data-descriptor": "^1.0.0",
+ "kind-of": "^6.0.2"
+ }
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ },
+ "kind-of": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+ "dev": true
+ }
+ }
+ },
+ "snapdragon-util": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
+ "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "^3.2.0"
+ }
+ },
+ "sntp": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz",
+ "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "hoek": "2.x.x"
+ }
+ },
+ "socket.io": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.0.4.tgz",
+ "integrity": "sha1-waRZDO/4fs8TxyZS8Eb3FrKeYBQ=",
+ "dev": true,
+ "requires": {
+ "debug": "~2.6.6",
+ "engine.io": "~3.1.0",
+ "socket.io-adapter": "~1.1.0",
+ "socket.io-client": "2.0.4",
+ "socket.io-parser": "~3.1.1"
+ }
+ },
+ "socket.io-adapter": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz",
+ "integrity": "sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs=",
+ "dev": true
+ },
+ "socket.io-client": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.0.4.tgz",
+ "integrity": "sha1-CRilUkBtxeVAs4Dc2Xr8SmQzL44=",
+ "dev": true,
+ "requires": {
+ "backo2": "1.0.2",
+ "base64-arraybuffer": "0.1.5",
+ "component-bind": "1.0.0",
+ "component-emitter": "1.2.1",
+ "debug": "~2.6.4",
+ "engine.io-client": "~3.1.0",
+ "has-cors": "1.1.0",
+ "indexof": "0.0.1",
+ "object-component": "0.0.3",
+ "parseqs": "0.0.5",
+ "parseuri": "0.0.5",
+ "socket.io-parser": "~3.1.1",
+ "to-array": "0.1.4"
+ }
+ },
+ "socket.io-parser": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.1.3.tgz",
+ "integrity": "sha512-g0a2HPqLguqAczs3dMECuA1RgoGFPyvDqcbaDEdCWY9g59kdUAz3YRmaJBNKXflrHNwB7Q12Gkf/0CZXfdHR7g==",
+ "dev": true,
+ "requires": {
+ "component-emitter": "1.2.1",
+ "debug": "~3.1.0",
+ "has-binary2": "~1.0.2",
+ "isarray": "2.0.1"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "isarray": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz",
+ "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=",
+ "dev": true
+ }
+ }
+ },
+ "sockjs": {
+ "version": "0.3.19",
+ "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz",
+ "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==",
+ "dev": true,
+ "requires": {
+ "faye-websocket": "^0.10.0",
+ "uuid": "^3.0.1"
+ }
+ },
+ "sockjs-client": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.1.5.tgz",
+ "integrity": "sha1-G7fA9yIsQPQq3xT0RCy9Eml3GoM=",
+ "dev": true,
+ "requires": {
+ "debug": "^2.6.6",
+ "eventsource": "0.1.6",
+ "faye-websocket": "~0.11.0",
+ "inherits": "^2.0.1",
+ "json3": "^3.3.2",
+ "url-parse": "^1.1.8"
+ },
+ "dependencies": {
+ "faye-websocket": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz",
+ "integrity": "sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=",
+ "dev": true,
+ "requires": {
+ "websocket-driver": ">=0.5.1"
+ }
+ }
+ }
+ },
+ "socks": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/socks/-/socks-2.2.3.tgz",
+ "integrity": "sha512-+2r83WaRT3PXYoO/1z+RDEBE7Z2f9YcdQnJ0K/ncXXbV5gJ6wYfNAebYFYiiUjM6E4JyXnPY8cimwyvFYHVUUA==",
+ "dev": true,
+ "requires": {
+ "ip": "^1.1.5",
+ "smart-buffer": "4.0.2"
+ }
+ },
+ "socks-proxy-agent": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-4.0.1.tgz",
+ "integrity": "sha512-Kezx6/VBguXOsEe5oU3lXYyKMi4+gva72TwJ7pQY5JfqUx2nMk7NXA6z/mpNqIlfQjWYVfeuNvQjexiTaTn6Nw==",
+ "dev": true,
+ "requires": {
+ "agent-base": "~4.2.0",
+ "socks": "~2.2.0"
+ }
+ },
+ "source-list-map": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz",
+ "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==",
+ "dev": true
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ },
+ "source-map-resolve": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz",
+ "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==",
+ "dev": true,
+ "requires": {
+ "atob": "^2.1.1",
+ "decode-uri-component": "^0.2.0",
+ "resolve-url": "^0.2.1",
+ "source-map-url": "^0.4.0",
+ "urix": "^0.1.0"
+ }
+ },
+ "source-map-support": {
+ "version": "0.4.18",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz",
+ "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==",
+ "dev": true,
+ "requires": {
+ "source-map": "^0.5.6"
+ }
+ },
+ "source-map-url": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
+ "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
+ "dev": true
+ },
+ "spdx-correct": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz",
+ "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==",
+ "dev": true,
+ "requires": {
+ "spdx-expression-parse": "^3.0.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "spdx-exceptions": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz",
+ "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==",
+ "dev": true
+ },
+ "spdx-expression-parse": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz",
+ "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==",
+ "dev": true,
+ "requires": {
+ "spdx-exceptions": "^2.1.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "spdx-license-ids": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.3.tgz",
+ "integrity": "sha512-uBIcIl3Ih6Phe3XHK1NqboJLdGfwr1UN3k6wSD1dZpmPsIkb8AGNbZYJ1fOBk834+Gxy8rpfDxrS6XLEMZMY2g==",
+ "dev": true
+ },
+ "spdy": {
+ "version": "3.4.7",
+ "resolved": "https://registry.npmjs.org/spdy/-/spdy-3.4.7.tgz",
+ "integrity": "sha1-Qv9B7OXMD5mjpsKKq7c/XDsDrLw=",
+ "dev": true,
+ "requires": {
+ "debug": "^2.6.8",
+ "handle-thing": "^1.2.5",
+ "http-deceiver": "^1.2.7",
+ "safe-buffer": "^5.0.1",
+ "select-hose": "^2.0.0",
+ "spdy-transport": "^2.0.18"
+ }
+ },
+ "spdy-transport": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-2.1.1.tgz",
+ "integrity": "sha512-q7D8c148escoB3Z7ySCASadkegMmUZW8Wb/Q1u0/XBgDKMO880rLQDj8Twiew/tYi7ghemKUi/whSYOwE17f5Q==",
+ "dev": true,
+ "requires": {
+ "debug": "^2.6.8",
+ "detect-node": "^2.0.3",
+ "hpack.js": "^2.1.6",
+ "obuf": "^1.1.1",
+ "readable-stream": "^2.2.9",
+ "safe-buffer": "^5.0.1",
+ "wbuf": "^1.7.2"
+ }
+ },
+ "split-string": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
+ "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "^3.0.0"
+ }
+ },
+ "sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
+ "dev": true
+ },
+ "sshpk": {
+ "version": "1.16.1",
+ "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",
+ "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==",
+ "dev": true,
+ "requires": {
+ "asn1": "~0.2.3",
+ "assert-plus": "^1.0.0",
+ "bcrypt-pbkdf": "^1.0.0",
+ "dashdash": "^1.12.0",
+ "ecc-jsbn": "~0.1.1",
+ "getpass": "^0.1.1",
+ "jsbn": "~0.1.0",
+ "safer-buffer": "^2.0.2",
+ "tweetnacl": "~0.14.0"
+ },
+ "dependencies": {
+ "assert-plus": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+ "dev": true
+ }
+ }
+ },
+ "ssri": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.3.0.tgz",
+ "integrity": "sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "^5.1.1"
+ }
+ },
+ "static-extend": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
+ "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
+ "dev": true,
+ "requires": {
+ "define-property": "^0.2.5",
+ "object-copy": "^0.1.0"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^0.1.0"
+ }
+ }
+ }
+ },
+ "statuses": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz",
+ "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==",
+ "dev": true
+ },
+ "stdout-stream": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz",
+ "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "readable-stream": "^2.0.1"
+ }
+ },
+ "stream-browserify": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz",
+ "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==",
+ "dev": true,
+ "requires": {
+ "inherits": "~2.0.1",
+ "readable-stream": "^2.0.2"
+ }
+ },
+ "stream-each": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz",
+ "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==",
+ "dev": true,
+ "requires": {
+ "end-of-stream": "^1.1.0",
+ "stream-shift": "^1.0.0"
+ }
+ },
+ "stream-http": {
+ "version": "2.8.3",
+ "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz",
+ "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==",
+ "dev": true,
+ "requires": {
+ "builtin-status-codes": "^3.0.0",
+ "inherits": "^2.0.1",
+ "readable-stream": "^2.3.6",
+ "to-arraybuffer": "^1.0.0",
+ "xtend": "^4.0.0"
+ }
+ },
+ "stream-shift": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz",
+ "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=",
+ "dev": true
+ },
+ "streamroller": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-0.7.0.tgz",
+ "integrity": "sha512-WREzfy0r0zUqp3lGO096wRuUp7ho1X6uo/7DJfTlEi0Iv/4gT7YHqXDjKC2ioVGBZtE8QzsQD9nx1nIuoZ57jQ==",
+ "dev": true,
+ "requires": {
+ "date-format": "^1.2.0",
+ "debug": "^3.1.0",
+ "mkdirp": "^0.5.1",
+ "readable-stream": "^2.3.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "3.2.6",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
+ "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
+ "dev": true,
+ "requires": {
+ "ms": "^2.1.1"
+ }
+ },
+ "ms": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
+ "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
+ "dev": true
+ }
+ }
+ },
+ "string-width": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+ "dev": true,
+ "requires": {
+ "code-point-at": "^1.0.0",
+ "is-fullwidth-code-point": "^1.0.0",
+ "strip-ansi": "^3.0.0"
+ }
+ },
+ "string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "~5.1.0"
+ }
+ },
+ "stringstream": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.6.tgz",
+ "integrity": "sha512-87GEBAkegbBcweToUrdzf3eLhWNg06FJTebl4BVJz/JgWy8CvEr9dRtX5qWphiynMSQlxxi+QqN0z5T32SLlhA==",
+ "dev": true,
+ "optional": true
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^2.0.0"
+ }
+ },
+ "strip-bom": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
+ "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
+ "dev": true,
+ "requires": {
+ "is-utf8": "^0.2.0"
+ }
+ },
+ "strip-eof": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
+ "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=",
+ "dev": true
+ },
+ "strip-indent": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz",
+ "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=",
+ "dev": true,
+ "requires": {
+ "get-stdin": "^4.0.1"
+ }
+ },
+ "strip-json-comments": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
+ "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
+ "dev": true
+ },
+ "style-loader": {
+ "version": "0.19.1",
+ "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.19.1.tgz",
+ "integrity": "sha512-IRE+ijgojrygQi3rsqT0U4dd+UcPCqcVvauZpCnQrGAlEe+FUIyrK93bUDScamesjP08JlQNsFJU+KmPedP5Og==",
+ "dev": true,
+ "requires": {
+ "loader-utils": "^1.0.2",
+ "schema-utils": "^0.3.0"
+ },
+ "dependencies": {
+ "ajv": {
+ "version": "5.5.2",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
+ "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
+ "dev": true,
+ "requires": {
+ "co": "^4.6.0",
+ "fast-deep-equal": "^1.0.0",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.3.0"
+ }
+ },
+ "schema-utils": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz",
+ "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=",
+ "dev": true,
+ "requires": {
+ "ajv": "^5.0.0"
+ }
+ }
+ }
+ },
+ "stylus": {
+ "version": "0.54.5",
+ "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.54.5.tgz",
+ "integrity": "sha1-QrlWCTHKcJDOhRWnmLqeaqPW3Hk=",
+ "dev": true,
+ "requires": {
+ "css-parse": "1.7.x",
+ "debug": "*",
+ "glob": "7.0.x",
+ "mkdirp": "0.5.x",
+ "sax": "0.5.x",
+ "source-map": "0.1.x"
+ },
+ "dependencies": {
+ "glob": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz",
+ "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.2",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ }
+ },
+ "source-map": {
+ "version": "0.1.43",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz",
+ "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=",
+ "dev": true,
+ "requires": {
+ "amdefine": ">=0.0.4"
+ }
+ }
+ }
+ },
+ "stylus-loader": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-3.0.2.tgz",
+ "integrity": "sha512-+VomPdZ6a0razP+zinir61yZgpw2NfljeSsdUF5kJuEzlo3khXhY19Fn6l8QQz1GRJGtMCo8nG5C04ePyV7SUA==",
+ "dev": true,
+ "requires": {
+ "loader-utils": "^1.0.2",
+ "lodash.clonedeep": "^4.5.0",
+ "when": "~3.6.x"
+ }
+ },
+ "supports-color": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz",
+ "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=",
+ "dev": true,
+ "requires": {
+ "has-flag": "^2.0.0"
+ }
+ },
+ "symbol-observable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz",
+ "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ="
+ },
+ "tapable": {
+ "version": "0.2.9",
+ "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.9.tgz",
+ "integrity": "sha512-2wsvQ+4GwBvLPLWsNfLCDYGsW6xb7aeC6utq2Qh0PFwgEy7K7dsma9Jsmb2zSQj7GvYAyUGSntLtsv++GmgL1A==",
+ "dev": true
+ },
+ "tar": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz",
+ "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "block-stream": "*",
+ "fstream": "^1.0.2",
+ "inherits": "2"
+ }
+ },
+ "through": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
+ "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
+ "dev": true
+ },
+ "through2": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
+ "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
+ "dev": true,
+ "requires": {
+ "readable-stream": "~2.3.6",
+ "xtend": "~4.0.1"
+ }
+ },
+ "thunkify": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/thunkify/-/thunkify-2.1.2.tgz",
+ "integrity": "sha1-+qDp0jDFGsyVyhOjYawFyn4EVT0=",
+ "dev": true,
+ "optional": true
+ },
+ "thunky": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.0.3.tgz",
+ "integrity": "sha512-YwT8pjmNcAXBZqrubu22P4FYsh2D4dxRmnWBOL8Jk8bUcRUtc5326kx32tuTmFDAZtLOGEVNl8POAR8j896Iow==",
+ "dev": true
+ },
+ "time-stamp": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-2.2.0.tgz",
+ "integrity": "sha512-zxke8goJQpBeEgD82CXABeMh0LSJcj7CXEd0OHOg45HgcofF7pxNwZm9+RknpxpDhwN4gFpySkApKfFYfRQnUA==",
+ "dev": true
+ },
+ "timers-browserify": {
+ "version": "2.0.10",
+ "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz",
+ "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==",
+ "dev": true,
+ "requires": {
+ "setimmediate": "^1.0.4"
+ }
+ },
+ "timespan": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/timespan/-/timespan-2.3.0.tgz",
+ "integrity": "sha1-SQLOBAvRPYRcj1myfp1ZutbzmSk=",
+ "dev": true,
+ "optional": true
+ },
+ "tmp": {
+ "version": "0.0.33",
+ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
+ "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
+ "dev": true,
+ "requires": {
+ "os-tmpdir": "~1.0.2"
+ }
+ },
+ "to-array": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz",
+ "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=",
+ "dev": true
+ },
+ "to-arraybuffer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz",
+ "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=",
+ "dev": true
+ },
+ "to-fast-properties": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
+ "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=",
+ "dev": true
+ },
+ "to-object-path": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
+ "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
+ "dev": true,
+ "requires": {
+ "kind-of": "^3.0.2"
+ }
+ },
+ "to-regex": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
+ "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
+ "dev": true,
+ "requires": {
+ "define-property": "^2.0.2",
+ "extend-shallow": "^3.0.2",
+ "regex-not": "^1.0.2",
+ "safe-regex": "^1.1.0"
+ }
+ },
+ "to-regex-range": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
+ "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+ "dev": true,
+ "requires": {
+ "is-number": "^3.0.0",
+ "repeat-string": "^1.6.1"
+ },
+ "dependencies": {
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "dev": true,
+ "requires": {
+ "kind-of": "^3.0.2"
+ }
+ }
+ }
+ },
+ "toposort": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.7.tgz",
+ "integrity": "sha1-LmhELZ9k7HILjMieZEOsbKqVACk=",
+ "dev": true
+ },
+ "tough-cookie": {
+ "version": "2.3.4",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz",
+ "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "punycode": "^1.4.1"
+ },
+ "dependencies": {
+ "punycode": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
+ "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
+ "dev": true,
+ "optional": true
+ }
+ }
+ },
+ "tree-kill": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.1.tgz",
+ "integrity": "sha512-4hjqbObwlh2dLyW4tcz0Ymw0ggoaVDMveUB9w8kFSQScdRLo0gxO9J7WFcUBo+W3C1TLdFIEwNOWebgZZ0RH9Q==",
+ "dev": true
+ },
+ "trim-newlines": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz",
+ "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=",
+ "dev": true
+ },
+ "trim-right": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
+ "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
+ "dev": true
+ },
+ "true-case-path": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz",
+ "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "glob": "^7.1.2"
+ }
+ },
+ "ts-node": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-4.1.0.tgz",
+ "integrity": "sha512-xcZH12oVg9PShKhy3UHyDmuDLV3y7iKwX25aMVPt1SIXSuAfWkFiGPEkg+th8R4YKW/QCxDoW7lJdb15lx6QWg==",
+ "dev": true,
+ "requires": {
+ "arrify": "^1.0.0",
+ "chalk": "^2.3.0",
+ "diff": "^3.1.0",
+ "make-error": "^1.1.1",
+ "minimist": "^1.2.0",
+ "mkdirp": "^0.5.1",
+ "source-map-support": "^0.5.0",
+ "tsconfig": "^7.0.0",
+ "v8flags": "^3.0.0",
+ "yn": "^2.0.0"
+ },
+ "dependencies": {
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true
+ },
+ "minimist": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+ "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+ "dev": true
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ },
+ "source-map-support": {
+ "version": "0.5.10",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.10.tgz",
+ "integrity": "sha512-YfQ3tQFTK/yzlGJuX8pTwa4tifQj4QS2Mj7UegOu8jAz59MqIiMGPXxQhVQiIMNzayuUSF/jEuVnfFF5JqybmQ==",
+ "dev": true,
+ "requires": {
+ "buffer-from": "^1.0.0",
+ "source-map": "^0.6.0"
+ }
+ },
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ }
+ }
+ },
+ "tsconfig": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz",
+ "integrity": "sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw==",
+ "dev": true,
+ "requires": {
+ "@types/strip-bom": "^3.0.0",
+ "@types/strip-json-comments": "0.0.30",
+ "strip-bom": "^3.0.0",
+ "strip-json-comments": "^2.0.0"
+ },
+ "dependencies": {
+ "strip-bom": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+ "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
+ "dev": true
+ }
+ }
+ },
+ "tsickle": {
+ "version": "0.27.5",
+ "resolved": "https://registry.npmjs.org/tsickle/-/tsickle-0.27.5.tgz",
+ "integrity": "sha512-NP+CjM1EXza/M8mOXBLH3vkFEJiu1zfEAlC5WdJxHPn8l96QPz5eooP6uAgYtw1CcKfuSyIiheNUdKxtDWCNeg==",
+ "dev": true,
+ "requires": {
+ "minimist": "^1.2.0",
+ "mkdirp": "^0.5.1",
+ "source-map": "^0.6.0",
+ "source-map-support": "^0.5.0"
+ },
+ "dependencies": {
+ "minimist": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+ "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+ "dev": true
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ },
+ "source-map-support": {
+ "version": "0.5.10",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.10.tgz",
+ "integrity": "sha512-YfQ3tQFTK/yzlGJuX8pTwa4tifQj4QS2Mj7UegOu8jAz59MqIiMGPXxQhVQiIMNzayuUSF/jEuVnfFF5JqybmQ==",
+ "dev": true,
+ "requires": {
+ "buffer-from": "^1.0.0",
+ "source-map": "^0.6.0"
+ }
+ }
+ }
+ },
+ "tslib": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz",
+ "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ=="
+ },
+ "tslint": {
+ "version": "5.9.1",
+ "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.9.1.tgz",
+ "integrity": "sha1-ElX4ej/1frCw4fDmEKi0dIBGya4=",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "^6.22.0",
+ "builtin-modules": "^1.1.1",
+ "chalk": "^2.3.0",
+ "commander": "^2.12.1",
+ "diff": "^3.2.0",
+ "glob": "^7.1.1",
+ "js-yaml": "^3.7.0",
+ "minimatch": "^3.0.4",
+ "resolve": "^1.3.2",
+ "semver": "^5.3.0",
+ "tslib": "^1.8.0",
+ "tsutils": "^2.12.1"
+ },
+ "dependencies": {
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ }
+ }
+ },
+ "tsscmp": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz",
+ "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==",
+ "dev": true,
+ "optional": true
+ },
+ "tsutils": {
+ "version": "2.29.0",
+ "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz",
+ "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==",
+ "dev": true,
+ "requires": {
+ "tslib": "^1.8.1"
+ }
+ },
+ "tty-browserify": {
+ "version": "0.0.0",
+ "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz",
+ "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=",
+ "dev": true
+ },
+ "tunnel-agent": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
+ "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "tweetnacl": {
+ "version": "0.14.5",
+ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
+ "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
+ "dev": true
+ },
+ "type-check": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "~1.1.2"
+ }
+ },
+ "type-is": {
+ "version": "1.6.16",
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz",
+ "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==",
+ "dev": true,
+ "requires": {
+ "media-typer": "0.3.0",
+ "mime-types": "~2.1.18"
+ }
+ },
+ "typedarray": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
+ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
+ "dev": true
+ },
+ "typescript": {
+ "version": "2.5.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.5.3.tgz",
+ "integrity": "sha512-ptLSQs2S4QuS6/OD1eAKG+S5G8QQtrU5RT32JULdZQtM1L3WTi34Wsu48Yndzi8xsObRAB9RPt/KhA9wlpEF6w==",
+ "dev": true
+ },
+ "uglify-js": {
+ "version": "3.4.9",
+ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz",
+ "integrity": "sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q==",
+ "dev": true,
+ "requires": {
+ "commander": "~2.17.1",
+ "source-map": "~0.6.1"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ }
+ }
+ },
+ "uglify-to-browserify": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz",
+ "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=",
+ "dev": true,
+ "optional": true
+ },
+ "uglifyjs-webpack-plugin": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.3.0.tgz",
+ "integrity": "sha512-ovHIch0AMlxjD/97j9AYovZxG5wnHOPkL7T1GKochBADp/Zwc44pEWNqpKl1Loupp1WhFg7SlYmHZRUfdAacgw==",
+ "dev": true,
+ "requires": {
+ "cacache": "^10.0.4",
+ "find-cache-dir": "^1.0.0",
+ "schema-utils": "^0.4.5",
+ "serialize-javascript": "^1.4.0",
+ "source-map": "^0.6.1",
+ "uglify-es": "^3.3.4",
+ "webpack-sources": "^1.1.0",
+ "worker-farm": "^1.5.2"
+ },
+ "dependencies": {
+ "commander": {
+ "version": "2.13.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz",
+ "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==",
+ "dev": true
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ },
+ "uglify-es": {
+ "version": "3.3.9",
+ "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz",
+ "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==",
+ "dev": true,
+ "requires": {
+ "commander": "~2.13.0",
+ "source-map": "~0.6.1"
+ }
+ }
+ }
+ },
+ "ultron": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz",
+ "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==",
+ "dev": true
+ },
+ "underscore": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz",
+ "integrity": "sha1-a7rwh3UA02vjTsqlhODbn+8DUgk=",
+ "dev": true
+ },
+ "union-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz",
+ "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=",
+ "dev": true,
+ "requires": {
+ "arr-union": "^3.1.0",
+ "get-value": "^2.0.6",
+ "is-extendable": "^0.1.1",
+ "set-value": "^0.4.3"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ },
+ "set-value": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz",
+ "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "^2.0.1",
+ "is-extendable": "^0.1.1",
+ "is-plain-object": "^2.0.1",
+ "to-object-path": "^0.3.0"
+ }
+ }
+ }
+ },
+ "unique-filename": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz",
+ "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==",
+ "dev": true,
+ "requires": {
+ "unique-slug": "^2.0.0"
+ }
+ },
+ "unique-slug": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.1.tgz",
+ "integrity": "sha512-n9cU6+gITaVu7VGj1Z8feKMmfAjEAQGhwD9fE3zvpRRa0wEIx8ODYkVGfSc94M2OX00tUFV8wH3zYbm1I8mxFg==",
+ "dev": true,
+ "requires": {
+ "imurmurhash": "^0.1.4"
+ }
+ },
+ "universalify": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
+ "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
+ "dev": true
+ },
+ "unpipe": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+ "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=",
+ "dev": true
+ },
+ "unset-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
+ "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
+ "dev": true,
+ "requires": {
+ "has-value": "^0.3.1",
+ "isobject": "^3.0.0"
+ },
+ "dependencies": {
+ "has-value": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
+ "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
+ "dev": true,
+ "requires": {
+ "get-value": "^2.0.3",
+ "has-values": "^0.1.4",
+ "isobject": "^2.0.0"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+ "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+ "dev": true,
+ "requires": {
+ "isarray": "1.0.0"
+ }
+ }
+ }
+ },
+ "has-values": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
+ "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
+ "dev": true
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ }
+ }
+ },
+ "upath": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz",
+ "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==",
+ "dev": true
+ },
+ "upper-case": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz",
+ "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=",
+ "dev": true
+ },
+ "uri-js": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
+ "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
+ "dev": true,
+ "requires": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "urix": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
+ "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
+ "dev": true
+ },
+ "url": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz",
+ "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=",
+ "dev": true,
+ "requires": {
+ "punycode": "1.3.2",
+ "querystring": "0.2.0"
+ },
+ "dependencies": {
+ "punycode": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
+ "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=",
+ "dev": true
+ }
+ }
+ },
+ "url-loader": {
+ "version": "0.6.2",
+ "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-0.6.2.tgz",
+ "integrity": "sha512-h3qf9TNn53BpuXTTcpC+UehiRrl0Cv45Yr/xWayApjw6G8Bg2dGke7rIwDQ39piciWCWrC+WiqLjOh3SUp9n0Q==",
+ "dev": true,
+ "requires": {
+ "loader-utils": "^1.0.2",
+ "mime": "^1.4.1",
+ "schema-utils": "^0.3.0"
+ },
+ "dependencies": {
+ "ajv": {
+ "version": "5.5.2",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
+ "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
+ "dev": true,
+ "requires": {
+ "co": "^4.6.0",
+ "fast-deep-equal": "^1.0.0",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.3.0"
+ }
+ },
+ "schema-utils": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz",
+ "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=",
+ "dev": true,
+ "requires": {
+ "ajv": "^5.0.0"
+ }
+ }
+ }
+ },
+ "url-parse": {
+ "version": "1.4.4",
+ "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.4.tgz",
+ "integrity": "sha512-/92DTTorg4JjktLNLe6GPS2/RvAd/RGr6LuktmWSMLEOa6rjnlrFXNgSbSmkNvCoL2T028A0a1JaJLzRMlFoHg==",
+ "dev": true,
+ "requires": {
+ "querystringify": "^2.0.0",
+ "requires-port": "^1.0.0"
+ }
+ },
+ "use": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
+ "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==",
+ "dev": true
+ },
+ "useragent": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.2.1.tgz",
+ "integrity": "sha1-z1k+9PLRdYdei7ZY6pLhik/QbY4=",
+ "dev": true,
+ "requires": {
+ "lru-cache": "2.2.x",
+ "tmp": "0.0.x"
+ },
+ "dependencies": {
+ "lru-cache": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.2.4.tgz",
+ "integrity": "sha1-bGWGGb7PFAMdDQtZSxYELOTcBj0=",
+ "dev": true
+ }
+ }
+ },
+ "util": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz",
+ "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==",
+ "dev": true,
+ "requires": {
+ "inherits": "2.0.3"
+ }
+ },
+ "util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
+ "dev": true
+ },
+ "utila": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz",
+ "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=",
+ "dev": true
+ },
+ "utils-merge": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
+ "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=",
+ "dev": true
+ },
+ "uuid": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
+ "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==",
+ "dev": true
+ },
+ "uws": {
+ "version": "9.14.0",
+ "resolved": "https://registry.npmjs.org/uws/-/uws-9.14.0.tgz",
+ "integrity": "sha512-HNMztPP5A1sKuVFmdZ6BPVpBQd5bUjNC8EFMFiICK+oho/OQsAJy5hnIx4btMHiOk8j04f/DbIlqnEZ9d72dqg==",
+ "dev": true,
+ "optional": true
+ },
+ "v8flags": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.1.2.tgz",
+ "integrity": "sha512-MtivA7GF24yMPte9Rp/BWGCYQNaUj86zeYxV/x2RRJMKagImbbv3u8iJC57lNhWLPcGLJmHcHmFWkNsplbbLWw==",
+ "dev": true,
+ "requires": {
+ "homedir-polyfill": "^1.0.1"
+ }
+ },
+ "validate-npm-package-license": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
+ "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
+ "dev": true,
+ "requires": {
+ "spdx-correct": "^3.0.0",
+ "spdx-expression-parse": "^3.0.0"
+ }
+ },
+ "vary": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
+ "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=",
+ "dev": true
+ },
+ "verror": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
+ "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
+ "dev": true,
+ "requires": {
+ "assert-plus": "^1.0.0",
+ "core-util-is": "1.0.2",
+ "extsprintf": "^1.2.0"
+ },
+ "dependencies": {
+ "assert-plus": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+ "dev": true
+ }
+ }
+ },
+ "vlq": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/vlq/-/vlq-0.2.3.tgz",
+ "integrity": "sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==",
+ "dev": true
+ },
+ "vm-browserify": {
+ "version": "0.0.4",
+ "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz",
+ "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=",
+ "dev": true,
+ "requires": {
+ "indexof": "0.0.1"
+ }
+ },
+ "void-elements": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz",
+ "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=",
+ "dev": true
+ },
+ "watchpack": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz",
+ "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==",
+ "dev": true,
+ "requires": {
+ "chokidar": "^2.0.2",
+ "graceful-fs": "^4.1.2",
+ "neo-async": "^2.5.0"
+ },
+ "dependencies": {
+ "anymatch": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
+ "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
+ "dev": true,
+ "requires": {
+ "micromatch": "^3.1.4",
+ "normalize-path": "^2.1.1"
+ }
+ },
+ "arr-diff": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+ "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
+ "dev": true
+ },
+ "array-unique": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
+ "dev": true
+ },
+ "braces": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+ "dev": true,
+ "requires": {
+ "arr-flatten": "^1.1.0",
+ "array-unique": "^0.3.2",
+ "extend-shallow": "^2.0.1",
+ "fill-range": "^4.0.0",
+ "isobject": "^3.0.1",
+ "repeat-element": "^1.1.2",
+ "snapdragon": "^0.8.1",
+ "snapdragon-node": "^2.0.1",
+ "split-string": "^3.0.2",
+ "to-regex": "^3.0.1"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ }
+ }
+ },
+ "chokidar": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz",
+ "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==",
+ "dev": true,
+ "requires": {
+ "anymatch": "^2.0.0",
+ "async-each": "^1.0.0",
+ "braces": "^2.3.0",
+ "fsevents": "^1.2.2",
+ "glob-parent": "^3.1.0",
+ "inherits": "^2.0.1",
+ "is-binary-path": "^1.0.0",
+ "is-glob": "^4.0.0",
+ "lodash.debounce": "^4.0.8",
+ "normalize-path": "^2.1.1",
+ "path-is-absolute": "^1.0.0",
+ "readdirp": "^2.0.0",
+ "upath": "^1.0.5"
+ }
+ },
+ "expand-brackets": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
+ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
+ "dev": true,
+ "requires": {
+ "debug": "^2.3.3",
+ "define-property": "^0.2.5",
+ "extend-shallow": "^2.0.1",
+ "posix-character-classes": "^0.1.0",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^0.1.0"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "dev": true,
+ "requires": {
+ "kind-of": "^3.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "dev": true,
+ "requires": {
+ "kind-of": "^3.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "^0.1.6",
+ "is-data-descriptor": "^0.1.4",
+ "kind-of": "^5.0.0"
+ }
+ },
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true
+ }
+ }
+ },
+ "extglob": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
+ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
+ "dev": true,
+ "requires": {
+ "array-unique": "^0.3.2",
+ "define-property": "^1.0.0",
+ "expand-brackets": "^2.1.4",
+ "extend-shallow": "^2.0.1",
+ "fragment-cache": "^0.2.1",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^1.0.0"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ }
+ }
+ },
+ "fill-range": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "^2.0.1",
+ "is-number": "^3.0.0",
+ "repeat-string": "^1.6.1",
+ "to-regex-range": "^2.1.0"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ }
+ }
+ },
+ "glob-parent": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
+ "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
+ "dev": true,
+ "requires": {
+ "is-glob": "^3.1.0",
+ "path-dirname": "^1.0.0"
+ },
+ "dependencies": {
+ "is-glob": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "^2.1.0"
+ }
+ }
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "^1.0.0",
+ "is-data-descriptor": "^1.0.0",
+ "kind-of": "^6.0.2"
+ }
+ },
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+ "dev": true
+ },
+ "is-glob": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz",
+ "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "^2.1.1"
+ }
+ },
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "dev": true,
+ "requires": {
+ "kind-of": "^3.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ },
+ "kind-of": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+ "dev": true
+ },
+ "micromatch": {
+ "version": "3.1.10",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+ "dev": true,
+ "requires": {
+ "arr-diff": "^4.0.0",
+ "array-unique": "^0.3.2",
+ "braces": "^2.3.1",
+ "define-property": "^2.0.2",
+ "extend-shallow": "^3.0.2",
+ "extglob": "^2.0.4",
+ "fragment-cache": "^0.2.1",
+ "kind-of": "^6.0.2",
+ "nanomatch": "^1.2.9",
+ "object.pick": "^1.3.0",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.2"
+ }
+ }
+ }
+ },
+ "wbuf": {
+ "version": "1.7.3",
+ "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz",
+ "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==",
+ "dev": true,
+ "requires": {
+ "minimalistic-assert": "^1.0.0"
+ }
+ },
+ "webdriver-js-extender": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/webdriver-js-extender/-/webdriver-js-extender-1.0.0.tgz",
+ "integrity": "sha1-gcUzqeM9W/tZe05j4s2yW1R3dRU=",
+ "dev": true,
+ "requires": {
+ "@types/selenium-webdriver": "^2.53.35",
+ "selenium-webdriver": "^2.53.2"
+ },
+ "dependencies": {
+ "adm-zip": {
+ "version": "0.4.4",
+ "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.4.tgz",
+ "integrity": "sha1-ph7VrmkFw66lizplfSUDMJEFJzY=",
+ "dev": true
+ },
+ "sax": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/sax/-/sax-0.6.1.tgz",
+ "integrity": "sha1-VjsZx8HeiS4Jv8Ty/DDjwn8JUrk=",
+ "dev": true
+ },
+ "selenium-webdriver": {
+ "version": "2.53.3",
+ "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-2.53.3.tgz",
+ "integrity": "sha1-0p/1qVff8aG0ncRXdW5OS/vc4IU=",
+ "dev": true,
+ "requires": {
+ "adm-zip": "0.4.4",
+ "rimraf": "^2.2.8",
+ "tmp": "0.0.24",
+ "ws": "^1.0.1",
+ "xml2js": "0.4.4"
+ }
+ },
+ "tmp": {
+ "version": "0.0.24",
+ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.24.tgz",
+ "integrity": "sha1-1qXhmNFKmDXMby18PZ4wJCjIzxI=",
+ "dev": true
+ },
+ "ultron": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz",
+ "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=",
+ "dev": true
+ },
+ "ws": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.5.tgz",
+ "integrity": "sha512-o3KqipXNUdS7wpQzBHSe180lBGO60SoK0yVo3CYJgb2MkobuWuBX6dhkYP5ORCLd55y+SaflMOV5fqAB53ux4w==",
+ "dev": true,
+ "requires": {
+ "options": ">=0.0.5",
+ "ultron": "1.0.x"
+ }
+ },
+ "xml2js": {
+ "version": "0.4.4",
+ "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.4.tgz",
+ "integrity": "sha1-MREBAAMAiuGSQOuhdJe1fHKcVV0=",
+ "dev": true,
+ "requires": {
+ "sax": "0.6.x",
+ "xmlbuilder": ">=1.0.0"
+ }
+ }
+ }
+ },
+ "webpack": {
+ "version": "3.11.0",
+ "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.11.0.tgz",
+ "integrity": "sha512-3kOFejWqj5ISpJk4Qj/V7w98h9Vl52wak3CLiw/cDOfbVTq7FeoZ0SdoHHY9PYlHr50ZS42OfvzE2vB4nncKQg==",
+ "dev": true,
+ "requires": {
+ "acorn": "^5.0.0",
+ "acorn-dynamic-import": "^2.0.0",
+ "ajv": "^6.1.0",
+ "ajv-keywords": "^3.1.0",
+ "async": "^2.1.2",
+ "enhanced-resolve": "^3.4.0",
+ "escope": "^3.6.0",
+ "interpret": "^1.0.0",
+ "json-loader": "^0.5.4",
+ "json5": "^0.5.1",
+ "loader-runner": "^2.3.0",
+ "loader-utils": "^1.1.0",
+ "memory-fs": "~0.4.1",
+ "mkdirp": "~0.5.0",
+ "node-libs-browser": "^2.0.0",
+ "source-map": "^0.5.3",
+ "supports-color": "^4.2.1",
+ "tapable": "^0.2.7",
+ "uglifyjs-webpack-plugin": "^0.4.6",
+ "watchpack": "^1.4.0",
+ "webpack-sources": "^1.0.1",
+ "yargs": "^8.0.2"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+ "dev": true
+ },
+ "camelcase": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz",
+ "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=",
+ "dev": true
+ },
+ "cliui": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz",
+ "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=",
+ "dev": true,
+ "requires": {
+ "center-align": "^0.1.1",
+ "right-align": "^0.1.1",
+ "wordwrap": "0.0.2"
+ }
+ },
+ "load-json-file": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz",
+ "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.2",
+ "parse-json": "^2.2.0",
+ "pify": "^2.0.0",
+ "strip-bom": "^3.0.0"
+ }
+ },
+ "os-locale": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz",
+ "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==",
+ "dev": true,
+ "requires": {
+ "execa": "^0.7.0",
+ "lcid": "^1.0.0",
+ "mem": "^1.1.0"
+ }
+ },
+ "path-type": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz",
+ "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=",
+ "dev": true,
+ "requires": {
+ "pify": "^2.0.0"
+ }
+ },
+ "pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+ "dev": true
+ },
+ "read-pkg": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz",
+ "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=",
+ "dev": true,
+ "requires": {
+ "load-json-file": "^2.0.0",
+ "normalize-package-data": "^2.3.2",
+ "path-type": "^2.0.0"
+ }
+ },
+ "read-pkg-up": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz",
+ "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=",
+ "dev": true,
+ "requires": {
+ "find-up": "^2.0.0",
+ "read-pkg": "^2.0.0"
+ }
+ },
+ "string-width": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
+ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+ "dev": true,
+ "requires": {
+ "is-fullwidth-code-point": "^2.0.0",
+ "strip-ansi": "^4.0.0"
+ },
+ "dependencies": {
+ "is-fullwidth-code-point": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+ "dev": true
+ },
+ "strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^3.0.0"
+ }
+ }
+ }
+ },
+ "strip-bom": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+ "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
+ "dev": true
+ },
+ "uglify-js": {
+ "version": "2.8.29",
+ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz",
+ "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=",
+ "dev": true,
+ "requires": {
+ "source-map": "~0.5.1",
+ "uglify-to-browserify": "~1.0.0",
+ "yargs": "~3.10.0"
+ },
+ "dependencies": {
+ "yargs": {
+ "version": "3.10.0",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz",
+ "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=",
+ "dev": true,
+ "requires": {
+ "camelcase": "^1.0.2",
+ "cliui": "^2.1.0",
+ "decamelize": "^1.0.0",
+ "window-size": "0.1.0"
+ }
+ }
+ }
+ },
+ "uglifyjs-webpack-plugin": {
+ "version": "0.4.6",
+ "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz",
+ "integrity": "sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=",
+ "dev": true,
+ "requires": {
+ "source-map": "^0.5.6",
+ "uglify-js": "^2.8.29",
+ "webpack-sources": "^1.0.1"
+ }
+ },
+ "which-module": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
+ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
+ "dev": true
+ },
+ "y18n": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
+ "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=",
+ "dev": true
+ },
+ "yargs": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz",
+ "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=",
+ "dev": true,
+ "requires": {
+ "camelcase": "^4.1.0",
+ "cliui": "^3.2.0",
+ "decamelize": "^1.1.1",
+ "get-caller-file": "^1.0.1",
+ "os-locale": "^2.0.0",
+ "read-pkg-up": "^2.0.0",
+ "require-directory": "^2.1.1",
+ "require-main-filename": "^1.0.1",
+ "set-blocking": "^2.0.0",
+ "string-width": "^2.0.0",
+ "which-module": "^2.0.0",
+ "y18n": "^3.2.1",
+ "yargs-parser": "^7.0.0"
+ },
+ "dependencies": {
+ "camelcase": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
+ "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
+ "dev": true
+ },
+ "cliui": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
+ "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=",
+ "dev": true,
+ "requires": {
+ "string-width": "^1.0.1",
+ "strip-ansi": "^3.0.1",
+ "wrap-ansi": "^2.0.0"
+ },
+ "dependencies": {
+ "string-width": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+ "dev": true,
+ "requires": {
+ "code-point-at": "^1.0.0",
+ "is-fullwidth-code-point": "^1.0.0",
+ "strip-ansi": "^3.0.0"
+ }
+ }
+ }
+ }
+ }
+ },
+ "yargs-parser": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz",
+ "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=",
+ "dev": true,
+ "requires": {
+ "camelcase": "^4.1.0"
+ },
+ "dependencies": {
+ "camelcase": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
+ "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
+ "dev": true
+ }
+ }
+ }
+ }
+ },
+ "webpack-dev-middleware": {
+ "version": "1.12.2",
+ "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-1.12.2.tgz",
+ "integrity": "sha512-FCrqPy1yy/sN6U/SaEZcHKRXGlqU0DUaEBL45jkUYoB8foVb6wCnbIJ1HKIx+qUFTW+3JpVcCJCxZ8VATL4e+A==",
+ "dev": true,
+ "requires": {
+ "memory-fs": "~0.4.1",
+ "mime": "^1.5.0",
+ "path-is-absolute": "^1.0.0",
+ "range-parser": "^1.0.3",
+ "time-stamp": "^2.0.0"
+ }
+ },
+ "webpack-dev-server": {
+ "version": "2.11.3",
+ "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-2.11.3.tgz",
+ "integrity": "sha512-Qz22YEFhWx+M2vvJ+rQppRv39JA0h5NNbOOdODApdX6iZ52Diz7vTPXjF7kJlfn+Uc24Qr48I3SZ9yncQwRycg==",
+ "dev": true,
+ "requires": {
+ "ansi-html": "0.0.7",
+ "array-includes": "^3.0.3",
+ "bonjour": "^3.5.0",
+ "chokidar": "^2.0.0",
+ "compression": "^1.5.2",
+ "connect-history-api-fallback": "^1.3.0",
+ "debug": "^3.1.0",
+ "del": "^3.0.0",
+ "express": "^4.16.2",
+ "html-entities": "^1.2.0",
+ "http-proxy-middleware": "~0.17.4",
+ "import-local": "^1.0.0",
+ "internal-ip": "1.2.0",
+ "ip": "^1.1.5",
+ "killable": "^1.0.0",
+ "loglevel": "^1.4.1",
+ "opn": "^5.1.0",
+ "portfinder": "^1.0.9",
+ "selfsigned": "^1.9.1",
+ "serve-index": "^1.7.2",
+ "sockjs": "0.3.19",
+ "sockjs-client": "1.1.5",
+ "spdy": "^3.4.1",
+ "strip-ansi": "^3.0.0",
+ "supports-color": "^5.1.0",
+ "webpack-dev-middleware": "1.12.2",
+ "yargs": "6.6.0"
+ },
+ "dependencies": {
+ "anymatch": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
+ "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
+ "dev": true,
+ "requires": {
+ "micromatch": "^3.1.4",
+ "normalize-path": "^2.1.1"
+ }
+ },
+ "arr-diff": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+ "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
+ "dev": true
+ },
+ "array-unique": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
+ "dev": true
+ },
+ "braces": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+ "dev": true,
+ "requires": {
+ "arr-flatten": "^1.1.0",
+ "array-unique": "^0.3.2",
+ "extend-shallow": "^2.0.1",
+ "fill-range": "^4.0.0",
+ "isobject": "^3.0.1",
+ "repeat-element": "^1.1.2",
+ "snapdragon": "^0.8.1",
+ "snapdragon-node": "^2.0.1",
+ "split-string": "^3.0.2",
+ "to-regex": "^3.0.1"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ }
+ }
+ },
+ "camelcase": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz",
+ "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=",
+ "dev": true
+ },
+ "chokidar": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz",
+ "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==",
+ "dev": true,
+ "requires": {
+ "anymatch": "^2.0.0",
+ "async-each": "^1.0.0",
+ "braces": "^2.3.0",
+ "fsevents": "^1.2.2",
+ "glob-parent": "^3.1.0",
+ "inherits": "^2.0.1",
+ "is-binary-path": "^1.0.0",
+ "is-glob": "^4.0.0",
+ "lodash.debounce": "^4.0.8",
+ "normalize-path": "^2.1.1",
+ "path-is-absolute": "^1.0.0",
+ "readdirp": "^2.0.0",
+ "upath": "^1.0.5"
+ }
+ },
+ "debug": {
+ "version": "3.2.6",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
+ "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
+ "dev": true,
+ "requires": {
+ "ms": "^2.1.1"
+ },
+ "dependencies": {
+ "ms": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
+ "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
+ "dev": true
+ }
+ }
+ },
+ "expand-brackets": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
+ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
+ "dev": true,
+ "requires": {
+ "debug": "^2.3.3",
+ "define-property": "^0.2.5",
+ "extend-shallow": "^2.0.1",
+ "posix-character-classes": "^0.1.0",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.1"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^0.1.0"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "dev": true,
+ "requires": {
+ "kind-of": "^3.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "dev": true,
+ "requires": {
+ "kind-of": "^3.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "^0.1.6",
+ "is-data-descriptor": "^0.1.4",
+ "kind-of": "^5.0.0"
+ }
+ },
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true
+ }
+ }
+ },
+ "extglob": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
+ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
+ "dev": true,
+ "requires": {
+ "array-unique": "^0.3.2",
+ "define-property": "^1.0.0",
+ "expand-brackets": "^2.1.4",
+ "extend-shallow": "^2.0.1",
+ "fragment-cache": "^0.2.1",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^1.0.0"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ }
+ }
+ },
+ "fill-range": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "^2.0.1",
+ "is-number": "^3.0.0",
+ "repeat-string": "^1.6.1",
+ "to-regex-range": "^2.1.0"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ }
+ }
+ },
+ "glob-parent": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
+ "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
+ "dev": true,
+ "requires": {
+ "is-glob": "^3.1.0",
+ "path-dirname": "^1.0.0"
+ },
+ "dependencies": {
+ "is-glob": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "^2.1.0"
+ }
+ }
+ }
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "^1.0.0",
+ "is-data-descriptor": "^1.0.0",
+ "kind-of": "^6.0.2"
+ }
+ },
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+ "dev": true
+ },
+ "is-glob": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz",
+ "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "^2.1.1"
+ }
+ },
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "dev": true,
+ "requires": {
+ "kind-of": "^3.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ },
+ "kind-of": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+ "dev": true
+ },
+ "micromatch": {
+ "version": "3.1.10",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+ "dev": true,
+ "requires": {
+ "arr-diff": "^4.0.0",
+ "array-unique": "^0.3.2",
+ "braces": "^2.3.1",
+ "define-property": "^2.0.2",
+ "extend-shallow": "^3.0.2",
+ "extglob": "^2.0.4",
+ "fragment-cache": "^0.2.1",
+ "kind-of": "^6.0.2",
+ "nanomatch": "^1.2.9",
+ "object.pick": "^1.3.0",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.2"
+ }
+ },
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ },
+ "y18n": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
+ "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=",
+ "dev": true
+ },
+ "yargs": {
+ "version": "6.6.0",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz",
+ "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=",
+ "dev": true,
+ "requires": {
+ "camelcase": "^3.0.0",
+ "cliui": "^3.2.0",
+ "decamelize": "^1.1.1",
+ "get-caller-file": "^1.0.1",
+ "os-locale": "^1.4.0",
+ "read-pkg-up": "^1.0.1",
+ "require-directory": "^2.1.1",
+ "require-main-filename": "^1.0.1",
+ "set-blocking": "^2.0.0",
+ "string-width": "^1.0.2",
+ "which-module": "^1.0.0",
+ "y18n": "^3.2.1",
+ "yargs-parser": "^4.2.0"
+ }
+ },
+ "yargs-parser": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz",
+ "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=",
+ "dev": true,
+ "requires": {
+ "camelcase": "^3.0.0"
+ }
+ }
+ }
+ },
+ "webpack-merge": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.1.tgz",
+ "integrity": "sha512-4p8WQyS98bUJcCvFMbdGZyZmsKuWjWVnVHnAS3FFg0HDaRVrPbkivx2RYCre8UiemD67RsiFFLfn4JhLAin8Vw==",
+ "dev": true,
+ "requires": {
+ "lodash": "^4.17.5"
+ }
+ },
+ "webpack-sources": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz",
+ "integrity": "sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==",
+ "dev": true,
+ "requires": {
+ "source-list-map": "^2.0.0",
+ "source-map": "~0.6.1"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ }
+ }
+ },
+ "webpack-subresource-integrity": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-1.3.2.tgz",
+ "integrity": "sha512-VpBtk0Ha1W0GebTzPj3Y8UqbmPDp+HqGlegRv+hS8g8/x818dw9NuEfJEOp5CF6zTPs3KF6aqknVu52Bh5h1eQ==",
+ "dev": true,
+ "requires": {
+ "webpack-sources": "^1.3.0"
+ }
+ },
+ "websocket-driver": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz",
+ "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=",
+ "dev": true,
+ "requires": {
+ "http-parser-js": ">=0.4.0",
+ "websocket-extensions": ">=0.1.1"
+ }
+ },
+ "websocket-extensions": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz",
+ "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==",
+ "dev": true
+ },
+ "when": {
+ "version": "3.6.4",
+ "resolved": "https://registry.npmjs.org/when/-/when-3.6.4.tgz",
+ "integrity": "sha1-RztRfsFZ4rhQBUl6E5g/CVQS404=",
+ "dev": true
+ },
+ "which": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+ "dev": true,
+ "requires": {
+ "isexe": "^2.0.0"
+ }
+ },
+ "which-module": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz",
+ "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=",
+ "dev": true
+ },
+ "wide-align": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz",
+ "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==",
+ "dev": true,
+ "requires": {
+ "string-width": "^1.0.2 || 2"
+ }
+ },
+ "window-size": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz",
+ "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=",
+ "dev": true
+ },
+ "with-callback": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/with-callback/-/with-callback-1.0.2.tgz",
+ "integrity": "sha1-oJYpuakgAo1yFAT7Q1vc/1yRvCE=",
+ "dev": true,
+ "optional": true
+ },
+ "wordwrap": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz",
+ "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=",
+ "dev": true
+ },
+ "worker-farm": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.6.0.tgz",
+ "integrity": "sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ==",
+ "dev": true,
+ "requires": {
+ "errno": "~0.1.7"
+ }
+ },
+ "wrap-ansi": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
+ "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
+ "dev": true,
+ "requires": {
+ "string-width": "^1.0.1",
+ "strip-ansi": "^3.0.1"
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ },
+ "ws": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz",
+ "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==",
+ "dev": true,
+ "requires": {
+ "async-limiter": "~1.0.0",
+ "safe-buffer": "~5.1.0",
+ "ultron": "~1.1.0"
+ }
+ },
+ "xml2js": {
+ "version": "0.4.19",
+ "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz",
+ "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==",
+ "dev": true,
+ "requires": {
+ "sax": ">=0.6.0",
+ "xmlbuilder": "~9.0.1"
+ },
+ "dependencies": {
+ "sax": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
+ "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==",
+ "dev": true
+ }
+ }
+ },
+ "xmlbuilder": {
+ "version": "9.0.7",
+ "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz",
+ "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=",
+ "dev": true
+ },
+ "xmlhttprequest-ssl": {
+ "version": "1.5.5",
+ "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz",
+ "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=",
+ "dev": true
+ },
+ "xregexp": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz",
+ "integrity": "sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM=",
+ "dev": true,
+ "optional": true
+ },
+ "xtend": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
+ "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=",
+ "dev": true
+ },
+ "xxhashjs": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/xxhashjs/-/xxhashjs-0.2.2.tgz",
+ "integrity": "sha512-AkTuIuVTET12tpsVIQo+ZU6f/qDmKuRUcjaqR+OIvm+aCBsZ95i7UVY5WJ9TMsSaZ0DA2WxoZ4acu0sPH+OKAw==",
+ "dev": true,
+ "requires": {
+ "cuint": "^0.2.2"
+ }
+ },
+ "y18n": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz",
+ "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==",
+ "dev": true
+ },
+ "yallist": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
+ "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
+ "dev": true
+ },
+ "yargs": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz",
+ "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "camelcase": "^3.0.0",
+ "cliui": "^3.2.0",
+ "decamelize": "^1.1.1",
+ "get-caller-file": "^1.0.1",
+ "os-locale": "^1.4.0",
+ "read-pkg-up": "^1.0.1",
+ "require-directory": "^2.1.1",
+ "require-main-filename": "^1.0.1",
+ "set-blocking": "^2.0.0",
+ "string-width": "^1.0.2",
+ "which-module": "^1.0.0",
+ "y18n": "^3.2.1",
+ "yargs-parser": "^5.0.0"
+ },
+ "dependencies": {
+ "camelcase": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz",
+ "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=",
+ "dev": true,
+ "optional": true
+ },
+ "y18n": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
+ "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=",
+ "dev": true,
+ "optional": true
+ }
+ }
+ },
+ "yargs-parser": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz",
+ "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "camelcase": "^3.0.0"
+ },
+ "dependencies": {
+ "camelcase": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz",
+ "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=",
+ "dev": true,
+ "optional": true
+ }
+ }
+ },
+ "yeast": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz",
+ "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=",
+ "dev": true
+ },
+ "yn": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz",
+ "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=",
+ "dev": true
+ },
+ "zone.js": {
+ "version": "0.8.29",
+ "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.8.29.tgz",
+ "integrity": "sha512-mla2acNCMkWXBD+c+yeUrBUrzOxYMNFdQ6FGfigGGtEVBPJx07BQeJekjt9DmH1FtZek4E9rE1eRR9qQpxACOQ=="
+ }
+ }
+}
diff --git a/spring-boot-angular/src/main/java/com/baeldung/angularclient/package.json b/spring-boot-angular/src/main/java/com/baeldung/angularclient/package.json
new file mode 100644
index 0000000000..a745cf671a
--- /dev/null
+++ b/spring-boot-angular/src/main/java/com/baeldung/angularclient/package.json
@@ -0,0 +1,48 @@
+{
+ "name": "sampleapp",
+ "version": "0.0.0",
+ "license": "MIT",
+ "scripts": {
+ "ng": "ng",
+ "start": "ng serve",
+ "build": "ng build --prod",
+ "test": "ng test",
+ "lint": "ng lint",
+ "e2e": "ng e2e"
+ },
+ "private": true,
+ "dependencies": {
+ "@angular/animations": "^5.2.0",
+ "@angular/common": "^5.2.0",
+ "@angular/compiler": "^5.2.0",
+ "@angular/core": "^5.2.0",
+ "@angular/forms": "^5.2.0",
+ "@angular/http": "^5.2.0",
+ "@angular/platform-browser": "^5.2.0",
+ "@angular/platform-browser-dynamic": "^5.2.0",
+ "@angular/router": "^5.2.0",
+ "core-js": "^2.4.1",
+ "rxjs": "^5.5.6",
+ "zone.js": "^0.8.19"
+ },
+ "devDependencies": {
+ "@angular/cli": "~1.7.4",
+ "@angular/compiler-cli": "^5.2.0",
+ "@angular/language-service": "^5.2.0",
+ "@types/jasmine": "~2.8.3",
+ "@types/jasminewd2": "~2.0.2",
+ "@types/node": "~6.0.60",
+ "codelyzer": "^4.0.1",
+ "jasmine-core": "~2.8.0",
+ "jasmine-spec-reporter": "~4.2.1",
+ "karma": "~2.0.0",
+ "karma-chrome-launcher": "~2.2.0",
+ "karma-coverage-istanbul-reporter": "^1.2.1",
+ "karma-jasmine": "~1.1.0",
+ "karma-jasmine-html-reporter": "^0.2.2",
+ "protractor": "~5.1.2",
+ "ts-node": "~4.1.0",
+ "tslint": "~5.9.1",
+ "typescript": "~2.5.3"
+ }
+}
diff --git a/spring-boot-angular/src/main/java/com/baeldung/angularclient/protractor.conf.js b/spring-boot-angular/src/main/java/com/baeldung/angularclient/protractor.conf.js
new file mode 100644
index 0000000000..7ee3b5ee86
--- /dev/null
+++ b/spring-boot-angular/src/main/java/com/baeldung/angularclient/protractor.conf.js
@@ -0,0 +1,28 @@
+// Protractor configuration file, see link for more information
+// https://github.com/angular/protractor/blob/master/lib/config.ts
+
+const { SpecReporter } = require('jasmine-spec-reporter');
+
+exports.config = {
+ allScriptsTimeout: 11000,
+ specs: [
+ './e2e/**/*.e2e-spec.ts'
+ ],
+ capabilities: {
+ 'browserName': 'chrome'
+ },
+ directConnect: true,
+ baseUrl: 'http://localhost:4200/',
+ framework: 'jasmine',
+ jasmineNodeOpts: {
+ showColors: true,
+ defaultTimeoutInterval: 30000,
+ print: function() {}
+ },
+ onPrepare() {
+ require('ts-node').register({
+ project: 'e2e/tsconfig.e2e.json'
+ });
+ jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } }));
+ }
+};
diff --git a/spring-boot-angular/src/main/java/com/baeldung/angularclient/src/app/app-routing.module.ts b/spring-boot-angular/src/main/java/com/baeldung/angularclient/src/app/app-routing.module.ts
new file mode 100644
index 0000000000..ecc848ac37
--- /dev/null
+++ b/spring-boot-angular/src/main/java/com/baeldung/angularclient/src/app/app-routing.module.ts
@@ -0,0 +1,15 @@
+import { NgModule } from '@angular/core';
+import { Routes, RouterModule } from '@angular/router';
+import { UserListComponent } from './user-list/user-list.component';
+import { UserFormComponent } from './user-form/user-form.component';
+
+const routes: Routes = [
+ { path: 'users', component: UserListComponent },
+ { path: 'adduser', component: UserFormComponent }
+];
+
+@NgModule({
+ imports: [RouterModule.forRoot(routes)],
+ exports: [RouterModule]
+})
+export class AppRoutingModule { }
diff --git a/spring-boot-angular/src/main/java/com/baeldung/angularclient/src/app/app.component.css b/spring-boot-angular/src/main/java/com/baeldung/angularclient/src/app/app.component.css
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/spring-boot-angular/src/main/java/com/baeldung/angularclient/src/app/app.component.html b/spring-boot-angular/src/main/java/com/baeldung/angularclient/src/app/app.component.html
new file mode 100644
index 0000000000..144a77ffe3
--- /dev/null
+++ b/spring-boot-angular/src/main/java/com/baeldung/angularclient/src/app/app.component.html
@@ -0,0 +1,16 @@
+
\ No newline at end of file
diff --git a/spring-boot-angular/src/main/java/com/baeldung/angularclient/src/app/app.component.spec.ts b/spring-boot-angular/src/main/java/com/baeldung/angularclient/src/app/app.component.spec.ts
new file mode 100644
index 0000000000..e4ca195309
--- /dev/null
+++ b/spring-boot-angular/src/main/java/com/baeldung/angularclient/src/app/app.component.spec.ts
@@ -0,0 +1,31 @@
+import { TestBed, async } from '@angular/core/testing';
+import { RouterTestingModule } from '@angular/router/testing';
+import { AppComponent } from './app.component';
+describe('AppComponent', () => {
+ beforeEach(async(() => {
+ TestBed.configureTestingModule({
+ imports: [
+ RouterTestingModule
+ ],
+ declarations: [
+ AppComponent
+ ],
+ }).compileComponents();
+ }));
+ it('should create the app', async(() => {
+ const fixture = TestBed.createComponent(AppComponent);
+ const app = fixture.debugElement.componentInstance;
+ expect(app).toBeTruthy();
+ }));
+ it(`should have as title 'app'`, async(() => {
+ const fixture = TestBed.createComponent(AppComponent);
+ const app = fixture.debugElement.componentInstance;
+ expect(app.title).toEqual('app');
+ }));
+ it('should render title in a h1 tag', async(() => {
+ const fixture = TestBed.createComponent(AppComponent);
+ fixture.detectChanges();
+ const compiled = fixture.debugElement.nativeElement;
+ expect(compiled.querySelector('h1').textContent).toContain('Welcome to app!');
+ }));
+});
diff --git a/spring-boot-angular/src/main/java/com/baeldung/angularclient/src/app/app.component.ts b/spring-boot-angular/src/main/java/com/baeldung/angularclient/src/app/app.component.ts
new file mode 100644
index 0000000000..b14112f90b
--- /dev/null
+++ b/spring-boot-angular/src/main/java/com/baeldung/angularclient/src/app/app.component.ts
@@ -0,0 +1,15 @@
+import { Component } from '@angular/core';
+
+@Component({
+ selector: 'app-root',
+ templateUrl: './app.component.html',
+ styleUrls: ['./app.component.css']
+})
+export class AppComponent {
+
+ title: string;
+
+ constructor() {
+ this.title = 'Spring Boot - Angular Application';
+ }
+}
diff --git a/spring-boot-angular/src/main/java/com/baeldung/angularclient/src/app/app.module.ts b/spring-boot-angular/src/main/java/com/baeldung/angularclient/src/app/app.module.ts
new file mode 100644
index 0000000000..3c6c070d96
--- /dev/null
+++ b/spring-boot-angular/src/main/java/com/baeldung/angularclient/src/app/app.module.ts
@@ -0,0 +1,26 @@
+import { BrowserModule } from '@angular/platform-browser';
+import { NgModule } from '@angular/core';
+import { AppRoutingModule } from './app-routing.module';
+import { FormsModule } from '@angular/forms';
+import { HttpClientModule } from '@angular/common/http';
+import { AppComponent } from './app.component';
+import { UserListComponent } from './user-list/user-list.component';
+import { UserFormComponent } from './user-form/user-form.component';
+import { UserService } from './service/user.service';
+
+@NgModule({
+ declarations: [
+ AppComponent,
+ UserListComponent,
+ UserFormComponent
+ ],
+ imports: [
+ BrowserModule,
+ AppRoutingModule,
+ HttpClientModule,
+ FormsModule
+ ],
+ providers: [UserService],
+ bootstrap: [AppComponent]
+})
+export class AppModule { }
diff --git a/spring-boot-angular/src/main/java/com/baeldung/angularclient/src/app/model/user.ts b/spring-boot-angular/src/main/java/com/baeldung/angularclient/src/app/model/user.ts
new file mode 100644
index 0000000000..f78cda4bf9
--- /dev/null
+++ b/spring-boot-angular/src/main/java/com/baeldung/angularclient/src/app/model/user.ts
@@ -0,0 +1,5 @@
+export class User {
+ id: string;
+ name: string;
+ email: string;
+}
diff --git a/spring-boot-angular/src/main/java/com/baeldung/angularclient/src/app/service/user.service.spec.ts b/spring-boot-angular/src/main/java/com/baeldung/angularclient/src/app/service/user.service.spec.ts
new file mode 100644
index 0000000000..b26195c25d
--- /dev/null
+++ b/spring-boot-angular/src/main/java/com/baeldung/angularclient/src/app/service/user.service.spec.ts
@@ -0,0 +1,15 @@
+import { TestBed, inject } from '@angular/core/testing';
+
+import { UserService } from './user.service';
+
+describe('UserService', () => {
+ beforeEach(() => {
+ TestBed.configureTestingModule({
+ providers: [UserService]
+ });
+ });
+
+ it('should be created', inject([UserService], (service: UserService) => {
+ expect(service).toBeTruthy();
+ }));
+});
diff --git a/spring-boot-angular/src/main/java/com/baeldung/angularclient/src/app/service/user.service.ts b/spring-boot-angular/src/main/java/com/baeldung/angularclient/src/app/service/user.service.ts
new file mode 100644
index 0000000000..e587632017
--- /dev/null
+++ b/spring-boot-angular/src/main/java/com/baeldung/angularclient/src/app/service/user.service.ts
@@ -0,0 +1,22 @@
+import { Injectable } from '@angular/core';
+import { HttpClient, HttpHeaders } from '@angular/common/http';
+import { User } from '../model/user';
+import { Observable } from 'rxjs/Observable';
+
+@Injectable()
+export class UserService {
+
+ private usersUrl: string;
+
+ constructor(private http: HttpClient) {
+ this.usersUrl = 'http://localhost:8080/users';
+ }
+
+ public findAll(): Observable {
+ return this.http.get(this.usersUrl);
+ }
+
+ public save(user: User) {
+ return this.http.post(this.usersUrl, user);
+ }
+}
diff --git a/spring-boot-angular/src/main/java/com/baeldung/angularclient/src/app/user-form/user-form.component.css b/spring-boot-angular/src/main/java/com/baeldung/angularclient/src/app/user-form/user-form.component.css
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/spring-boot-angular/src/main/java/com/baeldung/angularclient/src/app/user-form/user-form.component.html b/spring-boot-angular/src/main/java/com/baeldung/angularclient/src/app/user-form/user-form.component.html
new file mode 100644
index 0000000000..7cf1800e50
--- /dev/null
+++ b/spring-boot-angular/src/main/java/com/baeldung/angularclient/src/app/user-form/user-form.component.html
@@ -0,0 +1,19 @@
+
\ No newline at end of file
diff --git a/spring-boot-angular/src/main/java/com/baeldung/angularclient/src/app/user-form/user-form.component.spec.ts b/spring-boot-angular/src/main/java/com/baeldung/angularclient/src/app/user-form/user-form.component.spec.ts
new file mode 100644
index 0000000000..9e613476f5
--- /dev/null
+++ b/spring-boot-angular/src/main/java/com/baeldung/angularclient/src/app/user-form/user-form.component.spec.ts
@@ -0,0 +1,25 @@
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { UserFormComponent } from './user-form.component';
+
+describe('UserFormComponent', () => {
+ let component: UserFormComponent;
+ let fixture: ComponentFixture;
+
+ beforeEach(async(() => {
+ TestBed.configureTestingModule({
+ declarations: [ UserFormComponent ]
+ })
+ .compileComponents();
+ }));
+
+ beforeEach(() => {
+ fixture = TestBed.createComponent(UserFormComponent);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ });
+
+ it('should create', () => {
+ expect(component).toBeTruthy();
+ });
+});
diff --git a/spring-boot-angular/src/main/java/com/baeldung/angularclient/src/app/user-form/user-form.component.ts b/spring-boot-angular/src/main/java/com/baeldung/angularclient/src/app/user-form/user-form.component.ts
new file mode 100644
index 0000000000..869d53aede
--- /dev/null
+++ b/spring-boot-angular/src/main/java/com/baeldung/angularclient/src/app/user-form/user-form.component.ts
@@ -0,0 +1,26 @@
+import { Component } from '@angular/core';
+import { ActivatedRoute, Router } from '@angular/router';
+import { UserService } from '../service/user.service';
+import { User } from '../model/user';
+
+@Component({
+ selector: 'app-user-form',
+ templateUrl: './user-form.component.html',
+ styleUrls: ['./user-form.component.css']
+})
+export class UserFormComponent {
+
+ user: User;
+
+ constructor(private route: ActivatedRoute, private router: Router, private userService: UserService) {
+ this.user = new User();
+ }
+
+ onSubmit() {
+ this.userService.save(this.user).subscribe(result => this.gotoUserList());
+ }
+
+ gotoUserList() {
+ this.router.navigate(['/users']);
+ }
+}
diff --git a/spring-boot-angular/src/main/java/com/baeldung/angularclient/src/app/user-list/user-list.component.css b/spring-boot-angular/src/main/java/com/baeldung/angularclient/src/app/user-list/user-list.component.css
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/spring-boot-angular/src/main/java/com/baeldung/angularclient/src/app/user-list/user-list.component.html b/spring-boot-angular/src/main/java/com/baeldung/angularclient/src/app/user-list/user-list.component.html
new file mode 100644
index 0000000000..1ac849f552
--- /dev/null
+++ b/spring-boot-angular/src/main/java/com/baeldung/angularclient/src/app/user-list/user-list.component.html
@@ -0,0 +1,20 @@
+
+
+
+
+
+ #
+ Name
+ Email
+
+
+
+
+ {{ user.id }}
+ {{ user.name }}
+ {{ user.email }}
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-boot-angular/src/main/java/com/baeldung/angularclient/src/app/user-list/user-list.component.spec.ts b/spring-boot-angular/src/main/java/com/baeldung/angularclient/src/app/user-list/user-list.component.spec.ts
new file mode 100644
index 0000000000..9d521807d6
--- /dev/null
+++ b/spring-boot-angular/src/main/java/com/baeldung/angularclient/src/app/user-list/user-list.component.spec.ts
@@ -0,0 +1,25 @@
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { UserListComponent } from './user-list.component';
+
+describe('UserListComponent', () => {
+ let component: UserListComponent;
+ let fixture: ComponentFixture;
+
+ beforeEach(async(() => {
+ TestBed.configureTestingModule({
+ declarations: [ UserListComponent ]
+ })
+ .compileComponents();
+ }));
+
+ beforeEach(() => {
+ fixture = TestBed.createComponent(UserListComponent);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ });
+
+ it('should create', () => {
+ expect(component).toBeTruthy();
+ });
+});
diff --git a/spring-boot-angular/src/main/java/com/baeldung/angularclient/src/app/user-list/user-list.component.ts b/spring-boot-angular/src/main/java/com/baeldung/angularclient/src/app/user-list/user-list.component.ts
new file mode 100644
index 0000000000..91226695f5
--- /dev/null
+++ b/spring-boot-angular/src/main/java/com/baeldung/angularclient/src/app/user-list/user-list.component.ts
@@ -0,0 +1,23 @@
+import { Component, OnInit } from '@angular/core';
+import { User } from '../model/user';
+import { UserService } from '../service/user.service';
+
+@Component({
+ selector: 'app-user-list',
+ templateUrl: './user-list.component.html',
+ styleUrls: ['./user-list.component.css']
+})
+export class UserListComponent implements OnInit {
+
+ users: User[];
+
+ constructor(private userService: UserService) {
+
+ }
+
+ ngOnInit() {
+ this.userService.findAll().subscribe(data => {
+ this.users = data;
+ });
+ }
+}
diff --git a/spring-boot-angular/src/main/java/com/baeldung/angularclient/src/assets/.gitkeep b/spring-boot-angular/src/main/java/com/baeldung/angularclient/src/assets/.gitkeep
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/spring-boot-angular/src/main/java/com/baeldung/angularclient/src/environments/environment.prod.ts b/spring-boot-angular/src/main/java/com/baeldung/angularclient/src/environments/environment.prod.ts
new file mode 100644
index 0000000000..3612073bc3
--- /dev/null
+++ b/spring-boot-angular/src/main/java/com/baeldung/angularclient/src/environments/environment.prod.ts
@@ -0,0 +1,3 @@
+export const environment = {
+ production: true
+};
diff --git a/spring-boot-angular/src/main/java/com/baeldung/angularclient/src/environments/environment.ts b/spring-boot-angular/src/main/java/com/baeldung/angularclient/src/environments/environment.ts
new file mode 100644
index 0000000000..b7f639aeca
--- /dev/null
+++ b/spring-boot-angular/src/main/java/com/baeldung/angularclient/src/environments/environment.ts
@@ -0,0 +1,8 @@
+// The file contents for the current environment will overwrite these during build.
+// The build system defaults to the dev environment which uses `environment.ts`, but if you do
+// `ng build --env=prod` then `environment.prod.ts` will be used instead.
+// The list of which env maps to which file can be found in `.angular-cli.json`.
+
+export const environment = {
+ production: false
+};
diff --git a/spring-boot-angular/src/main/java/com/baeldung/angularclient/src/favicon.ico b/spring-boot-angular/src/main/java/com/baeldung/angularclient/src/favicon.ico
new file mode 100644
index 0000000000..8081c7ceaf
Binary files /dev/null and b/spring-boot-angular/src/main/java/com/baeldung/angularclient/src/favicon.ico differ
diff --git a/spring-boot-angular/src/main/java/com/baeldung/angularclient/src/index.html b/spring-boot-angular/src/main/java/com/baeldung/angularclient/src/index.html
new file mode 100644
index 0000000000..1ce7ff1ca6
--- /dev/null
+++ b/spring-boot-angular/src/main/java/com/baeldung/angularclient/src/index.html
@@ -0,0 +1,17 @@
+
+
+
+
+
+ Spring Boot - Angular Application
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-boot-angular/src/main/java/com/baeldung/angularclient/src/main.ts b/spring-boot-angular/src/main/java/com/baeldung/angularclient/src/main.ts
new file mode 100644
index 0000000000..91ec6da5f0
--- /dev/null
+++ b/spring-boot-angular/src/main/java/com/baeldung/angularclient/src/main.ts
@@ -0,0 +1,12 @@
+import { enableProdMode } from '@angular/core';
+import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
+
+import { AppModule } from './app/app.module';
+import { environment } from './environments/environment';
+
+if (environment.production) {
+ enableProdMode();
+}
+
+platformBrowserDynamic().bootstrapModule(AppModule)
+ .catch(err => console.log(err));
diff --git a/spring-boot-angular/src/main/java/com/baeldung/angularclient/src/polyfills.ts b/spring-boot-angular/src/main/java/com/baeldung/angularclient/src/polyfills.ts
new file mode 100644
index 0000000000..af84770782
--- /dev/null
+++ b/spring-boot-angular/src/main/java/com/baeldung/angularclient/src/polyfills.ts
@@ -0,0 +1,79 @@
+/**
+ * This file includes polyfills needed by Angular and is loaded before the app.
+ * You can add your own extra polyfills to this file.
+ *
+ * This file is divided into 2 sections:
+ * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers.
+ * 2. Application imports. Files imported after ZoneJS that should be loaded before your main
+ * file.
+ *
+ * The current setup is for so-called "evergreen" browsers; the last versions of browsers that
+ * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera),
+ * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile.
+ *
+ * Learn more in https://angular.io/docs/ts/latest/guide/browser-support.html
+ */
+
+/***************************************************************************************************
+ * BROWSER POLYFILLS
+ */
+
+/** IE9, IE10 and IE11 requires all of the following polyfills. **/
+// import 'core-js/es6/symbol';
+// import 'core-js/es6/object';
+// import 'core-js/es6/function';
+// import 'core-js/es6/parse-int';
+// import 'core-js/es6/parse-float';
+// import 'core-js/es6/number';
+// import 'core-js/es6/math';
+// import 'core-js/es6/string';
+// import 'core-js/es6/date';
+// import 'core-js/es6/array';
+// import 'core-js/es6/regexp';
+// import 'core-js/es6/map';
+// import 'core-js/es6/weak-map';
+// import 'core-js/es6/set';
+
+/** IE10 and IE11 requires the following for NgClass support on SVG elements */
+// import 'classlist.js'; // Run `npm install --save classlist.js`.
+
+/** IE10 and IE11 requires the following for the Reflect API. */
+// import 'core-js/es6/reflect';
+
+
+/** Evergreen browsers require these. **/
+// Used for reflect-metadata in JIT. If you use AOT (and only Angular decorators), you can remove.
+import 'core-js/es7/reflect';
+
+
+/**
+ * Required to support Web Animations `@angular/platform-browser/animations`.
+ * Needed for: All but Chrome, Firefox and Opera. http://caniuse.com/#feat=web-animation
+ **/
+// import 'web-animations-js'; // Run `npm install --save web-animations-js`.
+
+/**
+ * By default, zone.js will patch all possible macroTask and DomEvents
+ * user can disable parts of macroTask/DomEvents patch by setting following flags
+ */
+
+ // (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame
+ // (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick
+ // (window as any).__zone_symbol__BLACK_LISTED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames
+
+ /*
+ * in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js
+ * with the following flag, it will bypass `zone.js` patch for IE/Edge
+ */
+// (window as any).__Zone_enable_cross_context_check = true;
+
+/***************************************************************************************************
+ * Zone JS is required by default for Angular itself.
+ */
+import 'zone.js/dist/zone'; // Included with Angular CLI.
+
+
+
+/***************************************************************************************************
+ * APPLICATION IMPORTS
+ */
diff --git a/spring-boot-angular/src/main/java/com/baeldung/angularclient/src/styles.css b/spring-boot-angular/src/main/java/com/baeldung/angularclient/src/styles.css
new file mode 100644
index 0000000000..90d4ee0072
--- /dev/null
+++ b/spring-boot-angular/src/main/java/com/baeldung/angularclient/src/styles.css
@@ -0,0 +1 @@
+/* You can add global styles to this file, and also import other style files */
diff --git a/spring-boot-angular/src/main/java/com/baeldung/angularclient/src/tsconfig.app.json b/spring-boot-angular/src/main/java/com/baeldung/angularclient/src/tsconfig.app.json
new file mode 100644
index 0000000000..39ba8dbacb
--- /dev/null
+++ b/spring-boot-angular/src/main/java/com/baeldung/angularclient/src/tsconfig.app.json
@@ -0,0 +1,13 @@
+{
+ "extends": "../tsconfig.json",
+ "compilerOptions": {
+ "outDir": "../out-tsc/app",
+ "baseUrl": "./",
+ "module": "es2015",
+ "types": []
+ },
+ "exclude": [
+ "test.ts",
+ "**/*.spec.ts"
+ ]
+}
diff --git a/spring-boot-angular/src/main/java/com/baeldung/angularclient/src/tsconfig.spec.json b/spring-boot-angular/src/main/java/com/baeldung/angularclient/src/tsconfig.spec.json
new file mode 100644
index 0000000000..ac22a298ac
--- /dev/null
+++ b/spring-boot-angular/src/main/java/com/baeldung/angularclient/src/tsconfig.spec.json
@@ -0,0 +1,19 @@
+{
+ "extends": "../tsconfig.json",
+ "compilerOptions": {
+ "outDir": "../out-tsc/spec",
+ "baseUrl": "./",
+ "module": "commonjs",
+ "types": [
+ "jasmine",
+ "node"
+ ]
+ },
+ "files": [
+ "test.ts"
+ ],
+ "include": [
+ "**/*.spec.ts",
+ "**/*.d.ts"
+ ]
+}
diff --git a/spring-boot-angular/src/main/java/com/baeldung/angularclient/src/typings.d.ts b/spring-boot-angular/src/main/java/com/baeldung/angularclient/src/typings.d.ts
new file mode 100644
index 0000000000..ef5c7bd620
--- /dev/null
+++ b/spring-boot-angular/src/main/java/com/baeldung/angularclient/src/typings.d.ts
@@ -0,0 +1,5 @@
+/* SystemJS module definition */
+declare var module: NodeModule;
+interface NodeModule {
+ id: string;
+}
diff --git a/spring-boot-angular/src/main/java/com/baeldung/angularclient/tsconfig.json b/spring-boot-angular/src/main/java/com/baeldung/angularclient/tsconfig.json
new file mode 100644
index 0000000000..a6c016bf38
--- /dev/null
+++ b/spring-boot-angular/src/main/java/com/baeldung/angularclient/tsconfig.json
@@ -0,0 +1,19 @@
+{
+ "compileOnSave": false,
+ "compilerOptions": {
+ "outDir": "./dist/out-tsc",
+ "sourceMap": true,
+ "declaration": false,
+ "moduleResolution": "node",
+ "emitDecoratorMetadata": true,
+ "experimentalDecorators": true,
+ "target": "es5",
+ "typeRoots": [
+ "node_modules/@types"
+ ],
+ "lib": [
+ "es2017",
+ "dom"
+ ]
+ }
+}
diff --git a/spring-boot-angular/src/main/java/com/baeldung/angularclient/tslint.json b/spring-boot-angular/src/main/java/com/baeldung/angularclient/tslint.json
new file mode 100644
index 0000000000..9963d6c395
--- /dev/null
+++ b/spring-boot-angular/src/main/java/com/baeldung/angularclient/tslint.json
@@ -0,0 +1,143 @@
+{
+ "rulesDirectory": [
+ "node_modules/codelyzer"
+ ],
+ "rules": {
+ "arrow-return-shorthand": true,
+ "callable-types": true,
+ "class-name": true,
+ "comment-format": [
+ true,
+ "check-space"
+ ],
+ "curly": true,
+ "deprecation": {
+ "severity": "warn"
+ },
+ "eofline": true,
+ "forin": true,
+ "import-blacklist": [
+ true,
+ "rxjs",
+ "rxjs/Rx"
+ ],
+ "import-spacing": true,
+ "indent": [
+ true,
+ "spaces"
+ ],
+ "interface-over-type-literal": true,
+ "label-position": true,
+ "max-line-length": [
+ true,
+ 140
+ ],
+ "member-access": false,
+ "member-ordering": [
+ true,
+ {
+ "order": [
+ "static-field",
+ "instance-field",
+ "static-method",
+ "instance-method"
+ ]
+ }
+ ],
+ "no-arg": true,
+ "no-bitwise": true,
+ "no-console": [
+ true,
+ "debug",
+ "info",
+ "time",
+ "timeEnd",
+ "trace"
+ ],
+ "no-construct": true,
+ "no-debugger": true,
+ "no-duplicate-super": true,
+ "no-empty": false,
+ "no-empty-interface": true,
+ "no-eval": true,
+ "no-inferrable-types": [
+ true,
+ "ignore-params"
+ ],
+ "no-misused-new": true,
+ "no-non-null-assertion": true,
+ "no-shadowed-variable": true,
+ "no-string-literal": false,
+ "no-string-throw": true,
+ "no-switch-case-fall-through": true,
+ "no-trailing-whitespace": true,
+ "no-unnecessary-initializer": true,
+ "no-unused-expression": true,
+ "no-use-before-declare": true,
+ "no-var-keyword": true,
+ "object-literal-sort-keys": false,
+ "one-line": [
+ true,
+ "check-open-brace",
+ "check-catch",
+ "check-else",
+ "check-whitespace"
+ ],
+ "prefer-const": true,
+ "quotemark": [
+ true,
+ "single"
+ ],
+ "radix": true,
+ "semicolon": [
+ true,
+ "always"
+ ],
+ "triple-equals": [
+ true,
+ "allow-null-check"
+ ],
+ "typedef-whitespace": [
+ true,
+ {
+ "call-signature": "nospace",
+ "index-signature": "nospace",
+ "parameter": "nospace",
+ "property-declaration": "nospace",
+ "variable-declaration": "nospace"
+ }
+ ],
+ "unified-signatures": true,
+ "variable-name": false,
+ "whitespace": [
+ true,
+ "check-branch",
+ "check-decl",
+ "check-operator",
+ "check-separator",
+ "check-type"
+ ],
+ "directive-selector": [
+ true,
+ "attribute",
+ "app",
+ "camelCase"
+ ],
+ "component-selector": [
+ true,
+ "element",
+ "app",
+ "kebab-case"
+ ],
+ "no-output-on-prefix": true,
+ "use-input-property-decorator": true,
+ "use-output-property-decorator": true,
+ "use-host-property-decorator": true,
+ "no-input-rename": true,
+ "no-output-rename": true,
+ "use-life-cycle-interface": true,
+ "use-pipe-transform-interface": true,
+ "component-class-suffix": true,
+ "directive-class-suffix": true
+ }
+}
diff --git a/spring-boot-angular/src/main/java/com/baeldung/application/Application.java b/spring-boot-angular/src/main/java/com/baeldung/application/Application.java
new file mode 100644
index 0000000000..f1155c3106
--- /dev/null
+++ b/spring-boot-angular/src/main/java/com/baeldung/application/Application.java
@@ -0,0 +1,28 @@
+package com.baeldung.application;
+
+import com.baeldung.application.entities.User;
+import com.baeldung.application.repositories.UserRepository;
+import java.util.stream.Stream;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.Bean;
+
+@SpringBootApplication
+public class Application {
+
+ public static void main(String[] args) {
+ SpringApplication.run(Application.class, args);
+ }
+
+ @Bean
+ CommandLineRunner init(UserRepository userRepository) {
+ return args -> {
+ Stream.of("John", "Julie", "Jennifer", "Helen", "Rachel").forEach(name -> {
+ User user = new User(name, name.toLowerCase() + "@domain.com");
+ userRepository.save(user);
+ });
+ userRepository.findAll().forEach(System.out::println);
+ };
+ }
+}
diff --git a/spring-boot-angular/src/main/java/com/baeldung/application/controllers/UserController.java b/spring-boot-angular/src/main/java/com/baeldung/application/controllers/UserController.java
new file mode 100644
index 0000000000..c101ed771f
--- /dev/null
+++ b/spring-boot-angular/src/main/java/com/baeldung/application/controllers/UserController.java
@@ -0,0 +1,31 @@
+package com.baeldung.application.controllers;
+
+import com.application.entities.User;
+import com.baeldung.application.repositories.UserRepository;
+import java.util.List;
+import org.springframework.web.bind.annotation.CrossOrigin;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@CrossOrigin(origins = "http://localhost:4200")
+public class UserController {
+
+ private final UserRepository userRepository;
+
+ public UserController(UserRepository userRepository) {
+ this.userRepository = userRepository;
+ }
+
+ @GetMapping("/users")
+ public List getUsers() {
+ return (List) userRepository.findAll();
+ }
+
+ @PostMapping("/users")
+ void addUser(@RequestBody User user) {
+ userRepository.save(user);
+ }
+}
diff --git a/spring-boot-angular/src/main/java/com/baeldung/application/entities/User.java b/spring-boot-angular/src/main/java/com/baeldung/application/entities/User.java
new file mode 100644
index 0000000000..4c346fa5b9
--- /dev/null
+++ b/spring-boot-angular/src/main/java/com/baeldung/application/entities/User.java
@@ -0,0 +1,43 @@
+package com.baeldung.application.entities;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+
+@Entity
+public class User {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.AUTO)
+ private long id;
+ private final String name;
+ private final String email;
+
+ public User() {
+ this.name = "";
+ this.email = "";
+ }
+
+ public User(String name, String email) {
+ this.name = name;
+ this.email = email;
+ }
+
+ public long getId() {
+ return id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public String getEmail() {
+ return email;
+ }
+
+ @Override
+ public String toString() {
+ return "User{" + "id=" + id + ", name=" + name + ", email=" + email + '}';
+ }
+}
diff --git a/spring-boot-angular/src/main/java/com/baeldung/application/repositories/UserRepository.java b/spring-boot-angular/src/main/java/com/baeldung/application/repositories/UserRepository.java
new file mode 100644
index 0000000000..f8ef5a4c0c
--- /dev/null
+++ b/spring-boot-angular/src/main/java/com/baeldung/application/repositories/UserRepository.java
@@ -0,0 +1,10 @@
+package com.baeldung.application.repositories;
+
+import com.baeldung.application.entities.User;
+import org.springframework.data.repository.CrudRepository;
+import org.springframework.stereotype.Repository;
+import org.springframework.web.bind.annotation.CrossOrigin;
+
+@Repository
+@CrossOrigin(origins = "http://localhost:4200")
+public interface UserRepository extends CrudRepository{}
diff --git a/spring-boot-autoconfiguration/pom.xml b/spring-boot-autoconfiguration/pom.xml
index 1c3d8796ed..91692ebfff 100644
--- a/spring-boot-autoconfiguration/pom.xml
+++ b/spring-boot-autoconfiguration/pom.xml
@@ -4,8 +4,8 @@
com.baeldung
spring-boot-autoconfiguration
0.0.1-SNAPSHOT
- war
spring-boot-autoconfiguration
+ war
This is simple boot application demonstrating a custom auto-configuration
diff --git a/spring-boot-autoconfiguration/src/test/java/com/baeldung/SpringContextLiveTest.java b/spring-boot-autoconfiguration/src/test/java/com/baeldung/SpringContextLiveTest.java
new file mode 100644
index 0000000000..494013d1d9
--- /dev/null
+++ b/spring-boot-autoconfiguration/src/test/java/com/baeldung/SpringContextLiveTest.java
@@ -0,0 +1,19 @@
+package com.baeldung;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.test.context.web.WebAppConfiguration;
+
+import com.baeldung.autoconfiguration.MySQLAutoconfiguration;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(classes = MySQLAutoconfiguration.class)
+@WebAppConfiguration
+public class SpringContextLiveTest {
+
+ @Test
+ public void whenSpringContextIsBootstrapped_thenNoExceptions() {
+ }
+}
\ No newline at end of file
diff --git a/spring-boot-bootstrap/README.md b/spring-boot-bootstrap/README.md
index 76b977c129..70fcd90118 100644
--- a/spring-boot-bootstrap/README.md
+++ b/spring-boot-bootstrap/README.md
@@ -1,7 +1,8 @@
### Relevant Articles:
-- [Bootstrap a Simple Application using Spring Boot](http://www.baeldung.com/spring-boot-start)
+- [Spring Boot Tutorial – Bootstrap a Simple Application](http://www.baeldung.com/spring-boot-start)
- [Spring Boot Dependency Management with a Custom Parent](http://www.baeldung.com/spring-boot-dependency-management-custom-parent)
- [Thin JARs with Spring Boot](http://www.baeldung.com/spring-boot-thin-jar)
- [Deploying a Spring Boot Application to Cloud Foundry](https://www.baeldung.com/spring-boot-app-deploy-to-cloud-foundry)
- [Deploy a Spring Boot Application to Google App Engine](https://www.baeldung.com/spring-boot-google-app-engine)
- [Deploy a Spring Boot Application to OpenShift](https://www.baeldung.com/spring-boot-deploy-openshift)
+- [Deploy a Spring Boot Application to AWS Beanstalk](https://www.baeldung.com/spring-boot-deploy-aws-beanstalk)
diff --git a/spring-boot-bootstrap/pom.xml b/spring-boot-bootstrap/pom.xml
index 0ffc1820b8..70ebb225c8 100644
--- a/spring-boot-bootstrap/pom.xml
+++ b/spring-boot-bootstrap/pom.xml
@@ -4,16 +4,18 @@
4.0.0
com.baeldung
spring-boot-bootstrap
- jar
spring-boot-bootstrap
Demo project for Spring Boot
-
+ jar
+
+
parent-boot-2
com.baeldung
0.0.1-SNAPSHOT
../parent-boot-2
-
+
+
org.springframework.boot
spring-boot-starter-web
@@ -82,7 +84,7 @@
openshift
0.3.0.RELEASE
- Finchley.SR2
+ Greenwich.RELEASE
3.5.37
@@ -164,7 +166,7 @@
org.springframework.cloud
spring-cloud-dependencies
- Finchley.SR1
+ Greenwich.RELEASE
pom
import
@@ -212,7 +214,7 @@
org.springframework.cloud
spring-cloud-dependencies
- Finchley.SR1
+ Greenwich.RELEASE
pom
import
@@ -312,7 +314,8 @@
-
+
+
org.apache.maven.plugins
@@ -325,7 +328,8 @@
-
+
+
4.0.0
diff --git a/spring-boot-bootstrap/src/main/java/com/baeldung/Application.java b/spring-boot-bootstrap/src/main/java/com/baeldung/Application.java
index 567e9b2678..d5a597e48b 100644
--- a/spring-boot-bootstrap/src/main/java/com/baeldung/Application.java
+++ b/spring-boot-bootstrap/src/main/java/com/baeldung/Application.java
@@ -4,12 +4,10 @@ import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.boot.web.servlet.ServletComponentScan;
-import org.springframework.context.annotation.ComponentScan;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
@ServletComponentScan
-@SpringBootApplication
-@ComponentScan("com.baeldung")
+@SpringBootApplication(scanBasePackages = "com.baeldung")
@EnableJpaRepositories("com.baeldung.persistence.repo")
@EntityScan("com.baeldung.persistence.model")
public class Application {
diff --git a/spring-boot-bootstrap/src/main/resources/templates/error.html b/spring-boot-bootstrap/src/main/resources/templates/error.html
index f2b51a1938..ca3a740b71 100644
--- a/spring-boot-bootstrap/src/main/resources/templates/error.html
+++ b/spring-boot-bootstrap/src/main/resources/templates/error.html
@@ -1,19 +1,19 @@
-
+
Error Occurred
-
\ No newline at end of file
+
diff --git a/spring-boot-bootstrap/src/main/resources/templates/home.html b/spring-boot-bootstrap/src/main/resources/templates/home.html
index 5707cfb82a..0428ca1127 100644
--- a/spring-boot-bootstrap/src/main/resources/templates/home.html
+++ b/spring-boot-bootstrap/src/main/resources/templates/home.html
@@ -1,7 +1,7 @@
-
+
Home Page
Hello !
Welcome to Our App
-
\ No newline at end of file
+
diff --git a/spring-boot-client/pom.xml b/spring-boot-client/pom.xml
index fc89931f79..4850849039 100644
--- a/spring-boot-client/pom.xml
+++ b/spring-boot-client/pom.xml
@@ -4,8 +4,8 @@
com.baeldung
spring-boot-client
0.0.1-SNAPSHOT
- war
spring-boot-client
+ war
This is simple boot client application for Spring boot actuator test
diff --git a/spring-boot-crud/pom.xml b/spring-boot-crud/pom.xml
index 749bf9cb5a..73635b0a1c 100644
--- a/spring-boot-crud/pom.xml
+++ b/spring-boot-crud/pom.xml
@@ -3,15 +3,14 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
4.0.0
- com.baeldung.spring-boot-crud
spring-boot-crud
- 0.1.0
spring-boot-crud
- org.springframework.boot
- spring-boot-starter-parent
- 2.0.6.RELEASE
+ parent-boot-2
+ com.baeldung
+ 0.0.1-SNAPSHOT
+ ../parent-boot-2
@@ -41,11 +40,7 @@
h2
runtime
-
-
- UTF-8
- 1.8
-
+
spring-boot-crud
@@ -62,4 +57,10 @@
+
+
+ UTF-8
+ 1.8
+
+
\ No newline at end of file
diff --git a/spring-boot-data/README.md b/spring-boot-data/README.md
new file mode 100644
index 0000000000..21f7303c48
--- /dev/null
+++ b/spring-boot-data/README.md
@@ -0,0 +1,2 @@
+### Relevant Articles:
+- [Formatting JSON Dates in Spring ](https://www.baeldung.com/spring-boot-formatting-json-dates)
\ No newline at end of file
diff --git a/spring-boot-data/pom.xml b/spring-boot-data/pom.xml
new file mode 100644
index 0000000000..9ef4cc69c8
--- /dev/null
+++ b/spring-boot-data/pom.xml
@@ -0,0 +1,122 @@
+
+
+ 4.0.0
+ spring-boot-data
+ war
+ spring-boot-data
+ Spring Boot Data Module
+
+
+ parent-boot-2
+ com.baeldung
+ 0.0.1-SNAPSHOT
+ ../parent-boot-2
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+ org.springframework.boot
+ spring-boot-starter-tomcat
+ provided
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+
+ spring-boot
+
+
+ src/main/resources
+ true
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-war-plugin
+
+
+
+ pl.project13.maven
+ git-commit-id-plugin
+ ${git-commit-id-plugin.version}
+
+
+ get-the-git-infos
+
+ revision
+
+ initialize
+
+
+ validate-the-git-infos
+
+ validateRevision
+
+ package
+
+
+
+ true
+ ${project.build.outputDirectory}/git.properties
+
+
+
+
+
+
+
+
+ autoconfiguration
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+
+
+ integration-test
+
+ test
+
+
+
+ **/*LiveTest.java
+ **/*IntegrationTest.java
+ **/*IntTest.java
+
+
+ **/AutoconfigurationTest.java
+
+
+
+
+
+
+ json
+
+
+
+
+
+
+
+
+
+ com.baeldung.SpringBootDataApplication
+ 2.2.4
+
+
+
\ No newline at end of file
diff --git a/spring-boot-data/src/main/java/com/baeldung/SpringBootDataApplication.java b/spring-boot-data/src/main/java/com/baeldung/SpringBootDataApplication.java
new file mode 100644
index 0000000000..3aa093bb41
--- /dev/null
+++ b/spring-boot-data/src/main/java/com/baeldung/SpringBootDataApplication.java
@@ -0,0 +1,13 @@
+package com.baeldung;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class SpringBootDataApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(SpringBootDataApplication.class, args);
+ }
+
+}
diff --git a/spring-boot-data/src/main/java/com/baeldung/jsondateformat/Contact.java b/spring-boot-data/src/main/java/com/baeldung/jsondateformat/Contact.java
new file mode 100644
index 0000000000..f131d17196
--- /dev/null
+++ b/spring-boot-data/src/main/java/com/baeldung/jsondateformat/Contact.java
@@ -0,0 +1,70 @@
+package com.baeldung.jsondateformat;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+public class Contact {
+
+ private String name;
+ private String address;
+ private String phone;
+
+ @JsonFormat(pattern="yyyy-MM-dd")
+ private LocalDate birthday;
+
+ @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
+ private LocalDateTime lastUpdate;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getAddress() {
+ return address;
+ }
+
+ public void setAddress(String address) {
+ this.address = address;
+ }
+
+ public String getPhone() {
+ return phone;
+ }
+
+ public void setPhone(String phone) {
+ this.phone = phone;
+ }
+
+ public LocalDate getBirthday() {
+ return birthday;
+ }
+
+ public void setBirthday(LocalDate birthday) {
+ this.birthday = birthday;
+ }
+
+ public LocalDateTime getLastUpdate() {
+ return lastUpdate;
+ }
+
+ public void setLastUpdate(LocalDateTime lastUpdate) {
+ this.lastUpdate = lastUpdate;
+ }
+
+ public Contact() {
+ }
+
+ public Contact(String name, String address, String phone, LocalDate birthday, LocalDateTime lastUpdate) {
+ this.name = name;
+ this.address = address;
+ this.phone = phone;
+ this.birthday = birthday;
+ this.lastUpdate = lastUpdate;
+ }
+}
diff --git a/spring-boot-data/src/main/java/com/baeldung/jsondateformat/ContactApp.java b/spring-boot-data/src/main/java/com/baeldung/jsondateformat/ContactApp.java
new file mode 100644
index 0000000000..79037e1038
--- /dev/null
+++ b/spring-boot-data/src/main/java/com/baeldung/jsondateformat/ContactApp.java
@@ -0,0 +1,13 @@
+package com.baeldung.jsondateformat;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class ContactApp {
+
+ public static void main(String[] args) {
+ SpringApplication.run(ContactApp.class, args);
+ }
+
+}
diff --git a/spring-boot-data/src/main/java/com/baeldung/jsondateformat/ContactAppConfig.java b/spring-boot-data/src/main/java/com/baeldung/jsondateformat/ContactAppConfig.java
new file mode 100644
index 0000000000..7a20ebfa51
--- /dev/null
+++ b/spring-boot-data/src/main/java/com/baeldung/jsondateformat/ContactAppConfig.java
@@ -0,0 +1,33 @@
+package com.baeldung.jsondateformat;
+
+import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
+import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
+
+import java.time.format.DateTimeFormatter;
+
+@Configuration
+public class ContactAppConfig {
+
+ private static final String dateFormat = "yyyy-MM-dd";
+
+ private static final String dateTimeFormat = "yyyy-MM-dd HH:mm:ss";
+
+ @Bean
+ @ConditionalOnProperty(value = "spring.jackson.date-format", matchIfMissing = true, havingValue = "none")
+ public Jackson2ObjectMapperBuilderCustomizer jsonCustomizer() {
+ return new Jackson2ObjectMapperBuilderCustomizer() {
+ @Override
+ public void customize(Jackson2ObjectMapperBuilder builder) {
+ builder.simpleDateFormat(dateTimeFormat);
+ builder.serializers(new LocalDateSerializer(DateTimeFormatter.ofPattern(dateFormat)));
+ builder.serializers(new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(dateTimeFormat)));
+ }
+ };
+ }
+
+}
diff --git a/spring-boot-data/src/main/java/com/baeldung/jsondateformat/ContactController.java b/spring-boot-data/src/main/java/com/baeldung/jsondateformat/ContactController.java
new file mode 100644
index 0000000000..8894d82fc7
--- /dev/null
+++ b/spring-boot-data/src/main/java/com/baeldung/jsondateformat/ContactController.java
@@ -0,0 +1,77 @@
+package com.baeldung.jsondateformat;
+
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+@RestController
+@RequestMapping(value = "/contacts")
+public class ContactController {
+
+ @GetMapping
+ public List getContacts() {
+ List contacts = new ArrayList<>();
+
+ Contact contact1 = new Contact("John Doe", "123 Sesame Street", "123-456-789", LocalDate.now(), LocalDateTime.now());
+ Contact contact2 = new Contact("John Doe 2", "124 Sesame Street", "123-456-789", LocalDate.now(), LocalDateTime.now());
+ Contact contact3 = new Contact("John Doe 3", "125 Sesame Street", "123-456-789", LocalDate.now(), LocalDateTime.now());
+
+ contacts.add(contact1);
+ contacts.add(contact2);
+ contacts.add(contact3);
+
+ return contacts;
+ }
+
+ @GetMapping("/javaUtilDate")
+ public List getContactsWithJavaUtilDate() {
+ List contacts = new ArrayList<>();
+
+ ContactWithJavaUtilDate contact1 = new ContactWithJavaUtilDate("John Doe", "123 Sesame Street", "123-456-789", new Date(), new Date());
+ ContactWithJavaUtilDate contact2 = new ContactWithJavaUtilDate("John Doe 2", "124 Sesame Street", "123-456-789", new Date(), new Date());
+ ContactWithJavaUtilDate contact3 = new ContactWithJavaUtilDate("John Doe 3", "125 Sesame Street", "123-456-789", new Date(), new Date());
+
+ contacts.add(contact1);
+ contacts.add(contact2);
+ contacts.add(contact3);
+
+ return contacts;
+ }
+
+ @GetMapping("/plain")
+ public List getPlainContacts() {
+ List contacts = new ArrayList<>();
+
+ PlainContact contact1 = new PlainContact("John Doe", "123 Sesame Street", "123-456-789", LocalDate.now(), LocalDateTime.now());
+ PlainContact contact2 = new PlainContact("John Doe 2", "124 Sesame Street", "123-456-789", LocalDate.now(), LocalDateTime.now());
+ PlainContact contact3 = new PlainContact("John Doe 3", "125 Sesame Street", "123-456-789", LocalDate.now(), LocalDateTime.now());
+
+ contacts.add(contact1);
+ contacts.add(contact2);
+ contacts.add(contact3);
+
+ return contacts;
+ }
+
+ @GetMapping("/plainWithJavaUtilDate")
+ public List getPlainContactsWithJavaUtilDate() {
+ List contacts = new ArrayList<>();
+
+ PlainContactWithJavaUtilDate contact1 = new PlainContactWithJavaUtilDate("John Doe", "123 Sesame Street", "123-456-789", new Date(), new Date());
+ PlainContactWithJavaUtilDate contact2 = new PlainContactWithJavaUtilDate("John Doe 2", "124 Sesame Street", "123-456-789", new Date(), new Date());
+ PlainContactWithJavaUtilDate contact3 = new PlainContactWithJavaUtilDate("John Doe 3", "125 Sesame Street", "123-456-789", new Date(), new Date());
+
+ contacts.add(contact1);
+ contacts.add(contact2);
+ contacts.add(contact3);
+
+ return contacts;
+ }
+
+}
diff --git a/spring-boot-data/src/main/java/com/baeldung/jsondateformat/ContactWithJavaUtilDate.java b/spring-boot-data/src/main/java/com/baeldung/jsondateformat/ContactWithJavaUtilDate.java
new file mode 100644
index 0000000000..5a1c508098
--- /dev/null
+++ b/spring-boot-data/src/main/java/com/baeldung/jsondateformat/ContactWithJavaUtilDate.java
@@ -0,0 +1,69 @@
+package com.baeldung.jsondateformat;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import java.util.Date;
+
+public class ContactWithJavaUtilDate {
+
+ private String name;
+ private String address;
+ private String phone;
+
+ @JsonFormat(pattern="yyyy-MM-dd")
+ private Date birthday;
+
+ @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
+ private Date lastUpdate;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getAddress() {
+ return address;
+ }
+
+ public void setAddress(String address) {
+ this.address = address;
+ }
+
+ public String getPhone() {
+ return phone;
+ }
+
+ public void setPhone(String phone) {
+ this.phone = phone;
+ }
+
+ public Date getBirthday() {
+ return birthday;
+ }
+
+ public void setBirthday(Date birthday) {
+ this.birthday = birthday;
+ }
+
+ public Date getLastUpdate() {
+ return lastUpdate;
+ }
+
+ public void setLastUpdate(Date lastUpdate) {
+ this.lastUpdate = lastUpdate;
+ }
+
+ public ContactWithJavaUtilDate() {
+ }
+
+ public ContactWithJavaUtilDate(String name, String address, String phone, Date birthday, Date lastUpdate) {
+ this.name = name;
+ this.address = address;
+ this.phone = phone;
+ this.birthday = birthday;
+ this.lastUpdate = lastUpdate;
+ }
+}
diff --git a/spring-boot-data/src/main/java/com/baeldung/jsondateformat/PlainContact.java b/spring-boot-data/src/main/java/com/baeldung/jsondateformat/PlainContact.java
new file mode 100644
index 0000000000..7e9e53d205
--- /dev/null
+++ b/spring-boot-data/src/main/java/com/baeldung/jsondateformat/PlainContact.java
@@ -0,0 +1,66 @@
+package com.baeldung.jsondateformat;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+public class PlainContact {
+
+ private String name;
+ private String address;
+ private String phone;
+
+ private LocalDate birthday;
+
+ private LocalDateTime lastUpdate;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getAddress() {
+ return address;
+ }
+
+ public void setAddress(String address) {
+ this.address = address;
+ }
+
+ public String getPhone() {
+ return phone;
+ }
+
+ public void setPhone(String phone) {
+ this.phone = phone;
+ }
+
+ public LocalDate getBirthday() {
+ return birthday;
+ }
+
+ public void setBirthday(LocalDate birthday) {
+ this.birthday = birthday;
+ }
+
+ public LocalDateTime getLastUpdate() {
+ return lastUpdate;
+ }
+
+ public void setLastUpdate(LocalDateTime lastUpdate) {
+ this.lastUpdate = lastUpdate;
+ }
+
+ public PlainContact() {
+ }
+
+ public PlainContact(String name, String address, String phone, LocalDate birthday, LocalDateTime lastUpdate) {
+ this.name = name;
+ this.address = address;
+ this.phone = phone;
+ this.birthday = birthday;
+ this.lastUpdate = lastUpdate;
+ }
+}
diff --git a/spring-boot-data/src/main/java/com/baeldung/jsondateformat/PlainContactWithJavaUtilDate.java b/spring-boot-data/src/main/java/com/baeldung/jsondateformat/PlainContactWithJavaUtilDate.java
new file mode 100644
index 0000000000..daefb15543
--- /dev/null
+++ b/spring-boot-data/src/main/java/com/baeldung/jsondateformat/PlainContactWithJavaUtilDate.java
@@ -0,0 +1,69 @@
+package com.baeldung.jsondateformat;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import java.util.Date;
+
+public class PlainContactWithJavaUtilDate {
+
+ private String name;
+ private String address;
+ private String phone;
+
+ @JsonFormat(pattern="yyyy-MM-dd")
+ private Date birthday;
+
+ @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
+ private Date lastUpdate;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getAddress() {
+ return address;
+ }
+
+ public void setAddress(String address) {
+ this.address = address;
+ }
+
+ public String getPhone() {
+ return phone;
+ }
+
+ public void setPhone(String phone) {
+ this.phone = phone;
+ }
+
+ public Date getBirthday() {
+ return birthday;
+ }
+
+ public void setBirthday(Date birthday) {
+ this.birthday = birthday;
+ }
+
+ public Date getLastUpdate() {
+ return lastUpdate;
+ }
+
+ public void setLastUpdate(Date lastUpdate) {
+ this.lastUpdate = lastUpdate;
+ }
+
+ public PlainContactWithJavaUtilDate() {
+ }
+
+ public PlainContactWithJavaUtilDate(String name, String address, String phone, Date birthday, Date lastUpdate) {
+ this.name = name;
+ this.address = address;
+ this.phone = phone;
+ this.birthday = birthday;
+ this.lastUpdate = lastUpdate;
+ }
+}
diff --git a/spring-boot-data/src/main/resources/application.properties b/spring-boot-data/src/main/resources/application.properties
new file mode 100644
index 0000000000..845b783634
--- /dev/null
+++ b/spring-boot-data/src/main/resources/application.properties
@@ -0,0 +1,2 @@
+spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
+spring.jackson.time-zone=Europe/Zagreb
\ No newline at end of file
diff --git a/spring-boot-data/src/test/java/com/baeldung/jsondateformat/ContactAppIntegrationTest.java b/spring-boot-data/src/test/java/com/baeldung/jsondateformat/ContactAppIntegrationTest.java
new file mode 100644
index 0000000000..f76440d1bc
--- /dev/null
+++ b/spring-boot-data/src/test/java/com/baeldung/jsondateformat/ContactAppIntegrationTest.java
@@ -0,0 +1,100 @@
+package com.baeldung.jsondateformat;
+
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+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.http.ResponseEntity;
+import org.springframework.test.context.TestPropertySource;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import java.io.IOException;
+import java.text.ParseException;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.time.format.DateTimeParseException;
+import java.util.List;
+import java.util.Map;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(webEnvironment = RANDOM_PORT, classes = ContactApp.class)
+@TestPropertySource(properties = {
+ "spring.jackson.date-format=yyyy-MM-dd HH:mm:ss"
+})
+public class ContactAppIntegrationTest {
+
+ private final ObjectMapper mapper = new ObjectMapper();
+
+ @LocalServerPort
+ private int port;
+
+ @Autowired
+ private TestRestTemplate restTemplate;
+
+ @Test
+ public void givenJsonFormatAnnotationAndJava8DateType_whenGet_thenReturnExpectedDateFormat() throws IOException, ParseException {
+ ResponseEntity response = restTemplate.getForEntity("http://localhost:" + port + "/contacts", String.class);
+
+ assertEquals(200, response.getStatusCodeValue());
+
+ List> respMap = mapper.readValue(response.getBody(), new TypeReference>>(){});
+
+ LocalDate birthdayDate = LocalDate.parse(respMap.get(0).get("birthday"), DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+ LocalDateTime lastUpdateTime = LocalDateTime.parse(respMap.get(0).get("lastUpdate"), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+
+ assertNotNull(birthdayDate);
+ assertNotNull(lastUpdateTime);
+ }
+
+ @Test
+ public void givenJsonFormatAnnotationAndLegacyDateType_whenGet_thenReturnExpectedDateFormat() throws IOException {
+ ResponseEntity response = restTemplate.getForEntity("http://localhost:" + port + "/contacts/javaUtilDate", String.class);
+
+ assertEquals(200, response.getStatusCodeValue());
+
+ List> respMap = mapper.readValue(response.getBody(), new TypeReference>>(){});
+
+ LocalDate birthdayDate = LocalDate.parse(respMap.get(0).get("birthday"), DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+ LocalDateTime lastUpdateTime = LocalDateTime.parse(respMap.get(0).get("lastUpdate"), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+
+ assertNotNull(birthdayDate);
+ assertNotNull(lastUpdateTime);
+ }
+
+ @Test
+ public void givenDefaultDateFormatInAppPropertiesAndLegacyDateType_whenGet_thenReturnExpectedDateFormat() throws IOException {
+ ResponseEntity response = restTemplate.getForEntity("http://localhost:" + port + "/contacts/plainWithJavaUtilDate", String.class);
+
+ assertEquals(200, response.getStatusCodeValue());
+
+ List> respMap = mapper.readValue(response.getBody(), new TypeReference>>(){});
+
+ LocalDate birthdayDate = LocalDate.parse(respMap.get(0).get("birthday"), DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+ LocalDateTime lastUpdateTime = LocalDateTime.parse(respMap.get(0).get("lastUpdate"), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+
+ assertNotNull(birthdayDate);
+ assertNotNull(lastUpdateTime);
+ }
+
+ @Test(expected = DateTimeParseException.class)
+ public void givenDefaultDateFormatInAppPropertiesAndJava8DateType_whenGet_thenNotApplyFormat() throws IOException {
+ ResponseEntity response = restTemplate.getForEntity("http://localhost:" + port + "/contacts/plain", String.class);
+
+ assertEquals(200, response.getStatusCodeValue());
+
+ List> respMap = mapper.readValue(response.getBody(), new TypeReference>>(){});
+
+ LocalDate birthdayDate = LocalDate.parse(respMap.get(0).get("birthday"), DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+ LocalDateTime lastUpdateTime = LocalDateTime.parse(respMap.get(0).get("lastUpdate"), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+ }
+
+}
diff --git a/spring-boot-data/src/test/java/com/baeldung/jsondateformat/ContactAppWithObjectMapperCustomizerIntegrationTest.java b/spring-boot-data/src/test/java/com/baeldung/jsondateformat/ContactAppWithObjectMapperCustomizerIntegrationTest.java
new file mode 100644
index 0000000000..c286012653
--- /dev/null
+++ b/spring-boot-data/src/test/java/com/baeldung/jsondateformat/ContactAppWithObjectMapperCustomizerIntegrationTest.java
@@ -0,0 +1,67 @@
+package com.baeldung.jsondateformat;
+
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+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.http.ResponseEntity;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import java.io.IOException;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.List;
+import java.util.Map;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(webEnvironment = RANDOM_PORT, classes = ContactApp.class)
+public class ContactAppWithObjectMapperCustomizerIntegrationTest {
+
+ private final ObjectMapper mapper = new ObjectMapper();
+
+ @Autowired
+ private TestRestTemplate restTemplate;
+
+ @LocalServerPort
+ private int port;
+
+ @Test
+ public void givenDefaultDateFormatInAppPropertiesAndLegacyDateType_whenGet_thenReturnExpectedDateFormat() throws IOException {
+ ResponseEntity response = restTemplate.getForEntity("http://localhost:" + this.port + "/contacts/plainWithJavaUtilDate", String.class);
+
+ assertEquals(200, response.getStatusCodeValue());
+
+ List> respMap = mapper.readValue(response.getBody(), new TypeReference>>(){});
+
+ LocalDate birthdayDate = LocalDate.parse(respMap.get(0).get("birthday"), DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+ LocalDateTime lastUpdateTime = LocalDateTime.parse(respMap.get(0).get("lastUpdate"), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+
+ assertNotNull(birthdayDate);
+ assertNotNull(lastUpdateTime);
+ }
+
+ @Test
+ public void givenDefaultDateFormatInAppPropertiesAndJava8DateType_whenGet_thenReturnExpectedDateFormat() throws IOException {
+ ResponseEntity response = restTemplate.getForEntity("http://localhost:" + this.port + "/contacts/plain", String.class);
+
+ assertEquals(200, response.getStatusCodeValue());
+
+ List> respMap = mapper.readValue(response.getBody(), new TypeReference>>(){});
+
+ LocalDate birthdayDate = LocalDate.parse(respMap.get(0).get("birthday"), DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+ LocalDateTime lastUpdateTime = LocalDateTime.parse(respMap.get(0).get("lastUpdate"), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+
+ assertNotNull(birthdayDate);
+ assertNotNull(lastUpdateTime);
+ }
+
+}
diff --git a/spring-boot-data/src/test/resources/application.properties b/spring-boot-data/src/test/resources/application.properties
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/spring-boot-disable-console-logging/disabling-console-jul/pom.xml b/spring-boot-disable-console-logging/disabling-console-jul/pom.xml
index 9ccbd56231..f6f7890df1 100644
--- a/spring-boot-disable-console-logging/disabling-console-jul/pom.xml
+++ b/spring-boot-disable-console-logging/disabling-console-jul/pom.xml
@@ -6,10 +6,10 @@
- org.springframework.boot
- spring-boot-starter-parent
- 2.1.1.RELEASE
-
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.1.1.RELEASE
+
diff --git a/spring-boot-disable-console-logging/disabling-console-log4j2/pom.xml b/spring-boot-disable-console-logging/disabling-console-log4j2/pom.xml
index 0b360bb366..1cf3eb3e68 100644
--- a/spring-boot-disable-console-logging/disabling-console-log4j2/pom.xml
+++ b/spring-boot-disable-console-logging/disabling-console-log4j2/pom.xml
@@ -6,10 +6,10 @@
- org.springframework.boot
- spring-boot-starter-parent
- 2.1.1.RELEASE
-
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.1.1.RELEASE
+
diff --git a/spring-boot-jasypt/pom.xml b/spring-boot-jasypt/pom.xml
index de0df92678..ae0483f107 100644
--- a/spring-boot-jasypt/pom.xml
+++ b/spring-boot-jasypt/pom.xml
@@ -2,11 +2,10 @@
4.0.0
-
com.example.jasypt
spring-boot-jasypt
- jar
spring-boot-jasypt
+ jar
Demo project for Spring Boot
diff --git a/spring-boot-keycloak/pom.xml b/spring-boot-keycloak/pom.xml
index 3a39d4aa94..b13805b4bf 100644
--- a/spring-boot-keycloak/pom.xml
+++ b/spring-boot-keycloak/pom.xml
@@ -5,9 +5,9 @@
com.baeldung.keycloak
spring-boot-keycloak
0.0.1
- jar
spring-boot-keycloak
This is a simple application demonstrating integration between Keycloak and Spring Boot.
+ jar
com.baeldung
diff --git a/spring-boot-keycloak/src/main/resources/application.properties b/spring-boot-keycloak/src/main/resources/application.properties
index f667d3b27e..6e7da2cb90 100644
--- a/spring-boot-keycloak/src/main/resources/application.properties
+++ b/spring-boot-keycloak/src/main/resources/application.properties
@@ -1,3 +1,6 @@
+### server port
+server.port=8081
+
#Keycloak Configuration
keycloak.auth-server-url=http://localhost:8180/auth
keycloak.realm=SpringBootKeycloak
diff --git a/spring-boot-libraries/README.MD b/spring-boot-libraries/README.MD
index cc32ce8355..f3706e0fa4 100644
--- a/spring-boot-libraries/README.MD
+++ b/spring-boot-libraries/README.MD
@@ -4,3 +4,4 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring
### Relevant Articles:
- [Guide to ShedLock with Spring](https://www.baeldung.com/shedlock-spring)
+- [A Guide to the Problem Spring Web Library](https://www.baeldung.com/problem-spring-web)
diff --git a/spring-boot-libraries/pom.xml b/spring-boot-libraries/pom.xml
index c28128c5f0..b448d6fd66 100644
--- a/spring-boot-libraries/pom.xml
+++ b/spring-boot-libraries/pom.xml
@@ -1,144 +1,157 @@
- 4.0.0
- spring-boot-libraries
- war
- spring-boot-libraries
- This is simple boot application for Spring boot actuator test
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ 4.0.0
+ spring-boot-libraries
+ spring-boot-libraries
+ war
+ This is simple boot application for Spring boot actuator test
-
- parent-boot-2
- com.baeldung
- 0.0.1-SNAPSHOT
- ../parent-boot-2
-
+
+ parent-boot-2
+ com.baeldung
+ 0.0.1-SNAPSHOT
+ ../parent-boot-2
+
-
-
- org.springframework.boot
- spring-boot-starter-web
-
-
- org.springframework.boot
- spring-boot-starter-tomcat
-
-
- org.springframework.boot
- spring-boot-starter-test
- test
-
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.springframework.boot
+ spring-boot-starter-security
+
+
+ org.springframework.boot
+ spring-boot-starter-tomcat
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+ org.zalando
+ problem-spring-web
+ ${problem-spring-web.version}
+
-
-
- net.javacrumbs.shedlock
- shedlock-spring
- 2.1.0
-
-
- net.javacrumbs.shedlock
- shedlock-provider-jdbc-template
- 2.1.0
-
+
+
+ net.javacrumbs.shedlock
+ shedlock-spring
+ ${shedlock.version}
+
+
+ net.javacrumbs.shedlock
+ shedlock-provider-jdbc-template
+ ${shedlock.version}
+
-
+
-
- spring-boot
-
-
- src/main/resources
- true
-
-
+
+ spring-boot
+
+
+ src/main/resources
+ true
+
+
-
+
-
- org.apache.maven.plugins
- maven-war-plugin
-
+
+ org.apache.maven.plugins
+ maven-war-plugin
+
-
- pl.project13.maven
- git-commit-id-plugin
- ${git-commit-id-plugin.version}
-
-
- get-the-git-infos
-
- revision
-
- initialize
-
-
- validate-the-git-infos
-
- validateRevision
-
- package
-
-
-
- true
- ${project.build.outputDirectory}/git.properties
-
-
+
+ pl.project13.maven
+ git-commit-id-plugin
+ ${git-commit-id-plugin.version}
+
+
+ get-the-git-infos
+
+ revision
+
+ initialize
+
+
+ validate-the-git-infos
+
+ validateRevision
+
+ package
+
+
+
+ true
+ ${project.build.outputDirectory}/git.properties
+
+
-
+
-
+
-
-
- autoconfiguration
-
-
-
- org.apache.maven.plugins
- maven-surefire-plugin
-
-
- integration-test
-
- test
-
-
-
- **/*LiveTest.java
- **/*IntegrationTest.java
- **/*IntTest.java
-
-
- **/AutoconfigurationTest.java
-
-
-
-
-
-
- json
-
-
-
-
-
-
-
+
+
+ autoconfiguration
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+
+
+ integration-test
+
+ test
+
+
+
+ **/*LiveTest.java
+ **/*IntegrationTest.java
+ **/*IntTest.java
+
+
+ **/AutoconfigurationTest.java
+
+
+
+
+
+
+ json
+
+
+
+
+
+
+
-
-
- com.baeldung.intro.App
- 8.5.11
- 2.4.1.Final
- 1.9.0
- 2.0.0
- 5.0.2
- 5.0.2
- 5.2.4
- 18.0
- 2.2.4
- 2.3.2
-
+
+
+ com.baeldung.intro.App
+ 8.5.11
+ 2.4.1.Final
+ 1.9.0
+ 2.0.0
+ 5.0.2
+ 5.0.2
+ 5.2.4
+ 18.0
+ 2.2.4
+ 2.3.2
+ 0.23.0
+ 2.1.0
+
diff --git a/spring-boot-libraries/src/main/java/com/baeldung/Application.java b/spring-boot-libraries/src/main/java/com/baeldung/boot/Application.java
similarity index 93%
rename from spring-boot-libraries/src/main/java/com/baeldung/Application.java
rename to spring-boot-libraries/src/main/java/com/baeldung/boot/Application.java
index c1b6558b26..cb0d0c1532 100644
--- a/spring-boot-libraries/src/main/java/com/baeldung/Application.java
+++ b/spring-boot-libraries/src/main/java/com/baeldung/boot/Application.java
@@ -1,4 +1,4 @@
-package org.baeldung.boot;
+package com.baeldung.boot;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
diff --git a/spring-boot-libraries/src/main/java/com/baeldung/boot/problem/SpringProblemApplication.java b/spring-boot-libraries/src/main/java/com/baeldung/boot/problem/SpringProblemApplication.java
new file mode 100644
index 0000000000..7ca9881fb9
--- /dev/null
+++ b/spring-boot-libraries/src/main/java/com/baeldung/boot/problem/SpringProblemApplication.java
@@ -0,0 +1,19 @@
+package com.baeldung.boot.problem;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration;
+import org.springframework.context.annotation.ComponentScan;
+
+@SpringBootApplication
+@EnableAutoConfiguration(exclude = ErrorMvcAutoConfiguration.class)
+@ComponentScan("com.baeldung.boot.problem")
+public class SpringProblemApplication {
+
+ public static void main(String[] args) {
+ System.setProperty("spring.profiles.active", "problem");
+ SpringApplication.run(SpringProblemApplication.class, args);
+ }
+
+}
diff --git a/spring-boot-libraries/src/main/java/com/baeldung/boot/problem/advice/ExceptionHandler.java b/spring-boot-libraries/src/main/java/com/baeldung/boot/problem/advice/ExceptionHandler.java
new file mode 100644
index 0000000000..18df103733
--- /dev/null
+++ b/spring-boot-libraries/src/main/java/com/baeldung/boot/problem/advice/ExceptionHandler.java
@@ -0,0 +1,16 @@
+package com.baeldung.boot.problem.advice;
+
+import org.springframework.web.bind.annotation.ControllerAdvice;
+import org.zalando.problem.spring.web.advice.ProblemHandling;
+
+@ControllerAdvice
+public class ExceptionHandler implements ProblemHandling {
+
+ // The causal chain of causes is disabled by default,
+ // but we can easily enable it by overriding the behavior:
+ @Override
+ public boolean isCausalChainsEnabled() {
+ return true;
+ }
+
+}
diff --git a/spring-boot-libraries/src/main/java/com/baeldung/boot/problem/advice/SecurityExceptionHandler.java b/spring-boot-libraries/src/main/java/com/baeldung/boot/problem/advice/SecurityExceptionHandler.java
new file mode 100644
index 0000000000..8013cbf5c3
--- /dev/null
+++ b/spring-boot-libraries/src/main/java/com/baeldung/boot/problem/advice/SecurityExceptionHandler.java
@@ -0,0 +1,9 @@
+package com.baeldung.boot.problem.advice;
+
+import org.springframework.web.bind.annotation.ControllerAdvice;
+import org.zalando.problem.spring.web.advice.security.SecurityAdviceTrait;
+
+@ControllerAdvice
+public class SecurityExceptionHandler implements SecurityAdviceTrait {
+
+}
\ No newline at end of file
diff --git a/spring-boot-libraries/src/main/java/com/baeldung/boot/problem/configuration/ProblemDemoConfiguration.java b/spring-boot-libraries/src/main/java/com/baeldung/boot/problem/configuration/ProblemDemoConfiguration.java
new file mode 100644
index 0000000000..f5e6a6b99a
--- /dev/null
+++ b/spring-boot-libraries/src/main/java/com/baeldung/boot/problem/configuration/ProblemDemoConfiguration.java
@@ -0,0 +1,19 @@
+package com.baeldung.boot.problem.configuration;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.zalando.problem.ProblemModule;
+import org.zalando.problem.validation.ConstraintViolationProblemModule;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+@Configuration
+public class ProblemDemoConfiguration {
+
+ @Bean
+ public ObjectMapper objectMapper() {
+ // In this example, stack traces support is enabled by default.
+ // If you want to disable stack traces just use new ProblemModule() instead of new ProblemModule().withStackTraces()
+ return new ObjectMapper().registerModules(new ProblemModule().withStackTraces(), new ConstraintViolationProblemModule());
+ }
+}
diff --git a/spring-boot-libraries/src/main/java/com/baeldung/boot/problem/configuration/SecurityConfiguration.java b/spring-boot-libraries/src/main/java/com/baeldung/boot/problem/configuration/SecurityConfiguration.java
new file mode 100644
index 0000000000..0cb8048981
--- /dev/null
+++ b/spring-boot-libraries/src/main/java/com/baeldung/boot/problem/configuration/SecurityConfiguration.java
@@ -0,0 +1,31 @@
+package com.baeldung.boot.problem.configuration;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Import;
+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.zalando.problem.spring.web.advice.security.SecurityProblemSupport;
+
+@Configuration
+@EnableWebSecurity
+@Import(SecurityProblemSupport.class)
+public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
+
+ @Autowired
+ private SecurityProblemSupport problemSupport;
+
+ @Override
+ protected void configure(HttpSecurity http) throws Exception {
+ http.csrf().disable();
+
+ http.authorizeRequests()
+ .antMatchers("/")
+ .permitAll();
+
+ http.exceptionHandling()
+ .authenticationEntryPoint(problemSupport)
+ .accessDeniedHandler(problemSupport);
+ }
+}
diff --git a/spring-boot-libraries/src/main/java/com/baeldung/boot/problem/controller/ProblemDemoController.java b/spring-boot-libraries/src/main/java/com/baeldung/boot/problem/controller/ProblemDemoController.java
new file mode 100644
index 0000000000..50f1ad5137
--- /dev/null
+++ b/spring-boot-libraries/src/main/java/com/baeldung/boot/problem/controller/ProblemDemoController.java
@@ -0,0 +1,56 @@
+package com.baeldung.boot.problem.controller;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.springframework.http.MediaType;
+import org.springframework.security.access.AccessDeniedException;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.baeldung.boot.problem.dto.Task;
+import com.baeldung.boot.problem.problems.TaskNotFoundProblem;
+
+@RestController
+@RequestMapping("/tasks")
+public class ProblemDemoController {
+
+ private static final Map MY_TASKS;
+
+ static {
+ MY_TASKS = new HashMap<>();
+ MY_TASKS.put(1L, new Task(1L, "My first task"));
+ MY_TASKS.put(2L, new Task(2L, "My second task"));
+ }
+
+ @GetMapping(produces = MediaType.APPLICATION_JSON_VALUE)
+ public List getTasks() {
+ return new ArrayList<>(MY_TASKS.values());
+ }
+
+ @GetMapping(value = "/{id}", produces = MediaType.APPLICATION_JSON_VALUE)
+ public Task getTasks(@PathVariable("id") Long taskId) {
+ if (MY_TASKS.containsKey(taskId)) {
+ return MY_TASKS.get(taskId);
+ } else {
+ throw new TaskNotFoundProblem(taskId);
+ }
+ }
+
+ @PutMapping("/{id}")
+ public void updateTask(@PathVariable("id") Long id) {
+ throw new UnsupportedOperationException();
+ }
+
+ @DeleteMapping("/{id}")
+ public void deleteTask(@PathVariable("id") Long id) {
+ throw new AccessDeniedException("You can't delete this task");
+ }
+
+}
diff --git a/spring-boot-libraries/src/main/java/com/baeldung/boot/problem/dto/Task.java b/spring-boot-libraries/src/main/java/com/baeldung/boot/problem/dto/Task.java
new file mode 100644
index 0000000000..a5f39474e7
--- /dev/null
+++ b/spring-boot-libraries/src/main/java/com/baeldung/boot/problem/dto/Task.java
@@ -0,0 +1,32 @@
+package com.baeldung.boot.problem.dto;
+
+public class Task {
+
+ private Long id;
+ private String description;
+
+ public Task() {
+ }
+
+ public Task(Long id, String description) {
+ this.id = id;
+ this.description = description;
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+}
diff --git a/spring-boot-libraries/src/main/java/com/baeldung/boot/problem/problems/TaskNotFoundProblem.java b/spring-boot-libraries/src/main/java/com/baeldung/boot/problem/problems/TaskNotFoundProblem.java
new file mode 100644
index 0000000000..cc3f21d4a5
--- /dev/null
+++ b/spring-boot-libraries/src/main/java/com/baeldung/boot/problem/problems/TaskNotFoundProblem.java
@@ -0,0 +1,16 @@
+package com.baeldung.boot.problem.problems;
+
+import java.net.URI;
+
+import org.zalando.problem.AbstractThrowableProblem;
+import org.zalando.problem.Status;
+
+public class TaskNotFoundProblem extends AbstractThrowableProblem {
+
+ private static final URI TYPE = URI.create("https://example.org/not-found");
+
+ public TaskNotFoundProblem(Long taskId) {
+ super(TYPE, "Not found", Status.NOT_FOUND, String.format("Task '%s' not found", taskId));
+ }
+
+}
diff --git a/spring-boot-libraries/src/main/java/com/baeldung/scheduling/shedlock/TaskScheduler.java b/spring-boot-libraries/src/main/java/com/baeldung/scheduling/shedlock/TaskScheduler.java
index b1b1ad921f..060afe660e 100644
--- a/spring-boot-libraries/src/main/java/com/baeldung/scheduling/shedlock/TaskScheduler.java
+++ b/spring-boot-libraries/src/main/java/com/baeldung/scheduling/shedlock/TaskScheduler.java
@@ -7,9 +7,9 @@ import org.springframework.stereotype.Component;
@Component
class TaskScheduler {
- @Scheduled(cron = "*/15 * * * * *")
+ @Scheduled(cron = "*/15 * * * *")
@SchedulerLock(name = "TaskScheduler_scheduledTask", lockAtLeastForString = "PT5M", lockAtMostForString = "PT14M")
public void scheduledTask() {
System.out.println("Running ShedLock task");
}
-}
\ No newline at end of file
+}
diff --git a/spring-boot-libraries/src/main/resources/application-problem.properties b/spring-boot-libraries/src/main/resources/application-problem.properties
new file mode 100644
index 0000000000..7d0b0a2720
--- /dev/null
+++ b/spring-boot-libraries/src/main/resources/application-problem.properties
@@ -0,0 +1,3 @@
+spring.resources.add-mappings=false
+spring.mvc.throw-exception-if-no-handler-found=true
+spring.http.encoding.force=true
diff --git a/spring-boot-libraries/src/test/java/com/baeldung/boot/problem/controller/ProblemDemoControllerIntegrationTest.java b/spring-boot-libraries/src/test/java/com/baeldung/boot/problem/controller/ProblemDemoControllerIntegrationTest.java
new file mode 100644
index 0000000000..5ced1034c4
--- /dev/null
+++ b/spring-boot-libraries/src/test/java/com/baeldung/boot/problem/controller/ProblemDemoControllerIntegrationTest.java
@@ -0,0 +1,101 @@
+package com.baeldung.boot.problem.controller;
+
+import static org.hamcrest.CoreMatchers.containsString;
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.hamcrest.CoreMatchers.notNullValue;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put;
+import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.http.MediaType;
+import org.springframework.test.context.junit4.SpringRunner;
+import org.springframework.test.web.servlet.MockMvc;
+
+import com.baeldung.boot.problem.SpringProblemApplication;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK, classes = SpringProblemApplication.class)
+@AutoConfigureMockMvc
+public class ProblemDemoControllerIntegrationTest {
+
+ @Autowired
+ private MockMvc mockMvc;
+
+ @Test
+ public void whenRequestingAllTasks_thenReturnSuccessfulResponseWithArrayWithTwoTasks() throws Exception {
+ mockMvc.perform(get("/tasks").contentType(MediaType.APPLICATION_JSON_VALUE))
+ .andDo(print())
+ .andExpect(jsonPath("$.length()", equalTo(2)))
+ .andExpect(status().isOk());
+ }
+
+ @Test
+ public void whenRequestingExistingTask_thenReturnSuccessfulResponse() throws Exception {
+ mockMvc.perform(get("/tasks/1").contentType(MediaType.APPLICATION_JSON_VALUE))
+ .andDo(print())
+ .andExpect(jsonPath("$.id", equalTo(1)))
+ .andExpect(status().isOk());
+ }
+
+ @Test
+ public void whenRequestingMissingTask_thenReturnNotFoundProblemResponse() throws Exception {
+ mockMvc.perform(get("/tasks/5").contentType(MediaType.APPLICATION_PROBLEM_JSON_VALUE))
+ .andDo(print())
+ .andExpect(jsonPath("$.title", equalTo("Not found")))
+ .andExpect(jsonPath("$.status", equalTo(404)))
+ .andExpect(jsonPath("$.detail", equalTo("Task '5' not found")))
+ .andExpect(status().isNotFound());
+ }
+
+ @Test
+ public void whenMakePutCall_thenReturnNotImplementedProblemResponse() throws Exception {
+ mockMvc.perform(put("/tasks/1").contentType(MediaType.APPLICATION_PROBLEM_JSON_VALUE))
+ .andDo(print())
+ .andExpect(jsonPath("$.title", equalTo("Not Implemented")))
+ .andExpect(jsonPath("$.status", equalTo(501)))
+ .andExpect(status().isNotImplemented());
+ }
+
+ @Test
+ public void whenMakeDeleteCall_thenReturnForbiddenProblemResponse() throws Exception {
+ mockMvc.perform(delete("/tasks/2").contentType(MediaType.APPLICATION_PROBLEM_JSON_VALUE))
+ .andDo(print())
+ .andExpect(jsonPath("$.title", equalTo("Forbidden")))
+ .andExpect(jsonPath("$.status", equalTo(403)))
+ .andExpect(jsonPath("$.detail", equalTo("You can't delete this task")))
+ .andExpect(status().isForbidden());
+ }
+
+ @Test
+ public void whenMakeGetCallWithInvalidIdFormat_thenReturnBadRequestResponseWithStackTrace() throws Exception {
+ mockMvc.perform(get("/tasks/invalid-id").contentType(MediaType.APPLICATION_PROBLEM_JSON_VALUE))
+ .andDo(print())
+ .andExpect(jsonPath("$.title", equalTo("Bad Request")))
+ .andExpect(jsonPath("$.status", equalTo(400)))
+ .andExpect(jsonPath("$.stacktrace", notNullValue()))
+ .andExpect(status().isBadRequest());
+ }
+
+ @Test
+ public void whenMakeGetCallWithInvalidIdFormat_thenReturnBadRequestResponseWithCause() throws Exception {
+ mockMvc.perform(get("/tasks/invalid-id").contentType(MediaType.APPLICATION_PROBLEM_JSON_VALUE))
+ .andDo(print())
+ .andExpect(jsonPath("$.title", equalTo("Bad Request")))
+ .andExpect(jsonPath("$.status", equalTo(400)))
+ .andExpect(jsonPath("$.cause", notNullValue()))
+ .andExpect(jsonPath("$.cause.title", equalTo("Internal Server Error")))
+ .andExpect(jsonPath("$.cause.status", equalTo(500)))
+ .andExpect(jsonPath("$.cause.detail", containsString("For input string:")))
+ .andExpect(jsonPath("$.cause.stacktrace", notNullValue()))
+ .andExpect(status().isBadRequest());
+ }
+
+}
diff --git a/spring-boot-logging-log4j2/pom.xml b/spring-boot-logging-log4j2/pom.xml
index ad678a14cf..6cc60da52c 100644
--- a/spring-boot-logging-log4j2/pom.xml
+++ b/spring-boot-logging-log4j2/pom.xml
@@ -3,8 +3,8 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
spring-boot-logging-log4j2
- jar
spring-boot-logging-log4j2
+ jar
Demo project for Spring Boot Logging with Log4J2
@@ -40,12 +40,12 @@
org.springframework.boot
spring-boot-starter-log4j
- 1.3.8.RELEASE
+ ${spring-boot-starter-log4j.version}
org.graylog2
gelfj
- 1.1.16
+ ${gelfj.version}
compile
@@ -71,5 +71,7 @@
com.baeldung.springbootlogging.SpringBootLoggingApplication
+ 1.3.8.RELEASE
+ 1.1.16
diff --git a/spring-boot-mvc/README.md b/spring-boot-mvc/README.md
index bf32e4fc7c..d5a39cdc9f 100644
--- a/spring-boot-mvc/README.md
+++ b/spring-boot-mvc/README.md
@@ -9,4 +9,6 @@
- [Display RSS Feed with Spring MVC](http://www.baeldung.com/spring-mvc-rss-feed)
- [A Controller, Service and DAO Example with Spring Boot and JSF](https://www.baeldung.com/jsf-spring-boot-controller-service-dao)
- [Cache Eviction in Spring Boot](https://www.baeldung.com/spring-boot-evict-cache)
-- [Setting Up Swagger 2 with a Spring REST API](http://www.baeldung.com/swagger-2-documentation-for-spring-rest-api)
\ No newline at end of file
+- [Setting Up Swagger 2 with a Spring REST API](http://www.baeldung.com/swagger-2-documentation-for-spring-rest-api)
+- [Conditionally Enable Scheduled Jobs in Spring](https://www.baeldung.com/spring-scheduled-enabled-conditionally)
+- [Accessing Spring MVC Model Objects in JavaScript](https://www.baeldung.com/spring-mvc-model-objects-js)
diff --git a/spring-boot-mvc/pom.xml b/spring-boot-mvc/pom.xml
index b219e53431..e17c1d39b9 100644
--- a/spring-boot-mvc/pom.xml
+++ b/spring-boot-mvc/pom.xml
@@ -1,66 +1,77 @@
-
- 4.0.0
- spring-boot-mvc
- jar
- spring-boot-mvc
- Module For Spring Boot MVC
+
+ 4.0.0
+ spring-boot-mvc
+ spring-boot-mvc
+ jar
+ Module For Spring Boot MVC
-
- parent-boot-2
- com.baeldung
- 0.0.1-SNAPSHOT
- ../parent-boot-2
-
+
+ parent-boot-2
+ com.baeldung
+ 0.0.1-SNAPSHOT
+ ../parent-boot-2
+
-
+
-
- org.springframework.boot
- spring-boot-starter-web
-
-
- org.apache.tomcat.embed
- tomcat-embed-jasper
-
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.apache.tomcat.embed
+ tomcat-embed-jasper
+
+
+ org.springframework.boot
+ spring-boot-starter-tomcat
+ provided
+
+
+ org.springframework.boot
+ spring-boot-starter-thymeleaf
+
-
-
- org.glassfish
- javax.faces
- 2.3.7
-
-
-
- org.springframework.boot
- spring-boot-starter-test
- test
-
+
+
+ org.glassfish
+ javax.faces
+ 2.3.7
+
-
-
- com.rometools
- rome
- ${rome.version}
-
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
-
-
- org.hibernate.validator
- hibernate-validator
-
-
- javax.validation
- validation-api
-
-
- org.springframework.boot
- spring-boot-starter-validation
-
+
+
+ com.rometools
+ rome
+ ${rome.version}
+
-
+
+
+ org.hibernate.validator
+ hibernate-validator
+
+
+ javax.validation
+ validation-api
+
+
+ org.springframework.boot
+ spring-boot-starter-validation
+
+
+
io.springfox
springfox-swagger2
@@ -72,26 +83,32 @@
${spring.fox.version}
-
+
+ org.apache.tomcat.embed
+ tomcat-embed-jasper
+ provided
+
-
-
-
- org.springframework.boot
- spring-boot-maven-plugin
-
- com.baeldung.springbootmvc.SpringBootMvcApplication
- JAR
-
-
-
-
+
-
- 2.9.2
-
- 1.10.0
- com.baeldung.springbootmvc.SpringBootMvcApplication
-
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+ com.baeldung.springbootmvc.SpringBootMvcApplication
+ JAR
+
+
+
+
+
+
+ 2.9.2
+
+ 1.10.0
+ com.baeldung.springbootmvc.SpringBootMvcApplication
+
diff --git a/spring-boot-mvc/src/main/java/com/baeldung/accessparamsjs/App.java b/spring-boot-mvc/src/main/java/com/baeldung/accessparamsjs/App.java
new file mode 100644
index 0000000000..c16e784dd2
--- /dev/null
+++ b/spring-boot-mvc/src/main/java/com/baeldung/accessparamsjs/App.java
@@ -0,0 +1,12 @@
+package com.baeldung.accessparamsjs;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class App {
+
+ public static void main(String[] args) {
+ SpringApplication.run(App.class, args);
+ }
+}
diff --git a/spring-boot-mvc/src/main/java/com/baeldung/accessparamsjs/Controller.java b/spring-boot-mvc/src/main/java/com/baeldung/accessparamsjs/Controller.java
new file mode 100644
index 0000000000..8759f1bcd6
--- /dev/null
+++ b/spring-boot-mvc/src/main/java/com/baeldung/accessparamsjs/Controller.java
@@ -0,0 +1,32 @@
+package com.baeldung.accessparamsjs;
+
+import java.util.Map;
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.servlet.ModelAndView;
+
+/**
+ * Sample rest controller for the tutorial article
+ * "Access Spring MVC Model object in JavaScript".
+ *
+ * @author Andrew Shcherbakov
+ *
+ */
+@RestController
+public class Controller {
+
+ /**
+ * Define two model objects (one integer and one string) and pass them to the view.
+ *
+ * @param model
+ * @return
+ */
+ @RequestMapping("/index")
+ public ModelAndView thymeleafView(Map model) {
+ model.put("number", 1234);
+ model.put("message", "Hello from Spring MVC");
+ return new ModelAndView("thymeleaf/index");
+ }
+
+}
diff --git a/spring-boot-mvc/src/main/java/com/baeldung/scheduling/ScheduleJobsByProfile.java b/spring-boot-mvc/src/main/java/com/baeldung/scheduling/ScheduleJobsByProfile.java
new file mode 100644
index 0000000000..33cd44331f
--- /dev/null
+++ b/spring-boot-mvc/src/main/java/com/baeldung/scheduling/ScheduleJobsByProfile.java
@@ -0,0 +1,20 @@
+package com.baeldung.scheduling;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Profile;
+
+@Configuration
+public class ScheduleJobsByProfile {
+
+ private final static Logger LOG = LoggerFactory.getLogger(ScheduleJobsByProfile.class);
+
+ @Profile("prod")
+ @Bean
+ public ScheduledJob scheduledJob()
+ {
+ return new ScheduledJob("@Profile");
+ }
+}
diff --git a/spring-boot-mvc/src/main/java/com/baeldung/scheduling/ScheduledJob.java b/spring-boot-mvc/src/main/java/com/baeldung/scheduling/ScheduledJob.java
new file mode 100644
index 0000000000..df7cefcd3c
--- /dev/null
+++ b/spring-boot-mvc/src/main/java/com/baeldung/scheduling/ScheduledJob.java
@@ -0,0 +1,21 @@
+package com.baeldung.scheduling;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.scheduling.annotation.Scheduled;
+
+public class ScheduledJob {
+
+ private String source;
+
+ public ScheduledJob(String source) {
+ this.source = source;
+ }
+
+ private final static Logger LOG = LoggerFactory.getLogger(ScheduledJob.class);
+
+ @Scheduled(fixedDelay = 60000)
+ public void cleanTempDir() {
+ LOG.info("Cleaning temp directory via {}", source);
+ }
+}
diff --git a/spring-boot-mvc/src/main/java/com/baeldung/scheduling/ScheduledJobsWithBoolean.java b/spring-boot-mvc/src/main/java/com/baeldung/scheduling/ScheduledJobsWithBoolean.java
new file mode 100644
index 0000000000..b03de61641
--- /dev/null
+++ b/spring-boot-mvc/src/main/java/com/baeldung/scheduling/ScheduledJobsWithBoolean.java
@@ -0,0 +1,28 @@
+package com.baeldung.scheduling;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.annotation.Scheduled;
+
+@Configuration
+public class ScheduledJobsWithBoolean {
+
+ private final static Logger LOG = LoggerFactory.getLogger(ScheduledJobsWithBoolean.class);
+
+ @Value("${jobs.enabled:true}")
+ private boolean isEnabled;
+
+ /**
+ * A scheduled job controlled via application property. The job always
+ * executes, but the logic inside is protected by a configurable boolean
+ * flag.
+ */
+ @Scheduled(fixedDelay = 60000)
+ public void cleanTempDirectory() {
+ if(isEnabled) {
+ LOG.info("Cleaning temp directory via boolean flag");
+ }
+ }
+}
diff --git a/spring-boot-mvc/src/main/java/com/baeldung/scheduling/ScheduledJobsWithConditional.java b/spring-boot-mvc/src/main/java/com/baeldung/scheduling/ScheduledJobsWithConditional.java
new file mode 100644
index 0000000000..081c8d990a
--- /dev/null
+++ b/spring-boot-mvc/src/main/java/com/baeldung/scheduling/ScheduledJobsWithConditional.java
@@ -0,0 +1,20 @@
+package com.baeldung.scheduling;
+
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class ScheduledJobsWithConditional
+{
+ /**
+ * This uses @ConditionalOnProperty to conditionally create a bean, which itself
+ * is a scheduled job.
+ * @return ScheduledJob
+ */
+ @Bean
+ @ConditionalOnProperty(value = "jobs.enabled", matchIfMissing = true, havingValue = "true")
+ public ScheduledJob runMyCronTask() {
+ return new ScheduledJob("@ConditionalOnProperty");
+ }
+}
diff --git a/spring-boot-mvc/src/main/java/com/baeldung/scheduling/ScheduledJobsWithExpression.java b/spring-boot-mvc/src/main/java/com/baeldung/scheduling/ScheduledJobsWithExpression.java
new file mode 100644
index 0000000000..577a01f241
--- /dev/null
+++ b/spring-boot-mvc/src/main/java/com/baeldung/scheduling/ScheduledJobsWithExpression.java
@@ -0,0 +1,23 @@
+package com.baeldung.scheduling;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.annotation.Scheduled;
+
+@Configuration
+public class ScheduledJobsWithExpression
+{
+ private final static Logger LOG =
+ LoggerFactory.getLogger(ScheduledJobsWithExpression.class);
+
+ /**
+ * A scheduled job controlled via application property. The job always
+ * executes, but the logic inside is protected by a configurable boolean
+ * flag.
+ */
+ @Scheduled(cron = "${jobs.cronSchedule:-}")
+ public void cleanTempDirectory() {
+ LOG.info("Cleaning temp directory via placeholder");
+ }
+}
diff --git a/spring-boot-mvc/src/main/java/com/baeldung/scheduling/SchedulingApplication.java b/spring-boot-mvc/src/main/java/com/baeldung/scheduling/SchedulingApplication.java
new file mode 100644
index 0000000000..913e2137f8
--- /dev/null
+++ b/spring-boot-mvc/src/main/java/com/baeldung/scheduling/SchedulingApplication.java
@@ -0,0 +1,16 @@
+package com.baeldung.scheduling;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.scheduling.annotation.EnableScheduling;
+
+@SpringBootApplication
+@EnableScheduling
+public class SchedulingApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(SchedulingApplication.class, args);
+ }
+
+}
+
diff --git a/spring-boot-mvc/src/main/resources/application.properties b/spring-boot-mvc/src/main/resources/application.properties
index 709574239b..6dab470c84 100644
--- a/spring-boot-mvc/src/main/resources/application.properties
+++ b/spring-boot-mvc/src/main/resources/application.properties
@@ -1 +1,2 @@
-spring.main.allow-bean-definition-overriding=true
\ No newline at end of file
+spring.main.allow-bean-definition-overriding=true
+spring.thymeleaf.view-names=thymeleaf/*
\ No newline at end of file
diff --git a/spring-boot-mvc/src/main/resources/templates/thymeleaf/index.html b/spring-boot-mvc/src/main/resources/templates/thymeleaf/index.html
new file mode 100644
index 0000000000..4939d0ea50
--- /dev/null
+++ b/spring-boot-mvc/src/main/resources/templates/thymeleaf/index.html
@@ -0,0 +1,29 @@
+
+
+
+Access Spring MVC params
+
+
+
+
+
+
+ Number=
+
+ Message=
+
+ Data from the external JS file (due to loading order)
+
+
+ Asynchronous loading from external JS file (plain JS)
+
+
+ Asynchronous loading from external JS file (jQuery)
+
+
+
+
+
diff --git a/spring-boot-mvc/src/main/webapp/js/jquery.js b/spring-boot-mvc/src/main/webapp/js/jquery.js
new file mode 100644
index 0000000000..4d9b3a2587
--- /dev/null
+++ b/spring-boot-mvc/src/main/webapp/js/jquery.js
@@ -0,0 +1,2 @@
+/*! jQuery v3.3.1 | (c) JS Foundation and other contributors | jquery.org/license */
+!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(e,t){"use strict";var n=[],r=e.document,i=Object.getPrototypeOf,o=n.slice,a=n.concat,s=n.push,u=n.indexOf,l={},c=l.toString,f=l.hasOwnProperty,p=f.toString,d=p.call(Object),h={},g=function e(t){return"function"==typeof t&&"number"!=typeof t.nodeType},y=function e(t){return null!=t&&t===t.window},v={type:!0,src:!0,noModule:!0};function m(e,t,n){var i,o=(t=t||r).createElement("script");if(o.text=e,n)for(i in v)n[i]&&(o[i]=n[i]);t.head.appendChild(o).parentNode.removeChild(o)}function x(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?l[c.call(e)]||"object":typeof e}var b="3.3.1",w=function(e,t){return new w.fn.init(e,t)},T=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;w.fn=w.prototype={jquery:"3.3.1",constructor:w,length:0,toArray:function(){return o.call(this)},get:function(e){return null==e?o.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=w.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return w.each(this,e)},map:function(e){return this.pushStack(w.map(this,function(t,n){return e.call(t,n,t)}))},slice:function(){return this.pushStack(o.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(n>=0&&n0&&t-1 in e)}var E=function(e){var t,n,r,i,o,a,s,u,l,c,f,p,d,h,g,y,v,m,x,b="sizzle"+1*new Date,w=e.document,T=0,C=0,E=ae(),k=ae(),S=ae(),D=function(e,t){return e===t&&(f=!0),0},N={}.hasOwnProperty,A=[],j=A.pop,q=A.push,L=A.push,H=A.slice,O=function(e,t){for(var n=0,r=e.length;n+~]|"+M+")"+M+"*"),z=new RegExp("="+M+"*([^\\]'\"]*?)"+M+"*\\]","g"),X=new RegExp(W),U=new RegExp("^"+R+"$"),V={ID:new RegExp("^#("+R+")"),CLASS:new RegExp("^\\.("+R+")"),TAG:new RegExp("^("+R+"|[*])"),ATTR:new RegExp("^"+I),PSEUDO:new RegExp("^"+W),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+P+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},G=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Q=/^[^{]+\{\s*\[native \w/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,K=/[+~]/,Z=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ee=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},te=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ne=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},re=function(){p()},ie=me(function(e){return!0===e.disabled&&("form"in e||"label"in e)},{dir:"parentNode",next:"legend"});try{L.apply(A=H.call(w.childNodes),w.childNodes),A[w.childNodes.length].nodeType}catch(e){L={apply:A.length?function(e,t){q.apply(e,H.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function oe(e,t,r,i){var o,s,l,c,f,h,v,m=t&&t.ownerDocument,T=t?t.nodeType:9;if(r=r||[],"string"!=typeof e||!e||1!==T&&9!==T&&11!==T)return r;if(!i&&((t?t.ownerDocument||t:w)!==d&&p(t),t=t||d,g)){if(11!==T&&(f=J.exec(e)))if(o=f[1]){if(9===T){if(!(l=t.getElementById(o)))return r;if(l.id===o)return r.push(l),r}else if(m&&(l=m.getElementById(o))&&x(t,l)&&l.id===o)return r.push(l),r}else{if(f[2])return L.apply(r,t.getElementsByTagName(e)),r;if((o=f[3])&&n.getElementsByClassName&&t.getElementsByClassName)return L.apply(r,t.getElementsByClassName(o)),r}if(n.qsa&&!S[e+" "]&&(!y||!y.test(e))){if(1!==T)m=t,v=e;else if("object"!==t.nodeName.toLowerCase()){(c=t.getAttribute("id"))?c=c.replace(te,ne):t.setAttribute("id",c=b),s=(h=a(e)).length;while(s--)h[s]="#"+c+" "+ve(h[s]);v=h.join(","),m=K.test(e)&&ge(t.parentNode)||t}if(v)try{return L.apply(r,m.querySelectorAll(v)),r}catch(e){}finally{c===b&&t.removeAttribute("id")}}}return u(e.replace(B,"$1"),t,r,i)}function ae(){var e=[];function t(n,i){return e.push(n+" ")>r.cacheLength&&delete t[e.shift()],t[n+" "]=i}return t}function se(e){return e[b]=!0,e}function ue(e){var t=d.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function le(e,t){var n=e.split("|"),i=n.length;while(i--)r.attrHandle[n[i]]=t}function ce(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function fe(e){return function(t){return"input"===t.nodeName.toLowerCase()&&t.type===e}}function pe(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function de(e){return function(t){return"form"in t?t.parentNode&&!1===t.disabled?"label"in t?"label"in t.parentNode?t.parentNode.disabled===e:t.disabled===e:t.isDisabled===e||t.isDisabled!==!e&&ie(t)===e:t.disabled===e:"label"in t&&t.disabled===e}}function he(e){return se(function(t){return t=+t,se(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}function ge(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}n=oe.support={},o=oe.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&"HTML"!==t.nodeName},p=oe.setDocument=function(e){var t,i,a=e?e.ownerDocument||e:w;return a!==d&&9===a.nodeType&&a.documentElement?(d=a,h=d.documentElement,g=!o(d),w!==d&&(i=d.defaultView)&&i.top!==i&&(i.addEventListener?i.addEventListener("unload",re,!1):i.attachEvent&&i.attachEvent("onunload",re)),n.attributes=ue(function(e){return e.className="i",!e.getAttribute("className")}),n.getElementsByTagName=ue(function(e){return e.appendChild(d.createComment("")),!e.getElementsByTagName("*").length}),n.getElementsByClassName=Q.test(d.getElementsByClassName),n.getById=ue(function(e){return h.appendChild(e).id=b,!d.getElementsByName||!d.getElementsByName(b).length}),n.getById?(r.filter.ID=function(e){var t=e.replace(Z,ee);return function(e){return e.getAttribute("id")===t}},r.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&g){var n=t.getElementById(e);return n?[n]:[]}}):(r.filter.ID=function(e){var t=e.replace(Z,ee);return function(e){var n="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}},r.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&g){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),r.find.TAG=n.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):n.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},r.find.CLASS=n.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&g)return t.getElementsByClassName(e)},v=[],y=[],(n.qsa=Q.test(d.querySelectorAll))&&(ue(function(e){h.appendChild(e).innerHTML=" ",e.querySelectorAll("[msallowcapture^='']").length&&y.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||y.push("\\["+M+"*(?:value|"+P+")"),e.querySelectorAll("[id~="+b+"-]").length||y.push("~="),e.querySelectorAll(":checked").length||y.push(":checked"),e.querySelectorAll("a#"+b+"+*").length||y.push(".#.+[+~]")}),ue(function(e){e.innerHTML=" ";var t=d.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&y.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&y.push(":enabled",":disabled"),h.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&y.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),y.push(",.*:")})),(n.matchesSelector=Q.test(m=h.matches||h.webkitMatchesSelector||h.mozMatchesSelector||h.oMatchesSelector||h.msMatchesSelector))&&ue(function(e){n.disconnectedMatch=m.call(e,"*"),m.call(e,"[s!='']:x"),v.push("!=",W)}),y=y.length&&new RegExp(y.join("|")),v=v.length&&new RegExp(v.join("|")),t=Q.test(h.compareDocumentPosition),x=t||Q.test(h.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return f=!0,0;var r=!e.compareDocumentPosition-!t.compareDocumentPosition;return r||(1&(r=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!n.sortDetached&&t.compareDocumentPosition(e)===r?e===d||e.ownerDocument===w&&x(w,e)?-1:t===d||t.ownerDocument===w&&x(w,t)?1:c?O(c,e)-O(c,t):0:4&r?-1:1)}:function(e,t){if(e===t)return f=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===d?-1:t===d?1:i?-1:o?1:c?O(c,e)-O(c,t):0;if(i===o)return ce(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?ce(a[r],s[r]):a[r]===w?-1:s[r]===w?1:0},d):d},oe.matches=function(e,t){return oe(e,null,null,t)},oe.matchesSelector=function(e,t){if((e.ownerDocument||e)!==d&&p(e),t=t.replace(z,"='$1']"),n.matchesSelector&&g&&!S[t+" "]&&(!v||!v.test(t))&&(!y||!y.test(t)))try{var r=m.call(e,t);if(r||n.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(e){}return oe(t,d,null,[e]).length>0},oe.contains=function(e,t){return(e.ownerDocument||e)!==d&&p(e),x(e,t)},oe.attr=function(e,t){(e.ownerDocument||e)!==d&&p(e);var i=r.attrHandle[t.toLowerCase()],o=i&&N.call(r.attrHandle,t.toLowerCase())?i(e,t,!g):void 0;return void 0!==o?o:n.attributes||!g?e.getAttribute(t):(o=e.getAttributeNode(t))&&o.specified?o.value:null},oe.escape=function(e){return(e+"").replace(te,ne)},oe.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},oe.uniqueSort=function(e){var t,r=[],i=0,o=0;if(f=!n.detectDuplicates,c=!n.sortStable&&e.slice(0),e.sort(D),f){while(t=e[o++])t===e[o]&&(i=r.push(o));while(i--)e.splice(r[i],1)}return c=null,e},i=oe.getText=function(e){var t,n="",r=0,o=e.nodeType;if(o){if(1===o||9===o||11===o){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=i(e)}else if(3===o||4===o)return e.nodeValue}else while(t=e[r++])n+=i(t);return n},(r=oe.selectors={cacheLength:50,createPseudo:se,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(Z,ee),e[3]=(e[3]||e[4]||e[5]||"").replace(Z,ee),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||oe.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&oe.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return V.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=a(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(Z,ee).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=E[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&E(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=oe.attr(r,e);return null==i?"!="===t:!t||(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i.replace($," ")+" ").indexOf(n)>-1:"|="===t&&(i===n||i.slice(0,n.length+1)===n+"-"))}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,f,p,d,h,g=o!==a?"nextSibling":"previousSibling",y=t.parentNode,v=s&&t.nodeName.toLowerCase(),m=!u&&!s,x=!1;if(y){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===v:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?y.firstChild:y.lastChild],a&&m){x=(d=(l=(c=(f=(p=y)[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]||[])[0]===T&&l[1])&&l[2],p=d&&y.childNodes[d];while(p=++d&&p&&p[g]||(x=d=0)||h.pop())if(1===p.nodeType&&++x&&p===t){c[e]=[T,d,x];break}}else if(m&&(x=d=(l=(c=(f=(p=t)[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]||[])[0]===T&&l[1]),!1===x)while(p=++d&&p&&p[g]||(x=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===v:1===p.nodeType)&&++x&&(m&&((c=(f=p[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]=[T,x]),p===t))break;return(x-=i)===r||x%r==0&&x/r>=0}}},PSEUDO:function(e,t){var n,i=r.pseudos[e]||r.setFilters[e.toLowerCase()]||oe.error("unsupported pseudo: "+e);return i[b]?i(t):i.length>1?(n=[e,e,"",t],r.setFilters.hasOwnProperty(e.toLowerCase())?se(function(e,n){var r,o=i(e,t),a=o.length;while(a--)e[r=O(e,o[a])]=!(n[r]=o[a])}):function(e){return i(e,0,n)}):i}},pseudos:{not:se(function(e){var t=[],n=[],r=s(e.replace(B,"$1"));return r[b]?se(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),t[0]=null,!n.pop()}}),has:se(function(e){return function(t){return oe(e,t).length>0}}),contains:se(function(e){return e=e.replace(Z,ee),function(t){return(t.textContent||t.innerText||i(t)).indexOf(e)>-1}}),lang:se(function(e){return U.test(e||"")||oe.error("unsupported lang: "+e),e=e.replace(Z,ee).toLowerCase(),function(t){var n;do{if(n=g?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return(n=n.toLowerCase())===e||0===n.indexOf(e+"-")}while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===h},focus:function(e){return e===d.activeElement&&(!d.hasFocus||d.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:de(!1),disabled:de(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!r.pseudos.empty(e)},header:function(e){return Y.test(e.nodeName)},input:function(e){return G.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:he(function(){return[0]}),last:he(function(e,t){return[t-1]}),eq:he(function(e,t,n){return[n<0?n+t:n]}),even:he(function(e,t){for(var n=0;n=0;)e.push(r);return e}),gt:he(function(e,t,n){for(var r=n<0?n+t:n;++r1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function be(e,t,n){for(var r=0,i=t.length;r-1&&(o[l]=!(a[l]=f))}}else v=we(v===a?v.splice(h,v.length):v),i?i(null,a,v,u):L.apply(a,v)})}function Ce(e){for(var t,n,i,o=e.length,a=r.relative[e[0].type],s=a||r.relative[" "],u=a?1:0,c=me(function(e){return e===t},s,!0),f=me(function(e){return O(t,e)>-1},s,!0),p=[function(e,n,r){var i=!a&&(r||n!==l)||((t=n).nodeType?c(e,n,r):f(e,n,r));return t=null,i}];u1&&xe(p),u>1&&ve(e.slice(0,u-1).concat({value:" "===e[u-2].type?"*":""})).replace(B,"$1"),n,u0,i=e.length>0,o=function(o,a,s,u,c){var f,h,y,v=0,m="0",x=o&&[],b=[],w=l,C=o||i&&r.find.TAG("*",c),E=T+=null==w?1:Math.random()||.1,k=C.length;for(c&&(l=a===d||a||c);m!==k&&null!=(f=C[m]);m++){if(i&&f){h=0,a||f.ownerDocument===d||(p(f),s=!g);while(y=e[h++])if(y(f,a||d,s)){u.push(f);break}c&&(T=E)}n&&((f=!y&&f)&&v--,o&&x.push(f))}if(v+=m,n&&m!==v){h=0;while(y=t[h++])y(x,b,a,s);if(o){if(v>0)while(m--)x[m]||b[m]||(b[m]=j.call(u));b=we(b)}L.apply(u,b),c&&!o&&b.length>0&&v+t.length>1&&oe.uniqueSort(u)}return c&&(T=E,l=w),x};return n?se(o):o}return s=oe.compile=function(e,t){var n,r=[],i=[],o=S[e+" "];if(!o){t||(t=a(e)),n=t.length;while(n--)(o=Ce(t[n]))[b]?r.push(o):i.push(o);(o=S(e,Ee(i,r))).selector=e}return o},u=oe.select=function(e,t,n,i){var o,u,l,c,f,p="function"==typeof e&&e,d=!i&&a(e=p.selector||e);if(n=n||[],1===d.length){if((u=d[0]=d[0].slice(0)).length>2&&"ID"===(l=u[0]).type&&9===t.nodeType&&g&&r.relative[u[1].type]){if(!(t=(r.find.ID(l.matches[0].replace(Z,ee),t)||[])[0]))return n;p&&(t=t.parentNode),e=e.slice(u.shift().value.length)}o=V.needsContext.test(e)?0:u.length;while(o--){if(l=u[o],r.relative[c=l.type])break;if((f=r.find[c])&&(i=f(l.matches[0].replace(Z,ee),K.test(u[0].type)&&ge(t.parentNode)||t))){if(u.splice(o,1),!(e=i.length&&ve(u)))return L.apply(n,i),n;break}}}return(p||s(e,d))(i,t,!g,n,!t||K.test(e)&&ge(t.parentNode)||t),n},n.sortStable=b.split("").sort(D).join("")===b,n.detectDuplicates=!!f,p(),n.sortDetached=ue(function(e){return 1&e.compareDocumentPosition(d.createElement("fieldset"))}),ue(function(e){return e.innerHTML=" ","#"===e.firstChild.getAttribute("href")})||le("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),n.attributes&&ue(function(e){return e.innerHTML=" ",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||le("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ue(function(e){return null==e.getAttribute("disabled")})||le(P,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),oe}(e);w.find=E,w.expr=E.selectors,w.expr[":"]=w.expr.pseudos,w.uniqueSort=w.unique=E.uniqueSort,w.text=E.getText,w.isXMLDoc=E.isXML,w.contains=E.contains,w.escapeSelector=E.escape;var k=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&w(e).is(n))break;r.push(e)}return r},S=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},D=w.expr.match.needsContext;function N(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var A=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,t,n){return g(t)?w.grep(e,function(e,r){return!!t.call(e,r,e)!==n}):t.nodeType?w.grep(e,function(e){return e===t!==n}):"string"!=typeof t?w.grep(e,function(e){return u.call(t,e)>-1!==n}):w.filter(t,e,n)}w.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?w.find.matchesSelector(r,e)?[r]:[]:w.find.matches(e,w.grep(t,function(e){return 1===e.nodeType}))},w.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(w(e).filter(function(){for(t=0;t1?w.uniqueSort(n):n},filter:function(e){return this.pushStack(j(this,e||[],!1))},not:function(e){return this.pushStack(j(this,e||[],!0))},is:function(e){return!!j(this,"string"==typeof e&&D.test(e)?w(e):e||[],!1).length}});var q,L=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(w.fn.init=function(e,t,n){var i,o;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(i="<"===e[0]&&">"===e[e.length-1]&&e.length>=3?[null,e,null]:L.exec(e))||!i[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(i[1]){if(t=t instanceof w?t[0]:t,w.merge(this,w.parseHTML(i[1],t&&t.nodeType?t.ownerDocument||t:r,!0)),A.test(i[1])&&w.isPlainObject(t))for(i in t)g(this[i])?this[i](t[i]):this.attr(i,t[i]);return this}return(o=r.getElementById(i[2]))&&(this[0]=o,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):g(e)?void 0!==n.ready?n.ready(e):e(w):w.makeArray(e,this)}).prototype=w.fn,q=w(r);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};w.fn.extend({has:function(e){var t=w(e,this),n=t.length;return this.filter(function(){for(var e=0;e-1:1===n.nodeType&&w.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(o.length>1?w.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?u.call(w(e),this[0]):u.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(w.uniqueSort(w.merge(this.get(),w(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}w.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return k(e,"parentNode")},parentsUntil:function(e,t,n){return k(e,"parentNode",n)},next:function(e){return P(e,"nextSibling")},prev:function(e){return P(e,"previousSibling")},nextAll:function(e){return k(e,"nextSibling")},prevAll:function(e){return k(e,"previousSibling")},nextUntil:function(e,t,n){return k(e,"nextSibling",n)},prevUntil:function(e,t,n){return k(e,"previousSibling",n)},siblings:function(e){return S((e.parentNode||{}).firstChild,e)},children:function(e){return S(e.firstChild)},contents:function(e){return N(e,"iframe")?e.contentDocument:(N(e,"template")&&(e=e.content||e),w.merge([],e.childNodes))}},function(e,t){w.fn[e]=function(n,r){var i=w.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=w.filter(r,i)),this.length>1&&(O[e]||w.uniqueSort(i),H.test(e)&&i.reverse()),this.pushStack(i)}});var M=/[^\x20\t\r\n\f]+/g;function R(e){var t={};return w.each(e.match(M)||[],function(e,n){t[n]=!0}),t}w.Callbacks=function(e){e="string"==typeof e?R(e):w.extend({},e);var t,n,r,i,o=[],a=[],s=-1,u=function(){for(i=i||e.once,r=t=!0;a.length;s=-1){n=a.shift();while(++s-1)o.splice(n,1),n<=s&&s--}),this},has:function(e){return e?w.inArray(e,o)>-1:o.length>0},empty:function(){return o&&(o=[]),this},disable:function(){return i=a=[],o=n="",this},disabled:function(){return!o},lock:function(){return i=a=[],n||t||(o=n=""),this},locked:function(){return!!i},fireWith:function(e,n){return i||(n=[e,(n=n||[]).slice?n.slice():n],a.push(n),t||u()),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!r}};return l};function I(e){return e}function W(e){throw e}function $(e,t,n,r){var i;try{e&&g(i=e.promise)?i.call(e).done(t).fail(n):e&&g(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}w.extend({Deferred:function(t){var n=[["notify","progress",w.Callbacks("memory"),w.Callbacks("memory"),2],["resolve","done",w.Callbacks("once memory"),w.Callbacks("once memory"),0,"resolved"],["reject","fail",w.Callbacks("once memory"),w.Callbacks("once memory"),1,"rejected"]],r="pending",i={state:function(){return r},always:function(){return o.done(arguments).fail(arguments),this},"catch":function(e){return i.then(null,e)},pipe:function(){var e=arguments;return w.Deferred(function(t){w.each(n,function(n,r){var i=g(e[r[4]])&&e[r[4]];o[r[1]](function(){var e=i&&i.apply(this,arguments);e&&g(e.promise)?e.promise().progress(t.notify).done(t.resolve).fail(t.reject):t[r[0]+"With"](this,i?[e]:arguments)})}),e=null}).promise()},then:function(t,r,i){var o=0;function a(t,n,r,i){return function(){var s=this,u=arguments,l=function(){var e,l;if(!(t=o&&(r!==W&&(s=void 0,u=[e]),n.rejectWith(s,u))}};t?c():(w.Deferred.getStackHook&&(c.stackTrace=w.Deferred.getStackHook()),e.setTimeout(c))}}return w.Deferred(function(e){n[0][3].add(a(0,e,g(i)?i:I,e.notifyWith)),n[1][3].add(a(0,e,g(t)?t:I)),n[2][3].add(a(0,e,g(r)?r:W))}).promise()},promise:function(e){return null!=e?w.extend(e,i):i}},o={};return w.each(n,function(e,t){var a=t[2],s=t[5];i[t[1]]=a.add,s&&a.add(function(){r=s},n[3-e][2].disable,n[3-e][3].disable,n[0][2].lock,n[0][3].lock),a.add(t[3].fire),o[t[0]]=function(){return o[t[0]+"With"](this===o?void 0:this,arguments),this},o[t[0]+"With"]=a.fireWith}),i.promise(o),t&&t.call(o,o),o},when:function(e){var t=arguments.length,n=t,r=Array(n),i=o.call(arguments),a=w.Deferred(),s=function(e){return function(n){r[e]=this,i[e]=arguments.length>1?o.call(arguments):n,--t||a.resolveWith(r,i)}};if(t<=1&&($(e,a.done(s(n)).resolve,a.reject,!t),"pending"===a.state()||g(i[n]&&i[n].then)))return a.then();while(n--)$(i[n],s(n),a.reject);return a.promise()}});var B=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;w.Deferred.exceptionHook=function(t,n){e.console&&e.console.warn&&t&&B.test(t.name)&&e.console.warn("jQuery.Deferred exception: "+t.message,t.stack,n)},w.readyException=function(t){e.setTimeout(function(){throw t})};var F=w.Deferred();w.fn.ready=function(e){return F.then(e)["catch"](function(e){w.readyException(e)}),this},w.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--w.readyWait:w.isReady)||(w.isReady=!0,!0!==e&&--w.readyWait>0||F.resolveWith(r,[w]))}}),w.ready.then=F.then;function _(){r.removeEventListener("DOMContentLoaded",_),e.removeEventListener("load",_),w.ready()}"complete"===r.readyState||"loading"!==r.readyState&&!r.documentElement.doScroll?e.setTimeout(w.ready):(r.addEventListener("DOMContentLoaded",_),e.addEventListener("load",_));var z=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===x(n)){i=!0;for(s in n)z(e,t,s,n[s],!0,o,a)}else if(void 0!==r&&(i=!0,g(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(w(e),n)})),t))for(;s1,null,!0)},removeData:function(e){return this.each(function(){K.remove(this,e)})}}),w.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=J.get(e,t),n&&(!r||Array.isArray(n)?r=J.access(e,t,w.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=w.queue(e,t),r=n.length,i=n.shift(),o=w._queueHooks(e,t),a=function(){w.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return J.get(e,n)||J.access(e,n,{empty:w.Callbacks("once memory").add(function(){J.remove(e,[t+"queue",n])})})}}),w.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),arguments.length\x20\t\r\n\f]+)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,""," "],thead:[1,""],col:[2,""],tr:[2,""],td:[3,""],_default:[0,"",""]};ge.optgroup=ge.option,ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td;function ye(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&N(e,t)?w.merge([e],n):n}function ve(e,t){for(var n=0,r=e.length;n-1)i&&i.push(o);else if(l=w.contains(o.ownerDocument,o),a=ye(f.appendChild(o),"script"),l&&ve(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}!function(){var e=r.createDocumentFragment().appendChild(r.createElement("div")),t=r.createElement("input");t.setAttribute("type","radio"),t.setAttribute("checked","checked"),t.setAttribute("name","t"),e.appendChild(t),h.checkClone=e.cloneNode(!0).cloneNode(!0).lastChild.checked,e.innerHTML="",h.noCloneChecked=!!e.cloneNode(!0).lastChild.defaultValue}();var be=r.documentElement,we=/^key/,Te=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ce=/^([^.]*)(?:\.(.+)|)/;function Ee(){return!0}function ke(){return!1}function Se(){try{return r.activeElement}catch(e){}}function De(e,t,n,r,i,o){var a,s;if("object"==typeof t){"string"!=typeof n&&(r=r||n,n=void 0);for(s in t)De(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=ke;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return w().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=w.guid++)),e.each(function(){w.event.add(this,t,i,r,n)})}w.event={global:{},add:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,y=J.get(e);if(y){n.handler&&(n=(o=n).handler,i=o.selector),i&&w.find.matchesSelector(be,i),n.guid||(n.guid=w.guid++),(u=y.events)||(u=y.events={}),(a=y.handle)||(a=y.handle=function(t){return"undefined"!=typeof w&&w.event.triggered!==t.type?w.event.dispatch.apply(e,arguments):void 0}),l=(t=(t||"").match(M)||[""]).length;while(l--)d=g=(s=Ce.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=w.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=w.event.special[d]||{},c=w.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&w.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(e,r,h,a)||e.addEventListener&&e.addEventListener(d,a)),f.add&&(f.add.call(e,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),w.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,y=J.hasData(e)&&J.get(e);if(y&&(u=y.events)){l=(t=(t||"").match(M)||[""]).length;while(l--)if(s=Ce.exec(t[l])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){f=w.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,y.handle)||w.removeEvent(e,d,y.handle),delete u[d])}else for(d in u)w.event.remove(e,d+t[l],n,r,!0);w.isEmptyObject(u)&&J.remove(e,"handle events")}},dispatch:function(e){var t=w.event.fix(e),n,r,i,o,a,s,u=new Array(arguments.length),l=(J.get(this,"events")||{})[t.type]||[],c=w.event.special[t.type]||{};for(u[0]=t,n=1;n=1))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n-1:w.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u\x20\t\r\n\f]*)[^>]*)\/>/gi,Ae=/