From 70a314caacb44a4b5e34e2e6240b952280795f27 Mon Sep 17 00:00:00 2001 From: IgGusev Date: Mon, 11 Dec 2023 13:58:24 +0200 Subject: [PATCH] IGNITE-20810 Removing duplicate doc --- docs/.gitignore | 5 - docs/Gemfile | 17 - docs/README.adoc | 252 -------- docs/README.md | 4 + docs/_config.yml | 41 -- docs/_data/toc.yaml | 60 -- docs/_docs/aws/aws.adoc | 113 ---- docs/_docs/azure/azure.adoc | 45 -- docs/_docs/camel/camel-streamer.adoc | 153 ----- .../cdc/change-data-capture-extensions.adoc | 192 ------ docs/_docs/flink/flink-streamer.adoc | 78 --- docs/_docs/flume/flume-sink.adoc | 79 --- docs/_docs/gce/gce.adoc | 43 -- docs/_docs/images/CDC-design.svg | 4 - docs/_docs/images/camel-streamer.png | Bin 120217 -> 0 bytes docs/_docs/images/hibernate-l2-cache.png | Bin 135173 -> 0 bytes docs/_docs/images/hibernate.svg | 6 - docs/_docs/images/kafka.svg | 3 - docs/_docs/images/more.svg | 18 - docs/_docs/images/oracle.svg | 3 - docs/_docs/images/osgi.svg | 17 - docs/_docs/images/spark.svg | 7 - docs/_docs/images/spring.svg | 3 - docs/_docs/jms/jms-streamer.adoc | 123 ---- docs/_docs/kafka/kafka-streamer.adoc | 221 ------- docs/_docs/mqtt/mqtt-streamer.adoc | 76 --- .../performance-statistics.adoc | 86 --- docs/_docs/pub-sub/pub-sub.adoc | 32 - docs/_docs/rocketmq/rocketmq-streamer.adoc | 85 --- docs/_docs/spark/spark.adoc | 127 ---- docs/_docs/spring/spring-boot.adoc | 210 ------- docs/_docs/spring/spring-caching.adoc | 595 ------------------ docs/_docs/spring/spring-data.adoc | 296 --------- docs/_docs/spring/spring-sessions.adoc | 110 ---- docs/_docs/spring/spring-tx.adoc | 533 ---------------- docs/_docs/storm/storm-streamer.adoc | 62 -- .../topology-validator.adoc | 70 --- docs/_docs/twitter/twitter-streamer.adoc | 65 -- docs/_docs/zeromq/zeromq-streamer.adoc | 67 -- docs/_docs/zookeeper/zookeeper-ip.adoc | 49 -- docs/_includes/copyright.html | 22 - docs/_includes/footer.html | 20 - docs/_includes/header.html | 35 -- docs/_includes/left-nav.html | 88 --- docs/_includes/right-nav.html | 21 - docs/_includes/section-toc.html | 31 - docs/_includes/toc.html | 63 -- docs/_layouts/default.html | 72 --- docs/_layouts/doc.html | 33 - docs/_layouts/toc.html | 32 - docs/_plugins/asciidoctor-extensions.rb | 180 ------ docs/_sass/callouts.scss | 75 --- docs/_sass/code.scss | 115 ---- docs/_sass/docs.scss | 238 ------- docs/_sass/footer.scss | 48 -- docs/_sass/github.scss | 223 ------- docs/_sass/header.scss | 374 ----------- docs/_sass/layout.scss | 45 -- docs/_sass/left-nav.scss | 109 ---- docs/_sass/right-nav.scss | 73 --- docs/_sass/rouge-base16-solarized.scss | 99 --- docs/_sass/text.scss | 62 -- docs/_sass/variables.scss | 33 - docs/assets/css/asciidoc-pygments.css | 59 -- docs/assets/css/docs.scss | 21 - docs/assets/css/styles.scss | 30 - docs/assets/images/apple-blob.svg | 16 - docs/assets/images/arrow-down-white.svg | 3 - docs/assets/images/arrow-down.svg | 3 - docs/assets/images/background-lines.svg | 54 -- docs/assets/images/cancel.svg | 11 - docs/assets/images/checkmark-green.svg | 3 - docs/assets/images/copy-icon.svg | 6 - docs/assets/images/cpp.svg | 9 - docs/assets/images/dev-internal-bg.jpg | Bin 23014 -> 0 bytes docs/assets/images/dotnet.svg | 9 - docs/assets/images/edition-ce.svg | 16 - docs/assets/images/edition-ee.svg | 25 - docs/assets/images/edition-ue.svg | 28 - docs/assets/images/events-nav-arrow.svg | 3 - .../images/feature-easy-installation.svg | 28 - docs/assets/images/feature-fast.svg | 16 - docs/assets/images/feature-reliable.svg | 25 - docs/assets/images/github-gray.svg | 3 - docs/assets/images/github-white.svg | 3 - docs/assets/images/glowing-box.svg | 170 ----- .../assets/images/integrations/CDC-design.svg | 4 - docs/assets/images/integrations/hibernate.svg | 6 - docs/assets/images/integrations/kafka.svg | 3 - docs/assets/images/integrations/more.svg | 18 - docs/assets/images/integrations/oracle.svg | 3 - docs/assets/images/integrations/osgi.svg | 17 - docs/assets/images/integrations/spark.svg | 7 - docs/assets/images/integrations/spring.svg | 3 - docs/assets/images/java.svg | 9 - docs/assets/images/left-nav-arrow.svg | 3 - docs/assets/images/lines-bg-1.svg | 54 -- docs/assets/images/lines-bg-2.svg | 54 -- docs/assets/images/lines-bg-3.svg | 54 -- docs/assets/images/lines-bg-4.svg | 54 -- docs/assets/images/menu-icon.svg | 3 - docs/assets/images/mousepad-blob.svg | 9 - ...-of-paper-with-folded-top-right-corner.svg | 117 ---- docs/assets/images/scala.svg | 31 - docs/assets/images/search.svg | 15 - docs/assets/images/violent-blob.svg | 28 - docs/assets/images/watermelon-blob.svg | 9 - docs/assets/js/anchor.min.js | 9 - docs/assets/js/code-copy-to-clipboard.js | 70 --- docs/assets/js/code-tabs.js | 155 ----- docs/assets/js/docs-menu.js | 64 -- docs/assets/js/index.js | 51 -- docs/assets/js/page-nav.js | 37 -- docs/assets/js/top-navigation.js | 92 --- docs/favicon.ico | Bin 9780 -> 0 bytes docs/run.sh | 23 - 116 files changed, 4 insertions(+), 7580 deletions(-) delete mode 100644 docs/.gitignore delete mode 100644 docs/Gemfile delete mode 100644 docs/README.adoc create mode 100644 docs/README.md delete mode 100644 docs/_config.yml delete mode 100644 docs/_data/toc.yaml delete mode 100644 docs/_docs/aws/aws.adoc delete mode 100644 docs/_docs/azure/azure.adoc delete mode 100644 docs/_docs/camel/camel-streamer.adoc delete mode 100644 docs/_docs/cdc/change-data-capture-extensions.adoc delete mode 100644 docs/_docs/flink/flink-streamer.adoc delete mode 100644 docs/_docs/flume/flume-sink.adoc delete mode 100644 docs/_docs/gce/gce.adoc delete mode 100644 docs/_docs/images/CDC-design.svg delete mode 100644 docs/_docs/images/camel-streamer.png delete mode 100644 docs/_docs/images/hibernate-l2-cache.png delete mode 100644 docs/_docs/images/hibernate.svg delete mode 100644 docs/_docs/images/kafka.svg delete mode 100644 docs/_docs/images/more.svg delete mode 100644 docs/_docs/images/oracle.svg delete mode 100644 docs/_docs/images/osgi.svg delete mode 100644 docs/_docs/images/spark.svg delete mode 100644 docs/_docs/images/spring.svg delete mode 100644 docs/_docs/jms/jms-streamer.adoc delete mode 100644 docs/_docs/kafka/kafka-streamer.adoc delete mode 100644 docs/_docs/mqtt/mqtt-streamer.adoc delete mode 100644 docs/_docs/perf-statistics/performance-statistics.adoc delete mode 100644 docs/_docs/pub-sub/pub-sub.adoc delete mode 100644 docs/_docs/rocketmq/rocketmq-streamer.adoc delete mode 100644 docs/_docs/spark/spark.adoc delete mode 100644 docs/_docs/spring/spring-boot.adoc delete mode 100644 docs/_docs/spring/spring-caching.adoc delete mode 100644 docs/_docs/spring/spring-data.adoc delete mode 100644 docs/_docs/spring/spring-sessions.adoc delete mode 100644 docs/_docs/spring/spring-tx.adoc delete mode 100644 docs/_docs/storm/storm-streamer.adoc delete mode 100644 docs/_docs/topology-validator/topology-validator.adoc delete mode 100644 docs/_docs/twitter/twitter-streamer.adoc delete mode 100644 docs/_docs/zeromq/zeromq-streamer.adoc delete mode 100644 docs/_docs/zookeeper/zookeeper-ip.adoc delete mode 100644 docs/_includes/copyright.html delete mode 100644 docs/_includes/footer.html delete mode 100644 docs/_includes/header.html delete mode 100644 docs/_includes/left-nav.html delete mode 100644 docs/_includes/right-nav.html delete mode 100644 docs/_includes/section-toc.html delete mode 100644 docs/_includes/toc.html delete mode 100644 docs/_layouts/default.html delete mode 100644 docs/_layouts/doc.html delete mode 100644 docs/_layouts/toc.html delete mode 100644 docs/_plugins/asciidoctor-extensions.rb delete mode 100644 docs/_sass/callouts.scss delete mode 100644 docs/_sass/code.scss delete mode 100644 docs/_sass/docs.scss delete mode 100644 docs/_sass/footer.scss delete mode 100644 docs/_sass/github.scss delete mode 100644 docs/_sass/header.scss delete mode 100644 docs/_sass/layout.scss delete mode 100644 docs/_sass/left-nav.scss delete mode 100644 docs/_sass/right-nav.scss delete mode 100644 docs/_sass/rouge-base16-solarized.scss delete mode 100644 docs/_sass/text.scss delete mode 100644 docs/_sass/variables.scss delete mode 100644 docs/assets/css/asciidoc-pygments.css delete mode 100644 docs/assets/css/docs.scss delete mode 100644 docs/assets/css/styles.scss delete mode 100644 docs/assets/images/apple-blob.svg delete mode 100644 docs/assets/images/arrow-down-white.svg delete mode 100644 docs/assets/images/arrow-down.svg delete mode 100644 docs/assets/images/background-lines.svg delete mode 100644 docs/assets/images/cancel.svg delete mode 100644 docs/assets/images/checkmark-green.svg delete mode 100644 docs/assets/images/copy-icon.svg delete mode 100644 docs/assets/images/cpp.svg delete mode 100644 docs/assets/images/dev-internal-bg.jpg delete mode 100644 docs/assets/images/dotnet.svg delete mode 100644 docs/assets/images/edition-ce.svg delete mode 100644 docs/assets/images/edition-ee.svg delete mode 100644 docs/assets/images/edition-ue.svg delete mode 100644 docs/assets/images/events-nav-arrow.svg delete mode 100644 docs/assets/images/feature-easy-installation.svg delete mode 100644 docs/assets/images/feature-fast.svg delete mode 100644 docs/assets/images/feature-reliable.svg delete mode 100644 docs/assets/images/github-gray.svg delete mode 100644 docs/assets/images/github-white.svg delete mode 100644 docs/assets/images/glowing-box.svg delete mode 100644 docs/assets/images/integrations/CDC-design.svg delete mode 100644 docs/assets/images/integrations/hibernate.svg delete mode 100644 docs/assets/images/integrations/kafka.svg delete mode 100644 docs/assets/images/integrations/more.svg delete mode 100644 docs/assets/images/integrations/oracle.svg delete mode 100644 docs/assets/images/integrations/osgi.svg delete mode 100644 docs/assets/images/integrations/spark.svg delete mode 100644 docs/assets/images/integrations/spring.svg delete mode 100644 docs/assets/images/java.svg delete mode 100644 docs/assets/images/left-nav-arrow.svg delete mode 100644 docs/assets/images/lines-bg-1.svg delete mode 100644 docs/assets/images/lines-bg-2.svg delete mode 100644 docs/assets/images/lines-bg-3.svg delete mode 100644 docs/assets/images/lines-bg-4.svg delete mode 100644 docs/assets/images/menu-icon.svg delete mode 100644 docs/assets/images/mousepad-blob.svg delete mode 100644 docs/assets/images/piece-of-paper-with-folded-top-right-corner.svg delete mode 100644 docs/assets/images/scala.svg delete mode 100644 docs/assets/images/search.svg delete mode 100644 docs/assets/images/violent-blob.svg delete mode 100644 docs/assets/images/watermelon-blob.svg delete mode 100644 docs/assets/js/anchor.min.js delete mode 100644 docs/assets/js/code-copy-to-clipboard.js delete mode 100644 docs/assets/js/code-tabs.js delete mode 100644 docs/assets/js/docs-menu.js delete mode 100644 docs/assets/js/index.js delete mode 100644 docs/assets/js/page-nav.js delete mode 100644 docs/assets/js/top-navigation.js delete mode 100644 docs/favicon.ico delete mode 100644 docs/run.sh diff --git a/docs/.gitignore b/docs/.gitignore deleted file mode 100644 index a01b89afa..000000000 --- a/docs/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -.jekyll-cache/ -_site/ -Gemfile.lock -.jekyll-metadata - diff --git a/docs/Gemfile b/docs/Gemfile deleted file mode 100644 index 381249a04..000000000 --- a/docs/Gemfile +++ /dev/null @@ -1,17 +0,0 @@ -source "https://rubygems.org" - -# git_source(:github) {|repo_name| "https://github.com/#{repo_name}" } - -gem 'asciidoctor' -gem 'jekyll', group: :jekyll_plugins -gem 'wdm', '~> 0.1.1' if Gem.win_platform? -group :jekyll_plugins do - gem 'jekyll-asciidoc' -end -#gem 'pygments.rb', '~> 1.2.1' -gem 'thread_safe', '~> 0.3.6' -gem 'slim', '~> 4.0.1' -gem 'tilt', '~> 2.0.9' - -# Ruby 3.0.0 requires dependency which doesn't contains in the bundle -gem "webrick", "~> 1.7" diff --git a/docs/README.adoc b/docs/README.adoc deleted file mode 100644 index a3ce94800..000000000 --- a/docs/README.adoc +++ /dev/null @@ -1,252 +0,0 @@ -// Licensed to the Apache Software Foundation (ASF) under one or more -// contributor license agreements. See the NOTICE file distributed with -// this work for additional information regarding copyright ownership. -// The ASF licenses this file to You under the Apache License, Version 2.0 -// (the "License"); you may not use this file except in compliance with -// the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -= Apache Ignite Extensions Documentation -:toc: -:toc-title: - -== Overview -The Apache Ignite Extensions documentation is maintained in the repository with the code base, in the "/docs" subdirectory. The directory contains the source files, HTML templates and css styles. - - -The Apache Ignite documentation is written in link:https://asciidoctor.org/docs/what-is-asciidoc/[asciidoc]. -The Asciidoc files are compiled into HTML pages and published to https://ignite.apache.org/docs. - - -.Content of the “docs” directory -[cols="1,4",opts="stretch"] -|=== -| pass:[_]docs | The directory with .adoc files and code-snippets. -| pass:[_]config.yml | Jekyll configuration file. -|=== - - -== Building the Docs Locally - -To build the docs locally, you can install `jekyll` and other dependencies on your machine, or you can use Jekyll docker image. - -=== Install Jekyll and Asciidoctor - -. Install Jekyll by following this instruction: https://jekyllrb.com/docs/installation/[window=_blank] -. In the “/docs” directory, run the following command: -+ -[source, shell] ----- -$ bundle ----- -+ -This should install all dependencies, including `asciidoctor`. -. Start jekyll: -+ -[source, shell] ----- -$ bundle exec jekyll s ----- -The command compiles the Asciidoc files into HTML pages and starts a local webserver. - -Open `http://localhost:4000/docs[window=_blank]` in your browser. - -=== Run with Docker - -The following command starts jekyll in a container and downloads all dependencies. Run the command in the “/docs” directory. - -[source, shell] ----- -$ docker run -v "$PWD:/srv/jekyll" -p 4000:4000 jekyll/jekyll:latest jekyll s ----- - -Open `http://localhost:4000/docs[window=_blank]` in your browser. - -=== Troubleshooting - -Below are some issues you might hit during an installation of the Jekyll environment or while building the tutorials. -Let us know if you come across a new and found a workaround. - -==== MacOS: Issues with FFI library during Jekyll installation - -You should see an error trace similar to this: https://github.com/ffi/ffi/issues/653 - -Attempt to fix the problem by following this sequence of commands (typically it's the last command only): - -[source, text] ----- -brew reinstall libffi -export LDFLAGS="-L/usr/local/opt/libffi/lib" -export CPPFLAGS="-I/usr/local/opt/libffi/include" -export PKG_CONFIG_PATH="/usr/local/opt/libffi/lib/pkgconfig" -gem install --user-install bundler jekyll ----- - -==== MacOS: jekyll-asciidoc gem is not installed by default - -Try to follow this procedure to fix the issue. - -* Comment out the `rm -rf $tmp_dir` at the very end of the `build.sh` script, so that the temp folder is not deleted after the execution. -* Run `build.sh` (fails with `Could not find gem 'jekyll-asciidoc'...` error). -* Go to `tmp/web_site` folder. -* Run `bundle install`. -* Revert the `build.sh` script and run it again. - -==== MacOS: can't build project due to inability to load openssl - -You should see an error like this: - -`LoadError: dlopen(/Users/dmagda/.rbenv/versions/2.6.2/lib/ruby/2.6.0/x86_64-darwin18/digest/sha1.bundle, 9): Library not loaded: /usr/local/opt/openssl/lib/libssl.1.0.0.dylib - Referenced from: /Users/dmagda/.rbenv/versions/2.6.2/lib/ruby/2.6.0/x86_64-darwin18/digest/sha1.bundle` - -Try to upgrade Ruby, rbenv to the latest version (2.7.1) and then reinstall Jekyll. Use the official instructions: -https://jekyllrb.com/docs/installation/ - -== How to Contribute - -If you want to contribute to the documentation, add or modify the relevant page in the `docs/_docs` directory. -This directory contains all .adoc files (which are then rendered into HTML pages and published on the web-site). - -Because we use asciidoc for documentation, consider the following points: - -* Get familiar with the asciidoc format: https://asciidoctor.org/docs/user-manual/. You don’t have to read the entire manual. Search through it when you want to learn how to create a numbered list, or insert an image, or use italics. -* Please read the link:https://asciidoctor.org/docs/asciidoc-recommended-practices:[AsciiDoc Recommended Practices] and try to adhere to those when editing the .adoc source files. - - -The following sections explain specific asciidoc syntax that we use. - -=== Table of content - -The table of content is defined in the `_data/toc.yaml` file. -If you want to add a new page, make sure to update the TOC. - -=== Changing an URL of an existing page - -If you rename an already published page or change the page's path in the `/_data/toc.yaml` file, -you must configure a proper redirect from the old to the new URL in the following files of the Ignite website: -https://github.com/apache/ignite-website/blob/master/.htaccess - -Reach out to documentation maintainers if you need any help with this. - -=== Links to other sections in the docs -All .adoc files are located in the "docs/_docs" directory. -Any link to the files within the directory must be relative to that directory. -Remove the file extension (.adoc). - -For example: -[source, adoc] ----- -link:persistence/native-persistence[Native Persistence] ----- - -This is a link to the Native Persistence page. - -=== Links to external resources - -When referencing an external resource, make the link to open in a new window by adding the `window=_blank` attribute: - -[source, adoc] ----- -link:https://docs.oracle.com/javase/8/docs/technotes/guides/security/SunProviders.html#SunJSSE_Protocols[Supported protocols,window=_blank] ----- - - -=== Tabs - -We use custom syntax to insert tabs. Tabs are used to provide code samples for different programming languages. - -Tabs are defined by the `tabs` block: -``` -[tabs] --- -individual tabs are defined here --- -``` - -Each tab is defined by the 'tab' directive: - -``` -tab:tab_name[] -``` - -where `tab_name` is the title of the tab. - -The content of the tab is everything that is given between the tab title, and the next tab or the end of the block. - -```asciidoc -[tabs] --- -tab:XML[] - -The content of the XML tab goes here - -tab:Java[] - -The content of the Java tab is here - -tab:C#/.NET[] - -tab:C++[unsupported] - --- -``` - -=== Callouts - -Use the syntax below if you need to bring reader's attention to some details: - -[NOTE] -==== -[discrete] -=== Callout Title -Callout Text -==== - -Change the callout type to `CAUTION` if you want to put out a warning: - -[CAUTION] -==== -[discrete] -=== Callout Title -Callout Text -==== - -=== Code Snippets - -Code snippets must be taken from a compilable source code file (e.g. java, cs, js, etc). -We use the `include` feature of asciidoc. -Source code files are located in the `docs/_docs/code-snippets/{language}` folders. - - -To add a code snippet to a page, follow these steps: - -* Create a file in the code snippets directory, e.g. _docs/code-snippets/java/org/apache/ignite/snippets/JavaThinClient.java - -* Enclose the piece of code you want to include within named tags (see https://asciidoctor.org/docs/user-manual/#by-tagged-regions). Give the tag a self-evident name. -For example: -+ -``` -[source, java] ----- -// tag::clientConnection[] -ClientConfiguration cfg = new ClientConfiguration().setAddresses("127.0.0.1:10800"); -try (IgniteClient client = Ignition.startClient(cfg)) { - ClientCache cache = client.cache("myCache"); - // get data from the cache -} -// end::clientConnection[] ----- -``` - -* Include the tag in the adoc file: -+ -[source, adoc,subs="macros"] ----- -\include::{javaCodeDir}/JavaThinClient.java[tag=clientConnection,indent=0] ----- diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 000000000..6895436d2 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,4 @@ +Apache Ignite Extensions Documentation +------------------------ + +Apache Ignite extensions documentation is available in the main [Apache Ignite repository](https://github.com/apache/ignite). \ No newline at end of file diff --git a/docs/_config.yml b/docs/_config.yml deleted file mode 100644 index 369545275..000000000 --- a/docs/_config.yml +++ /dev/null @@ -1,41 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. -# The ASF licenses this file to You under the Apache License, Version 2.0 -# (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -exclude: [guidelines.md, "Gemfile", "Gemfile.lock", README.adoc, "_docs/code-snippets", "_docs/includes", '*.sh'] -attrs: &asciidoc_attributes - version: 1.0 - base_url: /docs - stylesdir: /docs/assets/css - imagesdir: /docs - source-highlighter: rouge - table-stripes: even -collections: - docs: - permalink: /docs/:path:output_ext - output: true -defaults: - - - scope: - path: '' - values: - layout: 'doc' - - - scope: - path: '_docs' - values: - toc: ignite -asciidoctor: - base_dir: _docs/ - attributes: *asciidoc_attributes - diff --git a/docs/_data/toc.yaml b/docs/_data/toc.yaml deleted file mode 100644 index 2ddc5fa6b..000000000 --- a/docs/_data/toc.yaml +++ /dev/null @@ -1,60 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. -# The ASF licenses this file to You under the Apache License, Version 2.0 -# (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -- title: Amazon S3 IP Finder - url: aws/aws -- title: Apache Camel Streamer - url: camel/camel-streamer -- title: Apache Flink Streamer - url: flink/flink-streamer -- title: Apache Flume Sink - url: flume/flume-sink -- title: Apache Ignite Azure Module - url: azure/azure -- title: Apache Ignite GCE Module - url: gce/gce -- title: Apache Ignite Pub/Sub Module - url: pub-sub/pub-sub -- title: Apache Ignite and Spring Boot - url: spring/spring-boot -- title: Apache Ignite and Spring Data - url: spring/spring-data -- title: Apache Ignite and Spring Cache - url: spring/spring-caching -- title: Apache Ignite and Spring Session - url: spring/spring-sessions -- title: Apache Ignite and Spring Transactions - url: spring/spring-tx -- title: Apache Kafka Streamer - url: kafka/kafka-streamer -- title: Apache Storm Streamer - url: storm/storm-streamer -- title: Change Data Capture Extension - url: cdc/change-data-capture-extensions -- title: JMS Streamer - url: jms/jms-streamer -- title: MQTT Streamer - url: mqtt/mqtt-streamer -- title: Performance Statistics Extension - url: perf-statistics/performance-statistics -- title: RocketMQ Streamer - url: rocketmq/rocketmq-streamer -- title: Topology Validator - url: topology-validator/topology-validator -- title: Twitter Streamer - url: twitter/twitter-streamer -- title: ZeroMQ Streamer - url: zeromq/zeromq-streamer -- title: ZooKeeper IP Finder - url: zookeeper/zookeeper-ip \ No newline at end of file diff --git a/docs/_docs/aws/aws.adoc b/docs/_docs/aws/aws.adoc deleted file mode 100644 index e6c9482cc..000000000 --- a/docs/_docs/aws/aws.adoc +++ /dev/null @@ -1,113 +0,0 @@ -= Amazon S3 IP Finder - -Amazon S3-based discovery allows Ignite nodes to register their IP addresses on start-up in an Amazon S3 store. -This way other nodes can try to connect to any of the IP addresses stored in S3 and initiate automatic node discovery. -To use S3 based automatic node discovery, you need to configure the `TcpDiscoveryS3IpFinder` type of `ipFinder`. - -Here is an example of how to configure Amazon S3 based IP finder: - - -[tabs] --- -tab:XML[] -[source,xml] ----- - - - - - - - - - - - - - - - - - - - ----- - -tab:Java[] -[source,java] ----- -TcpDiscoverySpi spi = new TcpDiscoverySpi(); - -BasicAWSCredentials creds = new BasicAWSCredentials("yourAccessKey", "yourSecreteKey"); - -TcpDiscoveryS3IpFinder ipFinder = new TcpDiscoveryS3IpFinder(); -ipFinder.setAwsCredentials(creds); -ipFinder.setBucketName("yourBucketName"); - -spi.setIpFinder(ipFinder); - -IgniteConfiguration cfg = new IgniteConfiguration(); - -// Override default discovery SPI. -cfg.setDiscoverySpi(spi); - -// Start a node. -Ignition.start(cfg); ----- - -tab:C#/.NET[unsupported] -tab:C++[unsupported] --- - -You can also use *Instance Profile* for AWS credentials provider. - -[tabs] --- -tab:XML[] -[source,xml] ----- - - - - - - - - - - - - - - - - - - ----- - -tab:Java[] -[source,java] ----- -TcpDiscoverySpi spi = new TcpDiscoverySpi(); - -AWSCredentialsProvider instanceProfileCreds = new InstanceProfileCredentialsProvider(false); - -TcpDiscoveryS3IpFinder ipFinder = new TcpDiscoveryS3IpFinder(); -ipFinder.setAwsCredentialsProvider(instanceProfileCreds); -ipFinder.setBucketName("yourBucketName"); - -spi.setIpFinder(ipFinder); - -IgniteConfiguration cfg = new IgniteConfiguration(); - -// Override default discovery SPI. -cfg.setDiscoverySpi(spi); - -// Start a node. -Ignition.start(cfg); ----- -tab:C#/.NET[unsupported] -tab:C++[unsupported] --- - diff --git a/docs/_docs/azure/azure.adoc b/docs/_docs/azure/azure.adoc deleted file mode 100644 index a2281263d..000000000 --- a/docs/_docs/azure/azure.adoc +++ /dev/null @@ -1,45 +0,0 @@ -= Apache Ignite Azure Module - - -Apache Ignite Azure module provides Azure Blob Storage based implementation of IP finder for TCP discovery. - -Depending on how you use Ignite, you can an extension using one of the following methods: - -- If you use the binary distribution, move the `libs/{module-dir}` to the `libs` directory of the Ignite distribution before starting the node. -- Add libraries from `libs/{module-dir}` to the classpath of your application. -- Add a module as a Maven dependency to your project. - - -== Building Azure Module And Running Tests - -To build and run Azure extension use the command below with the right credentials to the Azure service: - ----- -mvn clean package -pl modules/azure-ext -Dtest.azure.account.name=uname -Dtest.azure.account.key=key --Dtest.azure.endpoint=http://127.0.0.1:10000/devstoreaccount ----- - -== Importing Azure Module In Maven Project - -If you are using Maven to manage dependencies of your project, you can add Azure module -dependency like this (replace '${ignite.version}' with actual Ignite version you are -interested in): - ----- - - ... - - ... - - org.apache.ignite - ignite-azure-ext - ${ignite-azure-ext.version} - - ... - - ... - ----- \ No newline at end of file diff --git a/docs/_docs/camel/camel-streamer.adoc b/docs/_docs/camel/camel-streamer.adoc deleted file mode 100644 index 0e5a1f531..000000000 --- a/docs/_docs/camel/camel-streamer.adoc +++ /dev/null @@ -1,153 +0,0 @@ -// Licensed to the Apache Software Foundation (ASF) under one or more -// contributor license agreements. See the NOTICE file distributed with -// this work for additional information regarding copyright ownership. -// The ASF licenses this file to You under the Apache License, Version 2.0 -// (the "License"); you may not use this file except in compliance with -// the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -= Apache Camel Streamer - -== Overview - -This documentation page focuses on the Apache Camel, which can also be thought of as a universal streamer because it -allows you to consume from any technology or protocol supported by Camel into an Ignite Cache. - -image::images/camel-streamer.png[Camel Streamer] - -With this streamer, you can ingest entries straight into an Ignite cache based on: - -* Calls received on a Web Service (SOAP or REST), by extracting the body or headers. -* Listening on a TCP or UDP channel for messages. -* The content of files received via FTP or written to the local filesystem. -* Email messages received via POP3 or IMAP. -* A MongoDB tailable cursor. -* An AWS SQS queue. -* And many others. - -This streamer supports two modes of ingestion: **direct ingestion** and **mediated ingestion**. - -[NOTE] -==== -[discrete] -=== The Ignite Camel Component -There is also the https://camel.apache.org/components/latest/ignite-summary.html[camel-ignite, window=_blank] component, if what you are looking is -to interact with Ignite Caches, Compute, Events, Messaging, etc. from within a Camel route. -==== - -== Maven Dependency - -To make use of the `ignite-camel-ext` streamer, you need to add the following dependency: - -[tabs] --- -tab:pom.xml[] -[source,xml] ----- - - org.apache.ignite - ignite-camel-ext - ${ignite-camel-ext.version} - ----- --- - -It will also pull in `camel-core` as a transitive dependency. - -== Direct Ingestion - -Direct Ingestion allows you to consume from any Camel endpoint straight into Ignite, with the help of a -Tuple Extractor. We call this **direct ingestion**. - -Here is a code sample: -[tabs] --- -tab:Java[] -[source,java] ----- -// Start Apache Ignite. -Ignite ignite = Ignition.start(); - -// Create an streamer pipe which ingests into the 'mycache' cache. -IgniteDataStreamer pipe = ignite.dataStreamer("mycache"); - -// Create a Camel streamer and connect it. -CamelStreamer streamer = new CamelStreamer<>(); -streamer.setIgnite(ignite); -streamer.setStreamer(pipe); - -// This endpoint starts a Jetty server and consumes from all network interfaces on port 8080 and context path /ignite. -streamer.setEndpointUri("jetty:http://0.0.0.0:8080/ignite?httpMethodRestrict=POST"); - -// This is the tuple extractor. We'll assume each message contains only one tuple. -// If your message contains multiple tuples, use a StreamMultipleTupleExtractor. -// The Tuple Extractor receives the Camel Exchange and returns a Map.Entry with the key and value. -streamer.setSingleTupleExtractor(new StreamSingleTupleExtractor() { - @Override public Map.Entry extract(Exchange exchange) { - String stationId = exchange.getIn().getHeader("X-StationId", String.class); - String temperature = exchange.getIn().getBody(String.class); - return new GridMapEntry<>(stationId, temperature); - } -}); - -// Start the streamer. -streamer.start(); ----- --- - -== Mediated Ingestion - -For more sophisticated scenarios, you can also create a Camel route that performs complex processing on incoming messages, e.g. transformations, validations, splitting, aggregating, idempotency, resequencing, enrichment, etc. and **ingest only the result into the Ignite cache**. - -We call this **mediated ingestion**. - -[tabs] --- -tab:Java[] -[source,java] ----- -// Create a CamelContext with a custom route that will: -// (1) consume from our Jetty endpoint. -// (2) transform incoming JSON into a Java object with Jackson. -// (3) uses JSR 303 Bean Validation to validate the object. -// (4) dispatches to the direct:ignite.ingest endpoint, where the streamer is consuming from. -CamelContext context = new DefaultCamelContext(); -context.addRoutes(new RouteBuilder() { - @Override - public void configure() throws Exception { - from("jetty:http://0.0.0.0:8080/ignite?httpMethodRestrict=POST") - .unmarshal().json(JsonLibrary.Jackson) - .to("bean-validator:validate") - .to("direct:ignite.ingest"); - } -}); - -// Remember our Streamer is now consuming from the Direct endpoint above. -streamer.setEndpointUri("direct:ignite.ingest"); ----- --- - -== Setting a Response - -By default, the response sent back to the caller (if it is a synchronous endpoint) is simply an echo of the original request. -If you want to customize​ the response, set a Camel `Processor` as a `responseProcessor`: - -[tabs] --- -tab:Java[] -[source,java] ----- -streamer.setResponseProcessor(new Processor() { - @Override public void process(Exchange exchange) throws Exception { - exchange.getOut().setHeader(Exchange.HTTP_RESPONSE_CODE, 200); - exchange.getOut().setBody("OK"); - } -}); ----- --- diff --git a/docs/_docs/cdc/change-data-capture-extensions.adoc b/docs/_docs/cdc/change-data-capture-extensions.adoc deleted file mode 100644 index 9f6a1a700..000000000 --- a/docs/_docs/cdc/change-data-capture-extensions.adoc +++ /dev/null @@ -1,192 +0,0 @@ -// Licensed to the Apache Software Foundation (ASF) under one or more -// contributor license agreements. See the NOTICE file distributed with -// this work for additional information regarding copyright ownership. -// The ASF licenses this file to You under the Apache License, Version 2.0 -// (the "License"); you may not use this file except in compliance with -// the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -= Change Data Capture Extension - -WARNING: CDC is an experimental feature. API or design architecture might be changed. - -== Overview - -link:https://github.com/apache/ignite-extensions/tree/master/modules/cdc-ext[Change Data Capture Extension] module provides two ways to set up cross cluster replication based on CDC. - -. link:https://github.com/apache/ignite-extensions/blob/master/modules/cdc-ext/src/main/java/org/apache/ignite/cdc/IgniteToIgniteCdcStreamer.java[Ignite2IgniteCdcStreamer] - streams changes to destination cluster using client node. -. link:https://github.com/apache/ignite-extensions/blob/master/modules/cdc-ext/src/main/java/org/apache/ignite/cdc/kafka/IgniteToKafkaCdcStreamer.java[Ignite2KafkaCdcStreamer] combined with link:https://github.com/apache/ignite-extensions/blob/master/modules/cdc-ext/src/main/java/org/apache/ignite/cdc/kafka/KafkaToIgniteCdcStreamer.java[KafkaToIgniteCdcStreamer] streams changes to destination cluster using link:https://kafka.apache.org[Apache Kafka] as a transport. - -NOTE: For each cache replicated between clusters link:https://github.com/apache/ignite/blob/master/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/version/CacheVersionConflictResolver.java[CacheVersionConflictResolver] should be defined. - - -== Ignite to Ignite CDC streamer -This streamer starts client node which connects to destination cluster. -After connection is established, all changes captured by CDC will be replicated to destination cluster. - -NOTE: Instances of `ignite-cdc.sh` with configured streamer should be started on each server node of source cluster to capture all changes. - -image:images/CDC-design.svg[] - -== Configuration - -[cols="20%,45%,35%",opts="header"] -|=== -|Name |Description | Default value -| `caches` | Set of cache names to replicate. | null -| `destinationIgniteConfiguration` | Ignite configuration of client nodes that will connect to destination cluster to replicate changes. | null -| `onlyPrimary` | Flag to handle changes only on primary node. | `false` -| `maxBatchSize` | Maximum number of events to be sent to destination cluster in a single batch. | 1024 -|=== - -== Metrics - -|=== -|Name |Description -| `EventsCount` | Count of messages applied to destination cluster. -| `LastEventTime` | Timestamp of last applied event. -|=== - -== CDC replication using Kafka - -This way to replicate changes between clusters requires setting up two applications: - -. `ignite-cdc.sh` with `org.apache.ignite.cdc.kafka.IgniteToKafkaCdcStreamer` that will capture changes from source cluster and write it to Kafka topic. -. `kafka-to-ignite.sh` that will read changes from Kafka topic and then write them to destination cluster. - -NOTE: Instances of `ignite-cdc.sh` with configured streamer should be started on each server node of source cluster to capture all changes. - -=== IgniteToKafkaCdcStreamer Configuration - -[cols="20%,45%,35%",opts="header"] -|=== -|Name |Description | Default value -| `caches` | Set of cache names to replicate. | null -| `kafkaProperties` | Kafka producer properties. | null -| `topic` | Name of the Kafka topic. | null -| `kafkaParts` | Number of Kafka topic partitions. | null -| `onlyPrimary` | Flag to handle changes only on primary node. | `false` -| `maxBatchSize` | Maximum size of concurrently produced Kafka records. When streamer reaches this number, it waits for Kafka acknowledgements, and then commits CDC offset. | `1024` -| `kafkaRequestTimeout` | Kafka request timeout in milliseconds. | `3000` -|=== - -=== IgniteToKafkaCdcStreamer Metrics - -|=== -|Name |Description -| `EventsCount` | Count of messages applied to destination cluster. -| `LastEventTime` | Timestamp of last applied event. -| `BytesSent` | Number of bytes send to Kafka. -|=== - -=== `kafka-to-ignite.sh` application - -This application should be started near the destination cluster. -`kafka-to-ignite.sh` will read CDC events from Kafka topic and then apply them to destination cluster. - -IMPORTANT: `kafka-to-ignite.sh` implements the fail-fast approach. It just fails in case of any error. The restart procedure should be configured with the OS tools. - -Count of instances of the application does not corellate to the count of destination server nodes. -It should be just enough to process source cluster load. -Each instance of application will process configured subset of topic partitions to spread the load. -`KafkaConsumer` for each partition will be created to ensure fair reads. - -==== Installation - -. Build `cdc-ext` module with maven: -+ -```console - $~/src/ignite-extensions/> mvn clean package -DskipTests - $~/src/ignite-extensions/> ls modules/cdc-ext/target | grep zip -ignite-cdc-ext.zip -``` - -. Unpack `ignite-cdc-ext.zip` archive to `$IGNITE_HOME` folder. - -Now, you have additional binary `$IGNITE_HOME/bin/kafka-to-ignite.sh` and `$IGNITE_HOME/libs/ignite-cdc-ext` module. - -NOTE: Please, enable `ignite-cdc-ext` to be able to run `kafka-to-ignite.sh`. - -==== Configuration - -Application configuration should be done using POJO classes or Spring xml file like regular Ignite node configuration. -Kafka to ignite configuration file should contain the following beans that will be loaded during startup: - -. `IgniteConfiguration` bean: Configuration of the client node that will connect to the destination cluster. -. `java.util.Properties` bean with the name `kafkaProperties`: Single Kafka consumer configuration. -. `org.apache.ignite.cdc.kafka.KafkaToIgniteCdcStreamerConfiguration` bean: Options specific to `kafka-to-ignite.sh` application. - -[cols="20%,45%,35%",opts="header"] -|=== -|Name |Description | Default value -| `caches` | Set of cache names to replicate. | null -| `topic` | Name of the Kafka topic. | null -| `kafkaPartsFrom` | Lower Kafka partitions number (inclusive). | -1 -| `kafkaPartsTo` | Lower Kafka partitions number (exclusive). | -1 -| `kafkaRequestTimeout` | Kafka request timeout in milliseconds. | `3000` -| `maxBatchSize` | Maximum number of events to be sent to destination cluster in a single batch. | 1024 -| `threadCount` | Count of threads to proceed consumers. Each thread poll records from dedicated partitions in round-robin manner. | 16 -|=== - -==== Logging - -`kakfa-to-ignite.sh` uses the same logging configuration as the Ignite node does. The only difference is that the log is written in the "kafka-ignite-streamer.log" file. - -== CacheVersionConflictResolver implementation - -It expected that CDC streamers will be configured with the `onlyPrimary=false` in most real-world deployments to ensure fault-tolerance. -That means streamer will send the same change several times equal to `CacheConfiguration#backups` + 1. -At the same time concurrent updates of the same key can be done in replicated clusters. -`CacheVersionConflictResolver` used by Ignite node to selects or merge new (from update request) and existing (stored in the cluster) entry versions. -Selected entry version will be actually stored in the cluster. - -NOTE: Default implementation only select correct entry and never merge. - -link:https://github.com/apache/ignite/blob/master/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/version/CacheVersionConflictResolver.java[CacheVersionConflictResolver] should be defined for each cache replicated between clusters. - -Default link:https://github.com/apache/ignite-extensions/blob/master/modules/cdc-ext/src/main/java/org/apache/ignite/cdc/conflictresolve/CacheVersionConflictResolverImpl.java[implementation] is available in cdc-ext. - -=== Configuration - -[cols="20%,45%,35%",opts="header"] -|=== -|Name |Description | Default value -| `clusterId` | Local cluster id. Can be any value from 1 to 31. | null -| `caches` | Set of cache names to handle with this plugin instance. | null -| `conflictResolveField` | Value field to resolve conflict with. Optional. Field values must implement `java.lang.Comparable`. | null -|=== - -=== Conflict resolve algorithm - -Replicated changes contain some additional data. Specifically, entry version from source cluster supplied with the changed data. -Default conflict resolve algorithm based on entry version and `conflictResolveField`. -Conflict resolution field should contain user provided monotonically increasing value such as query id or timestamp. - -. Changes from the "local" cluster always win. -. If both old and new entry from the same cluster version comparison used to determine order. -. If `conflictResolveField` if provided then field values comparison used to determine order. -. Conflict resolution failed. Update will be ignored. - -=== Configuration example -Configuration is done via Ignite node plugin: - -```xml - - - - - - - - - - - - -``` \ No newline at end of file diff --git a/docs/_docs/flink/flink-streamer.adoc b/docs/_docs/flink/flink-streamer.adoc deleted file mode 100644 index 92ab39816..000000000 --- a/docs/_docs/flink/flink-streamer.adoc +++ /dev/null @@ -1,78 +0,0 @@ -// Licensed to the Apache Software Foundation (ASF) under one or more -// contributor license agreements. See the NOTICE file distributed with -// this work for additional information regarding copyright ownership. -// The ASF licenses this file to You under the Apache License, Version 2.0 -// (the "License"); you may not use this file except in compliance with -// the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -= Apache Flink Streamer - -Apache Ignite Flink Sink module is a streaming connector to inject Flink data into Ignite cache. The sink emits its input -data to Ignite cache. When creating a sink, an Ignite cache name and Ignite grid configuration file have to be provided. - -Starting data transfer to Ignite cache can be done with the following steps. - -. Import Ignite Flink Sink Module in Maven Project -If you are using Maven to manage dependencies of your project, you can add Flink module -dependency like this (replace `${ignite-flink-ext.version}` with actual Ignite Flink Extension version you are -interested in): -+ -[tabs] --- -tab:pom.xml[] -[source,xml] ----- - - ... - - ... - - org.apache.ignite - ignite-flink-ext - ${ignite-flink-ext.version} - - ... - - ... - ----- --- -. Create an Ignite configuration file and make sure it is accessible from the sink. -. Make sure your data input to the sink is specified and start the sink. -+ -[tabs] --- -tab:Java[] -[source,java] ----- -IgniteSink igniteSink = new IgniteSink("myCache", "ignite.xml"); - -igniteSink.setAllowOverwrite(true); -igniteSink.setAutoFlushFrequency(10); -igniteSink.start(); - -DataStream stream = ...; - -// Sink data into the grid. -stream.addSink(igniteSink); -try { - env.execute(); -} catch (Exception e){ - // Exception handling. -} -finally { - igniteSink.stop(); ----- --- - -Refer to the Javadocs of the `ignite-flink` module for more info on the available options. diff --git a/docs/_docs/flume/flume-sink.adoc b/docs/_docs/flume/flume-sink.adoc deleted file mode 100644 index 6428f80ee..000000000 --- a/docs/_docs/flume/flume-sink.adoc +++ /dev/null @@ -1,79 +0,0 @@ -// Licensed to the Apache Software Foundation (ASF) under one or more -// contributor license agreements. See the NOTICE file distributed with -// this work for additional information regarding copyright ownership. -// The ASF licenses this file to You under the Apache License, Version 2.0 -// (the "License"); you may not use this file except in compliance with -// the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -= Apache Flume Sink - -== Overview - -Apache Flume is a distributed, reliable, and available service for efficiently collecting, aggregating, and moving large -amounts of log data. - -`IgniteSink` is a Flume sink that extracts events from an associated Flume channel and injects into an Ignite cache. - -`IgniteSink` and its dependencies have to be included in the agent's classpath, as described in the following subsection, -before starting the Flume agent. - -== Setting Up - -. Create a transformer by implementing `EventTransformer` interface. -. Create `ignite` directory inside `plugins.d` directory which is located in `$\{FLUME_HOME}`. If the `plugins.d` directory -is not there, create it. -. Build it and copy to `$\{FLUME_HOME}/plugins.d/ignite-sink/lib`. -. Copy other Ignite-related jar files from Apache Ignite distribution to `$\{FLUME_HOME}/plugins.d/ignite-sink/libext` to -have them as shown below. -+ ----- -plugins.d/ -`-- ignite - |-- lib - | `-- ignite-flume-transformer-x.x.x.jar <-- your jar - `-- libext - |-- cache-api-1.0.0.jar - |-- ignite-core-x.x.x.jar - |-- ignite-flume-ext.x.x.x.jar <-- IgniteSink - |-- ignite-spring-x.x.x.jar - |-- spring-aop-4.1.0.RELEASE.jar - |-- spring-beans-4.1.0.RELEASE.jar - |-- spring-context-4.1.0.RELEASE.jar - |-- spring-core-4.1.0.RELEASE.jar - `-- spring-expression-4.1.0.RELEASE.jar ----- - -. In Flume configuration file, specify Ignite configuration XML file's location with cache properties -(see `flume/src/test/resources/example-ignite.xml` for a basic example) with the cache name specified for cache creation. -Also specify the cache name (same as in Ignite configuration file), your `EventTransformer`'s implementation class, and, -optionally, batch size. All properties are shown in the table below (required properties are in bold). -+ -[cols="20%,45%,35%",opts="header"] -|=== -|Property Name |Description | Default Value -|channel| | - -|type| The component type name. Needs to be `org.apache.ignite.stream.flume.IgniteSink` | - -|igniteCfg| Ignite configuration XML file | - -|cacheName| Cache name. Same as in igniteCfg | - -|eventTransformer| Your implementation of `org.apache.ignite.stream.flume.EventTransformer` | - -|batchSize| Number of events to be written per transaction| 100 -|=== - -The sink configuration part of agent named `a1` can look like this: - ----- -a1.sinks.k1.type = org.apache.ignite.stream.flume.IgniteSink -a1.sinks.k1.igniteCfg = /some-path/ignite.xml -a1.sinks.k1.cacheName = testCache -a1.sinks.k1.eventTransformer = my.company.MyEventTransformer -a1.sinks.k1.batchSize = 100 ----- - -After specifying your source and channel (see Flume's docs), you are ready to run a Flume agent. diff --git a/docs/_docs/gce/gce.adoc b/docs/_docs/gce/gce.adoc deleted file mode 100644 index f4c02eb22..000000000 --- a/docs/_docs/gce/gce.adoc +++ /dev/null @@ -1,43 +0,0 @@ -= Apache Ignite GCE Module - -Apache Ignite GCE module provides Google Cloud Storage based implementations of IP finder for TCP discovery. - -Depending on how you use Ignite, you can an extension using one of the following methods: - -- If you use the binary distribution, move the `libs/{module-dir}` to the `libs` directory of the Ignite distribution before starting the node. -- Add libraries from `libs/{module-dir}` to the classpath of your application. -- Add a module as a Maven dependency to your project. - - -== Building GCE Module And Running Tests - -To build and run GCE extension use the command below with the right credentials to the GCE service: - ----- -mvn clean package -pl modules/gce-ext -Dtest.gce.account.id=id -Dtest.gce.p12.path=path -Dtest.gce.project.name=name ----- - -== Importing GCE Module In Maven Project - -If you are using Maven to manage dependencies of your project, you can add GCE module -dependency like this (replace '${ignite.version}' with actual Ignite version you are -interested in): - ----- - - ... - - ... - - org.apache.ignite - ignite-gce-ext - ${ignite-gce-ext.version} - - ... - - ... - ----- \ No newline at end of file diff --git a/docs/_docs/images/CDC-design.svg b/docs/_docs/images/CDC-design.svg deleted file mode 100644 index d314d42b9..000000000 --- a/docs/_docs/images/CDC-design.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - -
ignite.sh
ignite.sh
WAL
WAL
ignite-cdc.sh
ignite-cdc.sh
Sever node host
Sever node host
DC-1 Changes
DC-1 Changes
DC-1 Changes
DC-1 Changes
WAL archive
WAL archive
Viewer does not support full SVG 1.1
\ No newline at end of file diff --git a/docs/_docs/images/camel-streamer.png b/docs/_docs/images/camel-streamer.png deleted file mode 100644 index cff36dc5b850486706e710358235dc83c3a861d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 120217 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%0Al?JR5To@ zoIjuKy5cv1n3gNKF`K-V2V>%6eQ}uwOn_J%qU+_333CM-1}edQj(WwEEcbQ=^qdbj zd$l_A^N~5caoy9#kM(lXRK41^NXK0_!u8V4_X>MsWrNATvNR}zrSRai8|n?}44+uv z$;Uxal=^K`l=hrt4B=={WM6VupoVgP7oQ*}SUE>cmys40YyC9*jfb%69a4?iI!V2` z>!o$}RzQ;AWxosxAARZvs~oy|RQI=bN#4eX!7tnJG7v@d18=cwN+c%_y-o8+vc zQ4Qj1B&xH!wL_Os-w_Fm)@e;D51+0H7+rO3zt-ZG3imlCf%$Crid&MlDPeD9-&>EF z-u~auJ_w~s-GQO*9kDWW=i6%?z%zV?z$x`d!G4x$*$utT`+fj z9+7)6if`cAKHOW>Xttt5ho&l6S{OKUnd#KmUiyi>jaPU{vHgd4@erNm%qd;)^WnqX zh?9@qSO*#2*ka#DZXy-Wcj++7f61mEo0%9%HoK)dN$SIpIYD+Hn~-k_a1WsFTAo%2 z5;P`Uv5Z+T{C1l2F!Yy2PhMzII0cXi1daQ+#$^Uc=fYXZz-~~&fHv0GJPrGbr?%?j? zy7uY?y*wT5ym*i?=%xQx-9wHoW=^)X{N5-|R~N&2tv(Y=|8wlVkWR;Hw^$A`{aJw- z=-R@1-5lPRn<*xzR9hFI=`g4`@-e6S z!oGH~IoaLp|EmQcq_)N}cLtyRcx(Fm*`#H;(X?_rmtCy5)PqIpuSLUzV1s2-qx8y# z2Hl-@b+odINUKiI;nO2`>9-g>H?>7t{4x^tqqJ>*l%_dhVOJ7rEo`Nv2=^_Gvdm}= z5x7N1>CuJJD@=TP*VCb)T~Y(xz8|7=IP_=w6!lp5yP(^Y1G>wW{b5z;TRe_vGK=(3 zqw=q`(eaeGa8(Av(zL6b99yzy9_1q|IXj8$J&;5N%sYeq{P+U%^r~EVXOw_ zg?WSE(Luf36JU&80#A@O==~zmVIY}tpsy&*!9_ifaqoI}3>anF4*C0KycIdD|E_k< zkto09-`O6%%xpb_V(9jiK{mJUSQL;5gq(YMAf@(m`O85i+OEjC?|Y-9%4Emag2|k5 zWHn^{#qhpYU&hnb%b`#&Q`@;M$@;SUIhHlt| z;?d&aRpIn%bux!{(%AK>hL>%~F&&vL6qtR&+tSew0cN}l)=f)4|7%b1BLEg?TT&?H zvG#}or-Y;c*O)SICujd%3{5RFPVs_NIyfSftO;=^=A1q*81ZO^&%0tDUJSO=EeGmr zb1^e=|C0lD*z3v*5(R3&R`M`t*DT7p?19s5z2CMh_Ftl4`pvE@Yw_EKIJrA1^VS;@QhA*9lN>b?0-rZJSz!YT{Jn{B-%?6JH{~N z5XkRqT6<>mnzIbHAAeA;B>iFxf@U?|S?A>zg^IPeRwyBfC21#y#$5~|@iB)R=?*Uf z!+aZpz#l+h2mi%OWe;PW-O6>c%LZWi;K# z1+4g0tB(dq*OrE@>IDT#)|!4>QdJ?fEw4{kR_eo_Ku>WHk%yU0w>Z$Ia#IdHyn8Mb zbZ7Nigu1}fADTK=@K8>>0K|wGSlTbd&Eo--g9y8CC0t2!?ix#Nbv^**1@Rqhe=Fyp+(A1MCqf;AA4q0r9$ z1c_;L2*+lYdUv(m# ztJ7`S1)qV0{o}E=yI^5u+h&Fp*K(e`fp)oR4k1G#lk2WxRBr(yql5%Ql=%}@S8CJ~ z{PcFK7ysjMc7V4!Si?PXpw2{7*>sZlNSAZI(c_Cqy|xC|x34~jEM_EMB8rM_9FwDi z7bqL6BrFmP4{8TIZ=m+zapHDTnDk?)BM=3E&p~2D zNc6sXjYyu?(R8*Ro74^_V`yQCIn9>F|$c|>$BJCNFT^EF6BMz6dl z=P5(gx6N$^_i;a}y6|M6=xUlNASt=tC}Esw`{XnGFMrxxmz4IJXc`>tD+(T-1t#ep zJ|cNFZ5_|xyJp*uBn`nX%jRyn0>kwvq})F(7ZEd6QT^{0F^RUor*q{C?qUAULOOc! zG(z9GMN8=%1KYI8>-#zrX6`-s4_nL(BE1aX?u#{z1CjkMwfy)UU{RDxB5?RygQVp6 zw=KFP5}0|742#SYR61O_7Cyf!YB#x`K&|(<(iHBNYZ<7`&yuJ2JX7eMhdpsC2fttY zAr5^XyB;BMtZb>LVA_oU`Up?rm~_fVOF{~5+9P!2x~x^9P2sXX?ldL}!Uv(j>4GTW zXpw6u`eJ_by-##KHm7*l;}2cD`Vl4Q%Hj83J|nP`m9@duTr??o=!RlLH0Bg6xqGb- z^Tp4$#8Gxh#3){?Sdil1-*){1q4LfTl#>)9bVB<*_1^e+Y1#FO#8)CEqn#zVV<~d5 zKVn#l;qA?X7xe^|s1}xo`5rw_tp&Wl7aS>h*%{jx`muGG-l~KOK2Yp_F=%zbHI4GE zBJ#PGs*^@NV!WPeb~J()uOy|bhzS6=OG2%iK}fqmt;i_GM*!1zj44D#b*-zrjWT}ptc;G4 zf3duOcxK-}iefl9UZ@S&7(ETSR_1;^kY8#mLL82NP<+&?vpJ(25xEjwYL(XFQAOrg zo#&pJTpl465F3=ptc?J3-AFo8)d$bW?qz1nhFNpiH%}?=#!LB6;cB8eBZJs!&jG2n zFQjsbR<}TVtS`uMb*vJg@XJI;=h7K-T|%GXZi1nUnsnkFE|7&6Em~YZo4Mey1X(xQ=i#9D zwol6;ET}NE z({)9)^e}QT-8m`zskPOHR^=EbZtJL@V=yBuOX5&=_y7&-)luL;O?9xtzZoRrFi6LLG&NMUY?Fiaj|yoejz@Tc)~Hi z2afZZ2Q8Tm+GdXwW#}MSdO&RzR1j77bYiopgf>8(39TthJz|==V%!89kNqs}{P>3H zxwQuWS*_lY0#NV@d@(M_VkAcm7+NEEy=UGkiQ(zBZnw86#w< z(XE}&4DSqF-_Q2~wbh+TRvAmcrz+0#xnXwwx3^YuU+)IgC7rqrvHgA%C99eWeZn z{&baBWUPb~vi_#))b6+FJNS)Y&Qpegfx+d-=d>|Z+ix*OM+Z;>GHl&T(KELUBbCOd;nD{g&6L*DZ?W4q}Cwlm!lciOBMx&(V({ zSllrv+OUCnV5X}dz#<4Dr-&d1(3l{?3VCUGSmE%ixa|58=9Twkf}uQVQeNHJN7j!Q zDrlMI67ef3h}o{CWN$0ozdtikC_`U zgI_JBSfyz(2E7&xJY;i){a}n!rr3fqi*PTFb$CCg!IIwt(muS;PQSi~*9H9jV`MS= zL$ylS4mq#=a*!zdo~=xQ7loY9q!*^yeUtAXE3u`@L^$A#DJ}+9@Il_52DC}{M>x?* zq>GEojND^8T5II8BCK! z>h>_K-L~dYVMJ3KoL{cN~Wqc9K(I60N%;3L@Ar_-K+bWo7Pcveojb8N=k|@j>F_9G*9AK;U{Y? zqeg{*ZKk;5x6YYV**I&czY(}fyGctf-)R=$yU7V1vF(CNPB%px-SwGjxQ;-;U43qAZSWi7qC&s5E|ihB1uT;T z=rhFJ1IiH|D5SJsO}?iCg*kt!Xb7gNy1rZv37k`#VP2w#MmR(INQJzqs}$2pxNOS-bch!7+X?=?#ZNS&F8pwMI1FirhNcJ_L%?V3DkOLN- zBkyB|*C9w85Fi+=#W?W1LHG?b3?feNz;wi3rxA^~)YI8@w%eRAU-3fD8W4<~g??Zs z-31pj-pqgd=HsTZ;M*CUPnvu9^PB6_H&Bd@%J&EP|UPV;sH8W?OPF#Z614jY! zA6|MavY_)K_L_oaS~~3Z?P0O$`rcoFs= zhV<3~EQ$+4QYI1YPJsc*fa^dEae=}siBf!5D8u-odBl4oR>b7S=;#PFJ(&Z@X&`d* zS~1$b>7avQGY;}Y#6z<3OhM@CSzG?z4LGzsrHzDd3TK+ILEm6qi9~BM7F2rj=eJzv zTxXaVv0~}GsmH>|M5Uf9*Gvf9Q6aFav^x@xqC|OEE4_GCsV?%*3PPzN(X><#Et;$F zhj_Gu&fnG8{d!+sSM|DsMFP;?vIo0rfE~JOi1c*z-xpxu=1HKXfnLB<7Y z@A$rO-5|p(JzaEb7%#qJgl)-QW<*qKtZULPhYqZ&oWT$<^ zEy&HiojcNK#X4PGQb>nndF-9mUlmj`w+uVgJPDZ(r-hv-C+=<9zS1L_q!5ZtuE=j9 zIzI2A5ug{rk?|xS0aWw_XuA0Qcho8Z2uC`xr$XwclQyXt@}(Wri?swc_%&hgE7SoSKj0PU;)?(+D0ii&i|p<#c@G}U}}V=x5Bh*g;WrF(MT}7s1&;OBHtqj z`Yr`6@4KLLrJymaF{XzNnso3Y0)e0QHR62C8M&dB6@(SXHT7mD)B?;^l)AKrlUK+xhYSKx99&i1SLCV}! zzmF+h=ThF)a(3P0A^;8ugo$JK&XqHR-R;_iLW6J%@=)J@#7ot&MsSq&1#^K;SJhSJ z(9Kr%2*9u|qHEr=|Mz*bP#|hrItoTCb_kTQ83#Hh3}ebZFmopCIlfq8W#c>YlGTKk zFdSmMT=b!Rm6c}XOkx)US=BA+k#0pmu#Ta%<57VEy|Nu~lD3*2v>Brg=dMsHz15JY zfz7TZb&BM1gh;$kVAD)SSkouR`p|OI%r*CwUzeW_0Npih6IcfppVg zVF>44lWHhR9cK&*CwtF3<8SYb7C(VSN5zK0FrPeF1+g77qXi_GNqGc=hk4KluRfq1 z)^!|VCg!}bOwBG|Z?JSFl+aDYY2|wAs_Qn2FPnZK<`-4U`cisQh%_Yf_h!Z+yX$@< zpo@@<4$#c4CI)!_S5p#bbHgjDSW3KGFs)mmL|LbaN5i)!3Z}Ej`6HtbH}fWMA!5kw zt`gWsA|j~=5b=D4>s0!0O~SPVccYp8WOT*ohTRMXsfww5%m`$XiPF!RA@Qd07vfFTCS&-S|5n5qe09{aV$KQ@n?NxK_A}<)$~qG$yrw{f z81X@6KZuB6_%Q0RZ8w_eFdIe0Nh#TP{~NgQCff}q`Yu&v%ay|=?su1kRj7OxY1kCRs?^^=-E-FLHr zI`+=XpG!34mFM1%ei5?Ija)e3GD0$M_%rXDeE&b@-wD9i0euPUk~9>1OA-JjTK?S- zwK^DRazr$8;|SMqB>`hZW68Ea@oqG)6L1i^A-8!AfhScgdlIa=u1qOI++c2A7P-I^ zMIyTD?usR8Z{F+SA-BPz-^{{>jM5PCSMT554r7CepBK30+1(;U;QfP>X=57CfTUUh zHX(D?9kTv@8Bo7mW5+9&$5w9pd^8N9BN0AU2m^`?6As8f&~+1bXO}6B)ps;5RF!8x zzmXmOdqnNu@;h#%N8kUviIY(jo-CHYtQCI&7MudIaRt~??(WFw)RUq{=pbD;*SnEs zb`UiL%54rW-R>AI2uYwx$QRvbdfB2eQOUr=4HV}x<{?Npuk(5YxAdZDx8Bd@$sq*#HdYMpZN#u$Ff%^DzXK+aT0E-cLgEiu%Ub$T4fIKt1Ll z-rmnC3u!*>9<6IXAK>j01+`5rcdvnhsRNEm2nXxEWi z+NRKz!QBrpO~Oxy1z$9`iJ#N#`C=%KzlJf9klNZNF^)nHqY7S#^6kb+>;h_(6+Lgv zC%%sKC2Vy3Vt{BWjVg4bQi62#gM|S6a>1%cwAHt+IcS$#(XRYI*0?Z|zV9QK^T^&p zG1G3`OU%{rG0V*U{kJ1MD z$(U5IM{pw8`P0Zpr5ZbX=Xm>uN}yxeyqeI)P?~6xI~zw(niAWZG#u=?5l2y)X|%a3 z99hx+_C6(8Cdr-MExu>uSxh;NCvuQC8wOrmZvZ|1!;!wV)ULk~X{D!%?%6&Wc&TEU zv}&yP=}0eg^^0D@$SH8%qg_;Z0D#Bipl2^me(S&^!1cg+T_h-zl6XJ|&qp-J2xa@n zFs)f`HCz{ta*BoqQrtC!RhlhKI3HdFUR`Du)z!ZIAvDR!t&aAB>)S*-H&Hs!=QFkr z7+ET)S3mrOVbJF46g9_U(AE%om+SvjD)_jY$V{>VdrDwFXjp8;x)$>R-Wpn_C-qw# zG}*#r)yK32&lXxd{V#$4lZGCl%T+g{LVjQgc$9DC6v!tY6Cnn6Sj@h&uFWqOIljUO zc|80kVa7y^Li!WAZ?x$Do)D(Ee3s~4#~#+^|3fPVh{ZNw(h^8$wX32)HwY5!(k+QD zvw763XI<~B+d`M^-A!)sek_EAIB_B+GxJZ1leHWu+|UjVa&ac)w-Q{pyVW%|$TEfl zGuWP^D%C5DNQT3EMj!S~P!>@dImvy)=6o3${}mARAa7oEmN)06aqn3PEwKmKJzV`e zs$KW%KH1rm{C^mG)JTgBJG@(e#CO~+%S%NQ(zqNbUBhfM7D%MCW7 zQBa588-DjAKv{+3Dx@Y)pkTu;psX2n0~5+%GMx&jn2c&@8SGiQ?)e-48qR&$rMudW zVhLSZ`^CVzSXyhJ8TU1Q{=}ULc{6r8{|5fKuC}wIl!E`EY|T z(iFIaLun|h)_eaWB}!dtGSg2{LSygrM^_)5w(9HkeT1IVKRX# z;KgsLH7~RM@uB`|tNeU81<_z4&@sx_&^(s_n(owfd?QEtCO(Ibgkmk0Uxt2;(R0U| z!<`q9N?U!rIhy(E6i_I(7ZTOmoSD&WYTL1vbh7%+u_k3=L?m2!GATbB~mT>!y&2WqSgbq(0q&ml+f?bkXg_#Lrewi=^30Af}3q)ZbN=*jb(}u6zxtcG?|M z!hSnKk1u`7yP5xfNUL0u$qTtMFUs@Zk0#z3c%*QXEdN{*0}q1;6T=KH*5A%uuIBX| zM@Eww3|5}+P8r~dzd)daJl4HRpvA>DgQM;2CGA82MOmIdw9daW5k*8XS?E7&8G03c zBNgITZ5}D`H8jk*?#!v)Sp?e_lldTI>tv#%F}1pcAu*YQB5eNAt2|@WvjN&v zc?IM=k+@LXapElMvDB#SQR1VSxyV>-UuU}6B>spHyH@dBd3i?&VFz+FIU(0?&0zBS zcg6^t7Lf6qZiitpwCT5<%TTbxFza)lv`)JNgq3@ulJvN#ZPUc=2UrTo>Coyx5Pbmz zzFil^>+5ThDKpIcO}AbAzvDlL`SyNiSH2w-qMp{Ew4y)uG{sq-9xSSj0je{BO!v!A zDPBmN$!|JW^kdK7|3rKaz}gzgji)?&#rLSx6mcL-x%ck|-b=t^sC+=&&U=qrlkdwx z#lI2zpo33>Jpd+9m7Wb$?SU$Q(7cCHv9ZplMo&PWmZ9J&r2D6Pu+x>e^f*e~`p)=|5G1a72{zelks9=mh9)CtJqHx?pL@CEhv?}%Gc76ph&Gf&V!P&Op#w` z4w?KdLURMiC3~+ff>BhjoGkKt8Wv^3wdkM1T8CBlT+$=U>D2}_lnbVvmLiMFh6I^% zT~zkI=%Nx=Pa7~r%avRioT?>PPN%0f|}Had}+t@_02U}pNsnWw2N4ln`yLA z4pvMHheaS;MZ>LUJh8#@Xl&HE%@%nyh8v|EJxV?_vDAk*x^AVHk03eAX{%l~do7*L ztk-fY<9;t$=F6Npw#j{&Kf38!X85}6Ip_YWeyXx}>6aXHe#u3)Z@*=G-PS^!95%zI zrNOcR40($|mNH41-D}d+9bmZKvl*ihHq%du(Xbvd__t_JE*X@h=_T*>r>P*v`qt?tXYF*fDCy)x${ay5%m z-^f7v*z@b2z-t#)tGwm@du^HWt5ySgriFnD9YzuVTEn5IXH6ja1O zS~_y5nh^|nSaDH=25G3{uer|-{)T_so`eR}JhTD`Gj+b_htD5*W-;UbSe3~`azHE<79_ez}~GR|H2=SX8Xl&x|?XD;)D zFwNUmuJovZ}q) zbxj|CGa~>!jMvAQjSZzJ1@v%Yesa)P2s%0x*FY{`;`|-dTYpH1*vO zL>Ve=N*gM7rB^B{T^F9H4w4&Nn7ek#@*?n^`23Lg=&T|hH>u$d%vk?7$L}&@5yFE) zp#eTWf0sHJ7?jf>$m5vr&%-Z50;M6y0rXCvCMyyuFy5^WAE*gIM=z3mC<_F9j~hM9 z91H3+2?#~*{1?;qKqxwv7BzJKGbH=z9hl;a+5h6fOSR_nh*?E{4&WKteIcmi zD?sR;7xbQXe{1f|-+;E$Fwilq;R?QHzka^lKo`E5_inV=I3w{quhgpDzdrwyY=~(< z1h!nsk=Q%yKTQw1G59~`y#2p@2q>yMp}}!Q#<7qHXpEB^i~)&OR3F89Yx+O4yHRM# zDKFsAAnGhIx~#x^CeJU0pa1{Yz~H_I;|Ah<{DAU{`SES63xE*W^gA%w0qC{=W9Mlm z#P5Efrsj09lS1Ykm?}TSM66*`!8uI5;lT)^_?Tu76D!(cX zkp6CpUhJ~6BKkh%+~!QdhvA=3!BislYZVg%@(WqN?Ef)WR1FjTav{l;NYh&h!7sCrn&0rCI060oHK3X1Yocb}Y(mw&s~ zDks&RTzB|lm>ZqRoV<|W|FIPv3Wbh*yL#({x&+-?8K(c8f)AnnQTcyE@;2dU--SQe zCic;1V?rs4zl8|nWbyxni2oXy5`>X_;X<=2{fN+j1I(0_Q5iXr|2w1zf$q|x{YF2D zoR4bITO6RaVQ<Bvu&PJyIje_h5vq7g$($>V+q-5z(|#B(Q-Tp4i3)TGxb8W z6gkqL9KDc#De6oYIT}VL4l;_Wc(+%6o^D2S4O45u)t#AoKaDF=8afOIEB#Qb?bPDj z9-g%}C@N^z?;@q2m|&K%1E0>o^Tqsr(b-O|ZvVLUt$jwuobM_AT@+}Yq=k1eY{zE; zX6OgL{q9xl5suWox8qTwllBp2eO;Z4oQ<7%S*(tl+KXxqL^gQS&cq}|PpKSp%51@q zW4O%;!LKVz)ku$Ql%zH*~V!n?VT0fB^Y{S5~_|cxk@qfKj10npOJV=81&3Qq9gQGy^4eKtR zx|YR1DG*2gav(Np#xExLW_bw_poB7KHp8KwV~)g%)xubc$Dm9rr$~_huO(K%^XOuO z04InR%bQaM+an`!7QS%67;>i}d0RWX%nDD0b&HVM0Tqyq z{Yj@Q>wiIJ86S)hU~eZ{Bp|*ChlvjMgx+dCDO0QEDUQLl93qdv&I?mxTxf~#&)sY zqsFdG^`dx?GV;M@QgfQVB9V0JmG9T&f%`l21(3f+zV#ys1djBX=hP;TPdg9RRbto!=Nf7*eN%~y zHf*+}Tv!483R(A7-^dws^=G{+mhJHK?5i1j`-fxEGu&=#!;PK`RbMbtON@FY*{cVo z9J|Y+;dFa?&S2}xe~;BV``A1)Z*>r==G==51 zm398Evh5wgh9eg@Iq2Ei*p8Q#)G(jeju#3S4i2T|(9zcVKhlmrgfk|&R>f}EV&-m{ z>~k9{eaNT5;>G<7{rXz%IK|aXw0GC(dABsQb!4qqG;*@_D5um}wo&bE03Nk>E>^$I zsU^H4XF@G2V@-`pkp`R<-j?wF-?qI?S^<}xUfYtNz|^4VV|pfGLI$IC z{iUE9uQU>jsIMyw1(e=|rvb9ZG=^bI*Pr<*yE?RxbbJ2~e!m=%TxO z1@LT48_b_AiT_N|&cF0Z8C$01 zJD2?6S{&*f@Wb4n%+lpcR_$6)e+^%{W-D!iOQf-PZ1{bLBMj|Qnys70i9${@U5=JD3;h1gjOWS`}ahYPaW)kcR81N zxxEyq-5h~k{JSEoFUK2*#OKv=TJ?E2S|sGOYoL3*56xr41ucu=>f-Uhh@7Jfs#&oU z`cZbM_Rpr1CtQf}aer<2(k+(10A|>Qo)ksDURX7c{nr8y^5RuKaEbpvSdowCVU3A& z#cM*z727^v$nQAY+d{U_M$Al@C~F!8xlik|DPNcOYUE44iY8*AgBN$h^{ikujM|}x zr+33nKpDk2jx{%S`t6GqX8i3Jy}XB7)84#l2=f(czUkQZ4FK=Y+v{=+Ukr}g;@`|n z;RI|zb`+-?VVw=ZK(1zz8os6SyKZqsUi17A_6$9L1>1cYy9(bcXtPrj?W<+MijHTt zU%ky9j+E(CzvibtmttbrH|VxXOR7hTv{@OxHl>#4&Kg_P6c*X1HEd2&n$i>iJ; zQg2kwj)tJ&+GsXx+vTk5`uxB)3w_4GkYY&btUDRay7csspwygX9CR=GM=2gp*f{?_ zE0AC;1;0O4Siaud*)TJwzV_RAa@k*CISZHZsMr{%WF>MGapPH^hc(+?T}or)N(gbV zh?><=Nc!DbjwFGTD`NTA*!JS`R}{m_(}a=YwsP_gk0~>4XD3Q#ge^B8;WSmtC-ZX2 zo7UIU%7&aT^rrWOU#op!B>$y@ZD31M8YV{`>*;Df&(J0<`}E9Rv1osX_|ybtlV4q3Jr!YOJtIauJAISf-Sm&-&Z|Dgf`1j!S*$BJ zO+F7PVqY$J2InS7{`2p=)$Kr1kX7n0W)bOo6%uF^eD*l+@6Kz^-&tE{6-ixASw%mVfB2Bp%4(Ur|HHy6whSW0GjxTO} z7|{Rin(1zAk9?L>(8iaUunGLA;m_%1^85cI>n)?=>Vj=i+?^l+8V$iMxD%Y<5Zv9} z-QC?SSP1U!?(PH{cW8q9?c_V>zB|VI%@~{AYgg5(nsZi_FxL>l^3Y&~Pclq>-Ofil z?8EBrbj7$@QlsMyN_^ti4^8Fd-*##}77clzKvb5~Ewpl)N|=Qu<8#j1`<9_rm1poh zOF%4QI0gl+lw)}@i@b*1Bus_Qi(cQo@Dj(UXpmrMP+4tMZFq>q3xRbw;@65fzwdSo z;`_9e<6`3!`O~AqkY`sD@ASb=Uy(Fmo(<2!3%HtYk+~k62Z3(}GbTgZNqX{0@?}v+ zf);#m!C^Zfc`3=(_<&&6D-bG5s9&kj2D=Ae*XuTKvYNX7$`NAt``*@ykZO-X0l;AY zBu=aExwn)JaOvF&?Tf~U&+g0D2CwqkY3C7KBzB(RpJK(u-+rDUw0p}>O^xvSbl*Sw zYRNLTIDU71CI0jXV_ZyW6*15B)6b(iS4{~aU`YsE!dT%KAJ`VIMsccD(i{607&x1F zpK>(P5J?{>^Laq4%zv4@&ga6kTo(e!Y7k+HV|~qdAEDpJytGsFOZO2H;aE?br<&%%;>=R26q`XAm z_{N^3GQG-U8w3hTL5Yc@sb$MN!cEa?sDoO%@6WjMjkVsP<=G0=Yvp=h`vyiV@mDjB zMiz`-GP3ZOYkO;76JE--*bwYc7x)7XxsR8Q__MtaVsVE@SNy0OcNxPQ)eu-)YIi>_ZlND%7&VhE;OmE zOT>+mYH6v^>)JkFe5n$H5e^i=#ALy1o3xv0Nzq^I3n?KMSH%XE5IW8oA|}s2wG%_z z4w0B`7B;e6nSXK5(Y5#pB*X~M-pj*ibmF`_--x>Cv<>m%sMLvBgIi8?-rN6>bad)J z!{WnUbK?O{`G*K1(5$ zNW>+jS)F5!8C;$aq(LC}$ZmQ2=!E>8$1T}eq^nz1PCZHwqY3l3rZ>dbRHcY4w}BwR zHFzl57;P>!jbZJ&w2H}n$TUEP^HC}mi?$Obxc)#jl>TY=3@>%Att!)JztQWPDjJC{ z``3xg!G|7qWlnD-;gPq-Z?XZ=D2u_83**xn!BEHxAq^L$-$<*AuWsD30L?!YxCa~8 zl9jOvt=ac5_?}^38o?Jj2AixP3Vtj`y<>uy;Y}Gj3M@wDD#fq6VfUa0<6`CmE>}~d zn%s;uS=H}thirx%eNqs#5#=dgN}G|hIVQTkaI?cjU9eX4FPv~Z8wgw^SRx~z z`!@PAQ!J`lQ$<|{ezVKfe4?+=nAn-ZFqJ_OGi=zwhnURxHP1zlpcl&-t?Y(M^BdE2 z#cCj3SwIsyAYT`nxk)6Wtjx9xGTnO}|H$0Zyp$Lk1nSIK>7*hM;D_Ih9W69aVTKSR z?CL8pqGGY_J5N77F8S?tbrFvCmSZol{Q=8q3^bGNWuTHB(D{sRv;dfAF(aE=``1D}KS9-?qM91HP_l3=fhWYrm(j!$cV&{YoUkZ;mpAea z{@OHfBTTz_W1uPds#%ONF31j|pdMypz z)$OsD(*CRb(J>2*=nX(Af?=I+r|Q{I$h_jqjnV{ZRJwpK-BL$Y_6>eTNSUGH7lox!G_#dLQrWYHI8i;!X@m2SvNA~)Q*6eDD;lgNY<39xo)Sy}6L&%hbU zM^PagH|mzDTZwz0?L~eMCcFuM)kK^3n{s@Li}Oa{qx)`Gvx?DC(n)1dtp+)_jR6dl z=M7of*OcDDcI=^;Gvnx)?St87t1y}n5%`Vw5$}1*wg)2+$f4v^Zr(IwDuDP1N4Hhg z3|Lv%8-}FYFJ7kn_~GBzD=5kk{0bj|!|F$r$dl4&bZw(Qb4nQ_c9s zk}adnT2XNe|yiUzPct1EA8K`+VCA{ zST6ddF7Ur-T!TE62fRQ}4KE%(uOM>utC>Kb2(*D04S?$2J2DKfD@3{6)KKz|#KSGg zJaFSE{j342GgDND!_#QpC13}pQU~47CWlGfp|~|HIl5ID7u>K?+MY^dy@|zonwlFU zT9S`UMVH~K5?$1QrR*J(R7Mda7v^8Ho!-0$@P6I36eXy1TeX~bxtHXUsP5%3 zy1Fn*o4G?{YmCb7ewh6(B8X0<$!VHiH+DNTtin;l#XiMmvashdzrv;b$WAbh*&F@| zp8AO`i8G0|%=x0h)P9VQ{`tnLB9}yQU-vd@#~Q1sM8N{=J6R?Csu^qefu*BJKZQk$ zxv?>k1^U9O`GbKcn~vtFyB{2L`@EeLf1MD(*UKr<7LtYL``F=jn>aTH@m80@lnF6k|V`ai;Xb?T(DbS?aD#9^BI^ zk7oQ2G8*72mJedqWr^&*K(Ferj<_^Dp=={A*>-Vs*#0d;eR#>U2dQ=_nZMzBq;Xf;j09(4+y zN=0mzRu+|%As~bxq(r}dpIU}ZW9lE8>RP%%wVF(EO2Ne|_}M^&hIUsXyH%ZC=y8F2 zaJX$)MXbBIS+h7QnsrdX*oY8NLXn@{!*@4veOp!Jm(Pm!`5uFlMrms zEb+B-GqCaUJ>;tMR~6m_-yP+f?|L@vymY&~R%~&#KrrKXQ^k!m{4b7ZLkyeY7Mr{v z5VlrBG6~PsNa&opP8wWmLDwu_x%XOmG9hT(b?_O z!_SwDKiFeXwX8<0U$w1!jMj-oCjA!IDPWK5G0Z7o)PI)kdbS(Shnp-e;V#O7X+}qc zqJcr+duIc9N@(`LFE=$(nrFw#m}j47TkPhok`@*-*GOh-`kD{NIZ~bJL3a?B-UwaD!DBTCc|`G`7s&X zZ?n2kC4!MXBpBLACI7i^SN0)Aj?xGi0m9iY$%7=IJwM_KtrrI<)>oC}hL0lTs5^GR z21@lm7qk$yd-= z>wFQz_R~JNu4bIAi0v_RcONxnmDVQ^ASBVp@GGbXy|j~TH>%|oe2LY+;_ti~T2c=E zGg8;;Ui9@PCaamqu1Y8D@K6>uwtAqS!fb~gSrc(tMyM;Z!_+ttY@T3Jz!mXB{O#Ck zHC&0A91>_O>j#^DBdk}w@t+$qXj3NzU-;K|}w zy7rCqu6S*tjfI@Mv7%QvCr3vGQ=2egzEI`HMwCUkw4`{L|5OcWRB2Wkx;4XiLaHyO z?M0PjxS(u_Jl+GBDzGt4Z}{i26Z6vnB=v~ga7Ga_=n_kKej+C!Hx6k8QgTKv0Q&i(z1izy#QWaWEHWU~xhXizy(+mV}L)OV_-)yND7BwLaX zdpqwdYsRH}>ipi|-+YO~xpTtTm3Bbqsh8U)rg4C0d2k2d8@!^PA0jV0$tOzRSivbR zf8Sm}LXrpMa2!A^KpDalwrzV{ULYjN4n8|dFscllKVr6lidyTLqq;OL$Os&$bOL2< zzov8jtWUjc?tI4BoW+&!iyCTH9h8)u?0xsTdfy&tVyd~f=BS8rs_CAd91(27ZlBT} zC@Pzu4S~^L-M8*|Udo#Ba1(zJa`e0%zdsWALww`Z9j%gQH{4^Z8!jNs#1H*UF))n@ zUI-n8y@&%;3Wy=(=v|*CjL>_6=> z(Pw4ma$3?2;+@4ty9rBt1X^Z4y`eO&ka@p({k&1o4+k`#c_cl|8)`or5@_Jw+kInY zWS|+qoHSg8C+Yq*kVjTsIbG?#Eht@+0&_U}aF4N<82ajMb!_O3`NSEW&#%|1eXdXV z1#Vsh#bfUfOfb>pFHgxhg8i5jW{n>5n%zgP;dVUeI=654UcSF~%Z-dq9=$v3X(+TkU0LT&gFeT8k5kLJ-cVBchP%fW`|p^7?vgMm?E9 zhr+{rIUPG;cXzIm>GY7Dy(DUTv_8GJ8!DL&?hlIH7s9ZZjAUj)f|q>3UL+n^ejcU* zN`~k?OHAp1#DKZ&rTy!Jxcn5hy?VLNtS{$u_J53tx}I$b&B@5mj!!4kgIHSJTQRUN zeGu;Dh>_`(jB#s%#l$|2F*s{J!`&hEUI2J&=seM1e#&0Na!^xKlb`BiJlzn62SE3; zI31uE=W_WMn$0!%7Ue|^gP~sPV$X}bcebH~LfAZ8pIXrIqcH=2&_-`WdHkG!T#II5y}SDz2-MO zx9RlAa11-^MK|2r-%wL?_SU<}k_#MhaHW899&)6&ViA;=P>_!953l}Z0~)$ z?^n-k_$Sm>oXsvUb~NARv^0m4pmMcd%|Xu1PN)<3)YD(h+BW}v8jvxCaDEoF)$9|b z!%_>nIfY?jl6StoA8KnP+3n($C^VYz1N}~Au)jX@=cPgktFC6cU51jYx?p>qk7%n5 zA{kD=Foygo>bUN$RHQa3B@`i~fxVKwprx$ChI8E&=Z}5}T$n?AxI>pp-zaZt^ydzL zb7t)rk`qBE0q&^=?WS{2C*aBNPGL-uvB6#+#?@Ht5n=ns7BtU1nms%>d$Cyc;46Cv z$)76`uO5c_^_`Jq)$@ndj1V=Vdn`B*1y4cg1g>wmm1t8uUot!}<5 z4i??fxu5Qz+;blsuZ9+WPwN_$9iI`+4l7R*-wd3K&J!SfC0AC^Hi(e}yf!d=Cib}F zHatE-FBE0#p7DV;5)WFV(&AX@UtI<{R5hVN z7Gn=baLG3T1imY>nujI`<1UgIjoqh2UV0JgAIG_h(q@LUVG{m_egi|wm$Rzue2sq) z{xH^ltW*-+H~E?4j_P4E`i(PIuGyChmL!%p5?)q|?StVK{27cXrfJ3wibvJUJep5Q z64f+6Aqdn@0_?UT5gr~pad3Tx=Q`$3X#!6}XIg=r?3+x#IjR4gV0k)^mylGN2(h7m zvXye0)V_!q4pAW|TJ>K_k}ech)yZ-?1*J))21#XRcCNrhZ*y)QS-d^A*-JY2Fcy{F z{FB*v;e4d}0kM{9*I~FKjJd_kY~`q8CS*YQR$nBLfpn%9!)7;7f6c4LvnJmn5AXtA zF1pU!O74$#-D9ItAW{n9@-6S=b{NCt>y!Tvjx&hdB@_pbpzUPkKFXrSX%Xso10reI63CRROzJ`JZ^YzakN#_Rm1zP6W&D5NCP-D|c+` z>4g_zc6TeQ=E)h0CB0wsZ};AMBeUpIkw6S{B(Q~L1zKv+%%kq=ZG?0sbq{z=Pm?*g z!ep)Nn4zqdoJUQTc%iuyoo>nYqpa1uUN+3OkPghs`dDR#$nBEDyghnOo zwev)d(kOCBZ}>o%#$ROv{nhEBk^kLX!#PIZO1n_qqmY%D4<{^^O8J#4CGakKd)^6;?NJkLcap+bAaZS z{fi`u@N;lRBGrs<855IU5U9X7pr|!U@#WdGsES`o(Kgm$9d>Q1cL`_8 z__mxqzP`GHJctvAP_tYo%9nLq+`@^Q!4C7Q$y_SRGGO8)tdg*?z6mSl)^RuTtg2nt z^z_gWnt1&Ve*kKQSVHHC{=b(M&JV#FDeb)cq@Clh4plw%vsQ@@)B}w#;Qio&b3aj! zTutXE@?~9DW#XeWrGa`WSB2u$ZB%up*ixx)y{8pUIQzGha5@aI^aPd*T$}zog{m9~ zdHUJUX$=RDlzW59=Mg^Jd3(oS+MGW8`;xl<3>|_4 zPK-w6zelh^m06Unc#smLa_m7WWBbG5j0j38H%9jCEdE%4^229~ZmP0h49=(Ij+@|X)yOQ4j{DnhvDSkVv<5xXu}42Amt`7iS6QV`<#UaI}K6DH;gZmxhBa*M7j7 zNBWU%B*JZ#wVuUsR31V=Hox`^OA9v7?Do-#=#<29 zx8t8Z4*)T5D~gg2fexR@!#-!UT zABo;>NqJn5g{liWw|BNJ>o(X$J1jh+<@5*=yQk#FP|0SZVaAY^6?BuKq)&+_)yuzw zrMp7Xf2G*Paq$iE|IQu_!F(sK#32)ray8hEsW0FMX%0Q*#M2-F>snjVU+_Ur9V^9>Y~A&j_y_A=Mvq&8SZWB!I0B18#E zN5vKLik%uu{zh9c^4HR2gq9%2oc<@2a3(__vuzs1mAb!yj&Y4Y6&vmG7tR()OJKQ& zo_`t}w{jck^B6xOhDXd^H8u{(3N#zPLXT| z18h))!m@w<3sypf7z#T~y!^=P0*}PGfKKL<&DymO@?E9D>nSA$nOk&Bbj$RiyYF0( zxW>Y)7XZ(rAdtV{nzrs8 z?T5)Xk$$S+g^K||Z3gR{x0^9uoQQRU?(!Yth~igjO5cA(bO*jb-Nc@iGu$fo)fC*CF9~Qe znOm4d^fv!SF>^CJ+w4%r4qc|DCR~FXrGm-K0Uv;=1S1Yoz|yzBd@g|7qWLc_3xva1 z>GI*lWzY=H^LzV<$D~^^8~7wwUqLDjxNNWo9(GbQ(2&XJ={j4a|5?Q+kI5Od*HVW; z>*QBjm)kkIpvc6|cxtK@Kl~(&(D41Qfc9iWvOQQR>JzE1kk(#}WZ{4JL6VS?5>_gs zPNdtG4_-k*0Y10mC-9)8pqd(HcTdm0v9U;31v4A9=6RgSJ_$KJrJW@EH|H;*@j|>^ zhd)2B5Qx0cIA&7Di{@A6Ftptu4#}VT3LRzzn!gLFrHBfI2%Y|wL86JHZIpD4E;AT06XiczP=k%-%4+zB}D$ z>8v7Cdu=X3-K`uUa0edx;LB-=DnOe!-M8gSd7qMj-)b>>k%`Sq7#vw?{z|Ko6XIR} z*&aazg#7fx$ViVrBs4+Uz?dNs06@nSZML+uRMXfPl9L1Awr?F1q+44Pl+KQlov8@v z?G%a6$XwksjD|Ih3s&Z6XCDwl3~$j??wbhxSj6Q|gNdRowDpNRae zYC_@ytaDbN3MhY()-e-k{bxMVw(dA_?o!W1dp~KWp7}b4uAOgi*R8URK0{78hnlob}=!69b#0#DE}P z^1J5UOo)Y&AAdAO5g8)=jkfN!zI)k<8jbxY1a?tl*r~SVaFhUlf%3mnO%>6^e^T?A zHUv9AlGshga$!fXrJTBD2Gp42=}w4@4U+jVP%cwpfv7JXZw}^g zq9`yO<{q{87@8_UB5SJNO#x9je-RU`06z(pApn!x1b@kG8_^>Ef6*UTMt`No0DP&t z=P-P?x;XjPbB`UHCsvB#H_4668)d;rNJK~g$jRA0*p1zrk3axyXmNy9TjhW1GWn}2 z|1vD5NeQF*5posoM+#~>o7&%)XitHto_IeM3Ww`Ox%WcJK!)@78yZDdFiZBWb{;Qi z1?7l1d{0>_Q!KvpZ?98jAlM64S!BR1T{8p-Y%h9$mS%V@3jgCrHteCk8DBNbbW}(; zTB%`cY>j245$+Jh`k6_R!V5JDYP}Xb9$IZV!zasRExZ`%A_D%HPi52CmebP`o;!Y z9}ls8&Ed8SmAGb?n#JsC<5IKUp(*qZ!L&gabq+D7il*{#vv*AhNzs)~D znNU6$4{l*5IU>3?sI5O()H6FOT#D0ZB4L8@=N>sdz8Ai$b+>ll{$)&j%|!!T&77y& zdMZlepaZ| zG=R%_egmruM51UUu+NFsFKu2V+TOfIH{p^+c@cxLTj&K=)sRPoXJO|Jwa%EYMr^KU z=6j{NgYw;?g?&>hbaaCI^oF}r`O#IwaUUVI=-#??grg`FbR+8{Ebs-5h_k=kZ71F4 z^)GipA)4(dRyg$?X~Azd>-qMrB5NFBJFvoq+rH{F_ZFvsUU&-%U!Fxqc{Bn!` z#TusViEGyB3Y!sEb4J&`Fy7;i>yDUP%7bDy>`pVP#EU9P$w9fh7k{On^*R|EKilk>H+S_(lCB`*FnLLWunr9w#zd+@^IR!)l4^x zl71T-7_>2=Z5f6)MmL6nW?`wEtepTuHZuW3Uy-x@;Z9zi=g#~fvzP~*GOa;FIzY{f zi?0TD%`&!Sht=PF(Nic0@)`HXy>{-*r^D0=mR4**=hTo4$C1 zt`{S+T!AShmHkb20>e~WZzyJXc=J)(guQD`ZC~wraE%>CC8fU#D?Cy?;7RG{V zN|}FL!__~Q)qz=9!sy^Ma4^8EaCt$A_cn3@0O&Cu6_!uxo4C5v)Sl?T3*-9x<|8YB zVz6SNt~2tBLv2r_SHk(+h&3SWtL5y0Vn(u=uD?YE#qOk@ww@%Hlxo)&i^r07aMIvl zxfSPz;B%buYkM#so%{yB308>=L0FOUaIM`t=1sc^%4gZ!U|m3t!9UT=!y*^=v+hFlu?0~-O9OB!ztP+lt z{@z8vU~3tdFgX+10RkT{On#vk*&T^sbc=3ROMEKoRxE%exa7ctSF`_j6g`hej=q&u z6#CLT{O?>ZxcbX(^zu!O01;c`eY&w;gUl1RV^I|Cj+c?0!sU)5c0Ie|5;)9!v);KW z*!c@DghKdGb1~4h!OC(alrHg&SWg1}%@xgX$ObtI;zcC%EH9?h19gY>xPkPvB3@h; z^VOZ!h+-J(M)n!=Ze0D<=!sjci3IadOg4l>J4ww&lpV(GC=ONZ5GmOJY{W+ogvDvZPfmh$L#Io<|;Cr}|Fj$zAA zL@tBjqSFoTNwF;n-p%0tt?+2h3&Rt>jok8?i7P8RvL~OEXcG{!6_?jLNg>`3@L0L| z&CvqyJe=bu6Wkp|+4b&=taOW$?y}WsKbz8DuZ#g@H`1l+f|>A;2}2v7@JQl+V8~oQWGAc8_^ zvL%u~=ziPqAT1>l5D>60rkO)SL#rvVDD;;9+mZAy{aKRf2`uRwQOmCMfQhl;M5XA~ zSIj=noLWSdmU3XBuXL#~3>mR7=a-|=Ky%qk4iJ%IsSK-a2%TDsyhtfXzuT`XF7qXd zq^VBP&=t{G`kq=`#;6jP`qj6A530j;Y=xFx^@N*6XTBvZIkkUi;@nqCDxyhuEHRhi zyp{C+h2uusp7{DOzoQ~Kw-iZP_YR~kW3k9;{4)wxXk27|NwdN8))EF5)?lN>VREyv ze>fJXu&L;bhWexJF~Z6RdTRQvm*l>e<9B9P!%@&w4sZYXxO5gyfv;L7pyE6A|5{H1 z0{-R;VHq>c!4T%pHzlRlOsx{uNbbdNn-A({O^>xxC64O|$kKG44$VqZjd;HEVvTi{ z<>P#n+07VGH%eNsDjiQNS1s%5F}%&%rQB!CH($LNt?BZRug%8h#xg6sQhZE?MZdi` zSl_nMDvxPsk@b*ot@k5yIHZR2;zez2Xn(-{@FTiQ9av4!cv$@;veL&>y{4h59!dQ5 zw*eTX$o~AhkAQaapK9-Kt|s)i8by$+`=8og1&SWRV{C6gv6+IO0Z>*}*5Z7O^-WqD zl@(UAbxGLHHGrUgP|q!CORDmT2yL|4F>6{tN5}^j2+QLK9C)J{Edx4E@@Jy!*zA~HkYDW zBHuNUPUZY=c^|p)66^&~A;0Qu@0h#Yq9p#1gKEW_PsmOUVeIX-Z|Pm9H#XB2@|-ex zcy{~2Kw@oA!;7qXv%$ry?GsIBUfnlP-%$GLTpItwOhE3aYCir6QOcd0h=zwpWp-3~ zl<6NQCpT!j_k6^1Rp#7ZIU9IQzP#Mry;D-#+^KmlH}wp~E%&&A zL^ph$s_B-$Wzh}~5B78BBWItTY+hF?O%4xe^;Kz?Y;=+bkaRtAx>Bj> z&(_ENR)AEm=nikzdne3pzX>cfffb+Uz~JTdMW_x(#Ge^Odh*0yd+RS>s+gG4~>)k;i+T=pL%2Q~nOApZ{C zMIlEcim`8zqrbaI$oo7C0xJT-&@Ut`z(S^qhtnvWFY${5yK5cqC%h5K+l_i z*pv3;w9?Ay?cB6@F_7d0nfAz-$fYkd=Fwrq!!8R~QewbEuyM;BlbEX~655qi=7;7Ja?g)wbV7`C4fK72^YzwD9ZQu(m`Fza4as^_0&N9y6n(9?ROjq;<`t*NnRRs=pi zF(s}hU>oGp*uM?^Jlb!@%`dp!lARIV-=HGNe7?M#Z~-VXlh!i~2)MCsO`N@-d4nDq zV+w9>W_k*}>sei)kj!Tg^}Hq22SG@yo~(#?*@JF8_*l;&)$#WGR%dY^pZL@hRqPiJ z3G+|+@SQHRkg^h`xiFkih;!QV^{Ovg;_XA5D5SzDHM-!@K1QC0b^UNLs+TeK~ygl4))5a^~_C3e|Wuu{i>WF(Hl;ahJ5;Xp$NppwfIV~hwO zaT^5Awo4d3MzSAaFA>7W=JxcI;d0^m5zrjtIXv9kC3v=epd9`I>K~25U-*r#=hF>+ zeVHdZFUFLJAT^v}^jv#!EqkARYWx|P zm3LQYhG+Kz8Yc#K73l$w^(HVr(XlF0;srIX*n~tN*Z^Y|7qs6V{rN z-r88Y7X&VGb3$32e;4E_ruABhKW;`8X<7 zf?6#Qi2Ys=qgy@vn-ZGC(x~Xiq$T5Z z$ss+7i(!l&ifG*bls(qaNJ`WO;XU1)2Sp@(rnoI~8#E;N(_nhJ0g=iAgYIJOv;&8(Xw~T+92;2e23OQVj!aUb!q>L?z31}R-9m8-;?3OLxerU z=+I@D+z+6mz_-yI?>AwdF&B>Xx1RoVp=Wr_f{vVM_4V`5f>B^Tvb~U!|G%dGfID#^ zdVdDzfz^;Mer_+RPJ3dFjIRw;dWg@nVU0NF?GiRkMQM9>g3tJ^j5@QdpAbGCqRQb` zG{i)5m%-Y=>B(L0HH3!zso@ND%v3Uy2%KqFCJl`v2vRH@{z3YRf|euqMHZ63=GE)P zZTX`N$tq!YUK@m#7w=x~sF1iPZK4zmO!5cdJo_n-Umv9{F$s-d_VQQ$>z0xvf-cu( z43tvPSy4%Ju!yT1T7;_C!z1A-A$#hQ-zr#;0KS~}dd`z)(qU-zWuJKxQ9}h>23A1; z^h=1Ny`9MX9^w|87X_J`rhvFG!rb(C>P^3UfcGgdp#9PhpSQ_+z{^TNT#qTfxEkBj z?KE(K)gu!ln%5DEqtnx9DZJo;-9!*7D2VysZWf<+mf(#TO_OSD^tYgw_rj7-0%*5q ziF6Y?{vKnZpsWvPY6%3o>Yp*7V76VLc7J}i~*VZC0_PwHoDbJ5mm8Wx_dZZV5aUk?Cl*S>=h)yCEy27x0?PZm($w)!yHmp z@-{crz!b%>M|iieDDV>9OWw%*Djf{paRm1iGvH+NJLH$$p6TJF3a?Iw18P~ZPVE53 zH{T6SqUbkB@M^f2xBg*@fo=-8n~MNhy^0{MIE0(KdiF)N?*<{ZzuWp}m#87Q-RN{F z7V^K^2FgSh6qZv72SQ1yYgrgwp6DZ+xsf;{o<&C}mlhnoI8^9$=hEBPO2!JtzR$Gr zN#DmFeFVl%5_b0#JbXtX=0os#z72U3CW@VP!kc5q5F4Zf!?F@bSG^K>1|S=^9uCfg zu_tubvzV_MA={91tK2`lnlV=5dkzm5L-_n$Pc~pT_Ymv+y5Cmb=RX%|c^Yoa?Yh3_%Jf^Ws!Du7iWSt|Me>eT;ciqtUlM`F^Obp)^`V5v6E zIm+9i-+O2~i7!?mg=eAvk}^(eG8nG?XhKO@V~k9KST#52=vbp4!nbC=IyMwb#CT+0 znF8j$W@nw-zSQBX#^WSZGO8}|sK>*WB-00G#{wpe4|V4%0?_tK@^)7>g1&U@9qK^s zlP@2_QK35p`0nYi}OAqdkbTwzbbd@xO5MbQHGAu;Z zFZb<>Mvk_=;?V8B#VvQDSZ(l=fvn9~SG<3B=M#@@=b@qu!BVvYMAN*IfZp}zyV6ro zDHU;W6o>5+fmsv6yhuLx_u2v$#*T`xH!zFC$YC7O=^T+q;^nwx7&rdtK~2vXl$Avn z;{eMz%W7z1giJX8h2HO$Qr-0o*6&&Pj4w6v-Rl^Z%by4V>>oVs@wZcISC`DlZjBLl}1hF2?ig9Q_Kd!oz_$)nm?3=A8HU&Ivm&?~4HyhLY zocnG6#71@yAwFI#SEB$^x4T0zR+6rx|68_#TW}2i@;@uU)D+z9fvepbhug1`hjMGu zF347fF$dY)4j)qYTG@U=PZD;7#!H}?$>mB3+sEbFb87lkk+pwfr?6*X_-Hm|1}p)i zXrCchR>)qxq3$lIr1OeVJuqT~NMl@-C0TK!O67?pGAfZhVce?f1R86f7gEQuAy-l* z)SkezF#gSj0X~7VU?%}*;=G>#9{wTtsJ}CQ_p2aKFj=H`8EO%f^S zxzc(|(FL*N%!o3y-5IVfTWdJbzy;q)`1|=saHcs|c7R8?VK!Rva(|-P-Eam8IBBEh zG$rP{2j3Hi%K=7LtZ#gg3Q4(DO zB!ZW*Keq60d1s#7K~4(7xo+^GXhmCTr@Or-f5#&H@4y^?@|gozQsg!OuPbnzsaq7x zW<1@Umm_v9EPVIA8pM0JUDmq-FTv>f{adFVNpnsWiKyz9QXA4Ha#}i#k*t*(CkNgc zyxU!MZ!@piD__ps_K{ufWuTy~v0gWXU5Wf40}OdPnC)&~98|?XBHPi?t)T-6pzSE* zLuFtjoLM#7t7`pmPbz<1-}S(I8_xIU9*dxWott{O8u>a=#f zeQ@Hc!`E1xkG61fOLNV8Gtt% zpedKge8oT%LZc6Eb3KoIdwt%`vg_)7zU+=`bvm5W^{N6BSjC+enyCoJ$iPho!R-YB z-pW_Cr(U0NCb$xTM+x@_&z-20_W=I$E7$S!=DzviC>s;bz2bB|P%8j$+Ju~+Uk7`G z{*7R4ZE7m@uFlDF5o#vZ-T0H9AUd(K)|y^|$A)BrU-97|%ln4Ipu3C->)^v6kCj=t zo63wZ%JXfD%On2@){pGIdg&=J|JT&OH(at%7Owx`;2@X_f(CDNtBUBZtNW592~I2;Gq#t zb}xRWl9(%ZxUqmdd^v>n>l%^Cb;+@Y23~>-%W0eYjQ*eZN^psLRX_WETEYo>=MA)l ziHzk0W?k0m2OVhNEYG(O3t8N?D~ZA6!hcQ=4nRy$HkuHB*yMB3mg>#qZGPvq{@iu) z#WW)8OYQM_zOy)1kFUXC?r338`qDPWI&9@VCB-#0n*hl~U|gH1hfe2AF8Zz$cs$EN_@QfZ zN~*!3Utx`x6(Ezd}w`E{T-}KrA@w>uos-W(BidXj6~(*C#Ao^kMzIOx&1U# z0;?}4hqkhcEPuL}_UnW^sG56oc^MBLjcBGq**c}Jxp{f1WHGfgSDTPO!|~FAT{+J4 za=)wWt(LNPxEs5K?+?OUqMby86at*VNK3)mg2G+2W{$j(TVM!Mv)Hw&1rhq<)M;hZ zIL!!ykUL1|=FE4V9d9@_l|=5PqBC9XzUtQ)v8c)Yk*dnTVkvnO$R_4hk&wr!V2CeS zP1AR2;o7xwSD~}>)1(_X>Hq6igD1+x&6~fd@;E*xYxFl!ODP*$C>Xx%${PZl$hk7_m0bnQ1~9) zhCtTZcyY9iBO(8vTjwG+SU`>_^R3n?r?qV3(Ka#G;EClDkEPNy34uJMkx_keR15?4 zI9pNlC}EO5lX{N3J%CcCnJvG4faYmY6^f9^qT1Np0w6^RN*T*j=D%mRJc-!;*WYa~Sx0KNzj`$LWK`cU({FZuk#j z;ieu2#s??nanWqN_;KA0s?ft!* zkk8Y^3!*o-HzHRpxnDAQnc{exv$|z=4ymZ<;D>z$zjdpHfnfl=w_ZreSoy%ha%@up zACjTTmKfh<%Vr48#2!^W;TrwDZk-MnRQZepv#8RFWwUSec3#-{_$wRKMFRipAHw-K z80Pg*@vGNS5AkFoH74V@;B7|IPEUPIR4@T-$HQ;d^d+wXmGMnhJb`*xo}}>Yz!=~?wSjRu%lDTOS=)b z>2dimWP?gDgJbdhWoDRnfo;DgnkcOX1PlVuUZqjc=X+>2vQ{$eZ!zKe=jP^0%JHJd zWp$WOmKnt`X;u|lFz}RP`C6YF)uv|0M+bFZ47VmBf{yosFx_H=4==u^yT1d%BLooM z;~_+&iBPPv=-yWs-^6E`EFBD3(1`hh2kIj-L8^MX+OnUVe2L4!tK1sQedoCT?@<7U zFk1d(jl@_e7cP!53GWWaE$coBzC9R46LQMcBh`U+D{<~Fx8iKpn=It?SAO(by)Qg< z6Ivu#utBI%OCo+v31+~v_AoCG7)~0_W1ucqs}^^6Z@IGuNwdSB7q>&^m^s{lQv={I ziJz#tI{s&w^cm9W64ak2vNZ8Wykps{T>W*arO zZ5xfP6Wg}$slLDWzBBg^xS3}%bIzRE&)$3Oz4%#cfi!lu3)9^uG&z{0|9~Cw==fnH zEh-T~P_biH%FnGRL777{tIw1iljerDhmh`9H5QUPxOIN7#~<2RNf?@^@z`%1F>oL8 zAu>{3;pA!~;CPD+00*~;( z6bla0^R8vBZ+A4M?gk|9igduZJfrsquwGbqPY29B#N!l%yLc%%OUf!nB*mdZ z)e$A}S+A(U5s%Y`ZNYtyoosJLNav^TAI;{PGv1!}08E6N?^JCtTn7 zuC?a{Hr@(}jwXn*MD$2@Zwo9CA@VRm-^5F6IXaYOpD$NBAu3>i0#)*_+uN0WK8;JL z%a|U{t0|@_>U<#Cv)wsH8$IMSJ2fJekq+t-))3gqc*G;=;UR0Ux4N(wmD{p5PH>%~ z6a6_T9z-`>zz=qAZFa>269e-5@jXGotO1iRRz4FLl&`C^m^V*o2UdzSPv}r7Q8hD= z;|UzHt@rf>vBJ-U7CW%KY54xdLPneiRZ_2B)s5BClHsQ1zPqNiP#cHJrDHJ+D6@23 z1#wGfqF!VhAuJ*1X#Bfx?jqd+Ap~aw;qQPoT}ii z;yzb0wO&PF?`r6(2NmX;mOk7HLr25Udz*wfjW1`-VV{_j8;12|f?N`#5Q6@BEJzu4 z-(@;>_u>?eXnp&v3^bGiM&>1@rDu9Wp!sZUY^>h=;y{Z^@CUl-3(kRoV$^R#lm!o6gd;9(Jv!y-EyP8X|f?9@YZ_$?9#^qSW-f z(1JMRdZmvX1Buzc{i-(~pk15(ifqSS=h-R$JllXZ|-*~OrbZwK|Hw@lur!;SG!ZpP=95%}dUAX6g3ZF2S*F7tm)yfZ5TLvxP6|DVO zkk20z<~L4uB7wEe;mpj;R`!BDwg7b&F`T6}Uq+{P>B8PAxgLHlbd})R%p_$ZLFZhe z>sec$x4=8Nqb{KeHVKPH5n9#c8RnY0V#8fyy1pG{U&H-&OJp4D$N{`<4 zq39vrT&H7o^T_NX1wz92?-TUhR|Z-D$UW#}0t<;Uh;Mrj$-(4le4Dp0+LU;w(wGMa z`Xg~-6BC1zk}yM{ZvYG;l|`AOIEr*TH`Uipd2>J1EVo#Ucqr2pC_&7%fyZunmQ&PrPkW8Ep&}B;qrLGx#VV0b%+O^$7PEo>G0k|}PNdj1hG+&Q=9?@i- z^IjS{?mcp)lP64c>Pp^i_HBAJ3_M%k?YjNP4N&&OJCiVc6>Sef4)6pI^oPW`mh83P z5?nP0q}bdcLQQ@Ir6zbCKnzcTsi>&%mSZlIm)3mDE|8&Zr=5d;XayoblJ8MVqTy6< z6PIaR+B~|c^!nXVZ++S^UWr~Qnst5Ic8aPisPk~kM$3M#`e3n-?`A24w(JIdWSM7o zVn$T}MtuUiM^XStpA2Qdsko_F#kpL@Sm5}i8fO90l1#D8MW!6B2jzPlq6E0=m!Z(=d@3u61gm6~Y z4LhR4DPi&&YN5UHl(x)`X5*2@-cWX0v}XpC-)|LERGo05)6Micyk9JMa=oAtkpnKl z@>olcc6_O%tW@A-Pq>TfuF~C5<F%1XVz-M+ovv#VzXMc;myePrEaWO3F`Z6CJzAGtAs z4r(HhugR-s-)&w<65{9ed~^b+1|ARNLQCGn3A~h#^d*gunNhZ}s|dp!LOfu;wWsH& zN9EF@GgYaYXA7L%vH!G{QFCG6iIwN9wNq4Cj+Uw;O4qrI=_@p*$W)gXQC{FKzAR=j z>au+ZK^iRk`L*TJbzzNghmwL~qSU2ZI!JdYb$AsbGd1x(LGT_L@xf6OWHg~5*imb@ zzOJsG5^_kWXo&jhOCA5VVEp7_p9X6Dqx|;kB@!fx8bR}N;9S;VdN3H)a;N1%kp~`7?kXqQ+*>B?G*LhyoaNWY`sFA@rsG2A3 z?jKK-m+X{;#x!=COpst3Xc`FbCNkbGl==;)QU?L;yECH987{A@`))6IcPehRZh_zG zAISx2hAy>l(Q-!*#&z`UTvPwY_D;Y0jzV{)$B4*>?34pjrGWi^JjbV3o~9U|f&Hp& zFE&L-&B@ZN4@?j7WUJbjEhy;e2jsjjQDv4x(1cqhhhhe>n7^1xDTnOPa6j=nrL;rZ zYih;K#z+K+=v%}pm7}SsY_5dSjM6C8gSb^bdBiG_>xxnai^;*-| zeqoxPZsAmHtCm)&t

N`VD#I+Zh4w$b<5+>xi`UW3WNy{y^tK`NZE*I`jX?O5r^ z(|0ErGB4hrwm-)vqSH;)Oj>o|u|5pP$0-QushJzcAhb1)kxZa|f>qvAK9Sl};p&)T zM3jC1Ri`@LACCvT&FxiEH~c5`Q?5v8pA>#ohK zSPFPiINxyGwkC|`-tuKHuO$XLy1~(t9x($S^ig{YXe^Av%JFV#5)@(pRJnCq;M?oj zTYoaEMeXON1ULNsvYS?^hddrG#420K<^;20&)JTrmX7JU(hspDJtnjPWQau-S#aMF z+u#olG5Mze+9D@uzvu=semGYNxr@Hv}w+$We-zNjd`JUi_6%yuK zgTutfHV~?f1|=>qPpjcX9}PtDsqg`3Agui3eY2u96J}tVbyrJ(7eZ#-GM%!n-gvDa0`O^&REb=rK+qpH3Eh#dpWY_at4yhcDZM-vR!ojEs!;B^Y|W zgFuJt*tS{^{*7k{*{4)jXjHG0&N8hAb6pCI;*BCE(wc^>6t8%j%z+zExa;OBY@b56 z{ezXckF-lKyuP?&wP!?Ht#SWm-5CV45C;;6kPf#&Lq*k1?|lJlg`h7W(5X|R$7N?< zwj+MFuyV7>h%QLq0Qdds^2CQ;Lqu6vhSwa=+DQw`=Eydhki6(kj_(0tc6K(|fk0zg zuC(QZOh;Hs#p@2vy=kYBgW{o|y*-PT`yANfTyQs+7uaY5t6{fR8^*z;ua2Q(fGV!4Qt+7sJ=j(KM3vs z&s6gpR8WGQfgLkosXJ~10YcdjLo88N zuXho=0688r5^MMiRYgmh1@Em>UcZXYlBs2Hd)t%k!82J13E_j6ag()~-u$o~RxzD} zSsrcJfHLI&ME=BY;>xx=mgfqS9(^4w;I|oc>dMyR$L4NN=$51E(5CgV6B#ue9^(n? zJ2G+7+Pe;7L|F?!(+L<|0y+%p^1vUJ_Q2bM)n9r)MU2qK%RZ_@8#tlJRr7Y#8Sb`> zr{TfEo#w$+BR$8D47(l-`t*)kJTSO6Q%7g=cZUrS>|eP#C?7cwUE-ipN5F@NhMIFk zi*s|g>$xLpZJSPZ!IzP%s5a#Y0#$Xjvjf)>f3~@zd_pC;Nb~Vl@-{tlnq*Ivd+ zQ%?;ij8dNeY)#u}2unqfLtt4vR*kK*G?&#$8urZ{rBXazZkf^1Q2@3jF|N~*!Z?R} z^4vA8+sr!~(ZuuN0~Bw$w|z#4K<9Guf`OX+R>Y6=iU?J%wRML_A8+~5n#2y-dKq=;L$;*2U|G5fKD)D|X={)m1 zB~m;pw-&mquA!kJ`O+YfAx)pMva%I0`OSSW$spa(J8=^eld>(K)1YMRwSfuex)%4^ zw8Xvrx;5nxr}80kUO^=_K*adsi1PW`mG>K#Q;Q-3yA61hae8N;zZCdbM~LShgR#!R zyUK+6Xq>2Y{-`TP$0?dJhR@XE)cDa-H9axVzMd+Y9*-6YkLB@f zdct;2`-#TtKA<%u-{&k2-ulwUDz%eC&xarmB|f@2k;Rqajyd>zbT`wk^2&YOzUi^l zzq6(o&)8I1VT7 zSU491Cdcu?MVOnq8%=E~sqVB2+;(7^gb@p6e;T?<({!5a8YQ{C&iA5Ew4Wz!3rtnL zWL;UP@D1Q+muB_dBm`5izlyh!vQq`5*(Xgc@^SS=F<`MEzRRldiqOU16v(d!c87M{F+FI1kizVe$mtMO* z78NzMf~I0IXNj4a)j@sCH66&ANt8`T1DqFXlVt(d&8D>Y5DDGkjqIzyp#axC6NbZ1 zH(FtFsXxsmk(66475>R#YT#tI@X*;*Uyr@%g@CJsTc1#?{l?{zYeexa(M>*f$oa(5 zKpThFx7#X%E_-Fw!o56YfH=G({@f~CE?-`x)@5VHSOFs zCPA)O>KicHF-Foz;wpU}lL(=h@3FCQuv0YJa&`H7=vH-GPqb6#shcbFvxfLYcrQzE z1Mz=y4wDr0eW##5PSNl+LW$#RE-J+pnv)4DNqlftYjm9W5b@4LFfRhBS6c8YV}fI= z3Y6X%3nD44MF_PjJ!N>Da6!jgH>A{j6ba z{ojF)=}h|ItMZ_BzU;6z06zW(-hS6BxlosKv2mu`?-6`;9=!IZ>Ne*f9IP3k5!p1I z`dxxK=5xFOZ)|2-O{Kg>`uD5qm>PA=>xuI6c+vS_?(5@Pgu9ng-WTqR!g7kPNPiR# z93Es03|RI(#>E+%l5FmaM%wJiW%YK7;i`mfNM^NM-KuPyd{; zwisZB)$`NK3(y#|7yM4P^i;r1Zlx6&+zwYfNLKAi(b4E3E+^=vTfDDrE%b90S^=eo z9<~?mFuSxqNTAM6_nuFD5Ci$^exl5khF2fA(G!S2Pg$1gGQ88`e}P_PqwjJ{8;Ch#3oF-$sOt%79d!%vWPqAQ zn4xkowYK)FxfCm23K(T_kuB@kEu2$O-jbYLo+@sQcb+o|)*NZ6tCNA}c2X5qiw}QI zKwl_v#BJ7vU|}yo{~Vjp`T=RJ0O1>YKs@q(XMxQtf$RtNp7AUgzR>COhH-uv6BRWk zy~^oDNs}ien>u%fhB_)lVT3fNVt{asIU=2TR2GDr*-UY{lj74iLGl zK+(sqSH*w7IOJZE|B?8$fgj)}j;|L@zqS^Vxlda9BaLfBrGNWLxYN|U{}~Fu3!n`C zdid7nZwO^*_dN00kz(>~I|uRe8%73UOC_B5M(F+6v|J|f6A&fcj5ek#c$n8ol?v!U zoe!r*PT_*LK$qz=DfX5+)T}gLfn-7Z@_8?|Mk1L7yaYqGC!fD9T#7wx1MS0C8@^`r z78R{Q%A(Fvw4+LUS+R!BW4U%L6H;i$&V_|AvZM4~{}A-&b^f)^*jyxBUQY;wRYBM1 z4X7%m+0VKfdG7g2=OY=s{{G3tmHrKTrK={@(tw0A z=h;8GO*#RLI3$xB@kO`QaHEf<1mR`0N2d+Y8&3K!#t0_&A4)DOjVPsSb2916|KXdv1hdt;;*>tJ>?Z6FYCpt(E7>~VWy?y zE;{Z?3!2T#0W)d7oS@DmYbt$V*JH5i*7E7NUD+7&IPa6rhcEcbIqwiQbY`QN&?~xx zsWCQsqvY&pT5zYC70-8|&NhZ5eX?dVMTi;0Jgcj4NG=o z?faU&QE^F4NPN9Eq?A=J*x<3ftqU98uaBupu6JAXw!9S}pY67gQ1K$;dNF_1v?HfM zsre!k(9u9%#tmLv7aL(&uzSK~Fw_lo{<7CzvwgE_x@emd>MkhCQAj`*L*n}FtcE_rVl`8Cb{ z=jO>?wB6PK5fc+Gvobl~$6f;K({#)NF1sR_*hWVpRO8v3Lr;jy8v0Gu5@xniy@2{; zl+^aPNR4ncgQ99|K*LP-kZFI!59ZG%r9vvA=0h&K<=6dXe{8qo;^L7blq8Wp=-irRugAapwgH+MaQYb;I#=fsfB zYV5Dy)%1;@=8)?v$*jiUU`};=#tj11qI%4459zR5k|?#fm{eXm*lyj! zuGg5K4{0)<-uL`))w0V1keIDb`cGkVA=57ik_xK|%p!nbLbU23U_TKyl>jlvS-Loe z^(ha6aKG7-6vHwDQyb6tn&v|BEnB!&D{)s(IJ64AV!3gDmO8JK(FigCJS(e}?qCcrO5E2Fr3PqmcF z$jFIcH7bU?T!X_Yd7fu9(pegztc<>`|8)Ao03l*9*?Q1uyIEM;it0-~`MP#~GC>mKyL26?891mV z9CqvVx_R9mDf+ftTr97hpI9fpCvY>gr~dfB5t z@x1cB-SD^vw$CRVBgeMJ2lwvG;~2^TR0*58=1el2Py2<{0hN6@9u)uDzZwf9^_ZN?r_0YW zQRK`HBtZ*^@8H!dm%TeWIDp~j=WlE&G3K7J(*y}FPh%kaO-H{cVPCNGSKB=u52A_H zRlk@J%)keat=@K>M&}yny!csjuXe}fMtl6A2~wVF=XaMivWD}1hPD^*UBXAIIZSsv z&iFi`3ouwoY538!dY+)D%azV20Y8U%qPF&`*YU8!gXhac#(t1+cpmad(^@4p*wYH7 zVOLq*fi5&X72TV!jidG-GCglJbOG=7;%=jV`26fxmm64B%G_4TVd-iM zBYUzI&>bdOmn#82=e=bI%*5NOkx7|6UJnhu@Y6J@lF_iO_i1{k(ez-h@JN}2bR78h zIG$n94?cgmCefvDLhp7xcF$ADd2br`GT>f_|tJ zm(B0Mq7^9~3@F(>b_WZ($NY)Gp{Pn5$NErehy>DO5(8CuDYonPFs*l!=yf7JMn)x0 zKp_96m}bKK}KMjdAU5D{yDN^3u|udh_qrx@hZC zMT|rmKU%`lL&ufo={&(=DUpEuIICvCcV1 zSv&=n}*NhjTe{S4kG0i=q{)=O65!or7~W8S)1pV zw_?IFak1*YHN>b>tSi|O<#XMmodI}|49#OzyxzK;N6HD8W`OIytQ>K8>hsG|bS=)Q zM~`OM2&UAK6ZiDQeoHQg$Q!B{((~6e^?u8bfL9kO&Lu)(f_~_ zIB9-!w8+9eQ)6Pzl2ud$^QF(HG_J&ivq|o^PO0w!h0Nm5wmGV@W}F zMW~e`R^pJZMEqx5_BJ1~Dc-nn<7eq4Xa}l1cizWob47U#j1lRMf=j)(?cGah$jWX; zXi}rwyj~11EGiKVD1xEw$JTCjMfPJH3^}*&p0!|?w`WHDVuBb5>5S0hVDBUjL?v#< z?Zc@Jcy^OiTCZS>Ks^zWAMwa$v}8_|2(}GEAifdO=(OWH6vzn*JHdbZI4+Q#!OP}V zg{R{5aTLtd+Du4wmol}(6TXg$U`$dZC@_dnCBEcx7hWVPBM56c-*7J1XnSWRFd&6H zfv*w!VDQ3LS#E#dF`Kb^v{VVhsgs!kQ%bG0b7s&?B83Sp9D_D6*n!)=LRVD5jPugo zVVwZGsFdrotNtR7vGGz^joKxH$)r8U>`HIKO0c||Rp^AjY?i) zk`o%`_kylTM_BgvQg&PJ2(1C#>lU^rG^Hq6t69kEE#7$kD>DWcVjeU~C(Z{`eWpc} z!a9c3xVXo&1A?PlH37j58FL7ViqjL?D*oLl@g1q!5J6&HJ$(vgoR}fAM{`6(OdrhK z(qrGbBf8*F3zLeT*HI%=5G>|{v<8cHN&OM*rC}iNGF4Q9txWo>qnEPgv{_1`58vpb|&>KC>E?@2jFFlxjxKh4CD(xB%T2 zxLu94q32hQq7DwI$te*()r6%63S@u!0&Jy!G_C7$*AhYqN0gjE!R7`fAAXZiF0br zZZ3ROSyDe`ogmv{&ac_RNFoq=&p_5(FqR&CgEL3MH-fPdYL=9OA8w`Pl0DdkXEDd) zn_44ox84bgJ2cXh8){~&bTezDtV*~OQ&5ZxDJUc}}K;&FEzEH3}Spac|5@B1L-*So!X#5q0n@8U2u`n#o$V z%?VKI(LNQ9+nlqa8J>tL&3DQ4x_|De0N9;m=Z2n21|>&K^&x%ZeS>h_N;xdV{EOn5^IiV`8mRP6Wew5SEu<%V5hvmw`D&S#5I zZ%Huf4esxrwYhCoM%%(=u%j2``L&zvg*8GFHaGpODC%H4dxpQP&s60!Dkuk?C%HmA z6hSDTU)-wB^++*51d&kDe1L%oJ-@y657&XMZkbB?#)##uiytB*p{V-Nxa#6IINAZn zx#$V1FYoitCg&kG0on6M(8wWkW$n-l^TxHf2ukQH`>uyli=;ZEJZwJAV3L9{V(&}b zQXMXgTglU}q65SW^RVw0F=CWf1K-s!H}@4K2)^!rl-Eg!Cc(I>GJ3V-pgPhNQe=XY zML0)*6O~r4%s%ivkW_!ylx%msK)GygDyD7ufhn3mK-ZXLu2c(l2Ho&&a#|v-9fUe@ zOgy;i{ev-UQVbvRs_d6-H8#V=?#27do;xHaJJ5V`h>f4Ih7=WM6Q_H##_x_RmG0!E z{TonxiSK1`c>|MGO?WQ0w*W}%-6a_EvzF16(*>Um01yx!IB}v}ux2$F#DD=%@o1M_ zdQMI(Yr3%z6*IRc&Kx0lZeEW(h;Z~0CTH`m)62Vh1tle5|BZ2j*XIWkKAW=EY+Mz* z*>m{Qr79U4w^KLipa2|;2#R4^!HYa%Wo=5)op^g75+jSP0-JT-#w?>a^}X^=Tn6S3NgvI-{Ayx zYEahdpXh6pS{6h}tW25Wmb#L_C zr*srV=i@T;lY&Rh`Gv>(atO!unA<0m^T2#{8&61XETOD$kCXRDxVUrSLm+o-;V$Yb z4b{LjeQQYEKH(@A%ZzH)>gB}Tg72NK2U;JV;QdCp+?^E2YNH)^McXa5uKNL5V`JmK zC|2wltOkbNY-;#IZKE|Tz}LEzDo;m)Pilr|A-SYs-P**rr36$~R@T<`7?;musfK>M zf=x0Lo^}XgZDPh(EcgqA%zIIRTKis>5OVRuo9+570dJhC8Kf0p@)86@A!ldUj{N+C z?*aqUU%w?BDA0x?^8HB~6y)1frZO5^5>V2G3b~_Vw=WD;Og*fS&lB$c07=Ngp^v1~ zlQpiQM_FG&R8hxTXKQyS&m&fkx~7(1deLZGtaQ?^5DJ0VQ2yX5oHU8R+S*W>i^*!f z|5>0C1#O6l`W6^%IG#M@LkWDU& zO3HfjvS~&h=7bs>;hz_?Kw5Fk(*NLAFh?O8;d)JhMY!G5^^0j;SBtUU{Km`Vh6B{j@+U^DJyz-gjaizdWZVW90 zo^jYG07=q?@ciQ$Y-3r3JxCA;OEkOTa+B=<=L zKz}Cu!Rza*Ko~9LM{KgOVJhU#seDiX;%)iH#>N2JJQw*?*>VmDIlC`|_VAaC*pa4| zmVp5+!X2e~sw%c$g8t$z#C$>CtwRg!(*Cl@^h=SDEK=Go^|?y3EbQ|+bS}=%eLJcH zpB^8Jk-@x^S>;o!8(Uf|gndMD!=`Z_%8QGqg2KXVEmiPU|Cw~Y5bd%+8|g^eHSqT< zG7*6W_}M_a*Hfj@AWANchIt3O zAl1eH$8ch-pgMtr41-w+4-XIbcRp_}tisrftewKi|Ev8&T>`{-7VZ!Sck2Q zynnZh(60q(XSQ;a^#6)&`zeSD1j#1E#jU^Gt$Lbd&Nybi@m;)5U2yxf7XEr7t zJQuMkdm@LG(UxiQ7=DK-?}C)pVFn*7r<+rv+x>I;d?88$LDD+aKZ!En{CP>3uc8a_ zDGJj!Bou<6uxI<3#JTL&3v~0LBLzi0$cp#$jU3!LRYk~7@J^=k#8tCdXml`;xq-PP z99)=?HZJ8NU67)Goyu*%g&x0qj~M$~A}ou8RR?CG_~WnQpQrAJMup-rH2kQOOR2sd zbWRD|GTI9w6qgI+J59TN4c=-g;70Ai) z`g$fr`XfgR$5BE1Yne#K$5)#2H+NEeqQ4wr>0>9SZ@tbN4ezgwQ)dSydxiV}iRmR^ z#{7@dMu39Vf<*ZNvAutY6qF#a2dx-If~Q$59r^p3c49+MfSJPAb@KcnusRy(Xv_j@ zZk)w?O_f;&=0BSUq%nG@2gJ|eKk9NjF`>br`n)edtL`w99Ik55imK}}UMe_;I`rV$Fv`4F-GHS8Au+eY4>xz)=Gpc^If zQ$|KcQqWV2fBFP-cz8H5H zqC#Ld`u8rZmqVC>wo(&|{kd@ah@e(bxQq4unH{L{ zo?In;ySzXw7!gH+fDEp4{3Q0(7|);c5F_9N+|mUC$q3=!=fzeHtl1T%YaRe7_8MV& zc8Eh@L7pTxPz}s175v%c>tY2K@rU>f@1f;EqWmQd(0}c+el5~OU%KZ}#^krV)k`1} z^rfYNgGcP|5zGk%vTxI3+THkH^A`gJ)q#leFTLdsCkFY)LG@{n)^R(l6J)@Av|9T&t@0qK-rH9ho(Vc~ zG!xSra!q~P(jP}oP}S5LLH~VYJJm@9VAs`46cU1e4ON;daC<k$LfE*z+Pj2xE34;s1#bNewDurI<{uVp5Ul&P! zUkgkG;E6|oQpx`lZ=N9cbIuzf24a*?n(G#7Jow9v()%m;y$P(d7+o(z#cj8TqZPhb z3R}tG;d|YR2G%ET&NlG-0qa-o(rHI5*90p}FZ*#R!KS51OKB(BhYl-8A5ozihg@% zu_xP!p;d1%oVXNQ?+UK_SkNKv+l0c6U`$NMhhO(@-j?Qy35e5LCqNGmrTkQ=FxU36 zh6LEQ%CGsECUvZ2AX@j4Fz7UNa<;x#tpuYfpezsPb zW!(MeYPBK9WF=N@k#Dv5yng5w5>`m}de7I@b$)jtpd!V5jH?ao43x`PUTMJ&bdEalaQo^h~dt-3q;OHdmDngMu19tY0KkA1=++$3jTcjEPQiJ@SBsvvfT0#mjd&NXe zn<`yw0}Hx*Z=DJ0Si#dXPWt8EuJ#IP=(-PW+Cat+sqcHpZ8rK3+9W>7^xZ?-qz<=2 z+sGjX27TR}+3;d0Zt{a9yB@>i4y1k{OLmR;^hx~ZkMH-3ay~)Lmj*N%cM$L8PJL@~ zdc0_OZT_MA?h-*T{5v|H-CTY#q)JY({ATQ#21i1UPBm%|i|;V;tT)h#ssd2P`6Wd( zeRa#8_dz0rbX3|Jpjvh>nr!B?tsUFjq)Cyijmarc?DYJ-10q?i42Wn>G7=J!K{^h2 z9Ca6etG73OX8)7;<{9%}ooy#<)p;uWTU5JHn+uV)M5s z`oqE(ph3C(s$#>wF#h4z|6ObeU$7XfKYl{V@@NYCcoXJov6;Epn0t)RJf*F(0a9UV1Sxc3{JLU4es z_r7P-eOU1@*9i5~S+WpwjrluApd5ae8Ltdc^E)!0^FzQ;2hBe0C?+|zFu|N5r>qX` z=EjMkM070$Cz64U%?V?CMn1Y3Qt7U}DhmO=Uu@KV0WcMaU1#c%(u9Y1@?~arF0*T9 z0j&WXo@x{_2Zolm3{WMe1b%oJxnkyIUFhmm2jERPq&iBPLvf@C z$<_`xM4@cdD(5~P&(;fGmZY@G!>r)Xbi@5o0p#-26M^LIS74f#Kt?+8Jn$EeNR#E$>q9(giH-u~EQ|D=$`D_&m@cc;BNV=#GdUMsPv{!61vnO$lvGfTcj*pFgI8lIp37+acVrYKcdN4`v{W?v~_?BfuyxM~I6ph=} z;ZHTK3bM`=M|cSrkkBZ`uk zjIq-_pBaq^Rzf8Qdb=k^%pZ~!ya#DeElA=Q3%Wu4SX{2vj0Js6lCNes9KDuYLNU3HC{lpr^M?>D? zS$7{(n*bXl6t+^`AhaWbfe{Y+*2@yLiFNd#4%f%e$M@?pp6yQz&X$kRPf;1uG@fPV z>P3d)u=O^tnDAqMNvxE}Dk`&;0a&Mk3a*wt=8c7-5ZqkHm8XLyF~=)GiF$5mXz*pg z3Iu))4N!;07D$-rFnW6Yz*cctSzXW=i1fMn1>Ljdcw(&AO1rT6XSb<~WR2 zyB{!*4)tx$Kmxiz#66mduoCHY{Yx4MG_lPmXUfO2kW={9{Li;PXai#dHf;}FvU@At zBZH_c;dvvh*D&E?nnE0hIM^HO+t7%{pJ!-&5{##ZfBs8G!z_cqeO387ne4XvCxf(; z3z~(>gc=C<>WRZ*M#e$=dcS~qPc5ZoX^ATo5CBBR1vTEgN@wuF%kF-x?NT@)2jUE{ z;%A+bS{%{xb9R|64hrk5id|va6bGREZ1kDX9277}l5UG|45wjPXZklG@rp z9M7bTR_HFRYH7A6|GsLSVlXUos=(@LtAgFvqUvl8Q!z@WYUtgFt8TE1eY43bcBj>> zN&Kv$@Su44nF)RiuLr>truIDz>FRQz9MVZYX#S{LKYztd-F90^etnFP0Xy`{rm54X z7iJ75DZDm@E^Ny|O`T;J-GIBaR_1fQz3m}q3a$Z>{+F!#2*fciKw;wl=T!JlDG~FP z)$iAgtmgTHlAr@XD{GIN>>1O1}XD P{QD#d>_I1_@BjY*T|Nq# diff --git a/docs/_docs/images/hibernate-l2-cache.png b/docs/_docs/images/hibernate-l2-cache.png deleted file mode 100644 index 42f83c54e67b49316445a7b5d07fdbeda15c5815..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 135173 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

RKtze9JU|;}{c#+yjQ2F!|6CZ1Xlhc=gL=*WQM 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 k6 - - - - - diff --git a/docs/_docs/images/kafka.svg b/docs/_docs/images/kafka.svg deleted file mode 100644 index db145e2c6..000000000 --- a/docs/_docs/images/kafka.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/docs/_docs/images/more.svg b/docs/_docs/images/more.svg deleted file mode 100644 index 42a3af10d..000000000 --- a/docs/_docs/images/more.svg +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - image/svg+xml - - - - - - - - - - - diff --git a/docs/_docs/images/oracle.svg b/docs/_docs/images/oracle.svg deleted file mode 100644 index 484c750d2..000000000 --- a/docs/_docs/images/oracle.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/docs/_docs/images/osgi.svg b/docs/_docs/images/osgi.svg deleted file mode 100644 index dae8409d1..000000000 --- a/docs/_docs/images/osgi.svg +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/docs/_docs/images/spark.svg b/docs/_docs/images/spark.svg deleted file mode 100644 index c0cb1b8e0..000000000 --- a/docs/_docs/images/spark.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/docs/_docs/images/spring.svg b/docs/_docs/images/spring.svg deleted file mode 100644 index 0e5f74ebe..000000000 --- a/docs/_docs/images/spring.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/docs/_docs/jms/jms-streamer.adoc b/docs/_docs/jms/jms-streamer.adoc deleted file mode 100644 index b3f9be986..000000000 --- a/docs/_docs/jms/jms-streamer.adoc +++ /dev/null @@ -1,123 +0,0 @@ -// Licensed to the Apache Software Foundation (ASF) under one or more -// contributor license agreements. See the NOTICE file distributed with -// this work for additional information regarding copyright ownership. -// The ASF licenses this file to You under the Apache License, Version 2.0 -// (the "License"); you may not use this file except in compliance with -// the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -= JMS Streamer - -== Overview - -Ignite offers a JMS Data Streamer to consume messages from JMS brokers, convert them into cache tuples and insert them in Ignite. - -This data streamer supports the following features: - -* Consumes from queues or topics. -* Supports durable subscriptions from topics. -* Concurrent consumers are supported via the `threads` parameter. - ** When consuming from queues, this component will start as many `Session` objects with separate `MessageListener` instances each, therefore achieving _natural_ concurrency. - ** When consuming from topics, obviously we cannot start multiple threads as that would lead us to consume duplicate messages. Therefore, we achieve concurrency in a _virtualized_ manner through an internal thread pool. -* Transacted sessions are supported through the `transacted` parameter. -* Batched consumption is possible via the `batched` parameter, which groups message reception within the scope of a local JMS transaction (XA not used supported). Depending on the broker, this technique can provide a higher throughput as it decreases the amount of message acknowledgment​ round trips that are necessary, albeit at the expense possible duplicate messages (especially if an incident occurs in the middle of a transaction). - ** Batches are committed when the `batchClosureMillis` time has elapsed, or when a Session has received at least `batchClosureSize` messages. - ** Time-based closure fires with the specified frequency and applies to all ``Session``s in parallel. - ** Size-based closure applies to each individual `Session` (as transactions are `Session-bound` in JMS), so it will fire when that `Session` has processed that many messages. - ** Both options are compatible with each other. You can disable either, but not both if batching is enabled. -* Supports specifying the destination with implementation-specific `Destination` objects or with names. - -We have tested our implementation against http://activemq.apache.org[Apache ActiveMQ, window=_blank], but any JMS broker -is supported as long as it client library implements the http://download.oracle.com/otndocs/jcp/7195-jms-1.1-fr-spec-oth-JSpec/[JMS 1.1 specification, window=_blank]. - -== Instantiating JMS Streamer - -When you instantiate the JMS Streamer, you will need to concretize​ the following generic types: - -* `T extends Message` \=> the type of JMS `Message` this streamer will receive. If it can receive multiple, use the generic `Message` type. -* `K` \=> the type of the cache key. -* `V` \=> the type of the cache value. - -To configure the JMS streamer, you will need to provide the following compulsory properties: - -* `connectionFactory` \=> an instance of your `ConnectionFactory` duly configured as required by the broker. It can be a pooled `ConnectionFactory`. -* `destination` or (`destinationName` and `destinationType`) \=> a `Destination` object (normally a broker-specific implementation of the JMS `Queue` or `Topic` interfaces), or the combination of a destination name (queue or topic name) and the type as a `Class` reference to either `Queue` or `Topic`. In the latter case, the streamer will use either `Session.createQueue(String)` or `Session.createTopic(String)` to get a hold of the destination. -* `transformer` \=> an implementation of `MessageTransformer` that digests a JMS message of type `T` and produces a `Map` of cache entries to add. It can also return `null` or an empty `Map` to ignore the incoming message. - -== Example - -The example in this section populates a cache with `String` keys and `String` values, consuming `TextMessages` with this format: - ----- -raulk,Raul Kripalani -dsetrakyan,Dmitriy Setrakyan -sv,Sergi Vladykin -gm,Gianfranco Murador ----- - -Here is the code: - -[tabs] --- -tab:Java[] -[source,java] ----- -// create a data streamer -IgniteDataStreamer dataStreamer = ignite.dataStreamer("mycache")); -dataStreamer.allowOverwrite(true); - -// create a JMS streamer and plug the data streamer into it -JmsStreamer jmsStreamer = new JmsStreamer<>(); -jmsStreamer.setIgnite(ignite); -jmsStreamer.setStreamer(dataStreamer); -jmsStreamer.setConnectionFactory(connectionFactory); -jmsStreamer.setDestination(destination); -jmsStreamer.setTransacted(true); -jmsStreamer.setTransformer(new MessageTransformer() { - @Override - public Map apply(TextMessage message) { - final Map answer = new HashMap<>(); - String text; - try { - text = message.getText(); - } - catch (JMSException e) { - LOG.warn("Could not parse message.", e); - return Collections.emptyMap(); - } - for (String s : text.split("\n")) { - String[] tokens = s.split(","); - answer.put(tokens[0], tokens[1]); - } - return answer; - } -}); - -jmsStreamer.start(); - -// on application shutdown -jmsStreamer.stop(); -dataStreamer.close(); ----- --- - -To use this component, you have to import the following module through your build system (Maven, Ivy, Gradle, sbt, etc.): - -[tabs] --- -tab:pom.xml[] -[source,xml] ----- - - org.apache.ignite - ignite-jms11-ext - ${ignite-jms11-ext.version} - ----- --- diff --git a/docs/_docs/kafka/kafka-streamer.adoc b/docs/_docs/kafka/kafka-streamer.adoc deleted file mode 100644 index aedb89692..000000000 --- a/docs/_docs/kafka/kafka-streamer.adoc +++ /dev/null @@ -1,221 +0,0 @@ -// Licensed to the Apache Software Foundation (ASF) under one or more -// contributor license agreements. See the NOTICE file distributed with -// this work for additional information regarding copyright ownership. -// The ASF licenses this file to You under the Apache License, Version 2.0 -// (the "License"); you may not use this file except in compliance with -// the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -= Apache Kafka Streamer - -== Overview - -Apache Ignite Kafka Streamer module provides streaming from Kafka to Ignite cache. -Either of the following two methods can be used to achieve such streaming: - -* using Kafka Connect functionality with Ignite sink -* importing the Kafka Streamer module in your Maven project and instantiating KafkaStreamer for data streaming - -== Streaming Data via Kafka Connect - -`IgniteSinkConnector` will help you export data from Kafka to Ignite cache by polling data from Kafka topics and writing -it to your specified cache. The connector can be found in the `ignite-kafka` module. It and its dependencies -have to be on the classpath of a Kafka running instance, as described in the following subsection. _For more information -on Kafka Connect, see http://kafka.apache.org/documentation.html#connect[Kafka Documentation, window=_blank]._ - -=== Setting up and Running - -. Add the `IGNITE_HOME/libs/ignite-kafka` module to the application classpath. - -. Prepare worker configurations, e.g., -+ -[tabs] --- -tab:Configuration[] -[source,yaml] ----- -bootstrap.servers=localhost:9092 - -key.converter=org.apache.kafka.connect.storage.StringConverter -value.converter=org.apache.kafka.connect.storage.StringConverter -key.converter.schemas.enable=false -value.converter.schemas.enable=false - -internal.key.converter=org.apache.kafka.connect.storage.StringConverter -internal.value.converter=org.apache.kafka.connect.storage.StringConverter -internal.key.converter.schemas.enable=false -internal.value.converter.schemas.enable=false - -offset.storage.file.filename=/tmp/connect.offsets -offset.flush.interval.ms=10000 ----- --- - -. Prepare connector configurations, e.g., -+ -[tabs] --- -tab:Configuration[] -[source,yaml] ----- -# connector -name=my-ignite-connector -connector.class=org.apache.ignite.stream.kafka.connect.IgniteSinkConnector -tasks.max=2 -topics=someTopic1,someTopic2 - -# cache -cacheName=myCache -cacheAllowOverwrite=true -igniteCfg=/some-path/ignite.xml -singleTupleExtractorCls=my.company.MyExtractor ----- --- -+ -* where `cacheName` is the name of the cache you specify in `/some-path/ignite.xml` and the data from `someTopic1,someTopic2` -will be pulled and stored. -* `cacheAllowOverwrite` can be set to `true` if you want to enable overwriting existing values in the cache. -* If you need to parse the incoming data and decide on your new key and value, you can implement it as `StreamSingleTupleExtractor` and specify as `singleTupleExtractorCls`. -* You can also set `cachePerNodeDataSize` and `cachePerNodeParOps` to adjust per-node buffer and the maximum number of parallel stream operations for a single node. - -. Start connector, for instance, in a standalone mode as follows, -+ -[tabs] --- -tab:Shell[] -[source,shell] ----- -bin/connect-standalone.sh myconfig/connect-standalone.properties myconfig/ignite-connector.properties ----- --- - -=== Checking the Flow - -To perform a very basic functionality check, you can do the following, - -. Start Zookeeper -+ -[tabs] --- -tab:Shell[] -[source,shell] ----- -bin/zookeeper-server-start.sh config/zookeeper.properties ----- --- -. Start Kafka server -+ -[tabs] --- -tab:Shell[] -[source,shell] ----- -bin/kafka-server-start.sh config/server.properties ----- --- -. Provide some data input to the Kafka server -+ -[tabs] --- -tab:Shell[] -[source,shell] ----- -bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test --property parse.key=true --property key.separator=,k1,v1 ----- --- -. Start the connector -+ -[tabs] --- -tab:Shell[] -[source,shell] ----- -bin/connect-standalone.sh myconfig/connect-standalone.properties myconfig/ignite-connector.properties ----- --- -. Check the value is in the cache. For example, via REST API, -+ -[tabs] --- -tab:Shell[] -[source,shell] ----- -http://node1:8080/ignite?cmd=size&cacheName=cache1 ----- --- - -== Streaming data with Ignite Kafka Streamer Module - -If you are using Maven to manage dependencies of your project, first of all you will have to add Kafka Streamer module -dependency like this (replace `${ignite-kafka-ext.version}` with actual Ignite Kafka Extension version you are interested in): - -[tabs] --- -tab:pom.xml[] -[source,xml] ----- - - ... - - ... - - org.apache.ignite - ignite-kafka-ext - ${ignite-kafka-ext.version} - - ... - - ... - ----- --- - -Having a cache with `String` keys and `String` values, the streamer can be started as follows -[tabs] --- -tab:Java[] -[source,java] ----- -KafkaStreamer kafkaStreamer = new KafkaStreamer<>(); - -IgniteDataStreamer stmr = ignite.dataStreamer("myCache")); - -// allow overwriting cache data -stmr.allowOverwrite(true); - -kafkaStreamer.setIgnite(ignite); -kafkaStreamer.setStreamer(stmr); - -// set the topic -kafkaStreamer.setTopic(someKafkaTopic); - -// set the number of threads to process Kafka streams -kafkaStreamer.setThreads(4); - -// set Kafka consumer configurations -kafkaStreamer.setConsumerConfig(kafkaConsumerConfig); - -// set extractor -kafkaStreamer.setSingleTupleExtractor(strExtractor); - -kafkaStreamer.start(); - -... - -// stop on shutdown -kafkaStreamer.stop(); - -strm.close(); ----- --- - -For the detailed information on Kafka consumer properties, refer to http://kafka.apache.org/documentation.html diff --git a/docs/_docs/mqtt/mqtt-streamer.adoc b/docs/_docs/mqtt/mqtt-streamer.adoc deleted file mode 100644 index 1339c97fc..000000000 --- a/docs/_docs/mqtt/mqtt-streamer.adoc +++ /dev/null @@ -1,76 +0,0 @@ -// Licensed to the Apache Software Foundation (ASF) under one or more -// contributor license agreements. See the NOTICE file distributed with -// this work for additional information regarding copyright ownership. -// The ASF licenses this file to You under the Apache License, Version 2.0 -// (the "License"); you may not use this file except in compliance with -// the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -= MQTT Streamer - -== Overview - -This streamer consumes from an MQTT topic and feeds key-value pairs into an `IgniteDataStreamer` instance, using -https://eclipse.org/paho/[Eclipse Paho, window=_blank] as an MQTT client. - -You need to provide a stream tuple extractor (either a single-entry or multiple-entries extractor) to process the incoming -message and extract the tuple to insert. - -This streamer supports: - -* Subscribing to a single topic or multiple topics at once. -* Specifying the subscriber's QoS for a single topic or for multiple topics. -* Setting https://www.eclipse.org/paho/files/javadoc/org/eclipse/paho/client/mqttv3/MqttConnectOptions.html[MqttConnectOptions, window=_blank] -to enable features like _last will testament_, _persistent sessions_, etc. -* Specifying the client ID. A random one will be generated and maintained throughout reconnections if the user does not provide one. -* (Re-)Connection retries powered by the https://github.com/rholder/guava-retrying[guava-retrying library, window=_blank]. -_Retry wait_ and _retry stop_ policies can be configured. -* Blocking the start() method until the client is connected for the first time. - -== Example - -Here's a trivial code sample showing how to use this streamer: - -[tabs] --- -tab:Java[] -[source,java] ----- -// Start Ignite. -Ignite ignite = Ignition.start(); - -// Get a data streamer reference. -IgniteDataStreamer dataStreamer = grid().dataStreamer("mycache"); - -// Create an MQTT data streamer -MqttStreamer streamer = new MqttStreamer<>(); -streamer.setIgnite(ignite); -streamer.setStreamer(dataStreamer); -streamer.setBrokerUrl(brokerUrl); -streamer.setBlockUntilConnected(true); - -// Set a single tuple extractor to extract items in the format 'key,value' where key => Int, and value => String -// (using Guava here). -streamer.setSingleTupleExtractor(new StreamSingleTupleExtractor() { - @Override public Map.Entry extract(MqttMessage msg) { - List s = Splitter.on(",").splitToList(new String(msg.getPayload())); - - return new GridMapEntry<>(Integer.parseInt(s.get(0)), s.get(1)); - } -}); - -// Consume from multiple topics at once. -streamer.setTopics(Arrays.asList("def", "ghi", "jkl", "mno")); - -// Start the MQTT Streamer. -streamer.start(); ----- --- - -Refer to the Javadocs of the `ignite-mqtt-ext` module for more info on the available options. diff --git a/docs/_docs/perf-statistics/performance-statistics.adoc b/docs/_docs/perf-statistics/performance-statistics.adoc deleted file mode 100644 index 6c82b3821..000000000 --- a/docs/_docs/perf-statistics/performance-statistics.adoc +++ /dev/null @@ -1,86 +0,0 @@ -// Licensed to the Apache Software Foundation (ASF) under one or more -// contributor license agreements. See the NOTICE file distributed with -// this work for additional information regarding copyright ownership. -// The ASF licenses this file to You under the Apache License, Version 2.0 -// (the "License"); you may not use this file except in compliance with -// the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -= Performance Statistics Extension - -== Overview - -Ignite provides link:monitoring-metrics/performance-statistics[a built-in tool for cluster profiling.] - -The extension provides utilities to link:#building-the-report[create the report] and -link:#print-statistics[print statistics] from the collected files. - -== Building the Report - -Ignite provides a tool to generate the report from the performance statistics files. - -Follow these steps to build the performance report: - -1. Stop collecting statistics and place files from all nodes under an empty directory. For example: -+ ----- - /path_to_files/ - ├── node-162c7147-fef8-4ea2-bd25-8653c41fc7fa.prf - ├── node-7b8a7c5c-f3b7-46c3-90da-e66103c00001.prf - └── node-faedc6c9-3542-4610-ae10-4ff7e0600000.prf ----- -+ -2. Run the script from the release package of the tool: -+ -[source,shell] ----- -performance-statistics-tool/build-report.sh path_to_files ----- -+ -The performance report is created in the new directory under the performance statistics files: -`path_to_files/report_yyyy-MM-dd_HH-mm-ss/`. -Open `report_yyyy-MM-dd_HH-mm-ss/index.html` in the browser to see the report. -+ -For more details run the help command: -+ -[source,shell] ----- -performance-statistics-tool/build-report.sh --help ----- - -== Print Statistics - -Ignite provides a tool to print statistics to a console or to a file in JSON format. - -Run the script from the release package of the tool to print statistics: - -[source,shell] ----- -performance-statistics-tool/print-statistics.sh path_to_files ----- - -Note that `path_to_files` is a path to the performance statistics file or files directory. - -The script provides the ability to filter operations by operation's type, time, or cache. For more details run the -help command: - -[source,shell] ----- -performance-statistics-tool/print-statistics.sh --help ----- - -See the output example below: - ----- - {"op":"CACHE_GET","nodeId":"955130d1-5218-4e46-87f6-62755e92e9b4","cacheId":-1809642915,"startTime":1616837094237,"duration":64992213} - {"op":"CACHE_PUT","nodeId":"955130d1-5218-4e46-87f6-62755e92e9b4","cacheId":-1809642915,"startTime":1616837094237,"duration":879869} - {"op":"CACHE_GET_AND_PUT","nodeId":"955130d1-5218-4e46-87f6-62755e92e9b4","cacheId":1328364293,"startTime":1616837094248,"duration":17186240} - {"op":"TX_COMMIT","nodeId":"955130d1-5218-4e46-87f6-62755e92e9b4","cacheIds":[-1809642915],"startTime":1616837094172,"duration":184887787} - {"op":"QUERY","nodeId":"955130d1-5218-4e46-87f6-62755e92e9b4","type":"SQL_FIELDS","text":"create table Person (id int, val varchar, primary key (id))","id":0,"startTime":1616837094143,"duration":258741595,"success":true} ----- \ No newline at end of file diff --git a/docs/_docs/pub-sub/pub-sub.adoc b/docs/_docs/pub-sub/pub-sub.adoc deleted file mode 100644 index 91ba14772..000000000 --- a/docs/_docs/pub-sub/pub-sub.adoc +++ /dev/null @@ -1,32 +0,0 @@ -= Apache Ignite Pub/Sub Module - -Pub/Sub module is a streaming connector to inject Pub/Sub data into Ignite cache. - -Starting data transfer to Ignite can be done with the following steps. - -1. Import Ignite Pub/Sub Module in Maven Project -+ -If you are using Maven to manage dependencies of your project, you can add Pub/Sub module dependency like this (replace '${ignite.version}' with actual Ignite version you are interested in): -+ ----- - - ... - - ... - - org.apache.ignite - ignite-pub-sub-ext - ${ignite-pub-sub-ext.version} - - ... - - ... - ----- -+ -2. Create an Ignite configuration file (see example-ignite.xml) and make sure it is accessible from the sink. -+ -3. Make sure your data input to the sink is specified. For example `input.addSink(igniteSinkObject)` \ No newline at end of file diff --git a/docs/_docs/rocketmq/rocketmq-streamer.adoc b/docs/_docs/rocketmq/rocketmq-streamer.adoc deleted file mode 100644 index a302ca722..000000000 --- a/docs/_docs/rocketmq/rocketmq-streamer.adoc +++ /dev/null @@ -1,85 +0,0 @@ -// Licensed to the Apache Software Foundation (ASF) under one or more -// contributor license agreements. See the NOTICE file distributed with -// this work for additional information regarding copyright ownership. -// The ASF licenses this file to You under the Apache License, Version 2.0 -// (the "License"); you may not use this file except in compliance with -// the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -= RocketMQ Streamer - -This streamer module provides streaming from https://github.com/apache/incubator-rocketmq[Apache RocketMQ, window=_blank] -to Ignite. - -To use Ignite RocketMQ Streamer module - -. Import it to your Maven project. If you are using Maven to manage dependencies of your project, you can add an Ignite -RocketMQ module dependency like this (replace `${ignite-rocketmq-ext.version}` with actual Ignite RocketMQ Extension version you are interested in): -+ -[tabs] --- -tab:pom.xml[] -[source,xml] ----- - - ... - - ... - - org.apache.ignite - ignite-rocketmq-ext - ${ignite-rocketmq-ext.version} - - ... - - ... - ----- --- - -. Implement either `StreamSingleTupleExtractor` or `StreamMultipleTupleExtractor` for the streamer (shown -as `MyTupleExtractor` in the code sample below). For a simple implementation, refer to `RocketMQStreamerTest.java`. - -. Initialize and start the streamer -+ -[tabs] --- -tab:Java[] -[source,java] ----- -IgniteDataStreamer dataStreamer = ignite.dataStreamer(MY_CACHE)); - -dataStreamer.allowOverwrite(true); -dataStreamer.autoFlushFrequency(10); - -streamer = new RocketMQStreamer<>(); - -//configure. -streamer.setIgnite(ignite); -streamer.setStreamer(dataStreamer); -streamer.setNameSrvAddr(NAMESERVER_IP_PORT); -streamer.setConsumerGrp(CONSUMER_GRP); -streamer.setTopic(TOPIC_NAME); -streamer.setMultipleTupleExtractor(new MyTupleExtractor()); - -streamer.start(); - -... - -// stop on shutdown -streamer.stop(); - -dataStreamer.close(); ----- --- - -Refer to the Javadocs for more info on the available options. diff --git a/docs/_docs/spark/spark.adoc b/docs/_docs/spark/spark.adoc deleted file mode 100644 index 3c4196ea3..000000000 --- a/docs/_docs/spark/spark.adoc +++ /dev/null @@ -1,127 +0,0 @@ -// Licensed to the Apache Software Foundation (ASF) under one or more -// contributor license agreements. See the NOTICE file distributed with -// this work for additional information regarding copyright ownership. -// The ASF licenses this file to You under the Apache License, Version 2.0 -// (the "License"); you may not use this file except in compliance with -// the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -= Using Spark with Apache Ignite - -This module provides an implementation of Spark RDD abstraction, providing access to Ignite caches from your Spark project. - -== Using Spark Integration - -. Import the extension to your Maven project. If you are using Maven to manage dependencies of your project, you can add an Ignite -Spark module dependency in the following way (replace `${ignite-spark-ext.version}` with actual Ignite Spark Extension version you are interested in): -+ -[tabs] --- -tab:pom.xml[] -[source,xml] ----- - - ... - - ... - - org.apache.ignite - ignite-spark-ext - ${ignite-spark-ext.version} - - ... - - ... - ----- --- - -. Make sure that all required libraries are present in the classpath -if you run the application by using the spark-submit command, or add them to your POM file: - -NOTE: We support any minor version of Scala 2.12, Spark 3.2 and all versions of Apache Ignite. - -tab:pom.xml[] -[source,xml] ----- - ... - - ... - - org.scala-lang - scala-library - {scala-version} - - - org.scala-lang - scala-reflect - {scala-version} - - - - org.apache.ignite - ignite-core - {ignite-version} - - - - org.apache.ignite - ignite-indexing - {ignite-version} - - - - org.apache.ignite - ignite-spring - {ignite-version} - - - - org.apache.spark - spark-core_2.12 - {spark-version} - - - - org.apache.spark - spark-catalyst_2.12 - {spark-version} - - - - org.apache.spark - spark-sql_2.12 - {spark-version} - - - - org.apache.spark - spark-network-common_2.12 - {spark-version} - - - - org.apache.spark - spark-network-shuffle_2.12 - {spark-version} - - - - org.apache.spark - spark-tags_2.12 - {spark-version} - - ... - - ... - ----- diff --git a/docs/_docs/spring/spring-boot.adoc b/docs/_docs/spring/spring-boot.adoc deleted file mode 100644 index b5022eb0a..000000000 --- a/docs/_docs/spring/spring-boot.adoc +++ /dev/null @@ -1,210 +0,0 @@ -// Licensed to the Apache Software Foundation (ASF) under one or more -// contributor license agreements. See the NOTICE file distributed with -// this work for additional information regarding copyright ownership. -// The ASF licenses this file to You under the Apache License, Version 2.0 -// (the "License"); you may not use this file except in compliance with -// the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -= Apache Ignite With Spring Boot - -== Overview - -https://spring.io/projects/spring-boot[Spring Boot, window="_blank"] is a widely used Java framework that makes it easy -to create stand-alone Spring-based applications. - -Apache Ignite provides two extensions that automate Ignite configuration withing the Spring Boot environment: - -* `ignite-spring-boot-autoconfigure-ext` - autoconfigures ignite server and client nodes within Spring Boot. -* `ignite-spring-boot-thin-client-autoconfigure-ext` - autoconfigures link:thin-clients/java-thin-client[Ignite Thin Client] with Spring Boot. - -== Autoconfiguration of Apache Ignite Servers and Clients - -You need to use `ignite-spring-boot-autoconfigure-ext` extension to autoconfigure Ignite servers or clients (aka. thick clients) with Spring Boot. - -The extension can be added with Maven as follows: - -[tabs] --- -tab:pom.xml[] -[source,xml] ----- - - org.apache.ignite - ignite-spring-boot-autoconfigure-ext - 1.0.0 - ----- --- - -Once added, Spring will create an Ignite instance on start-up automatically. - -=== Set Ignite Up Via Spring Boot Configuration - -You can use a regular Spring Boot configuration to set Ignite-specific settings. Use `ignite` as a prefix: - -[tabs] --- -tab:application.yml[] -[source,yaml] ----- -ignite: - igniteInstanceName: properties-instance-name - communicationSpi: - localPort: 5555 - dataStorageConfiguration: - defaultDataRegionConfiguration: - initialSize: 10485760 #10MB - dataRegionConfigurations: - - name: my-dataregion - initialSize: 104857600 #100MB - cacheConfiguration: - - name: accounts - queryEntities: - - tableName: ACCOUNTS - keyFieldName: ID - keyType: java.lang.Long - valueType: java.lang.Object - fields: - ID: java.lang.Long - amount: java.lang.Double - updateDate: java.util.Date - - name: my-cache2 ----- --- - -=== Set Ignite Up Programmatically - -There are two ways to configure Ignite programmatically. - -**1. Create IgniteConfiguration Bean** - -Just create a method that returns `IgniteConfiguration` bean that will be used to initialize an Ignite node with the settings you set: - -[tabs] --- -tab:Java[] -[source,java] ----- -@Bean - public IgniteConfiguration igniteConfiguration() { - // If you provide a whole ClientConfiguration bean then configuration properties will not be used. - IgniteConfiguration cfg = new IgniteConfiguration(); - cfg.setIgniteInstanceName("my-ignite"); - return cfg; - } ----- --- - -**2. Customize IgniteConfiguration Created With Spring Boot Configuration** - -If you want to customize `IgniteConfiguration` that was initially created with Spring Boot configuration file, then -provide an implementation of `IgniteConfigurer` interface for your application context. - -First, `IgniteConfiguration` will be loaded from the Spring Boot configuration and then that instance will be passed to the configurer for extra settings. - -[tabs] --- -tab:Java[] -[source,java] ----- -@Bean - public IgniteConfigurer nodeConfigurer() { - return cfg -> { - //Setting some property. - //Other will come from `application.yml` - cfg.setIgniteInstanceName("my-ignite"); - }; - } ----- --- - -== Autoconfiguration of Apache Ignite Thin Client - -You need to use `ignite-spring-boot-thin-client-autoconfigure-ext` extension to autoconfigure Ignite Thin Client with Spring Boot. - -[tabs] --- -tab:pom.xml[] -[source,xml] ----- - - org.apache.ignite - ignite-spring-boot-thin-client-autoconfigure-ext - 1.0.0 - ----- --- - -Once added, Spring will create an instance of Ignite Thin client connection on start-up automatically. - -=== Set Thin Client Up Via Spring Boot Configuration - -You can use a regular Spring Boot configuration to configure `IgniteClient` object. Use `ignite-client` for Ignite-specific settings: - -[tabs] --- -tab:application.yml[] -[source,yaml] ----- -ignite-client: - addresses: 127.0.0.1:10800 # this is mandatory property! - timeout: 10000 - tcpNoDelay: false ----- --- - -=== Set Thin Client Up Programmatically - -You can use two ways to configure `IgniteClient` object programmatically. - -**1. Create ClientConfiguration bean** - -Just create a method that returns `ClientConfiguration` bean. `IgniteClient` object will use that bean upon startup: - -[tabs] --- -tab:Java[] -[source,java] ----- -@Bean - public ClientConfiguration clientConfiguration() { - // If you provide a whole ClientConfiguration bean then configuration properties will not be used. - ClientConfiguration cfg = new ClientConfiguration(); - cfg.setAddresses("127.0.0.1:10800"); - return cfg; - } ----- --- - -**2. Customize ClientConfiguration Created With Spring Boot Configuration** - -If you want to customize `ClientConfiguration` bean created from the Spring Boot configuration file, then provide an -implementation of `IgniteClientConfigurer` interface in your application context. - -First, `ClientConfiguration` will be loaded from the Spring Boot configuration and then an instance will be passed to the configurer. - -[tabs] --- -tab:Java[] -[source,java] ----- -@Bean - IgniteClientConfigurer configurer() { - //Setting some property. - //Other will come from `application.yml` - return cfg -> cfg.setSendBufferSize(64*1024); - } ----- --- - -== Examples - -Refer to several available https://github.com/apache/ignite-extensions/tree/master/modules/spring-boot-autoconfigure-ext/examples/main[examples, windows="_blank"] -for more details. diff --git a/docs/_docs/spring/spring-caching.adoc b/docs/_docs/spring/spring-caching.adoc deleted file mode 100644 index 343c07e78..000000000 --- a/docs/_docs/spring/spring-caching.adoc +++ /dev/null @@ -1,595 +0,0 @@ -// Licensed to the Apache Software Foundation (ASF) under one or more -// contributor license agreements. See the NOTICE file distributed with -// this work for additional information regarding copyright ownership. -// The ASF licenses this file to You under the Apache License, Version 2.0 -// (the "License"); you may not use this file except in compliance with -// the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -= Using Spring Cache With Apache Ignite - -== Overview - -http://docs.spring.io/spring/docs/current/spring-framework-reference/html/cache.html[Spring Cache, window=_blank] -abstraction provides an annotation-based way to enable caching for Java methods so that the result of a method execution -is stored in an external cache storage. Later, if the same method is called with the same set of parameter values, the result -will be retrieved from the cache instead of actually executing the method. - -Apache Ignite provides the `ignite-spring-cache-ext` extension that allows to use Apache Ignite Cache as an external -storage for the Spring Cache abstraction. The mentioned above integration is achieved by providing implementations of the -`CacheManager` Spring interface. There are two such implementations: `SpringCacheManager` and -`IgniteClientSpringCacheManager`, which use either Apache Ignite node or Apache Ignite thin client to connect to the -Apache Ignite cluster and perform data caching. - -== Maven Configuration - -If you use Maven to manage dependencies in your project, you can add Apache Ignite Spring Cache extension -dependencies to the application's `pom.xml` file like this: - -[tabs] --- -tab: For all Apache Ignite versions since 2.12.0[] -[source,xml] ----- - - org.apache.ignite - ignite-spring-cache-ext - ${ignite-spring-cache-ext.version} - - - - org.apache.ignite - ignite-core - ${ignite.version} - - - - org.apache.ignite - ignite-spring - ${ignite.version} - - - org.springframework - spring-context - - - - - - org.springframework - spring-context - ${spring.version} - ----- -tab:For Apache Ignite 2.11.0[] -[source,xml] ----- - - org.apache.ignite - ignite-spring-cache-ext - ${ignite-spring-cache-ext.version} - - - - org.apache.ignite - ignite-core - ${ignite.version} - - - - org.apache.ignite - ignite-spring - ${ignite.version} - - - org.springframework - spring-context - - - org.springframework - spring-core - - - org.springframework - spring-aop - - - org.springframework - spring-expressions - - - org.springframework - spring-beans - - - org.springframework - spring-jdbc - - - org.springframework - spring-tx - - - - - - org.springframework - spring-context - ${spring.version} - ----- --- - -Replace `${ignite-spring-cache-ext.version}`, `${spring.version}`, and -`${ignite.version}` with an actual version of Apache Ignite Spring Cache extension, Spring, and -Apache Ignite dependency you need, respectively. - -The table below shows available versions of the Apache Ignite Spring Cache extension and compatible versions -of the Apache Ignite and Spring. - -[cols="4,5,5", opts="header"] -|=== -|Apache Ignite Spring Cache extension version | Apache Ignite versions | Spring versions -| 1.0.0 | All versions since 2.11.0 | All versions since 4.3.0 -|=== - -== Apache Ignite Node Cache Manager Configuration - -=== Cluster Connection Configuration - -To plug in an Ignite cache into your Spring-based application that uses Ignite node to connect to Apache Ignite cluster -you need to perform just two simple steps: - -* Start an Ignite node with proper configuration in embedded mode (i.e., in the same JVM where the application is running). -It can already have predefined caches, but it's not required - caches will be created automatically on first access if required. -* Configure `SpringCacheManager` as the cache manager in the Spring application context. - -The embedded node can be started by `SpringCacheManager` itself. In this case you will need to provide a path to either -the Ignite configuration XML file or `IgniteConfiguration` instance via `configurationPath` or `configuration` -properties respectively (see examples below). Note that setting both is illegal and results in `IllegalArgumentException`. - -[discrete] -=== Specifying Apache Ignite Node Configuration - -[tabs] --- -tab:Java[] -[source,java] ----- -@Configuration -@EnableCaching -public class SpringApplicationConfiguration { - @Bean - public SpringCacheManager cacheManager() { - SpringCacheManager mgr = new SpringCacheManager(); - - mgr.setConfiguration(new IgniteConfiguration() - .setIgniteInstanceName("")); - // Other required configuration parameters. - - return mgr; - } -} ----- -tab:XML[] -[source,xml] ----- - - - - - - ... - - - - - - - ----- --- - -[discrete] -=== Specifying Path to Apache Ignite XML Node Configuration File - -[tabs] --- -tab:Java[] -[source,java] ----- -@Configuration -@EnableCaching -public class SpringApplicationConfiguration { - @Bean - public SpringCacheManager cacheManager() { - SpringCacheManager mgr = new SpringCacheManager(); - - mgr.setConfigurationPath(" - - - - - - - - ----- --- - -[discrete] -=== Specifying Name of the Manually Started Apache Ignite Node Instance - -It's possible that you already have an Ignite node running when the cache manager is initialized (e.g., it was started using -`ServletContextListenerStartup`). In this case you should simply provide the grid name via `igniteInstanceName` property. -Note that if you don't set the grid name as well, the cache manager will try to use the default Ignite instance -(the one with the `null` name). Here is an example: - -[tabs] --- -tab:Java[] -[source,java] ----- -@Configuration -@EnableCaching -public class SpringApplicationConfiguration { - @Bean - public SpringCacheManager cacheManager() { - SpringCacheManager mgr = new SpringCacheManager(); - - mgr.setIgniteInstanceName(""); - - return mgr; - } -} ----- -tab:XML[] -[source,xml] ----- - - - - - - - - - ----- --- - -[NOTE] -==== -[discrete] -Keep in mind that the node started inside your application is an entry point to the whole topology it connects to. -You can start as many remote standalone nodes as you need and all these nodes will participate in caching the data. -==== - -=== Dynamic Caches - -While you can have all required caches predefined in Ignite configuration, it's not required. If Spring wants to use a -cache that doesn't exist, the `SpringCacheManager` will automatically create it. - -If otherwise not specified, a new cache will be created with default configuration. To customize it, you can provide a configuration -template via `dynamicCacheConfiguration` property. For example, if you want to use `REPLICATED` caches instead of -`PARTITIONED`, you should configure `SpringCacheManager` like this: - -[tabs] --- -tab:Java[] -[source,java] ----- -@Configuration -@EnableCaching -public class SpringApplicationConfiguration { - @Bean - public SpringCacheManager cacheManager() { - SpringCacheManager mgr = new SpringCacheManager(); - ... - - mgr.setDynamicCacheConfiguration(new CacheConfiguration<>("") - .setCacheMode(CacheMode.REPLICATED)); - - return mgr; - } -} ----- -tab:XML[] -[source,xml] ----- - - ... - - - - - - - - ----- --- - -You can also utilize near caches on client side. To achieve this, simply provide near cache configuration via the -`dynamicNearCacheConfiguration` property. By default, near cache is not created. Here is an example: - -[tabs] --- -tab:Java[] -[source,java] ----- -@Configuration -@EnableCaching -public class SpringApplicationConfiguration { - @Bean - public SpringCacheManager cacheManager() { - SpringCacheManager mgr = new SpringCacheManager(); - ... - - mgr.setDynamicNearCacheConfiguration(new NearCacheConfiguration<>().setNearStartSize(1000)); - - return mgr; - } -} ----- -tab:XML[] -[source,xml] ----- - - ... - - - - - - - ----- --- - -== Apache Ignite Thin Client Cache Manager Configuration -This chapter shows how to set up `IgniteClientSpringCacheManager` that relies on Ignite thin client to connect -to the Ignite cluster and perform caching. - -[IMPORTANT] -==== -[discrete] -`IgniteClientSpringCacheManager` does not support Spring Cache synchronous mode -(https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/cache/annotation/Cacheable.html#sync--[Cacheable#sync, window=_blank]). -If this feature is crucial to your application, choose the -link:extensions-and-integrations/spring/spring-caching#apache-ignite-node-cache-manager-configuration[SpringCacheManager] -that uses an Ignite node to connect to Ignite cluster. -==== - -=== Cluster Connection Configuration -Cluster connection configuration defines Apache Ignite thin client used by `IgniteClientSpringCacheManager` to access -the cluster. -There are several approaches to do this: - -[NOTE] -==== -It is incorrect to mix multiple approaches - this results in the `IllegalArgumentException` exception during the manager startup. -==== - -[discrete] -=== Specifying Instance of the Apache Ignite Thin Client - -[tabs] --- -tab:Java[] -[source,java] ----- -@Configuration -@EnableCaching -public class SpringApplicationConfiguration { - @Bean - public IgniteClient igniteClient() { - return Ignition.startClient(new ClientConfiguration().setAddresses("127.0.0.1:10800")); - } - - @Bean - public IgniteClientSpringCacheManager cacheManager(IgniteClient cli) { - return new IgniteClientSpringCacheManager().setClientInstance(cli); - } -} ----- -tab:XML[] -[source,xml] ----- - - - - - - - - 127.0.0.1:10800 - - - - - - - - - - - - - - ----- --- - -[discrete] -=== Specifying Apache Ignite Thin Client Configuration - -In this case, Apache Ignite thin client instance is started automatically by the `IgniteClientSpringCacheManager` based -on the provided configuration. - -[tabs] --- -tab:Java[] -[source,java] ----- -@Configuration -@EnableCaching -public class SpringApplicationConfiguration { - @Bean - public IgniteClientSpringCacheManager cacheManager() { - return new IgniteClientSpringCacheManager() - .setClientConfiguration(new ClientConfiguration() - .setAddresses("127.0.0.1:10800")); - } -} ----- -tab:XML[] -[source,xml] ----- - - - - - - - - 127.0.0.1:10800 - - - - - - - - - ----- --- - -=== Dynamic Caches - -Dynamic Caches configuration for `IgniteClientSpringCacheManager` is performed the same way as for -link:extensions-and-integrations/spring/spring-caching#dynamic-caches[SpringCacheManager] -that uses Apache Ignite node instance to access the cluster. - -== Example - -Once you have added `SpringCacheManager` to your Spring application context, you can enable caching for any Java method by simply attaching an annotation to it. - -Usually, you would use caching for heavy operations, like database access. For example, let's assume you have a DAO class with -`averageSalary(...)` method that calculates the average salary of all employees in an organization. You can use `@Cacheable` -annotation to enable caching for this method: - -[tabs] --- -tab:Java[] -[source,java] ----- -private JdbcTemplate jdbc; - -@Cacheable("averageSalary") -public long averageSalary(int organizationId) { - String sql = - "SELECT AVG(e.salary) " + - "FROM Employee e " + - "WHERE e.organizationId = ?"; - - return jdbc.queryForObject(sql, Long.class, organizationId); -} ----- --- - -When this method is called for the first time, `SpringCacheManager` will automatically create a `averageSalary` cache. -It will also lookup the pre-calculated average value in this cache and return it right away if it's there. If the average -for this organization is not calculated yet, the method will be called and the result will be stored in cache. So next -time you request the average salary for this organization, you will not need to query the database. - -If the salary of one of the employees is changed, you may want to remove the average value for the organization this -employee belongs to, because otherwise the `averageSalary(...)` method will return obsolete cached result. This can be -achieved by attaching `@CacheEvict` annotation to a method that updates employee's salary: - -[tabs] --- -tab:Java[] -[source,java] ----- -private JdbcTemplate jdbc; - -@CacheEvict(value = "averageSalary", key = "#e.organizationId") -public void updateSalary(Employee e) { - String sql = - "UPDATE Employee " + - "SET salary = ? " + - "WHERE id = ?"; - - jdbc.update(sql, e.getSalary(), e.getId()); -} ----- --- - -After this method is called, average value for the provided employee's organization will be evicted from the `averageSalary` cache. -This will force `averageSalary(...)` to recalculate the value next time it's called. - -[NOTE] -==== -[discrete] -Note that this method receives employee as a parameter, while average values are saved in cache by `organizationID`. -To explicitly specify what is used as a cache key, we used key parameter of the annotation and Spring Expression Language. - -The `#e.organizationId` expression means that we need to extract the value of `organizationId` property from `e` variable. -Essentially, `getOrganizationId()` method will be called on provided employee object and the returned value will be used as the cache key. -==== diff --git a/docs/_docs/spring/spring-data.adoc b/docs/_docs/spring/spring-data.adoc deleted file mode 100644 index 5d93fc69b..000000000 --- a/docs/_docs/spring/spring-data.adoc +++ /dev/null @@ -1,296 +0,0 @@ -// Licensed to the Apache Software Foundation (ASF) under one or more -// contributor license agreements. See the NOTICE file distributed with -// this work for additional information regarding copyright ownership. -// The ASF licenses this file to You under the Apache License, Version 2.0 -// (the "License"); you may not use this file except in compliance with -// the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -= Apache Ignite With Spring Data - -== Overview - -Spring Data Framework provides a unified and widely used API that allows abstracting an underlying data storage from the -application layer. Spring Data helps you avoid locking to a specific database vendor, making it easy to switch from one -database to another with minimal efforts. Apache Ignite integrates with Spring Data by implementing Spring Data `CrudRepository` interface. - -== Maven Configuration - -The easiest way to start working with Apache Ignite's Spring Data repository is by adding the following Maven dependencies -to the application's `pom.xml` file: - -[tabs] --- -tab:pom.xml[] -[source,xml] ----- - - org.apache.ignite - ignite-spring-data-ext - ${ignite-spring-data-ext.version} - - - - org.apache.ignite - ignite-core - ${ignite.version} - - - - org.apache.ignite - ignite-indexing - ${ignite.version} - - - - org.apache.ignite - ignite-spring - ${ignite.version} - - - - org.springframework.data - spring-data-commons - ${spring.data.version} - - - - org.springframework - spring-tx - ${spring.version} - ----- --- - -Replace `${ignite-spring-data-ext.version}`, `${spring.data.version}`, and -`${ignite.version}` with an actual version of Apache Ignite Spring Data extension, Spring Data, and Apache Ignite -dependencies you are interested in, respectively. - -The table below shows available versions of the Apache Ignite Spring Data extension and corresponding versions of the -Apache Ignite each one is compatible with. - -[cols="4,5", opts="header"] -|=== -|Apache Ignite Spring Data extension version | Compatible Apache Ignite versions -| 1.0.0 | All versions since 2.8.0 -| 2.0.0 | All versions since 2.8.0 -|=== - -== Apache Ignite Repository - -Apache Ignite introduces a special `IgniteRepository` interface that extends default `CrudRepository`. This interface -should be extended by all custom Spring Data repositories that wish to store and query data located in an Apache Ignite cluster. - -For instance, let's create the first custom repository named `PersonRepository`: - -[tabs] --- -tab:Java[] -[source,java] ----- -@RepositoryConfig(cacheName = "PersonCache") -public interface PersonRepository extends IgniteRepository { - /** - * Gets all the persons with the given name. - * @param name Person name. - * @return A list of Persons with the given first name. - */ - public List findByFirstName(String name); - - /** - * Returns top Person with the specified surname. - * @param name Person surname. - * @return Person that satisfy the query. - */ - public Cache.Entry findTopByLastNameLike(String name); - - /** - * Getting ids of all the Person satisfying the custom query from {@link Query} annotation. - * - * @param orgId Query parameter. - * @param pageable Pageable interface. - * @return A list of Persons' ids. - */ - @Query("SELECT id FROM Person WHERE orgId > ?") - public List selectId(long orgId, Pageable pageable); -} ----- --- - -* `@RepositoryConfig` annotation should be specified to map a repository to a distributed cache. In the above example, `PersonRepository` is mapped to `PersonCache`. -* Signatures of custom methods like `findByFirstName(name)` and `findTopByLastNameLike(name)` will be automatically processed and turned -into SQL queries when methods get executed. In addition, `@Query(queryString)` annotation can be used if a concrete​ SQL -query needs to be executed as a result of a method call. - - -[CAUTION] -==== -[discrete] -=== Unsupported CRUD Operations - -Some operations of CrudRepository interface are not currently supported. These are the operations that do not require providing the key as a parameter: - -* save(S entity) -* save(Iterable entities) -* delete(T entity) -* delete(Iterable entities) - -Instead of these operations you can use Ignite specific counterparts available via `IgniteRepository` interface: - -* save(ID key, S entity) -* save(Map entities) -* deleteAll(Iterable ids) - -==== - -== Spring Data and Apache Ignite Configuration - -Apache Ignite Spring Data integration supports connecting to the Apache Ignite cluster through the Apache Ignite node or -Apache Ignite thin client. Both approaches to configuring access to the Apache Ignite cluster use the same API shown -below. Apache Ignite Spring Data integration automatically recognizes the type of the provided bean and uses the -appropriate cluster connection. - -To enable Apache Ignite backed repositories in Spring Data, mark an application configuration with `@EnableIgniteRepositories` -annotation, as shown below: - -[tabs] --- -tab:Ignite node connection configuration[] -[source,java] ----- -@Configuration -@EnableIgniteRepositories -public class SpringAppCfg { - /** - * Creating Apache Ignite instance bean. A bean will be passed - * to IgniteRepositoryFactoryBean to initialize all Ignite based Spring Data repositories and connect to a cluster. - */ - @Bean - public Ignite igniteInstance() { - IgniteConfiguration cfg = new IgniteConfiguration(); - - // Setting some custom name for the node. - cfg.setIgniteInstanceName("springDataNode"); - - // Enabling peer-class loading feature. - cfg.setPeerClassLoadingEnabled(true); - - // Defining and creating a new cache to be used by Ignite Spring Data - // repository. - CacheConfiguration ccfg = new CacheConfiguration("PersonCache"); - - // Setting SQL schema for the cache. - ccfg.setIndexedTypes(Long.class, Person.class); - - cfg.setCacheConfiguration(ccfg); - - return Ignition.start(cfg); - } -} ----- -tab:Ignite thin client connection configuration[] -[source,java] ----- -@Configuration -@EnableIgniteRepositories -public class SpringAppCfg { - /** - * Creating Apache Ignite thin client instance bean. A bean will be passed to the IgniteRepositoryFactoryBean to - * connect to the Ignite cluster and perform cache operations. - */ - @Bean - public IgniteClient igniteInstance() { - return Ignition.startClient(new ClientConfiguration().setAddresses("127.0.0.1:10800");; - } -} ----- --- - -The configuration has to instantiate the Apache Ignite bean (node) or the Apache Ignite thin client bean that is passed -to `IgniteRepositoryFactoryBean` and is used by all the Apache Ignite repositories in order to connect to the cluster. - -In the example above, the bean is initialized directly by the application and is named `igniteInstance`. -Alternatively, the following beans can be registered in your configuration and an Apache Ignite node will be started automatically: - -* `IgniteConfiguration` object named as `igniteCfg` bean. -* A path to Apache Ignite's Spring XML configuration named `igniteSpringCfgPath`. - -In the case of connecting to the cluster via Apache Ignite thin client, you can alternatively register the -`ClientConfiguration` bean named `igniteCfg`, so that the Apache Ignite thin client instance is started automatically by -the Apache Ignite Spring Data integration. - -== Using Apache Ignite Repositories - -Once all the configurations and repositories are ready to be used, you can register the configuration in an application context and get a reference to the repository. -The following example shows how to register `SpringAppCfg` - our sample configuration from the section above - in an application context and get a reference to `PersonRepository`: - -[tabs] --- -tab:Java[] -[source,java] ----- -ctx = new AnnotationConfigApplicationContext(); - -// Explicitly registering Spring configuration. -ctx.register(SpringAppCfg.class); - -ctx.refresh(); - -// Getting a reference to PersonRepository. -repo = ctx.getBean(PersonRepository.class); ----- --- - -Now, you can put data in Ignite using Spring Data API: - -[tabs] --- -tab:Java[] -[source,java] ----- -TreeMap persons = new TreeMap<>(); - -persons.put(1L, new Person(1L, 2000L, "John", "Smith", 15000, "Worked for Apple")); - -persons.put(2L, new Person(2L, 2000L, "Brad", "Pitt", 16000, "Worked for Oracle")); - -persons.put(3L, new Person(3L, 1000L, "Mark", "Tomson", 10000, "Worked for Sun")); - -// Adding data into the repository. -repo.save(persons); ----- --- - -To query the data, we can use basic CRUD operations or methods that will be automatically turned into Apache Ignite SQL queries: - -[tabs] --- -tab:Java[] -[source,java] ----- -List persons = repo.findByFirstName("John"); - -for (Person person: persons) - System.out.println(" >>> " + person); - -Cache.Entry topPerson = repo.findTopByLastNameLike("Smith"); - -System.out.println("\n>>> Top Person with surname 'Smith': " + - topPerson.getValue()); ----- --- - -== Example - -The complete example is available on link: https://github.com/apache/ignite-extensions/tree/master/modules/spring-data-ext/examples[GitHub, windows="_blank"] - -== Tutorial - -Follow the tutorial that shows how to build a https://www.gridgain.com/docs/tutorials/spring/spring-ignite-tutorial[RESTful web service with Apache Ignite and Spring Data, window=_blank]. - diff --git a/docs/_docs/spring/spring-sessions.adoc b/docs/_docs/spring/spring-sessions.adoc deleted file mode 100644 index 875cd2383..000000000 --- a/docs/_docs/spring/spring-sessions.adoc +++ /dev/null @@ -1,110 +0,0 @@ -// Licensed to the Apache Software Foundation (ASF) under one or more -// contributor license agreements. See the NOTICE file distributed with -// this work for additional information regarding copyright ownership. -// The ASF licenses this file to You under the Apache License, Version 2.0 -// (the "License"); you may not use this file except in compliance with -// the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -= Apache Ignite With Spring Session - -== Overview - - -Apache Ignite Spring Session integration provides SessionRepository and IndexedSessionRepository implementation and configuration support. Spring Session simplifies support for clustered sessions without being tied to an application container specific solution. - - -== Maven Configuration - -Add the `ignite-spring-session-ext` extension to your Maven to use your Ignite cluster for Spring Session storage and replication. Here is how you can add this extension to your project: - -[tabs] --- -tab:pom.xml[] -[source,xml] ----- - - - org.springframework.session - spring-session-core - - - org.apache.ignite - ignite-spring-session-ext - 1.0.0 - - ----- --- - -=== Set Ignite Up Programmatically - -To expose Spring Sessions to Ignite: - -- Add the `@EnableIgniteHttpSession` annotation to the class that configures Ignite session. -- Add the `@SpringSessionIgnite` annotation to your Ignite instance. - -Here is how you can add these annotations: - -[source,java] ----- -@Configuration -@EnableIgniteHttpSession -public class SessionConfiguration { - @Bean - @SpringSessionIgnite - public Ignite ignite() { - IgniteConfiguration cfg = new IgniteConfiguration(); - - TcpDiscoverySpi tcpDiscoverySpi = new TcpDiscoverySpi(); - - tcpDiscoverySpi.setLocalAddress("127.0.0.1") - .setLocalPort(47500) - .setLocalPortRange(10); - - cfg.setDiscoverySpi(); - - return Ignition.start(cfg); - } -} ----- - -After you add these annotations, Spring Session will use Ignite as a data storage for sessions. For example, here is how you can create a simple controller: - -[source,java] ----- -@Controller -public class SampleController { - @GetMapping("/") - public String SessionId(HttpSession session) { - return session.getId(); - } -} ----- - - -== Configuration - - -`@EnableIgniteHttpSession` annotation provides arguments to configure the session storage: - -- `maxInactiveIntervalInSeconds` – session timeout in seconds. By default, it is set to 1800 seconds (30 minutes). -- `sessionMapName` – the name of the distributed map that will be used in Ignite to store the session data. -By default, it is set to `"spring:session:sessions"`. -- `flushMode` – flush mode for the Ignite sessions. -The default is `FlushMode#ON_SAVE` which only updates the backing distributed storage when `SessionRepository#save(Session)` is invoked. -In a web environment this happens just before the HTTP response is committed. -- `saveMode` – save mode for the session. The default is `SaveMode#ON_SET_ATTRIBUTE`, which -only saves changes made to session. - - -== Example - - -You can find an example in the https://github.com/antkr/ignite-spring-session-demo[example repository, windows="_blank"]. In it, an Ignite node is started with a Spring Session controller. diff --git a/docs/_docs/spring/spring-tx.adoc b/docs/_docs/spring/spring-tx.adoc deleted file mode 100644 index 442b03d83..000000000 --- a/docs/_docs/spring/spring-tx.adoc +++ /dev/null @@ -1,533 +0,0 @@ -// Licensed to the Apache Software Foundation (ASF) under one or more -// contributor license agreements. See the NOTICE file distributed with -// this work for additional information regarding copyright ownership. -// The ASF licenses this file to You under the Apache License, Version 2.0 -// (the "License"); you may not use this file except in compliance with -// the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -= Apache Ignite with Spring Transactions - -== Overview - -http://docs.spring.io/spring/docs/current/spring-framework-reference/html/transaction.html[Spring Transactions, window="_blank"] -abstraction allows you to use a declarative transaction management to concentrate on business logic rather than -transaction life-cycle. - -Apache Ignite provides the `ignite-spring-tx-ext` extension that allows to manage -https://ignite.apache.org/docs/latest/key-value-api/transactions#performing-transactions[Apache Ignite Transactions, window="_blank"] -through the Spring Transactions abstraction. The mentioned above integration is achieved by providing implementations of the -`TransactionManager` Spring Transactions interface. There are two such implementations: `SpringTransactionManager` and -`IgniteClientSpringTransactionManager`, which use either Apache Ignite node or Apache Ignite thin client to connect to the -Apache Ignite cluster and manage the Apache Ignite transactions. - -To enable declarative transaction management in your Spring application, create and configure -`SpringTransactionManager` or `IgniteClientSpringTransactionManager` bean in the Spring application context. The choice -of implementation depends on your preferable way to access the Apache Ignite cluster. - -== Maven Configuration - -If you use Maven to manage dependencies in your project, you can add Spring Transactions extension dependencies to -the application's `pom.xml` file like this: - -[tabs] --- -tab:For all Apache Ignite versions since 2.12.0[] -[source,xml] ----- - - org.apache.ignite - ignite-spring-tx-ext - ${ignite-spring-tx-ext.version} - - - - org.apache.ignite - ignite-core - ${ignite.version} - - - - org.apache.ignite - ignite-spring - ${ignite.version} - - - org.springframework - spring-context - - - - - - org.springframework - spring-context - ${spring.version} - - - - org.springframework - spring-tx - ${spring.version} - ----- -tab: For Apache Ignite 2.11.0[] -[source,xml] ----- - - org.apache.ignite - ignite-spring-tx-ext - ${ignite-spring-tx-ext.version} - - - - org.apache.ignite - ignite-core - ${ignite.version} - - - - org.apache.ignite - ignite-spring - ${ignite.version} - - - org.springframework - spring-context - - - org.springframework - spring-core - - - org.springframework - spring-aop - - - org.springframework - spring-expressions - - - org.springframework - spring-beans - - - org.springframework - spring-jdbc - - - org.springframework - spring-tx - - - - - - org.springframework - spring-context - ${spring.version} - - - - org.springframework - spring-tx - ${spring.version} - ----- --- - -Replace `${ignite-spring-tx-ext.version}`, `${spring.version}`, and -`${ignite.version}` with an actual version of Apache Ignite Spring Transactions extension, Spring, and -Apache Ignite dependency you need, respectively. - -The table below shows available versions of the Apache Ignite Spring Transactions extension and compatible versions -of the Apache Ignite and Spring. - -[cols="4,5,5", opts="header"] -|=== -|Apache Ignite Spring Transactions extension version | Apache Ignite versions | Spring versions -| 1.0.0 | All versions since 2.11.0 | All versions since 4.3.0 -|=== - -== Apache Ignite Node Transaction Manager Configuration -This chapter shows how to set up `SpringTransactionManager` that relies on Apache Ignite node to connect to the cluster -and to manage transactions. The configuration consists of two steps - -link:extensions-and-integrations/spring/spring-tx#cluster-connection-configuration[Cluster connection configuration] -and link:extensions-and-integrations/spring/spring-tx#transaction-concurrency-mode-configuration[Transaction concurrency mode configuration]. - -=== Cluster Connection Configuration - -Cluster connection configuration defines Apache Ignite node used by `SpringTransactionManager` to access the cluster. -There are several approaches to do this: - -[NOTE] -==== -Mixing of multiple approaches is incorrect and results in the exception during the manager startup. -==== - -[discrete] -=== 1. Specifying Name of the Manually Started Apache Ignite Node Instance - -This approach is suitable if you have Apache Ignite node instance already running in your application. - -[tabs] --- -tab:Java[] -[source,java] ----- -@Configuration -@EnableTransactionManagement -public class SpringApplicationConfiguration { - @Bean - public SpringTransactionManager transactionManager() { - SpringTransactionManager mgr = new SpringTransactionManager(); - - mgr.setIgniteInstanceName(""); - - return mgr; - } -} ----- -tab:XML[] -[source,xml] ----- - - - - - - - - - ----- --- - -[discrete] -=== 2. Specifying Apache Ignite Node Configuration - -In this case, Apache Ignite node instance is started automatically by the manager based on the provided configuration. - -[tabs] --- -tab:Java[] -[source,java] ----- -@Configuration -@EnableTransactionManagement -public class SpringApplicationConfiguration { - @Bean - public SpringTransactionManager transactionManager() { - SpringTransactionManager mgr = new SpringTransactionManager(); - - mgr.setConfiguration(new IgniteConfiguration() - .setIgniteInstanceName("") - // Other required configuration parameters. - ); - - return mgr; - } -} ----- -tab:XML[] -[source,xml] ----- - - - - - - ... - - - - - - - ----- --- - -[discrete] -=== 3. Specifying Path to Apache Ignite XML Node Configuration File - -In this case, Apache Ignite node instance is started automatically by the manager based on the provided configuration. - -[tabs] --- -tab:Java[] -[source,java] ----- -@Configuration -@EnableTransactionManagement -public class SpringApplicationConfiguration { - @Bean - public SpringTransactionManager transactionManager() { - SpringTransactionManager mgr = new SpringTransactionManager(); - - mgr.setConfigurationPath("") - - return mgr; - } -} ----- -tab:XML[] -[source,xml] ----- - - - - - - - - - ----- --- - -[NOTE] -==== -If no connection configuration is specified, `SpringTransactionManager` uses Apache Ignite node instance with the -default name. If it does not exist, an exception is thrown during the `SpringTransactionManager` startup. -==== - -[IMPORTANT] -==== -[discrete] -Regardless the configuration approach you chose, the same Apache Ignite node instance must be used to initialize the -transaction manager and perform the transactional operations. In case Apache Ignite node was started by the transaction manager, -you can obtain its instance in your application through `Ignition.ignite("");`. -==== - - -=== Transaction Concurrency Mode Configuration - -The transaction concurrency mode configuration defines the -link:https://ignite.apache.org/docs/latest/key-value-api/transactions#concurrency-modes-and-isolation-levels[Apache Ignite -transaction concurrency mode,window="_blank"] -that a manager will apply to all transactions that it processes. - -[tabs] --- -tab:Java[] -[source,java] ----- -@Configuration -@EnableTransactionManagement -public class SpringApplicationConfiguration { - @Bean - public SpringTransactionManager transactionManager() { - SpringTransactionManager mgr = new SpringTransactionManager(); - - mgr.setTransactionConcurrency(TransactionConcurrency.OPTIMISTIC); - - return mgr; - } -} ----- -tab:XML[] -[source,xml] ----- - - - - - - - - - - ----- --- - -[NOTE] -==== -If no transaction concurrency mode configuration is specified, `PESSIMISTIC` concurrency mode is used. -==== - -In case you need to support multiple transaction concurrency modes in your application, create separate -transaction managers for each transaction concurrency mode that you need, and for each Spring transaction specify the -manager that will process it. - -[tabs] --- -tab:Java[] -[source,java] ----- -@Configuration -@EnableTransactionManagement -public class SpringApplicationConfiguration { - @Bean - public SpringTransactionManager pessimisticTransactionManager() { - SpringTransactionManager mgr = new SpringTransactionManager(); - - mgr.setTransactionConcurrency(TransactionConcurrency.PESSIMISTIC); - - return mgr; - } - - @Bean - public SpringTransactionManager optimisticTransactionManager() { - SpringTransactionManager mgr = new SpringTransactionManager(); - - mgr.setTransactionConcurrency(TransactionConcurrency.OPTIMISTIC); - - return mgr; - } -} ----- -tab:XML[] -[source,xml] ----- - - - - - - - - - - - - - - ----- --- - -[source,java] ----- -public class TransactionalService { - @Transactional("optimisticTransactionManager") - public void doOptimistically() { - // Method body. - } - - @Transactional("pessimisticTransactionManager") - public void doPessimistically() { - // Method body. - } -} ----- - -== Apache Ignite Thin Client Transaction Manager Configuration -This chapter shows how to set up `IgniteClientSpringTransactionManager` that relies on Ignite thin client to connect -to the cluster and manage transactions. - -=== Cluster Connection Configuration -Cluster connection configuration defines Apache Ignite thin client instance used by `IgniteClientSpringTransactionManager` -to access the cluster. - -[tabs] --- -tab:Java[] -[source,java] ----- -@Configuration -@EnableTransactionManagement -public static class SpringApplicationConfiguration { - @Bean - public IgniteClient igniteClient() { - return Ignition.startClient(new ClientConfiguration().setAddresses("127.0.0.1:10800")); - } - - @Bean - public IgniteClientSpringTransactionManager transactionManager(IgniteClient cli) { - IgniteClientSpringTransactionManager mgr = new IgniteClientSpringTransactionManager(); - - mgr.setClientInstance(cli); - - return mgr; - } -} ----- -tab:XML[] -[source,xml] ----- - - - - - - - - 127.0.0.1:10800 - - - - - - - - - - - - - - ----- --- - -[IMPORTANT] -==== -[discrete] -The same Apache Ignite thin client instance must be used to initialize the transaction manager and to perform -transactional operations. -==== - -=== Transaction Concurrency Mode Configuration -Transaction concurrency mode configuration for `IgniteClientSpringTransactionManager` is performed the same way as for -link:extensions-and-integrations/spring/spring-tx#transaction-concurrency-mode-configuration[SpringTransactionManager] -that uses Apache Ignite node instance to access the cluster. - -== Examples - -The example of using Apache Ignite Spring Transactions integration is available on https://github.com/apache/ignite-extensions/tree/master/modules/spring-tx-ext/examples/main/java/org/apache/ignite/transactions/spring/examples[GitHub, window="_blank"]. diff --git a/docs/_docs/storm/storm-streamer.adoc b/docs/_docs/storm/storm-streamer.adoc deleted file mode 100644 index 887712e10..000000000 --- a/docs/_docs/storm/storm-streamer.adoc +++ /dev/null @@ -1,62 +0,0 @@ -// Licensed to the Apache Software Foundation (ASF) under one or more -// contributor license agreements. See the NOTICE file distributed with -// this work for additional information regarding copyright ownership. -// The ASF licenses this file to You under the Apache License, Version 2.0 -// (the "License"); you may not use this file except in compliance with -// the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -= Apache Storm Streamer - -Apache Ignite Storm Streamer module provides streaming via http://storm.apache.org/[Storm, window=_blank] to Ignite. - -Starting data transfer to Ignite can be done with the following steps. - -. Import Ignite Storm Streamer Module In Maven Project. If you are using Maven to manage dependencies of your project, -you can add Storm module dependency like this (replace `${ignite-storm-ext.version}` with actual Ignite Storm Extension version you are interested in): -+ -[tabs] --- -tab:pom.xml[] -[source,xml] ----- - - ... - - ... - - org.apache.ignite - ignite-storm-ext - ${ignite-storm-ext.version} - - ... - - ... - ----- --- - -. Create an Ignite configuration file (see `example-ignite.xml` in `modules/storm/src/test/resources/example-ignite.xml`) -and make sure it is accessible from the streamer. -. Make sure your key-value data input to the streamer is specified with the field named `ignite` (or a different one you -configure with `StormStreamer.setIgniteTupleField(...)`). -See TestStormSpout.declareOutputFields(...) for an example. -. Create a topology with the streamer, make a jar file with all dependencies and run the following -+ -[tabs] --- -tab:Shell[] -[source,shell] ----- -storm jar ignite-storm-streaming-jar-with-dependencies.jar my.company.ignite.MyStormTopology ----- --- diff --git a/docs/_docs/topology-validator/topology-validator.adoc b/docs/_docs/topology-validator/topology-validator.adoc deleted file mode 100644 index 767306f8d..000000000 --- a/docs/_docs/topology-validator/topology-validator.adoc +++ /dev/null @@ -1,70 +0,0 @@ -= Topology Validator - -Some network issues can cause the Ignite cluster to split into several isolated parts - segments. Nodes from different -segments cannot communicate with each other, while nodes from the same segment do not experience communication problems. -In this case, each segment marks the nodes with which the connection was lost as failed and considers itself as an -independent Ignite cluster. Let's call this scenario cluster segmentation. - -Cluster segmentation can lead to cache data inconsistency across different segments because each segment can continue to handle cache update requests independently. - -Apache Ignite allows the user to provide custom validation logic for Ignite caches that will be applied to -each topology change, and if the validation fails, writes to the corresponding cache will be blocked. The mentioned -validation logic is passed to Ignite as an TopologyValidation interface implementation. It can be done through cache -configuration or through Ignite plugin extensions mechanism (see CacheTopologyValidatorProvider interface). - -This module represents an implementation of the Ignite plugin that provides the guarantee that -after cluster segmentation, no more than one segment can process write requests to all caches. This is achieved by -providing implementation of the TopologyValidation interface as mentioned above. - -The current implementation of TopologyValidation uses remaining Ignite baseline nodes in the topology to determine -segmentation. - -== In what cases cache writes will be blocked for the segment? - -The following rules are used to determine which segment can process cache write requests after segmentation and which -cannot: - -1. The segment is allowed to process cache writes requests after segmentation if and only if more than configured -fraction of the baseline nodes remain in the segment, otherwise all writes to the cache will be blocked. -2. If the cluster is split into two equal segments, writing to both of them will be blocked. -3. Since Ignite treats segmentation as sequential node failures, even a single node failure in an active cluster in -which alive baseline nodes count is less or equals to segmentation threshold is considered as segmentation and results -in write block for all caches. - -== Configuration - -1. Configure CacheTopologyValidatorPluginProvider on each server node: -+ ----- - ``` - new IgniteConfiguration() - ... - .setPluginProviders(new CacheTopologyValidatorPluginProvider()); - ``` ----- -+ -2. Configure baseline nodes explicitly, or configure baseline nodes auto adjustment with a timeout that significantly -exceeds the node failure detection timeout. It can be done through Java Api or through control script. -See [1] and [2] for more info. - -Note that it is illegal to use baseline nodes auto adjustment with a zero timeout along with current -TopologyValidator implementation. - -3. Configure deactivation threshold. -The deactivation threshold is a fraction of nodes that determines how many nodes must remain in the baseline topology in -order to this segment was considered valid and continued to accept write requests. -This value must be in range from 0.5 (inclusively) to 1. Default value is 0.5. If the default value suits you, nothing -to do is required. - -To set up custom deactivation threshold value set the `org.apache.ignite.topology.validator.deactivation.threshold` -distributed configuration property via control script (see https://ignite.apache.org/docs/latest/tools/control-script#working-with-cluster-properties) - -== Manual segmentation resolving - -The state of each segment for which cache writes were blocked will be eventually switched to the READ-ONLY mode. -Manually switching the cluster state back to ACTIVE mode will restore cache write availability. It can be done through -Java Api or through control script. See [1] and [2] for more info. - -[1] - https://ignite.apache.org/docs/latest/clustering/baseline-topology - -[2] - https://ignite.apache.org/docs/latest/tools/control-script#activation-deactivation-and-topology-management \ No newline at end of file diff --git a/docs/_docs/twitter/twitter-streamer.adoc b/docs/_docs/twitter/twitter-streamer.adoc deleted file mode 100644 index 4f47c60f2..000000000 --- a/docs/_docs/twitter/twitter-streamer.adoc +++ /dev/null @@ -1,65 +0,0 @@ -// Licensed to the Apache Software Foundation (ASF) under one or more -// contributor license agreements. See the NOTICE file distributed with -// this work for additional information regarding copyright ownership. -// The ASF licenses this file to You under the Apache License, Version 2.0 -// (the "License"); you may not use this file except in compliance with -// the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -= Twitter Streamer - -Ignite Twitter Streamer module consumes tweets from Twitter and feeds the transformed key-value pairs `` into Ignite. - -To stream data from Twitter into Ignite, you need to: - -. Import Ignite Twitter Module with Maven and replace `${ignite-twitter-ext.version}` with the actual Ignite Twitter Extension version you are interested in. -+ -[tabs] --- -tab:pom.xml[] -[source,xml] ----- - - org.apache.ignite - ignite-twitter-ext - ${ignite-twitter-ext.version} - ----- --- - -. In your code, set the necessary parameters and start the streamer, like so: -+ -[tabs] --- -tab:Java[] -[source,java] ----- -IgniteDataStreamer dataStreamer = ignite.dataStreamer("myCache"); -dataStreamer.allowOverwrite(true); -dataStreamer.autoFlushFrequency(10); - -OAuthSettings oAuthSettings = new OAuthSettings("setting1", "setting2", "setting3", "setting4"); - -TwitterStreamer streamer = new TwitterStreamer<>(oAuthSettings); -streamer.setIgnite(ignite); -streamer.setStreamer(dataStreamer); - -Map params = new HashMap<>(); -params.put("track", "apache, twitter"); -params.put("follow", "3004445758"); - -streamer.setApiParams(params);// Twitter Streaming API params. -streamer.setEndpointUrl(endpointUrl);// Twitter streaming API endpoint. -streamer.setThreadsCount(8); - -streamer.start(); ----- --- - -Refer to https://dev.twitter.com/streaming/overview[Twitter streaming API, window=_blank] documentation for more information on various streaming parameters. diff --git a/docs/_docs/zeromq/zeromq-streamer.adoc b/docs/_docs/zeromq/zeromq-streamer.adoc deleted file mode 100644 index 918c0e827..000000000 --- a/docs/_docs/zeromq/zeromq-streamer.adoc +++ /dev/null @@ -1,67 +0,0 @@ -// Licensed to the Apache Software Foundation (ASF) under one or more -// contributor license agreements. See the NOTICE file distributed with -// this work for additional information regarding copyright ownership. -// The ASF licenses this file to You under the Apache License, Version 2.0 -// (the "License"); you may not use this file except in compliance with -// the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -= ZeroMQ Streamer - -Apache Ignite ZeroMQ Streamer module enables streaming capabilities via http://zeromq.org/[ZeroMQ, window=_blank] into Ignite. - -To start streaming into Ignite, you need to do the following: - -. Add Ignite ZeroMQ Streamer Module to your Maven `pom.xml` file. -+ -[tabs] --- -tab:pom.xml[] -[source,xml] ----- - - ... - - org.apache.ignite - ignite-zeromq-ext - ${ignite-zeromq-ext.version} - - ... - ----- --- - -. Implement either the https://github.com/apache/ignite/blob/f2f82f09b35368f25e136c9fce5e7f2198a91171/modules/core/src/main/java/org/apache/ignite/stream/StreamSingleTupleExtractor.java[StreamSingleTupleExtractor, window=_blank] or -the https://github.com/apache/ignite/blob/f2f82f09b35368f25e136c9fce5e7f2198a91171/modules/core/src/main/java/org/apache/ignite/stream/StreamMultipleTupleExtractor.java[StreamMultipleTupleExtractor, window=_blank] for ZeroMQ streamer. -Refer to https://github.com/apache/ignite/blob/7492843ad9e22c91764fb8d0c3a096b8ce6c653e/modules/zeromq/src/test/java/org/apache/ignite/stream/zeromq/ZeroMqStringSingleTupleExtractor.java[this sample implementation, window=_blank] for more details. -. Set the extractor and initiate the streaming as shown below: -+ -[tabs] --- -tab:Java[] -[source,java] ----- -try (IgniteDataStreamer dataStreamer = - grid().dataStreamer("myCacheName")) { - - dataStreamer.allowOverwrite(true); - dataStreamer.autoFlushFrequency(1); - - try (IgniteZeroMqStreamer streamer = new IgniteZeroMqStreamer( - 1, ZeroMqTypeSocket.PULL, "tcp://localhost:5671", null)) { - streamer.setIgnite(grid()); - streamer.setStreamer(dataStreamer); - - streamer.setSingleTupleExtractor(new ZeroMqStringSingleTupleExtractor()); - - streamer.start(); - } -} ----- --- diff --git a/docs/_docs/zookeeper/zookeeper-ip.adoc b/docs/_docs/zookeeper/zookeeper-ip.adoc deleted file mode 100644 index cefe2b1b3..000000000 --- a/docs/_docs/zookeeper/zookeeper-ip.adoc +++ /dev/null @@ -1,49 +0,0 @@ -= ZooKeeper IP Finder - - -To set up ZooKeeper IP finder use `TcpDiscoveryZookeeperIpFinder` (note that `ignite-zookeeper` module has to be enabled). - -[tabs] --- -tab:XML[] -[source,xml] ----- - - - - - - - - - - - - ----- - -tab:Java[] -[source,java] ----- -TcpDiscoverySpi spi = new TcpDiscoverySpi(); - -TcpDiscoveryZookeeperIpFinder ipFinder = new TcpDiscoveryZookeeperIpFinder(); - -// Specify ZooKeeper connection string. -ipFinder.setZkConnectionString("127.0.0.1:2181"); - -spi.setIpFinder(ipFinder); - -IgniteConfiguration cfg = new IgniteConfiguration(); - -// Override default discovery SPI. -cfg.setDiscoverySpi(spi); - -// Start the node. -Ignite ignite = Ignition.start(cfg); ----- - -tab:C#/.NET[unsupported] -tab:C++[unsupported] - --- diff --git a/docs/_includes/copyright.html b/docs/_includes/copyright.html deleted file mode 100644 index 00e196c36..000000000 --- a/docs/_includes/copyright.html +++ /dev/null @@ -1,22 +0,0 @@ - - -

diff --git a/docs/_includes/footer.html b/docs/_includes/footer.html deleted file mode 100644 index 76a3ffefd..000000000 --- a/docs/_includes/footer.html +++ /dev/null @@ -1,20 +0,0 @@ - - {% assign doc_var = page.leftNav | append: "_var" %} - {% assign base_url = '' %} -
-
diff --git a/docs/_includes/header.html b/docs/_includes/header.html deleted file mode 100644 index cfcb87722..000000000 --- a/docs/_includes/header.html +++ /dev/null @@ -1,35 +0,0 @@ - - -
- -
- -
- - Apache Ignite logo - -
- - -
-
diff --git a/docs/_includes/left-nav.html b/docs/_includes/left-nav.html deleted file mode 100644 index 6e4d223cb..000000000 --- a/docs/_includes/left-nav.html +++ /dev/null @@ -1,88 +0,0 @@ - - -{% assign prefix = site.attrs.base_url %} -{% assign normalized_path = page.url | replace: ".html","" | remove_first: prefix %} -{% if page.toc != false %} - -
-{% endif %} diff --git a/docs/_includes/right-nav.html b/docs/_includes/right-nav.html deleted file mode 100644 index 7fccc8a9a..000000000 --- a/docs/_includes/right-nav.html +++ /dev/null @@ -1,21 +0,0 @@ - - - diff --git a/docs/_includes/section-toc.html b/docs/_includes/section-toc.html deleted file mode 100644 index 8e793fca8..000000000 --- a/docs/_includes/section-toc.html +++ /dev/null @@ -1,31 +0,0 @@ - - -{% assign s = include.section %} - -{% if include.title %} -{{s.title}} -{% endif %} - -{% if s.items %} - -{% endif %} - diff --git a/docs/_includes/toc.html b/docs/_includes/toc.html deleted file mode 100644 index 683b4000e..000000000 --- a/docs/_includes/toc.html +++ /dev/null @@ -1,63 +0,0 @@ - - -
-{% assign path = page.path | remove: "/index.adoc" | remove_first: "_" | remove_first: page.collection | remove_first: "/" %} - -{% assign current_guide = path | split: "/" | first %} -{% assign section = path | remove: current_guide | remove : "/" %} - - -{% if current_guide != nil %} - - {% assign current_guide_url = current_guide | prepend: "/" %} - - - {% assign guide = site.data.toc | where: "url", current_guide_url | first %} - - - {% if section != "" %} - {% assign section_url = "/" | append: current_guide | append: "/" | append: section %} - {% assign sect = guide.items | where: "url", section_url | first %} - - {% include section-toc.html section=sect title=false %} - {% else %} -
    - {% for sect in guide.items %} -
  • - {% include section-toc.html section=sect title=true%} -
  • - {% endfor %} -
- {% endif %} -{% else %} - {% for guide in site.data.toc %} - -

-{{guide.title}}

- {% if guide.items %} -
    - {% for sect in guide.items %} -
  • - {% include section-toc.html section=sect title=true%} -
  • - {% endfor %} -
- {% endif %} - {% endfor %} -{% endif %} -
diff --git a/docs/_layouts/default.html b/docs/_layouts/default.html deleted file mode 100644 index 9c7a42e4b..000000000 --- a/docs/_layouts/default.html +++ /dev/null @@ -1,72 +0,0 @@ - - - - {% assign doc_var = page.leftNav | append: "_var" %} - - - - - - - - {% if page.content == nil or page.content == "" %} - -{% endif %} - - - {{page.title}} | Ignite Documentation - {% if site.attrs.base_url contains "/latest" %} - - {% else %} - - {% endif %} - {% capture timestamp %}{{"now"| date: '%s'}}{% endcapture %} - - - - - - - - - - - - - - - {% include header.html %} - {{content}} - - - - diff --git a/docs/_layouts/doc.html b/docs/_layouts/doc.html deleted file mode 100644 index 9d5e83116..000000000 --- a/docs/_layouts/doc.html +++ /dev/null @@ -1,33 +0,0 @@ ---- -layout: default ---- - - -
- {% include left-nav.html %} -
- Edit - {% if page.path contains ".adoc" %} -

{{page.title}}

- {% endif %} - {{content}} - {% include copyright.html %} -
- {% include right-nav.html %} -
- diff --git a/docs/_layouts/toc.html b/docs/_layouts/toc.html deleted file mode 100644 index 682f77ce8..000000000 --- a/docs/_layouts/toc.html +++ /dev/null @@ -1,32 +0,0 @@ ---- -layout: default ---- - - -
- {% include left-nav.html %} -
- {% if page.path contains ".adoc" %} -

{{page.title}}

- {% endif %} - {{ content }} - {% include toc.html %} -
- {% include right-nav.html %} -
- diff --git a/docs/_plugins/asciidoctor-extensions.rb b/docs/_plugins/asciidoctor-extensions.rb deleted file mode 100644 index 715d33d11..000000000 --- a/docs/_plugins/asciidoctor-extensions.rb +++ /dev/null @@ -1,180 +0,0 @@ -# MIT License -# -# Copyright (C) 2012-2020 Dan Allen, Sarah White, Ryan Waldron, and the -# individual contributors to Asciidoctor. -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -require 'asciidoctor' -require 'asciidoctor/extensions' -require 'set' - -include Asciidoctor - -class TabsBlock < Asciidoctor::Extensions::BlockProcessor - use_dsl - - named :tabs - on_context :open - parse_content_as :simple - - def render_tab(parent, name, options, tab_content, use_xml) - if (options == 'unsupported') - content = Asciidoctor.convert "[source]\n----\nThis API is not presently available for #{name}."+( use_xml ? " You can use XML configuration." : "")+"\n----", parent: parent.document - return "#{content}" - else - if tab_content.empty? - warn "There is an empty tab (#{name}) on the " + parent.document.attributes['doctitle'] + " page: " + parent.document.attributes['docfile'] - # File.write("log.txt", "There is an empty tab (#{name}) on the " + parent.document.attributes['doctitle'] + " page: " + parent.document.attributes['docfile'] + "\n", mode: "a") - end - content = Asciidoctor.convert tab_content, parent: parent.document - return "#{content}" - end - end - - - def process parent, reader, attrs - lines = reader.lines - - html = '' - tab_content = '' - name = '' - options = '' - tabs = Set.new - lines.each do |line| - if (line =~ /^tab:.*\[.*\]/ ) - # render the previous tab if there is one - unless name.empty? - html = html + render_tab(parent, name, options, tab_content, tabs.include?("XML")) - end - - tab_content = ''; - name = line[/tab:(.*)\[.*/,1] - tabs << name - options = line[/tab:.*\[(.*)\]/,1] - else - tab_content = tab_content + "\n" + line; - end - end - - unless name.empty? - html = html + render_tab(parent, name, options, tab_content, tabs.include?("XML")) - end - - - html = %(#{html}) - - create_pass_block parent, html, attrs - - end -end - - -Asciidoctor::Extensions.register do - block TabsBlock -end - - -class JavadocUrlMacro < Extensions::InlineMacroProcessor - use_dsl - - named :javadoc - name_positional_attributes 'text' - - def process parent, target, attrs - - parts = target.split('.') - - if attrs['text'] == nil - text = parts.last(); - else - text = attrs['text'] - end - - target = parent.document.attributes['javadoc_base_url'] + '/' + parts.join('/') + ".html" - attrs.store('window', '_blank') - - (create_anchor parent, text, type: :link, target: target, attributes: attrs).render - end -end - -Asciidoctor::Extensions.register do - inline_macro JavadocUrlMacro -end -Extensions.register do - inline_macro do - named :link - parse_content_as :text - - process do |parent, target, attrs| -# if(parent.document.attributes['latest']) -# base_url = parent.document.attributes['base_url'] + '/latest' -# else -# base_url = parent.document.attributes['base_url'] + '/' + parent.document.attributes['version'] -# end - -# print parent.document.attributes - base_url = parent.document.attributes['base_url'] # + '/' + parent.document.attributes['version'] - - if (text = attrs['text']).empty? - text = target - end - - if text =~ /(\^|, *window=_?blank *)$/ - text = text.sub(/\^$/,'') - text = text.sub(/, *window=_?blank *$/,'') - attrs.store('window', '_blank') - end - - if target.start_with? 'http','ftp', '/', '#' - else - target = base_url + '/' + %(#{target}) - end - - (create_anchor parent, text, type: :link, target: target, attributes: attrs).render - end - end -end - -class ImageTreeProcessor < Extensions::Treeprocessor - def process document - - image_width = (document.attr 'image_width', "") - - imagedir = document.attributes['docdir'] - - #scan for images - (document.find_by context: :image).each do |img| - - imagefile = imagedir + '/' + img.attributes['target'] - - if !File.file?(imagefile) - warn 'Image does not exist: ' +imagefile - end - - if !(img.attributes['width'] || image_width.empty?) - img.attributes['width'] = image_width - end - end - end -end - -Extensions.register do - treeprocessor ImageTreeProcessor -end diff --git a/docs/_sass/callouts.scss b/docs/_sass/callouts.scss deleted file mode 100644 index 2aad06fb6..000000000 --- a/docs/_sass/callouts.scss +++ /dev/null @@ -1,75 +0,0 @@ -// Licensed to the Apache Software Foundation (ASF) under one or more -// contributor license agreements. See the NOTICE file distributed with -// this work for additional information regarding copyright ownership. -// The ASF licenses this file to You under the Apache License, Version 2.0 -// (the "License"); you may not use this file except in compliance with -// the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -aside { - border-left: 6px solid var(--callout-border); - background: var(--callout-background); - color: var(--callout-text); - margin-left: 0; - padding-right: 10px; - padding-left:20px; - position: relative; - display: flex; - margin-bottom: 16px; - - h3 { - font-weight: bold; - color:var(--callout-text); - } - - &+aside { - margin-top: 1em; - } - - &:before { - font-size: 18px; - width: 78px; - flex: 0 0 auto; - align-self: center; - text-align: center; - } - - .callout__margin-collapse-root { - margin-top: 16px; - margin-bottom: 16px; - } - - &.note { - --callout-text: #723c81; - --callout-border: #723c81; - --callout-background: #f7f7f7; - --callout-icon: "\2B50"; - } - - &.tip { - --callout-text: #af4e17; - --callout-border: #f18329; - --callout-background: #f7f7f7; - --callout-icon: "\2B50"; - } - - &.caution, &.important { - --callout-text: #65666a; - --callout-border: #e9502c; - --callout-background: #f7f7f7; - --callout-icon: "\01F449"; - } - - &.warning { - --callout-text: #df2226; - --callout-border: #df2226; - --callout-background: #f7f7f7; - --callout-icon: "\01F4CD"; - } -} diff --git a/docs/_sass/code.scss b/docs/_sass/code.scss deleted file mode 100644 index d0e2eeac2..000000000 --- a/docs/_sass/code.scss +++ /dev/null @@ -1,115 +0,0 @@ -// Licensed to the Apache Software Foundation (ASF) under one or more -// contributor license agreements. See the NOTICE file distributed with -// this work for additional information regarding copyright ownership. -// The ASF licenses this file to You under the Apache License, Version 2.0 -// (the "License"); you may not use this file except in compliance with -// the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -pre, pre.rouge { - padding: 8px 15px; - background: var(--block-code-background) !important; - border-radius: 5px; - border: 1px solid #e5e5e5; - overflow-x: auto; - // So code copy button doesn't overflow - min-height: 36px; - line-height: 18px; - color: #545454; -} - -code { - color: #545454; -} - -pre.rouge code { - background: none !important; -} - -pre.rouge .tok-err { - border: none !important; - } - - -.highlight .err { - background: initial !important; - color: initial !important; -} - -code-tabs.code-tabs__initialized { - display: block; - margin-bottom: 1.5em; - - nav { - border-bottom: 1px solid #e0e0e0 - } - - nav button { - background: white; - color: inherit; - border: none; - padding: 0.7em 1em; - cursor: pointer; - transform: translateY(1px); - font-size: .9em; - - &.active { - border-bottom: var(--orange-line-thickness) solid var(--link-color); - } - &.grey { - color: grey; - } - } - - code-tab:not([hidden]) { - display: block; - } -} - -*:not(pre) > code { - background: var(--inline-code-background); - padding: 0.1em 0.5em; - background-clip: padding-box; - border-radius: 3px; - color: #545454; - font-size: 90% -} - -// Required for copy button positioning -.listingblock .content { - position: relative; -} - -.copy-to-clipboard-button { - margin: 0; - padding: 0; - width: 36px; - height: 36px; - display: flex; - align-items: center; - justify-content: center; - background: none; - border: none; - - position: absolute; - top: 0; - right: 0; - background: url('../images/copy-icon.svg') center center no-repeat; - - &.copy-to-clipboard-button__success { - color: green; - background: none; - font-size: 20px; - font-weight: bold; - } - - &:hover:not(.copy-to-clipboard-button__success) { - filter: var(--gg-orange-filter); - } -} diff --git a/docs/_sass/docs.scss b/docs/_sass/docs.scss deleted file mode 100644 index 58dc0f2ec..000000000 --- a/docs/_sass/docs.scss +++ /dev/null @@ -1,238 +0,0 @@ -// Licensed to the Apache Software Foundation (ASF) under one or more -// contributor license agreements. See the NOTICE file distributed with -// this work for additional information regarding copyright ownership. -// The ASF licenses this file to You under the Apache License, Version 2.0 -// (the "License"); you may not use this file except in compliance with -// the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -section.page-docs { - display: grid; - transition: grid-template-columns 0.15s; - grid-template-columns: auto 1fr auto; - grid-template-rows: 100%; - grid-template-areas: 'left-nav content right-nav'; - line-height: 20px; - max-width: 1440px; - margin: auto; - width: 100%; - - &>article { - // box-shadow: -1px 13px 20px 0 #696c70; - border-left: 1px solid #eeeeee; - background-color: #ffffff; - padding: 0 50px 30px; - grid-area: content; - overflow: hidden; - font-family: sans-serif; - font-size: 16px; - color: #545454; - line-height: 1.6em; - - h1, h2, h3:not(.discrete), h4, h5, strong, th { - font-family: 'Open Sans'; - } - - li { - margin-bottom: 0.5em; - - > p { - margin-top: 0; - margin-bottom: 0; - } - } - - @media (max-width: 800px) { - padding-left: 15px; - padding-right: 15px - } - } - - .edit-link { - position:relative; - top: 10px; - right:10px; - float: right; - padding-top: calc(var(--header-height) + var(--padding-top)); - margin-top: calc((-1 * var(--header-height))); - } - - h1, h2, h3:not(.discrete), h4, h5 { - margin-bottom: 0; - - &[id] { - margin-top: var(--margin-top); - margin-bottom: calc(var(--margin-top) * 0.5); - // padding-top: calc(var(--header-height) + var(--padding-top)); - z-index: -1; - } - } - - .toc > ul { - margin: 0; - } - - - .content > .pygments.highlight { - margin-top: 0px; - } - - .title { - font-style: italic; - } - - .checkmark:before { - content: '\f14a'; - visibility: visible; - font-family: FontAwesome; - color: #00a100; - } - .checkmark { - visibility: hidden; - } - - .stretch {width: 100%;} - h1[id] { - --margin-top: 1em; - } - h2[id] { - --margin-top: 1.2em; - } - .toc > h2 { - --margin-top: 1em; - } - - h3[id] { - --margin-top: 1.2em; - } - h4[id] { - --margin-top: 0.5em; - } - h5[id] { - --margin-top: 1.67em; - } - .imageblock .content, .image { - text-align: center; - display: block; - } - .imageblock, .image { - img:not([width]):not([height]) { - width: auto; - height: auto; - max-width: 100%; - max-height: 450px; - } - } - strong { - color: #757575; - } - - th.valign-top,td.valign-top { - vertical-align:top; - } - - table { - margin: 16px 0; - } - - table tr td { - hyphens: auto; - } - - table thead,table tfoot { - background:#f7f8f7; - color: #757575; - } - table tr.even,table tr.alt{background:#f8f8f7} - table.stripes-all tr,table.stripes-odd tr:nth-of-type(odd),table.stripes-even tr:nth-of-type(even),table.stripes-hover tr:hover{background:#f8f8f7} - -} -.copyright { - margin-top: 3em; - padding-top: 1em; - border-top: 1px solid #f0f0f0; - font-size: 0.9em; - line-height: 1.8em; - color: #757575; -} - -body.hide-left-nav { - .left-nav { - display: none; - } -} - -.left-nav { - top: 0; - bottom: 0; - position: -webkit-sticky; - position: sticky; -} -.left-nav { - max-height: calc(100vh ); - grid-area: left-nav; -} -.right-nav { - grid-area: right-nav; -} -.left-nav__overlay { - display: none; - background: rgba(0, 0, 0, 0.50); - z-index: 1; - position: fixed; - top: var(--header-height); - bottom: 0; - left: 0; - right: 0; -} -@media (max-width: 990px) { - body:not(.hide-left-nav) { - .left-nav__overlay { - display: block; - } - } - nav.left-nav { - background: #fafafa; - grid-area: left-nav; - box-shadow: 0 4px 4px 0 rgba(0, 0, 0, 0.24), 0 0 4px 0 rgba(0, 0, 0, 0.12); - min-height: calc(100vh - var(--header-height)); - max-height: calc(100vh - var(--header-height)); - position: fixed; - bottom: 0; - top: var(--header-height); - z-index: 2; - } - section.page-docs > article { - grid-column-start: left-nav; - grid-column-end: content; - grid-row: content; - } -} -@media (max-width: 800px) { - nav.right-nav { - display: none; - } -} - -:target:before { - content: ""; - display: block; - margin-top: calc(var(--header-height) * -1); - height: var(--header-height); - width: 1px; -} -@media (min-width: 600px) and (max-width: 900px) { - :target:before { - content: ""; - display: block; - width: 1px; - margin-top: -150px; - height: 150px; - } -} diff --git a/docs/_sass/footer.scss b/docs/_sass/footer.scss deleted file mode 100644 index c8afea49d..000000000 --- a/docs/_sass/footer.scss +++ /dev/null @@ -1,48 +0,0 @@ -// Licensed to the Apache Software Foundation (ASF) under one or more -// contributor license agreements. See the NOTICE file distributed with -// this work for additional information regarding copyright ownership. -// The ASF licenses this file to You under the Apache License, Version 2.0 -// (the "License"); you may not use this file except in compliance with -// the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -body > footer { - border-top: 2px solid #dddddd; - height: var(--footer-height); - font-size: 16px; - color: #393939; - display: flex; - justify-content: space-between; - align-items: center; - - - @media (max-width: 570px) { - .copyright__extra { - display: none; - } - } -} -.right-nav footer { - font-size: 12px; - padding: calc(var(--footer-gap) * 0.3) 0 5px;; - text-align: left; - margin: auto 0 0; - - a { - margin: 0; - } - - img { - width: 70px; - } - - .copyright { - display: none; - } -} diff --git a/docs/_sass/github.scss b/docs/_sass/github.scss deleted file mode 100644 index 069805c75..000000000 --- a/docs/_sass/github.scss +++ /dev/null @@ -1,223 +0,0 @@ -// Licensed to the Apache Software Foundation (ASF) under one or more -// contributor license agreements. See the NOTICE file distributed with -// this work for additional information regarding copyright ownership. -// The ASF licenses this file to You under the Apache License, Version 2.0 -// (the "License"); you may not use this file except in compliance with -// the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -.highlight table td { padding: 5px; } -.highlight table pre { margin: 0; } -.highlight .cm { - color: #777772; - font-style: italic; -} -.highlight .cp { - color: #797676; - font-weight: bold; -} -.highlight .c1 { - color: #777772; - font-style: italic; -} -.highlight .cs { - color: #797676; - font-weight: bold; - font-style: italic; -} -.highlight .c, .highlight .cd { - color: #777772; - font-style: italic; -} -.highlight .err { - color: #a61717; - background-color: #e3d2d2; -} -.highlight .gd { - color: #000000; - background-color: #ffdddd; -} -.highlight .ge { - color: #000000; - font-style: italic; -} -.highlight .gr { - color: #aa0000; -} -.highlight .gh { - color: #797676; -} -.highlight .gi { - color: #000000; - background-color: #ddffdd; -} -.highlight .go { - color: #888888; -} -.highlight .gp { - color: #555555; -} -.highlight .gs { - font-weight: bold; -} -.highlight .gu { - color: #aaaaaa; -} -.highlight .gt { - color: #aa0000; -} -.highlight .kc { - color: #000000; - font-weight: bold; -} -.highlight .kd { - color: #000000; - font-weight: bold; -} -.highlight .kn { - color: #000000; - font-weight: bold; -} -.highlight .kp { - color: #000000; - font-weight: bold; -} -.highlight .kr { - color: #000000; - font-weight: bold; -} -.highlight .kt { - color: #445588; - font-weight: bold; -} -.highlight .k, .highlight .kv { - color: #000000; - font-weight: bold; -} -.highlight .mf { - color: #009999; -} -.highlight .mh { - color: #009999; -} -.highlight .il { - color: #009999; -} -.highlight .mi { - color: #009999; -} -.highlight .mo { - color: #009999; -} -.highlight .m, .highlight .mb, .highlight .mx { - color: #009999; -} -.highlight .sb { - color: #d14; -} -.highlight .sc { - color: #d14; -} -.highlight .sd { - color: #d14; -} -.highlight .s2 { - color: #d14; -} -.highlight .se { - color: #d14; -} -.highlight .sh { - color: #d14; -} -.highlight .si { - color: #d14; -} -.highlight .sx { - color: #d14; -} -.highlight .sr { - color: #009926; -} -.highlight .s1 { - color: #d14; -} -.highlight .ss { - color: #990073; -} -.highlight .s { - color: #d14; -} -.highlight .na { - color: #008080; -} -.highlight .bp { - color: #797676; -} -.highlight .nb { - color: #0086B3; -} -.highlight .nc { - color: #445588; - font-weight: bold; -} -.highlight .no { - color: #008080; -} -.highlight .nd { - color: #3c5d5d; - font-weight: bold; -} -.highlight .ni { - color: #800080; -} -.highlight .ne { - color: #990000; - font-weight: bold; -} -.highlight .nf { - color: #990000; - font-weight: bold; -} -.highlight .nl { - color: #990000; - font-weight: bold; -} -.highlight .nn { - color: #555555; -} -.highlight .nt { - color: #000080; -} -.highlight .vc { - color: #008080; -} -.highlight .vg { - color: #008080; -} -.highlight .vi { - color: #008080; -} -.highlight .nv { - color: #008080; -} -.highlight .ow { - color: #000000; - font-weight: bold; -} -.highlight .o { - color: #000000; - font-weight: bold; -} -.highlight .w { - color: #bbbbbb; -} -.highlight { - background-color: #f8f8f8; -} diff --git a/docs/_sass/header.scss b/docs/_sass/header.scss deleted file mode 100644 index e45b3498d..000000000 --- a/docs/_sass/header.scss +++ /dev/null @@ -1,374 +0,0 @@ -// Licensed to the Apache Software Foundation (ASF) under one or more -// contributor license agreements. See the NOTICE file distributed with -// this work for additional information regarding copyright ownership. -// The ASF licenses this file to You under the Apache License, Version 2.0 -// (the "License"); you may not use this file except in compliance with -// the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -header { - - min-height: var(--header-height); - background: white; - display: grid; - grid-template-columns: auto auto 1fr auto auto auto; - grid-template-areas: 'left-toggle home nav search gh gg'; - grid-template-rows: 40px; - flex-direction: row; - align-items: center; - justify-content: flex-start; - padding: 12px 20px; - box-shadow: 0 4px 4px 0 rgba(0, 0, 0, 0.24), 0 0 4px 0 rgba(0, 0, 0, 0.12); - z-index: 1; - - a:hover, button:hover { - opacity: 0.85; - } - - li:hover .dropdown, a:focus + .dropdown { - display: block; - } - - .dropdown-arrow { - margin-left: 5px; - margin-bottom: 3px; - - width: 8px; - height: 4px; - } - - .dropdown { - display: none; - position: fixed; - top: calc(var(--header-height) - 12px); - width: max-content; - background: white; - box-shadow: 0 4px 4px 0 rgba(0, 0, 0, 0.24), 0 0 4px 0 rgba(0, 0, 0, 0.12); - border-radius: 4px; - padding-top: 10px; - padding-bottom: 12px; - z-index: 2; - - li { - display: flex; - } - - a { - color: grey !important; - font-size: 16px; - padding-top: 5px; - padding-bottom: 4px; - &:hover { - color: var(--gg-orange) !important; - } - } - } - - .menu { - border: none; - background: none; - width: 40px; - height: 40px; - margin-right: 12px; - cursor: pointer; - grid-area: left-toggle; - - img { - width: 18px; - height: 12px; - } - } - - .search-toggle, .top-nav-toggle, .github, .search-close { - background: none; - border: none; - padding: 0; - width: 36px; - height: 36px; - display: inline-flex; - align-items: center; - justify-content: center; - color: var(--gg-dark-gray); - font-size: 26px; - } - .search-toggle { - grid-area: search; - } - .top-nav-toggle { - grid-area: top-toggle; - } - - .home { - - grid-area: home; - margin-right: auto; - img { - height: 36px; - } - } - - - .search { - margin-left: auto; - margin-right: 20px; - grid-area: search; - - input[type='search'] { - color: var(--gg-dark-gray); - - background: rgba(255, 255, 255, 0.8); - border: 1px solid #cccccc; - padding: 10px 15px; - font-family: inherit; - max-width: 148px; - height: 37px; - font-size: 14px; - -webkit-appearance: unset; - appearance: unset; - - &[disabled] { - opacity: 0.5; - cursor: not-allowed; - } - } - - } - - - - - - &>nav { - grid-area: nav; - font-size: 18px; - display: flex; - flex-direction: row; - margin: 0 20px; - - li { - list-style: none; - margin-right: 0.5em; - display: flex; - } - - a { - padding: 9px 14px; - color: var(--gg-dark-gray) !important; - text-decoration: none; - white-space: nowrap; - - &.active { - border-radius: 3px; - background-color: #f0f0f0; - } - } - } - - .github { - grid-area: gh; - } - - - .search-close { - margin-right: 10px; - } - - - @media (max-width: 900px) { - grid-template-columns: auto auto 1fr auto auto auto; - grid-template-areas: - 'left-toggle home spacer top-toggle search gh gg' - 'nav nav nav nav nav nav nav'; - - nav { - justify-content: center; - margin: 20px 0 10px; - } - - & > nav > li { - position: relative; - } - - .dropdown { - - top: calc(var(--header-height) + 25px); - } - } - - @media (max-width: 600px) { - .search { - margin-right: 5px; - input[type='search'] { - max-width: 110px; - } - } - } - - &:not(.narrow-header) { - .search-toggle, .top-nav-toggle, .search-close { - display: none; - } - } - &.narrow-header { - a.home { - top: 0; - } - &:not(.show-nav) { - nav { - display: none; - } - } - &.show-search { - .search-toggle, .home, .top-nav-toggle, .github, .menu { - display: none; - } - .search { - grid-column-start: home; - grid-column-end: github; - width: 100%; - display: flex; - - input { - max-width: initial; - width: 100%; - } - } - } - &:not(.show-search) { - .search { - display: none; - } - } - nav { - flex-direction: column; - justify-content: stretch; - - li { - display: flex; - } - - a { - width: 100%; - } - } - } -} -.swiftype-widget { - - .autocomplete { - background-color: white; - display: block; - list-style-type: none; - margin: 0; - padding: 0; - box-shadow: 0px 0px 10px 1px rgba(0, 0, 0, 0.37); - position: absolute; - border-radius: 3px; - text-align: left; - right: 75px !important; - min-width: 350px; - - ul { - - background-color: white; - display: block; - list-style-type: none; - margin: 0; - padding: 0; - border-radius: 3px; - text-align: left; - max-height: 70vh; - overflow: auto; - - li { - border-top: 1px solid #e5e5e5; - border-bottom: 1px solid #fff; - cursor: pointer; - padding: 10px 8px; - font-size: 13px; - list-style-type: none; - background-image: none; - margin: 0; - } - - li.active { - border-top: 1px solid #cccccc; - border-bottom: 1px solid #cccccc; - background-color: #f0f0f0; - } - - p { - font-size: 13px; - line-height: 16px; - margin: 0; - padding: 0; - - &.url { - font-size: 11px; - color: #999; - } - } - - a { - font-size: 15px; - } - em { - font-weight: bold - } - } - } -} -section.hero { - background-image: url(../images/dev-internal-bg.jpg); - background-position: center; - background-position-x: left; - background-repeat: no-repeat; - background-size: cover; - display: grid; - grid-template-columns: 1fr auto; - grid-template-areas: 'title versions'; - grid-template-rows: 60px; - align-items: center; - padding: 5px 30px; - flex: unset; - - - .title { - color: #f3f3f3; - text-transform: uppercase; - font-size: 22px; - } - - select { - list-style: none; - - line-height: 28px; - border-radius: 3px; - - - color: #333333; - line-height: 24px; - padding: 5px 10px; - white-space: nowrap; - font-size: 14px; - background: #f0f0f0 url("/assets/images/arrow-down.svg") no-repeat center right 5px; - } -} - -@media (max-width: 450px) { - section.hero { - grid-template-rows: auto; - padding: 15px; - - .title { - font-size: 18px; - } - } - -} diff --git a/docs/_sass/layout.scss b/docs/_sass/layout.scss deleted file mode 100644 index cd0c288a8..000000000 --- a/docs/_sass/layout.scss +++ /dev/null @@ -1,45 +0,0 @@ -// Licensed to the Apache Software Foundation (ASF) under one or more -// contributor license agreements. See the NOTICE file distributed with -// this work for additional information regarding copyright ownership. -// The ASF licenses this file to You under the Apache License, Version 2.0 -// (the "License"); you may not use this file except in compliance with -// the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -body { - --header-height: 64px; - --footer-height: 104px; - --footer-gap: 60px; - - @media (min-width: 451px) and (max-width: 850px) { - --header-height: 111px; - } - - padding: 0; - margin: 0; - display: flex; - flex-direction: column; - min-height: 100vh; - - &>section { - flex: 1; - } -} -header { - position: -webkit-sticky; - position: sticky; - top: 0; - z-index: 2; -} -body > footer { - margin: var(--footer-gap) 30px 0; -} -* { - box-sizing: border-box; -} diff --git a/docs/_sass/left-nav.scss b/docs/_sass/left-nav.scss deleted file mode 100644 index 0fd55fdd1..000000000 --- a/docs/_sass/left-nav.scss +++ /dev/null @@ -1,109 +0,0 @@ -// Licensed to the Apache Software Foundation (ASF) under one or more -// contributor license agreements. See the NOTICE file distributed with -// this work for additional information regarding copyright ownership. -// The ASF licenses this file to You under the Apache License, Version 2.0 -// (the "License"); you may not use this file except in compliance with -// the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -.left-nav { - padding: 10px 20px; - width: 289px; - overflow-y: auto; -/* height: calc(100vh - var(--header-height)); */ - font-family: 'Open Sans'; - padding-top: var(--padding-top); - - - li { - list-style: none; - } - a, button { - text-decoration: none; - color: #757575; - font-size: 16px; - display: inline-flex; - width: 100%; - margin: 2px 0; - padding: 0.25em 0.375em; - background: none; - border: none; - cursor: pointer; - font: inherit; - text-align: left; - - &.active, &:hover { - color: var(--link-color); - } - } - - *:focus { - outline: none; - } - - .nav-group { - margin-left: 6px; - font-size: 14px; - } - - nav { - border-left: 2px solid #dddddd; -// margin-top: 5px; - margin-bottom: 5px; - - &.collapsed { - display: none; - } - } - - nav > li > a, nav > li > button { - padding-left: 20px; - text-align: left; - - &.active { - border-left: var(--orange-line-thickness) solid var(--active-color); - padding-left: calc(20px - var(--orange-line-thickness)); - } - } - - nav.sub_pages { - border: none; - } - - nav.sub_pages a, nav.sub_pages button { - padding-left: 32px; - - &.active { - padding-left: calc(32px - var(--orange-line-thickness)); - } - } - - .parent { - color: #393939; - } - - .state-indicator { - margin-left: auto; - margin-top: 5px; - width: 6.2px; - height: 10px; - flex: 0 0 auto; - transition: transform 0.1s; - filter: invert(49%) sepia(4%) saturate(5%) hue-rotate(23deg) brightness(92%) contrast(90%); - } - - button:hover .state-indicator, - button.current .state-indicator { - filter: invert(47%) sepia(61%) saturate(1950%) hue-rotate(345deg) brightness(100%) contrast(95%); - } - - button.expanded .state-indicator { - transform: rotate(90deg); - } -} diff --git a/docs/_sass/right-nav.scss b/docs/_sass/right-nav.scss deleted file mode 100644 index 68589c020..000000000 --- a/docs/_sass/right-nav.scss +++ /dev/null @@ -1,73 +0,0 @@ -// Licensed to the Apache Software Foundation (ASF) under one or more -// contributor license agreements. See the NOTICE file distributed with -// this work for additional information regarding copyright ownership. -// The ASF licenses this file to You under the Apache License, Version 2.0 -// (the "License"); you may not use this file except in compliance with -// the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -.right-nav { - width: 289px; - padding: 12px 26px; - overflow-y: auto; - height: calc(100vh - var(--header-height)); - top: 0; - position: -webkit-sticky; - position: sticky; - display: flex; - flex-direction: column; - font-family: 'Open sans'; - padding-top: var(--padding-top); - - h6 { - margin: 12px 0; - font-size: 16px; - font-weight: normal; - } - - ul { - list-style: none; - padding: 0; - margin: 0; - // margin-bottom: auto; - } - - li { - padding: 0; - } - - a { - --border-width: 0px; - font-size: 14px; - color: #757575; - padding-left: calc(15px * var(--nesting-level) + 8px - var(--border-width)); - margin: 0.3em 0; - display: inline-block; - - &:hover { - color: var(--link-color); - } - - &.active { - --border-width: var(--orange-line-thickness); - border-left: var(--border-width) solid var(--link-color); - color: #393939; - } - } - - .sectlevel1 { - border-left: 2px solid #dddddd; - } - - @for $i from 1 through 6 { - .sectlevel#{$i} { - --nesting-level: #{$i - 1}; - } - } -} diff --git a/docs/_sass/rouge-base16-solarized.scss b/docs/_sass/rouge-base16-solarized.scss deleted file mode 100644 index 10b189166..000000000 --- a/docs/_sass/rouge-base16-solarized.scss +++ /dev/null @@ -1,99 +0,0 @@ -//# MIT license. See http://www.opensource.org/licenses/mit-license.php -// -//Copyright (c) 2012 Jeanine Adkisson. -// -//Permission is hereby granted, free of charge, to any person obtaining a copy -//of this software and associated documentation files (the "Software"), to deal -//in the Software without restriction, including without limitation the rights -//to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -//copies of the Software, and to permit persons to whom the Software is -//furnished to do so, subject to the following conditions: -// -//The above copyright notice and this permission notice shall be included in -//all copies or substantial portions of the Software. -// -//THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -//IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -//FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -//AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -//LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -//OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -//THE SOFTWARE. - -.highlight table td { padding: 5px; } -.highlight table pre { margin: 0; } -.highlight, .highlight .w { - color: #586e75; -} -.highlight .err { - color: #002b36; - background-color: #dc322f; -} -.highlight .c, .highlight .cd, .highlight .cm, .highlight .c1, .highlight .cs { - color: #657b83; -} -.highlight .cp { - color: #b58900; -} -.highlight .nt { - color: #b58900; -} -.highlight .o, .highlight .ow { - color: #93a1a1; -} -.highlight .p, .highlight .pi { - color: #93a1a1; -} -.highlight .gi { - color: #859900; -} -.highlight .gd { - color: #dc322f; -} -.highlight .gh { - color: #268bd2; - background-color: #002b36; - font-weight: bold; -} -.highlight .k, .highlight .kn, .highlight .kp, .highlight .kr, .highlight .kv { - color: #6c71c4; -} -.highlight .kc { - color: #cb4b16; -} -.highlight .kt { - color: #cb4b16; -} -.highlight .kd { - color: #cb4b16; -} -.highlight .s, .highlight .sb, .highlight .sc, .highlight .sd, .highlight .s2, .highlight .sh, .highlight .sx, .highlight .s1 { - color: #859900; -} -.highlight .sr { - color: #2aa198; -} -.highlight .si { - color: #d33682; -} -.highlight .se { - color: #d33682; -} -.highlight .nn { - color: #b58900; -} -.highlight .nc { - color: #b58900; -} -.highlight .no { - color: #b58900; -} -.highlight .na { - color: #268bd2; -} -.highlight .m, .highlight .mf, .highlight .mh, .highlight .mi, .highlight .il, .highlight .mo, .highlight .mb, .highlight .mx { - color: #859900; -} -.highlight .ss { - color: #859900; -} diff --git a/docs/_sass/text.scss b/docs/_sass/text.scss deleted file mode 100644 index 711ba7d56..000000000 --- a/docs/_sass/text.scss +++ /dev/null @@ -1,62 +0,0 @@ -// Licensed to the Apache Software Foundation (ASF) under one or more -// contributor license agreements. See the NOTICE file distributed with -// this work for additional information regarding copyright ownership. -// The ASF licenses this file to You under the Apache License, Version 2.0 -// (the "License"); you may not use this file except in compliance with -// the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -body { - font-family: 'Open Sans', sans-serif; -} - -h1, h2, h3, h4 { - color: #000; - font-weight: normal; - font-family: 'Open Sans'; -} - -h1 { - font-size: 36px; - line-height: 40px; -} - -a { - text-decoration: none; - color: var(--link-color); -} - - -section { - color: #545454; -} - -table { - border-collapse: collapse; - - td, th { - text-align: left; - padding: 5px 10px; - border-bottom: 1px solid hsl(0, 0%, 85%); - border-top: 1px solid hsl(0, 0%, 85%); - } - - td p.tableblock { - margin-top: 0.5em; - margin-bottom: 0.5em; - - &:first-child { - margin-top: 0.125em; - } - - &:last-child { - margin-bottom: 0.125em; - } - } -} diff --git a/docs/_sass/variables.scss b/docs/_sass/variables.scss deleted file mode 100644 index 9b63c5bac..000000000 --- a/docs/_sass/variables.scss +++ /dev/null @@ -1,33 +0,0 @@ -// Licensed to the Apache Software Foundation (ASF) under one or more -// contributor license agreements. See the NOTICE file distributed with -// this work for additional information regarding copyright ownership. -// The ASF licenses this file to You under the Apache License, Version 2.0 -// (the "License"); you may not use this file except in compliance with -// the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -:root { - --gg-red: #ec1c24; - --gg-orange: #ec1c24; - --gg-orange-dark: #bc440b; - --gg-orange-filter: invert(47%) sepia(61%) saturate(1950%) hue-rotate(345deg) brightness(100%) contrast(95%); - --gg-dark-gray: #333333; - --orange-line-thickness: 3px; - --block-code-background: rgba(241, 241, 241, 20%); - --inline-code-background: rgba(241, 241, 241, 90%); - --padding-top: 25px; - --link-color: #ec1c24; -} - -@font-face { - font-family: 'Open Sans'; - font-weight: 300; - font-display: swap; - font-style: normal; -} diff --git a/docs/assets/css/asciidoc-pygments.css b/docs/assets/css/asciidoc-pygments.css deleted file mode 100644 index 6de1084a3..000000000 --- a/docs/assets/css/asciidoc-pygments.css +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright (C) 2013-2018 Dan Allen, Paul Rayner, and the Asciidoctor Project - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -pre.pygments .hll { background-color: #ffffcc } -pre.pygments, pre.pygments code { background: #ffffff; } -pre.pygments .tok-c { color: #008000 } /* Comment */ -pre.pygments .tok-err { border: 1px solid #FF0000 } /* Error */ -pre.pygments .tok-k { color: #0000ff } /* Keyword */ -pre.pygments .tok-ch { color: #008000 } /* Comment.Hashbang */ -pre.pygments .tok-cm { color: #008000 } /* Comment.Multiline */ -pre.pygments .tok-cp { color: #0000ff } /* Comment.Preproc */ -pre.pygments .tok-cpf { color: #008000 } /* Comment.PreprocFile */ -pre.pygments .tok-c1 { color: #008000 } /* Comment.Single */ -pre.pygments .tok-cs { color: #008000 } /* Comment.Special */ -pre.pygments .tok-ge { font-style: italic } /* Generic.Emph */ -pre.pygments .tok-gh { font-weight: bold } /* Generic.Heading */ -pre.pygments .tok-gp { font-weight: bold } /* Generic.Prompt */ -pre.pygments .tok-gs { font-weight: bold } /* Generic.Strong */ -pre.pygments .tok-gu { font-weight: bold } /* Generic.Subheading */ -pre.pygments .tok-kc { color: #0000ff } /* Keyword.Constant */ -pre.pygments .tok-kd { color: #0000ff } /* Keyword.Declaration */ -pre.pygments .tok-kn { color: #0000ff } /* Keyword.Namespace */ -pre.pygments .tok-kp { color: #0000ff } /* Keyword.Pseudo */ -pre.pygments .tok-kr { color: #0000ff } /* Keyword.Reserved */ -pre.pygments .tok-kt { color: #2b91af } /* Keyword.Type */ -pre.pygments .tok-s { color: #a31515 } /* Literal.String */ -pre.pygments .tok-nc { color: #2b91af } /* Name.Class */ -pre.pygments .tok-ow { color: #0000ff } /* Operator.Word */ -pre.pygments .tok-sa { color: #a31515 } /* Literal.String.Affix */ -pre.pygments .tok-sb { color: #a31515 } /* Literal.String.Backtick */ -pre.pygments .tok-sc { color: #a31515 } /* Literal.String.Char */ -pre.pygments .tok-dl { color: #a31515 } /* Literal.String.Delimiter */ -pre.pygments .tok-sd { color: #a31515 } /* Literal.String.Doc */ -pre.pygments .tok-s2 { color: #a31515 } /* Literal.String.Double */ -pre.pygments .tok-se { color: #a31515 } /* Literal.String.Escape */ -pre.pygments .tok-sh { color: #a31515 } /* Literal.String.Heredoc */ -pre.pygments .tok-si { color: #a31515 } /* Literal.String.Interpol */ -pre.pygments .tok-sx { color: #a31515 } /* Literal.String.Other */ -pre.pygments .tok-sr { color: #a31515 } /* Literal.String.Regex */ -pre.pygments .tok-s1 { color: #a31515 } /* Literal.String.Single */ -pre.pygments .tok-ss { color: #a31515 } /* Literal.String.Symbol */ diff --git a/docs/assets/css/docs.scss b/docs/assets/css/docs.scss deleted file mode 100644 index a3379e71c..000000000 --- a/docs/assets/css/docs.scss +++ /dev/null @@ -1,21 +0,0 @@ ---- ---- -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -// Docs-specific global styles -body { -} diff --git a/docs/assets/css/styles.scss b/docs/assets/css/styles.scss deleted file mode 100644 index dcc18bd1b..000000000 --- a/docs/assets/css/styles.scss +++ /dev/null @@ -1,30 +0,0 @@ ---- ---- -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -@import "variables"; -@import "header"; -@import "code"; -@import "rouge-base16-solarized"; -@import "text"; -@import "callouts"; -@import "layout"; -@import "left-nav"; -@import "right-nav"; -@import "footer"; - -@import "docs"; diff --git a/docs/assets/images/apple-blob.svg b/docs/assets/images/apple-blob.svg deleted file mode 100644 index 308bf94c8..000000000 --- a/docs/assets/images/apple-blob.svg +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/docs/assets/images/arrow-down-white.svg b/docs/assets/images/arrow-down-white.svg deleted file mode 100644 index 12a561372..000000000 --- a/docs/assets/images/arrow-down-white.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/docs/assets/images/arrow-down.svg b/docs/assets/images/arrow-down.svg deleted file mode 100644 index 170a167ec..000000000 --- a/docs/assets/images/arrow-down.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/docs/assets/images/background-lines.svg b/docs/assets/images/background-lines.svg deleted file mode 100644 index 50524eb56..000000000 --- a/docs/assets/images/background-lines.svg +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/assets/images/cancel.svg b/docs/assets/images/cancel.svg deleted file mode 100644 index 1ca9a6aab..000000000 --- a/docs/assets/images/cancel.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - Cancel-icon - Created with Sketch. - - - - - - \ No newline at end of file diff --git a/docs/assets/images/checkmark-green.svg b/docs/assets/images/checkmark-green.svg deleted file mode 100644 index 7f4bd06ca..000000000 --- a/docs/assets/images/checkmark-green.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/docs/assets/images/copy-icon.svg b/docs/assets/images/copy-icon.svg deleted file mode 100644 index 9ee5957dc..000000000 --- a/docs/assets/images/copy-icon.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/docs/assets/images/cpp.svg b/docs/assets/images/cpp.svg deleted file mode 100644 index 2ad3e6d16..000000000 --- a/docs/assets/images/cpp.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/docs/assets/images/dev-internal-bg.jpg b/docs/assets/images/dev-internal-bg.jpg deleted file mode 100644 index 847a3f5869db306f61c92e1c5cb823e46cb20b1b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23014 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

ouo6 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 diff --git a/docs/assets/images/dotnet.svg b/docs/assets/images/dotnet.svg deleted file mode 100644 index 580127124..000000000 --- a/docs/assets/images/dotnet.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/docs/assets/images/edition-ce.svg b/docs/assets/images/edition-ce.svg deleted file mode 100644 index fad4eb561..000000000 --- a/docs/assets/images/edition-ce.svg +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/docs/assets/images/edition-ee.svg b/docs/assets/images/edition-ee.svg deleted file mode 100644 index fbc466d13..000000000 --- a/docs/assets/images/edition-ee.svg +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/assets/images/edition-ue.svg b/docs/assets/images/edition-ue.svg deleted file mode 100644 index 0d788edb1..000000000 --- a/docs/assets/images/edition-ue.svg +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/assets/images/events-nav-arrow.svg b/docs/assets/images/events-nav-arrow.svg deleted file mode 100644 index 217fdaa8e..000000000 --- a/docs/assets/images/events-nav-arrow.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/docs/assets/images/feature-easy-installation.svg b/docs/assets/images/feature-easy-installation.svg deleted file mode 100644 index 0d788edb1..000000000 --- a/docs/assets/images/feature-easy-installation.svg +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/assets/images/feature-fast.svg b/docs/assets/images/feature-fast.svg deleted file mode 100644 index 58898784f..000000000 --- a/docs/assets/images/feature-fast.svg +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/docs/assets/images/feature-reliable.svg b/docs/assets/images/feature-reliable.svg deleted file mode 100644 index d677c70e3..000000000 --- a/docs/assets/images/feature-reliable.svg +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/assets/images/github-gray.svg b/docs/assets/images/github-gray.svg deleted file mode 100644 index 664368e60..000000000 --- a/docs/assets/images/github-gray.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/docs/assets/images/github-white.svg b/docs/assets/images/github-white.svg deleted file mode 100644 index 5ae1ae69c..000000000 --- a/docs/assets/images/github-white.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/docs/assets/images/glowing-box.svg b/docs/assets/images/glowing-box.svg deleted file mode 100644 index c384c4a67..000000000 --- a/docs/assets/images/glowing-box.svg +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/assets/images/integrations/CDC-design.svg b/docs/assets/images/integrations/CDC-design.svg deleted file mode 100644 index d314d42b9..000000000 --- a/docs/assets/images/integrations/CDC-design.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - -
ignite.sh
ignite.sh
WAL
WAL
ignite-cdc.sh
ignite-cdc.sh
Sever node host
Sever node host
DC-1 Changes
DC-1 Changes
DC-1 Changes
DC-1 Changes
WAL archive
WAL archive
Viewer does not support full SVG 1.1
\ No newline at end of file diff --git a/docs/assets/images/integrations/hibernate.svg b/docs/assets/images/integrations/hibernate.svg deleted file mode 100644 index 38e4f313e..000000000 --- a/docs/assets/images/integrations/hibernate.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/docs/assets/images/integrations/kafka.svg b/docs/assets/images/integrations/kafka.svg deleted file mode 100644 index db145e2c6..000000000 --- a/docs/assets/images/integrations/kafka.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/docs/assets/images/integrations/more.svg b/docs/assets/images/integrations/more.svg deleted file mode 100644 index 42a3af10d..000000000 --- a/docs/assets/images/integrations/more.svg +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - image/svg+xml - - - - - - - - - - - diff --git a/docs/assets/images/integrations/oracle.svg b/docs/assets/images/integrations/oracle.svg deleted file mode 100644 index 484c750d2..000000000 --- a/docs/assets/images/integrations/oracle.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/docs/assets/images/integrations/osgi.svg b/docs/assets/images/integrations/osgi.svg deleted file mode 100644 index dae8409d1..000000000 --- a/docs/assets/images/integrations/osgi.svg +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/docs/assets/images/integrations/spark.svg b/docs/assets/images/integrations/spark.svg deleted file mode 100644 index c0cb1b8e0..000000000 --- a/docs/assets/images/integrations/spark.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/docs/assets/images/integrations/spring.svg b/docs/assets/images/integrations/spring.svg deleted file mode 100644 index 0e5f74ebe..000000000 --- a/docs/assets/images/integrations/spring.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/docs/assets/images/java.svg b/docs/assets/images/java.svg deleted file mode 100644 index 962f9d745..000000000 --- a/docs/assets/images/java.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/docs/assets/images/left-nav-arrow.svg b/docs/assets/images/left-nav-arrow.svg deleted file mode 100644 index 747a83d8e..000000000 --- a/docs/assets/images/left-nav-arrow.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/docs/assets/images/lines-bg-1.svg b/docs/assets/images/lines-bg-1.svg deleted file mode 100644 index c6f714aa3..000000000 --- a/docs/assets/images/lines-bg-1.svg +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/assets/images/lines-bg-2.svg b/docs/assets/images/lines-bg-2.svg deleted file mode 100644 index 42c4afad5..000000000 --- a/docs/assets/images/lines-bg-2.svg +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/assets/images/lines-bg-3.svg b/docs/assets/images/lines-bg-3.svg deleted file mode 100644 index 42c4afad5..000000000 --- a/docs/assets/images/lines-bg-3.svg +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/assets/images/lines-bg-4.svg b/docs/assets/images/lines-bg-4.svg deleted file mode 100644 index 87b0a9bf9..000000000 --- a/docs/assets/images/lines-bg-4.svg +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/assets/images/menu-icon.svg b/docs/assets/images/menu-icon.svg deleted file mode 100644 index 0bf1e7f19..000000000 --- a/docs/assets/images/menu-icon.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/docs/assets/images/mousepad-blob.svg b/docs/assets/images/mousepad-blob.svg deleted file mode 100644 index a05769b2d..000000000 --- a/docs/assets/images/mousepad-blob.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/docs/assets/images/piece-of-paper-with-folded-top-right-corner.svg b/docs/assets/images/piece-of-paper-with-folded-top-right-corner.svg deleted file mode 100644 index aa493a799..000000000 --- a/docs/assets/images/piece-of-paper-with-folded-top-right-corner.svg +++ /dev/null @@ -1,117 +0,0 @@ - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/assets/images/scala.svg b/docs/assets/images/scala.svg deleted file mode 100644 index 5f2778964..000000000 --- a/docs/assets/images/scala.svg +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/assets/images/search.svg b/docs/assets/images/search.svg deleted file mode 100644 index 4123a57f2..000000000 --- a/docs/assets/images/search.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - - 76A07A59-5A01-45B5-86ED-1007B13A770C - Created with sketchtool. - - - - - - - - - - \ No newline at end of file diff --git a/docs/assets/images/violent-blob.svg b/docs/assets/images/violent-blob.svg deleted file mode 100644 index 4bef98b5c..000000000 --- a/docs/assets/images/violent-blob.svg +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/assets/images/watermelon-blob.svg b/docs/assets/images/watermelon-blob.svg deleted file mode 100644 index c2fe4451a..000000000 --- a/docs/assets/images/watermelon-blob.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/docs/assets/js/anchor.min.js b/docs/assets/js/anchor.min.js deleted file mode 100644 index e302d89b5..000000000 --- a/docs/assets/js/anchor.min.js +++ /dev/null @@ -1,9 +0,0 @@ -// @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&dn=expat.txt Expat -// -// AnchorJS - v4.2.0 - 2019-01-01 -// https://github.com/bryanbraun/anchorjs -// Copyright (c) 2019 Bryan Braun; Licensed MIT -// -// @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&dn=expat.txt Expat -!function(A,e){"use strict";"function"==typeof define&&define.amd?define([],e):"object"==typeof module&&module.exports?module.exports=e():(A.AnchorJS=e(),A.anchors=new A.AnchorJS)}(this,function(){"use strict";return function(A){function f(A){A.icon=A.hasOwnProperty("icon")?A.icon:"",A.visible=A.hasOwnProperty("visible")?A.visible:"hover",A.placement=A.hasOwnProperty("placement")?A.placement:"right",A.ariaLabel=A.hasOwnProperty("ariaLabel")?A.ariaLabel:"Anchor",A.class=A.hasOwnProperty("class")?A.class:"",A.base=A.hasOwnProperty("base")?A.base:"",A.truncate=A.hasOwnProperty("truncate")?Math.floor(A.truncate):64,A.titleText=A.hasOwnProperty("titleText")?A.titleText:""}function p(A){var e;if("string"==typeof A||A instanceof String)e=[].slice.call(document.querySelectorAll(A));else{if(!(Array.isArray(A)||A instanceof NodeList))throw new Error("The selector provided to AnchorJS was invalid.");e=[].slice.call(A)}return e}this.options=A||{},this.elements=[],f(this.options),this.isTouchDevice=function(){return!!("ontouchstart"in window||window.DocumentTouch&&document instanceof DocumentTouch)},this.add=function(A){var e,t,i,n,o,s,a,r,c,h,l,u,d=[];if(f(this.options),"touch"===(l=this.options.visible)&&(l=this.isTouchDevice()?"always":"hover"),A||(A="h2, h3, h4, h5, h6"),0===(e=p(A)).length)return this;for(function(){if(null===document.head.querySelector("style.anchorjs")){var A,e=document.createElement("style");e.className="anchorjs",e.appendChild(document.createTextNode("")),void 0===(A=document.head.querySelector('[rel="stylesheet"], style'))?document.head.appendChild(e):document.head.insertBefore(e,A),e.sheet.insertRule(" .anchorjs-link { opacity: 0; text-decoration: none; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; }",e.sheet.cssRules.length),e.sheet.insertRule(" *:hover > .anchorjs-link, .anchorjs-link:focus { opacity: 1; }",e.sheet.cssRules.length),e.sheet.insertRule(" [data-anchorjs-icon]::after { content: attr(data-anchorjs-icon); }",e.sheet.cssRules.length),e.sheet.insertRule(' @font-face { font-family: "anchorjs-icons"; src: url(data:n/a;base64,AAEAAAALAIAAAwAwT1MvMg8yG2cAAAE4AAAAYGNtYXDp3gC3AAABpAAAAExnYXNwAAAAEAAAA9wAAAAIZ2x5ZlQCcfwAAAH4AAABCGhlYWQHFvHyAAAAvAAAADZoaGVhBnACFwAAAPQAAAAkaG10eASAADEAAAGYAAAADGxvY2EACACEAAAB8AAAAAhtYXhwAAYAVwAAARgAAAAgbmFtZQGOH9cAAAMAAAAAunBvc3QAAwAAAAADvAAAACAAAQAAAAEAAHzE2p9fDzz1AAkEAAAAAADRecUWAAAAANQA6R8AAAAAAoACwAAAAAgAAgAAAAAAAAABAAADwP/AAAACgAAA/9MCrQABAAAAAAAAAAAAAAAAAAAAAwABAAAAAwBVAAIAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAMCQAGQAAUAAAKZAswAAACPApkCzAAAAesAMwEJAAAAAAAAAAAAAAAAAAAAARAAAAAAAAAAAAAAAAAAAAAAQAAg//0DwP/AAEADwABAAAAAAQAAAAAAAAAAAAAAIAAAAAAAAAIAAAACgAAxAAAAAwAAAAMAAAAcAAEAAwAAABwAAwABAAAAHAAEADAAAAAIAAgAAgAAACDpy//9//8AAAAg6cv//f///+EWNwADAAEAAAAAAAAAAAAAAAAACACEAAEAAAAAAAAAAAAAAAAxAAACAAQARAKAAsAAKwBUAAABIiYnJjQ3NzY2MzIWFxYUBwcGIicmNDc3NjQnJiYjIgYHBwYUFxYUBwYGIwciJicmNDc3NjIXFhQHBwYUFxYWMzI2Nzc2NCcmNDc2MhcWFAcHBgYjARQGDAUtLXoWOR8fORYtLTgKGwoKCjgaGg0gEhIgDXoaGgkJBQwHdR85Fi0tOAobCgoKOBoaDSASEiANehoaCQkKGwotLXoWOR8BMwUFLYEuehYXFxYugC44CQkKGwo4GkoaDQ0NDXoaShoKGwoFBe8XFi6ALjgJCQobCjgaShoNDQ0NehpKGgobCgoKLYEuehYXAAAADACWAAEAAAAAAAEACAAAAAEAAAAAAAIAAwAIAAEAAAAAAAMACAAAAAEAAAAAAAQACAAAAAEAAAAAAAUAAQALAAEAAAAAAAYACAAAAAMAAQQJAAEAEAAMAAMAAQQJAAIABgAcAAMAAQQJAAMAEAAMAAMAAQQJAAQAEAAMAAMAAQQJAAUAAgAiAAMAAQQJAAYAEAAMYW5jaG9yanM0MDBAAGEAbgBjAGgAbwByAGoAcwA0ADAAMABAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAH//wAP) format("truetype"); }',e.sheet.cssRules.length)}}(),t=document.querySelectorAll("[id]"),i=[].map.call(t,function(A){return A.id}),o=0;o\]\.\/\(\)\*\\\n\t\b\v]/g,"-").replace(/-{2,}/g,"-").substring(0,this.options.truncate).replace(/^-+|-+$/gm,"").toLowerCase()},this.hasAnchorJSLink=function(A){var e=A.firstChild&&-1<(" "+A.firstChild.className+" ").indexOf(" anchorjs-link "),t=A.lastChild&&-1<(" "+A.lastChild.className+" ").indexOf(" anchorjs-link ");return e||t||!1}}}); -// @license-end \ No newline at end of file diff --git a/docs/assets/js/code-copy-to-clipboard.js b/docs/assets/js/code-copy-to-clipboard.js deleted file mode 100644 index 3fd42b224..000000000 --- a/docs/assets/js/code-copy-to-clipboard.js +++ /dev/null @@ -1,70 +0,0 @@ -// Licensed to the Apache Software Foundation (ASF) under one or more -// contributor license agreements. See the NOTICE file distributed with -// this work for additional information regarding copyright ownership. -// The ASF licenses this file to You under the Apache License, Version 2.0 -// (the "License"); you may not use this file except in compliance with -// the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -const BUTTON_CLASSNAME = 'copy-to-clipboard-button' -const BUTTON_CLASSNAME_SUCCESS = 'copy-to-clipboard-button__success' - -const TEMPLATE = document.createElement('button') -TEMPLATE.classList.add(BUTTON_CLASSNAME) -TEMPLATE.title = 'Copy to clipboard' -TEMPLATE.type = 'button' - -const SECOND = 1000 -const RESULT_DISPLAY_DURATION = 0.5 * SECOND - -/** - * @param {HTMLElement?} el Element to copy text from - * @returns {boolean} Copy success/failure - */ -function copyCode(el) { - if (!el) return - if (!el.matches('code')) return - - const range = document.createRange() - range.selectNode(el) - window.getSelection().addRange(range) - - try { - return document.execCommand('copy') - } catch (err) {} finally { - window.getSelection().removeAllRanges() - } -} - -function init() { - for (const code of document.querySelectorAll('pre>code')) { - try { - const container = code.closest('.listingblock .content') - if (!container) break - const button = TEMPLATE.cloneNode(true) - container.appendChild(button) - } catch (err) {} - } - document.addEventListener('click', e => { - if (e.target.classList.contains(BUTTON_CLASSNAME)) { - const result = copyCode(e.target.parentElement.querySelector('code')) - if (result) { - e.target.innerText = '✓' - e.target.classList.add(BUTTON_CLASSNAME_SUCCESS) - setTimeout(() => { - e.target.innerText = TEMPLATE.textContent - e.target.classList.remove(BUTTON_CLASSNAME_SUCCESS) - }, RESULT_DISPLAY_DURATION) - } - } - }) -} - -window.addEventListener('load', init) diff --git a/docs/assets/js/code-tabs.js b/docs/assets/js/code-tabs.js deleted file mode 100644 index 6d8118af2..000000000 --- a/docs/assets/js/code-tabs.js +++ /dev/null @@ -1,155 +0,0 @@ -// Licensed to the Apache Software Foundation (ASF) under one or more -// contributor license agreements. See the NOTICE file distributed with -// this work for additional information regarding copyright ownership. -// The ASF licenses this file to You under the Apache License, Version 2.0 -// (the "License"); you may not use this file except in compliance with -// the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -const TAB_BUTTON = document.createRange().createContextualFragment(` - -`) - -const getAllCodeTabs = () => document.querySelectorAll('code-tabs') - -/** - * @typedef CodeTabsState - * @prop {string?} currentTab - * @prop {string[]} tabs - * @prop {number?} boundingClientRectTop - */ - -/** - * @typedef {number} ScrollState - */ - -class CodeTabs { - /** @param {HTMLElement} el */ - constructor(el) { - this.el = el - this.el.codeTabs = this - /** - * @type {CodeTabsState} - */ - this._state = {tabs: []} - } - get state() { - return this._state - } - /** - * @param {CodeTabsState} newState - */ - set state(newState) { - const oldState = this._state - this._state = newState - this._render(oldState, newState) - } - connectedCallback() { - this._tabElements = this.el.querySelectorAll('code-tab') - this.state = { - currentTab: this._tabElements[0].dataset.tab, - tabs: [...this._tabElements].map(el => el.dataset.tab), - } - } - /** - * @private - * @param {CodeTabsState} oldState - * @param {CodeTabsState} newState - */ - _render(oldState, newState) { - if (!oldState.tabs.length && newState.tabs.length) { - /** @type {HTMLElement} */ - this.el.prepend(newState.tabs.reduce((nav, tab, i) => { - const button = TAB_BUTTON.firstElementChild.cloneNode() - button.dataset.tab = tab - button.innerText = tab - button.onclick = () => { - const scrollState = this._rememberScrollState() - this._openTab(tab) - this._restoreScrollState(scrollState) - } - if (this._tabElements[i].dataset.unavailable) { - button.classList.add('grey') - } - - this._tabElements[i].button = button - nav.appendChild(button) - return nav - }, document.createElement('NAV'))) - this.el.classList.add('code-tabs__initialized') - } - if (oldState.currentTab !== newState.currentTab) { - for (const tab of this._tabElements) { - const hidden = tab.dataset.tab !== newState.currentTab - if (hidden) { - tab.setAttribute('hidden', 'hidden') - } else { - tab.removeAttribute('hidden') - } - tab.button.classList.toggle('active', !hidden) - } - } - } - /** - * @private - * @param {string} tab - */ - _openTab(tab, emitEvent = true) { - if (!this.state.tabs.includes(tab)) return - this.state = Object.assign({}, this.state, {currentTab: tab}) - if (emitEvent) this.el.dispatchEvent(new CustomEvent('tabopen', { - bubbles: true, - detail: {tab} - })) - } - /** - * @param {string} tab - */ - openTab(tab) { - this._openTab(tab, false) - } - - /** - * @private - * @returns {ScrollState} - */ - _rememberScrollState() { - return this.el.getBoundingClientRect().top - } - - /** - * @private - * @param {ScrollState} scrollState - * @returns {void} - */ - _restoreScrollState(scrollState) { - const currentRectTop = this.el.getBoundingClientRect().top - const delta = currentRectTop - scrollState - document.scrollingElement.scrollBy(0, delta) - } -} - -/** - * @param {NodeListOf} tabs - */ -const setupSameLanguageSync = (tabs) => { - document.addEventListener('tabopen', (e) => { - [...tabs].filter(tab => tab !== e.target).forEach(tab => { - tab.codeTabs.openTab(e.detail.tab) - }) - }) -} - -// Edge does not support custom elements V1 -for (const el of getAllCodeTabs()) { - const instance = new CodeTabs(el) - instance.connectedCallback() -} -setupSameLanguageSync(getAllCodeTabs()) diff --git a/docs/assets/js/docs-menu.js b/docs/assets/js/docs-menu.js deleted file mode 100644 index 8e598da55..000000000 --- a/docs/assets/js/docs-menu.js +++ /dev/null @@ -1,64 +0,0 @@ -// Licensed to the Apache Software Foundation (ASF) under one or more -// contributor license agreements. See the NOTICE file distributed with -// this work for additional information regarding copyright ownership. -// The ASF licenses this file to You under the Apache License, Version 2.0 -// (the "License"); you may not use this file except in compliance with -// the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -const button = document.querySelector('button.menu') -const overlay = document.querySelector('.left-nav__overlay') - -const eventTypes = { - show: 'leftNavigationShow', - hide: 'leftNavigationHide' -} - -/** - * @param {keyof eventTypes} type - */ -const emit = type => { - if (!CustomEvent) return - document.dispatchEvent(new CustomEvent(type, {bubbles: true})) -} - -/** - * @param {boolean} force - */ -const toggleMenu = (force) => { - const body = document.querySelector('body') - const HIDE_CLASS = 'hide-left-nav' - body.classList.toggle(HIDE_CLASS, force) - emit(eventTypes[body.classList.contains(HIDE_CLASS) ? 'hide' : 'show']) -} - -export const hideLeftNav = () => { - toggleMenu(true, false) -} - -if (button && overlay) { - const query = window.matchMedia('(max-width: 990px)') - - button.addEventListener('click', () => toggleMenu()) - overlay.addEventListener('click', () => toggleMenu()) - query.addListener((e) => { - toggleMenu(e.matches) - }) - toggleMenu(query.matches) -} - -document.addEventListener('click', e => { - if (e.target.matches('.left-nav button')) { - e.target.classList.toggle('expanded') - e.target.classList.toggle('collapsed') - e.target.nextElementSibling.classList.toggle('expanded') - e.target.nextElementSibling.classList.toggle('collapsed') - } -}) diff --git a/docs/assets/js/index.js b/docs/assets/js/index.js deleted file mode 100644 index 0fa36f799..000000000 --- a/docs/assets/js/index.js +++ /dev/null @@ -1,51 +0,0 @@ -// Licensed to the Apache Software Foundation (ASF) under one or more -// contributor license agreements. See the NOTICE file distributed with -// this work for additional information regarding copyright ownership. -// The ASF licenses this file to You under the Apache License, Version 2.0 -// (the "License"); you may not use this file except in compliance with -// the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -import './code-tabs.js?1' -import {hideLeftNav} from './docs-menu.js' -//import {hideTopNav} from './top-navigation.js' -import './page-nav.js' - - - - -document.addEventListener('topNavigationShow', hideLeftNav) -document.addEventListener('leftNavigationShow', hideTopNav) - - - - -// enables search with Swiftype widget -jQuery(document).ready(function(){ - - var customRenderFunction = function(document_type, item) { - var out = '' + item.highlight['title'] + ''; - return out.concat('

' + String(item['url']).replace("https://www.", '') + '

' + item.highlight['body'] + '

'); - } - -/* jQuery("#search-input").swiftype({ - fetchFields: { 'page': ['url'] }, - renderFunction: customRenderFunction, - highlightFields: { - 'page': { - 'title': {'size': 60, 'fallback': true }, - 'body': { 'size': 100, 'fallback':true } - } - }, - engineKey: '_t6sDkq6YsFC_12W6UH2' - }); - */ - -}); diff --git a/docs/assets/js/page-nav.js b/docs/assets/js/page-nav.js deleted file mode 100644 index 8f484649d..000000000 --- a/docs/assets/js/page-nav.js +++ /dev/null @@ -1,37 +0,0 @@ -// Licensed to the Apache Software Foundation (ASF) under one or more -// contributor license agreements. See the NOTICE file distributed with -// this work for additional information regarding copyright ownership. -// The ASF licenses this file to You under the Apache License, Version 2.0 -// (the "License"); you may not use this file except in compliance with -// the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -const rightNav = document.querySelector('.right-nav .sectlevel1') - -if (IntersectionObserver && rightNav) { - const tocAnchors = [...rightNav.querySelectorAll('a[href]')] - let last; - tocAnchors.forEach((a, i, all) => { - const target = document.querySelector(`${a.hash}`) - if (!target) return - const observer = new IntersectionObserver((entries) => { - entries.forEach(entry => { - a.classList.toggle('visible', entry.isIntersecting) - if (entry.isIntersecting) last = a - - const firstVisible = rightNav.querySelector('.visible') - tocAnchors.forEach(a => a.classList.remove('active')) - if (firstVisible) firstVisible.classList.add('active') - else if (last) last.classList.add('active') - }) - }); - observer.observe(target) - }) -} diff --git a/docs/assets/js/top-navigation.js b/docs/assets/js/top-navigation.js deleted file mode 100644 index 291ae92f4..000000000 --- a/docs/assets/js/top-navigation.js +++ /dev/null @@ -1,92 +0,0 @@ -// Licensed to the Apache Software Foundation (ASF) under one or more -// contributor license agreements. See the NOTICE file distributed with -// this work for additional information regarding copyright ownership. -// The ASF licenses this file to You under the Apache License, Version 2.0 -// (the "License"); you may not use this file except in compliance with -// the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -const query = window.matchMedia('(max-width: 450px)') -const header = document.querySelector('header') -const search = document.querySelector('header .search input') - -let state = { - narrowMode: false, - showSearch: false, - showNav: false -} - -const eventTypes = { - navShow: 'topNavigationShow', - navHide: 'topNavigationHide' -} - -/** - * @param {keyof eventTypes} type - */ -const emit = type => { - if (!CustomEvent) return - header.dispatchEvent(new CustomEvent(type, {bubbles: true})) -} - -/** - * @param {typeof state} newState - */ -const render = (newState) => { - if (state.narrowMode !== newState.narrowMode) - header.classList.toggle('narrow-header') - if (state.showSearch !== newState.showSearch) { - header.classList.toggle('show-search') - search.value = '' - if (newState.showSearch) search.focus() - } - if (state.showNav !== newState.showNav) { - header.classList.toggle('show-nav') - emit(eventTypes[newState.showNav ? 'navShow' : 'navHide']) - } - state = newState -} - -render(Object.assign({}, state, {narrowMode: query.matches})) - -query.addListener((e) => { - render(Object.assign({}, state, { - narrowMode: e.matches, - showSearch: false, - showNav: false - })) -}) - -document.querySelector('.top-nav-toggle').addEventListener('click', () => { - render(Object.assign({}, state, { - showNav: !state.showNav, - showSearch: false - })) -}) - -document.querySelector('.search-toggle').addEventListener('click', () => { - render(Object.assign({}, state, { - showSearch: !state.showSearch, - showNav: false - })) -}) - -search.addEventListener('blur', () => { - render(Object.assign({}, state, { - showSearch: false - })) -}) - -export const hideTopNav = () => { - render(Object.assign({}, state, { - showNav: false, - showSearch: false - })) -} diff --git a/docs/favicon.ico b/docs/favicon.ico deleted file mode 100644 index 62d5ea639269c50eafec371db0b4164854c27211..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9780 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