Commit acc6c229 authored by Aaron Harder's avatar Aaron Harder

Initial commit of quick start and key concepts, with SVG diagrams

parents
Pipeline #713 skipped
All kinds of reference material.
\ No newline at end of file
# Blacklight CMS
This is the good thing.
[[include:"readme.md"]]
# Blacklight Quick Start
Blacklight is a Content Management System (CMS) and web server that runs on the [Node.js](https://nodejs.org) platform and works with [Apache Sling](https://sling.apache.org/)-based content repositories for data storage.
![img:class=center](/alt/blacklight/docs/images/blacklight-system-diagram-1.svg)
Below are the basic steps to get a new Blacklight instance up and running in your environment.
## Install Node.js and Blacklight
- If you haven't already, install the latest **LTS** version of [Node.js](https://nodejs.org/)
- If you haven't already, install the [Blacklight cli tool](https://gitlab.entropy.cc/blacklight/blacklight-cli) with the following command:
```bash
> npm install -g git+https://gitlab.entropy.cc/blacklight/blacklight-cli.git
```
- Add the `blcd` helper command to your `.bash_profile` or `.bashrc` file.<br>_Note:_ This step is optional, but recommended because the `blcd` command can greatly expedite navigation of Blacklight's directory structure from a command shell.
```bash
## Add this to .bash_profile or .bashrc:
blcd(){
cd `bl module folder $1`
}
```
## Download and Start Sling
Apache Sling comes as a standalone JAR file. You can download the latest version of the Apache Sling JAR file via your web browser from the [Sling homepage](https://sling.apache.org/) (look for _"Downloads"_ in the left-hand nav bar).
Alternately, you can download the Sling version 8 JAR file from the command line:
```bash
> mkdir /opt/sling ## Or some other folder, if you prefer
> cd /opt/sling
> wget http://apache.mirrors.pair.com/sling/org.apache.sling.launchpad-8.jar
```
Once the **.jar** file is downloaded, run the jar file with the following command:
```bash
> java -Xmx512M -jar org.apache.sling.launchpad-8.jar -p 4500 & ## Assumes Sling version 8
```
Then navigate to the Sling homepage to confirm it is working:
http://127.0.0.1:4500/
## Initialize and Configure a New Blacklight Instance
Create a new, empty Blacklight website by running the following command. Answer the prompts as outlined below.
```bash
> bl init my-site
```
- **Git URL** -- can be use any Git URL you like, including the fake sample URL, `git@gitlab.mycompany.com:my-site/`
- **Sling url** -- The Sling instance you initiated above is running at http://127.0.0.1:4500
- **Sling username** -- Is `admin` and **password** is also `admin`.
- **Website domain name** -- Is not important for this test installation of Blacklight. Put in any domain you like.
- **Asset path** and **App path** should be left as their default values (just hit enter)
- **Email address to receive errors** can be left blank
## Install a Sample Site Module
To get things going, use the `bl` command line tool to install a simple example Blacklight site moudle:
```bash
> cd my-site
> bl module install example.doodad --url=https://github.com/blacklight-cms/example-doodad.git
> bl example.doodad make-sample-content ## This command adds `doodad` sample content to Sling
> node index.js ##Start up the Blacklight server
```
Now navigate to the sample page: http://127.0.0.1:4400/content/example/doodads
# Sample Edit Dialog
Create a folder and type this file into it:
```javascript
function blang($){
var dialog={
title: "Body Footer Text",
items: {
fields: {
widget:"panel",
items:{
footer_text: { widget:"richtext"}
}
}
}
}
return dialog;
}
```
\ No newline at end of file
# Key Blacklight Concepts
Blacklight is a Content Management System (CMS) and web server that runs on the [Node.js](https://nodejs.org) platform and works with [Apache Sling](https://sling.apache.org/)-based content repositories for data storage.
![img:class=center](/alt/blacklight/docs/images/blacklight-system-diagram-1.svg)
Blacklight uses the [Handlebars](http://handlebarsjs.com/) templating language to generate HTML. Handlebars is intentionally limited in its capabilities. When more complicated data processing or business logic is required, Blacklight does that work using dedicated **model processors**, which are written in Node.js. As a developer you're encouraged to organize all the Blacklight code needed to customize your site around **modules** and **components**. These two concepts are described below.
## Modules
There are three categories of module to consider when using Blacklight:
1. **Third-party NPM modules** -- As a regular Node.js app, Blacklight uses [NPM](https://www.npmjs.com/) to manage third-party libraries
2. **Internal Node.js modules** -- Besides external third-party NPM modules, Blacklight also makes extensive _internal_ use of Node's preferred [CommonJS](https://nodejs.org/docs/latest/api/modules.html) format. Much of Blacklight's behaviour is cusomtized and controlled by placing CommonJS module files in particular places, with particular file names, and which export particular properties. For example, every Blacklight **model processor** is implemented as a CommonJS module stored in a predictable place.
3. **Blacklight site modules** -- For the purposes of this document, this is the most important type of module in Blacklight to understand. Most websites have distinct areas, each with concerns that are related but separate from the other site areas. Blacklight enables the organization of code into modules divided along these same lines of concern by isolating that code into "**Blacklight site modules**." (Sometimes also simply referred to as "**Blacklight modules**.") This separation helps ensure each distinct area of concern will remain isolated in its own code base, and has advantages that include simplifying testing, avoiding unintentional side effects, improving the ability to reason about the code, and minimizing the build time of each site module.
![img:class=center](/alt/blacklight/docs/images/blacklight-code-organization.svg "Blacklight Code Organization")
Note, **Blacklight site modules** are _**not**_ in and of themselves NPM/CommonJS modules. Instead, each **Blacklight site module** is simply a collection of related code, organized a particular way, and stored in its own Git repository. Blacklight site modules can be created, installed, and managed using the `module` directive available in Blacklight's [command line tool](blacklight-cli).
Each **Blacklight site module** has a unique ID consisting of two parts: a **site id** and a **module id**; for example `my-site.my-area`. As a developer, you create and extend your site by creating and editing Blacklight site modules. But Blacklight itself also uses site modules to implement key aspects of its own functionality. For example, the `blacklight.edit` module gives Blacklight the ability to work with edit dialogs, and the `blacklight.docs` module holds the documentation you are reading now. Code for any of your own site modules can be opened and edited in isolation from the rest, which helps prevent confusion with -- and side effects against -- code from the other modules. See [Blacklight code organization](#blacklight-code-organization) for details.
## Components
![img:class=fancy right caption border|width=500|data-rollover=componentization-2.jpg|data-clearfix=7](/alt/blacklight/docs/images/componentization.jpg "Simple example of web page componentization. Mouse over to see.")
The concept of **components** is widely used in web development, and it might mean different things to different people. But in simple terms, a Blacklight component is generally a rectangle on screen that contains a logically distinct portion of page content and/or functionality. Usually any given **instance** of a component can be customized by feeding it data from the CMS and/or by its being sensitive to surrounding content. Components also can contain other components. In fact, in Blacklight the page itself is just another component, and it usually contains various types of child components.
### Component File Paths and Resource Types
Each Blacklight component is stored in a single folder in your source tree. Most Sling content is tagged with a component type string -- called a `resourceType` in Sling parlance. Sling data is stored in a hierarchical NoSQL-like content repository. You might think of it as a very large XML document, in that there are parent and child nodes, any of which can be uniquely addressed with a URL-like path. In its basic form (without Blacklight), Sling will take browser requests on its own and will directly use the path in your browser's address bar as a key to determine which data node to retrieve.
Blacklight works very much the same way, passing address bar paths back to Sling to get an initial set of page data in JSON form. That page data will have a `resourceType` which itself maps to a path, but this time to a path to a component folder on disk. Here's a sample:
![img:class=center shadow](/alt/blacklight/docs/images/sling-resource-type-lookup.svg "Resource Type Lookup")
In the sample above, the `my-site/my-area/pages/landing` component has two functional pieces: 1) `landing.js` to do any **model processing** of the raw JSON that may be required, and 2) `landing.hbs` a **template** to render the final JSON into HTML. In addition to **model processing** and **rendering**, any component can also implement an **edit dialog** to let content managers change component data in the CMS. The next sections expand on these three component functions.
### Component Templates
Blacklight uses the [Handlebars](http://handlebarsjs.com/) templating language to generate HTML from the JSON that Sling returns. Handlebars comes with a number of built-in "helper" functions that are available to use in your Blacklight templates. Blacklight adds in a few custom helpers as well, in particular the following:
- **`component` helper** -- Takes a data node as an argument, looks at the data's associated `resourceType`, loads the appropriate component template, and runs that template against the data.
- **`img-opt` helper** -- Takes a Sling JPG image path and
- **`translate` helper** -- Which blah blah blah
- **`ifop` and `ifnot` helpers** -- Which blah blah blah
### Component Model Processors
### Component Edit Dialogs
- JSON data source / Sling
- JSON Model Processor
- Handlebars templates
- Modularized
# Network Diagrams
The following diagram depicts the typical Blacklight configuration, including a Sling content repository fronted by a Blacklight instance:
![Blacklight System Diagram 1](/alt/blacklight/docs/images/blacklight-system-diagram-1.svg)
Raw content data is stored in the **Sling repository**, which serves the JSON content to **Blacklight** via the restful [Sling protocol](https://sling.apache.org/documentation/bundles/manipulating-content-the-slingpostservlet-servlets-post.html). Depending on the page being rendered, Blacklight may apply some business logic to the JSON returned from Sling, aggregating and transforming it. Finally, Blacklight will render the JSON into finished HTML for delivery to the browser, possibly via a **cache layer** such as Nginx and/or a CDN such as CloudFlare.
When developing Blacklight modules locally (e.g. on a laptop), the "Blacklight-first" configuration shown above is frequently used, often with the Sling content repository being a remote staging instance which is shared by multiple Blacklight installations.
By contrast, in a production environment you might be more likely to see that order reversed, with Sling on the front end of the request pipeline and Blacklight on the back end, as depicted in the following diagram:
![Blacklight System Diagram 2](/alt/blacklight/docs/images/blacklight-system-diagram-2.svg)
In this "Sling-first" type of configuration, a piece of software called the **Blacklight Proxy** is installed into Sling, and performs the task of deciding whether to render raw content from the repository entirely in Sling, or to send the raw JSON over to Blacklight to be rendered. The "Sling-first" approach is usually used when a site has already been running on a Sling-based CMS, and there is a desire to incorporate some Blacklight pages into the environment. In such a case, the Blacklight Proxy is installed and then configured to send certain types of requests to Blacklight, and to leave the rest for Sling to sort out.
For most Blacklight development work, it is best both to configure and to envision the system as depicted in diagram 1, i.e. the "Blacklight-first" approach.
# Blacklight request handling
Blacklight is a regular [Node.js Express](http://expressjs.com/) application, and behaves much like any other Express app does. In particular, it uses the [Express router](http://expressjs.com/en/guide/routing.html) to determine which methods(s) to invoke to handle a given request. In Blacklight, all route handlers lead to your site's `index.js` file, which is the main point of entry for your application (to illustrate this fact, you can type `> node index.js` from a command line to start your Blacklight server). The `index.js` file is generated by the `> bl init` utility, but is otherwise a fairly typical Express app. If you examine your `index.js` file you'll find a set of route handlers, usually in the following sequence:
1. **img-opt handler** -- Blacklight image optimizer service.
http://www.mysite.com/apps/img-opt
2. **Module-level "rooted" routes** -- Can attach to any path _from the root_ of the URL namespace. Use sparingly -- only when your project requires you conform to a URL convention different than Blacklight's preferred module name spacing.
http://www.mysite.com/some-special-api
3. **Module-level "regular" routes** -- Can attach to any path _under_ its module's namespace.
http://www.mysite.com/apps/my-site/my-module/some-other-api
4. **Static files handler** -- Static files are served via the `publicMount` folder (usually set to `assets`).
http://www.mysite.com/assets/my-site/my-module/some-file.js
5. **Blacklight page renderer** -- Finally, any request not handled by the above will be sent to the Blacklight page renderer.
http://www.mysite.com/content/my-site/some-page.html
*Note:* Blacklight's generated `index.js` file can be edited by hand, and for certain tasks this is the simplest way to make changes to your Blacklight instance. However, it is recommended you do _**not**_ edit the `index.js` file to add custom routes. The standard Blacklight route configuration API (which is available to every Blacklight module, and briefly described in points 2 and 3 above) provides ample facility to accommodate just about any need your site may have in terms of route namespacing. By configuring your routes using Blacklight conventions, your work remains more manageable and trackable than when editing `index.js` by hand.
## Blacklight Page Rendering Pipeline
As described in step 5 above, Blacklight invokes its "page rendering pipeline" handler when it receives a request for a URL that is not handled by any other route configured in the Express stack. The Blacklight rendering pipeline is broken up into four main stages:
- Preprocessing
- Model processing
- Template Rendering
- HTML post-processing
The following diagram illustrates and expands on the four stages of the render pipeline:
![img:class=fancy center shadow caption|width=740](/alt/blacklight/docs/images/blacklight-rendering-pipeline.svg "Blacklight Rendering Pipeline")
### Preprocessing directives
Blacklight's pre-processor directives are currently stored in an array called `requestPreprocessors`, which in turn resides in the main `index.js` file -- but these will likely move to the Blacklight module level at a future date. Each `requestPreprocessor` entry consists of a `path` or `type` **filter**, and a **directive** (currently, `redirect`, `proxy`, or `slingPreprocess` are available). The **filter** determines which requests the given **directive** should apply to. Here is an example configuration:
```js
requestPreprocessors = [
// Redirect requests for 'some-area' to 'some-other-area'
{path: /^\/content\/my-site\/some-area\/(.*)$/, redirect: "/content/my-site/some-other-area/$1" },
// Inject analytics data stubs for all mysite.com page requests
{path:"^/content/my-site/", slingPreprocess: myAnalyticsPreprocessor},
// Create a page path that gets its raw JSON from another source rather than Sling
{path:"^/static-content/", proxy: myJSONproxy}
];
///////////////////////////////////////////////////////////////////////////////////////////////
function myAnalyticsPreprocessor(model, $, cb){
if(!$.page.trimmedPath.match(/my-excluded-pattern/))
model.analytics={_sling_resourceType:"my-site/shared/content/analytics", pageInfo={}}
cb(null);
}
///////////////////////////////////////////////////////////////////////////////////////////////
function myJSONproxy(urlPath, $, cb){
var path = require("path").join("/var/static-data", urlPath + ".json");
fs.readFile(path, (err, contents){
if(err){console.error("ERROR: Problem reading static JSON file:", path);}
cb(err, contents);
});
}
```
Here is a description of the three types of `requestPreprocessor` directives that are available:
1. `redirect` is the first type of preprocessor Blacklight will try to apply to a given page request, when the URL matches the directive's `path` filter (the `type` filter is not available at this stage because no data has been retrieved, and so the page type is not known). A `redirect` function can rewrite the incoming request URL, before Blacklight passes that URL on for futher processing in the pipeline.
2. `proxy` is the second type of preprocessor Blacklight will try to apply, based again on a match with the given `path` filter (and again, the `type` filter is not available at this stage because no data has yet been retrieved). A proxy function is able to bypass the normal Sling data retrieval functionality, and replace it with a completely customized JSON retrieval process. For example, you may wish for certain requests to pull data from a different Sling source than what is configured by default; or you may wish certain requests to retrieve JSON from some other data source that has nothing to do with Sling.
3. `slingPreprocess` is the final type of preprocessor directive that is considered. After applying `redirect` and `proxy` directives, Blacklight will apply any `slingPreprocess` directives that match the `path` or `type` specified. This final directive allows you to provide a function that can alter any previously retrieved JSON, in any way required.<br>
While this optional step is very similar to the much more prominent **model processor** stage of the render pipeline, the `slingPreprocess` step has the ability to add and alter `resourceTypes` to the base JSON retrieved for any page, something which Blacklight's main model processor is currently unable to do. In future, Blacklight's internals may be tweaked to allow `resourceType` manipulation in the main model processor, but until then `slingPreprocess` is the best way to do so.
# Blacklight Code Organization
![Blacklight Code Organization](/alt/blacklight/docs/images/blacklight-code-organization.svg "Blacklight Code Organization")
## Anatomy of a Blacklight Module Folder
The Blacklight module loader looks for four key folders in each site module:
1. `components` -- Templates, model processors and dialog definitions for each component in this module.
2. `public` -- Static assets (JS, CSS, image files, etc) referenced in public pages rendered by this module.
3. `apps` -- Custom API routes, model processor helpers, command line tools and other supporting services that might be needed by the module.
4. `docs` -- Documentation files relevant to this module, in Markdown format.
### Soft-linked Module Folders & IDE Usage
![img:class=right fancy|data-clearfix=7](/alt/blacklight/docs/images/blacklight-module-soft-linking.svg "Module Soft Linking")
One quirk of Blacklight folder layout is that, upon installation, three of the four folder types listed above are soft-link "mounted" into a second location in the top-level folder hierarchy. The diagram at the right illustrates where these secondary soft links reside.
This soft-linking accelerates and simplifies file lookup when Blacklight is running. For example, all module `public` folders get mapped into a contiguous set of module-specific folders under a top-level `public` umbrella folder, with a resulting structure that translates directly to a logical URL namespace. `components` and `apps` also benefit from this remapping, for similar reasons.
Although this soft-linking makes things easier for the Blacklight server, for developers it can ambiguate how best to approach the files when doing development. When using a folder-oriented IDE such as [Sublime Text](https://www.sublimetext.com/) or [Atom](https://atom.io/), the question becomes which folder to start with, and which folders to hide. Two primary options are worth considering when working in a folder-based IDE:
1. **All files and modules in a single window** -- Looking at the example on the right, you'd open the "my-site" folder, and then work your way down the file tree to find the particular file you need. For example, to open the main template for the landing page component in the "my-area" site module, you'd drill down to: `/my-site/components/my-site/area-one/pages/landing/landing.hbs`. When taking this view on the files in your IDE, you will probably want to **hide** the `blacklight_modules` folder, so as not to get duplicate results when searching in files, etc.
2. **Each module in a different window** -- Again, using the example in the right-hand figure, and to edit the same file as in option 1, open the module folder in your IDE: `/my-site/blacklight_modules/my-site/area-one`. Then navigate in the IDE's file tree to `components/pages/landing/landing.hbs`.
Option 2 has a few notable advantages over option 1: Notice the path to the example file in the tree is much shorter in option 2 than in option 1, and also there is no need to hide any folders in your IDE to get optimal search results. Option 2 gives you a concise view of all `component`, `public`, and `apps` files, with much less confusing distance between them, and no files from unrelated modules cluttering the view. So depending on how you like to conceptualize things, option 2 is mostly upside as compared to option 1. One of the only potential downsides for option 2 is that you need to jump between IDE windows when you wish to work on another module; though arguably, that is actually an advantage too.
Option 1 allows you to see three key files that are not visible from option 2: the main `index.js`, `config/default.json` and `config/local.json`. Option 1 also provides an easy way to search through **all** modules for certain stings or references from a single point. So even if, like the creators of Blacklight, you prefer using option 2 for most module-specific development, it is definitely useful to keep option 1 handy for certain types of changes.
Diagram: Blacklight Render, Blacklight Edit, Model Processor pipeline
## Sling Repository
All about Sling. Mostly pointers to Apache Sling project.
## Sling-to-Blacklight Proxy
Publish vs. Author repositories
## Rendering Pages & Components
- Pages, Nodes, and Properties
- Components & Resource Types
- Components Folder
- Handlebars & Custom Helpers
- Model Processors
## Dialogs, Containers & Widgets
- How to augment component folders with dialog.js and container.js
- Approving Content
- Modules
- Multilingual
# The Blacklight CLI
\ No newline at end of file
This diff is collapsed.
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="337px" height="534px" version="1.1" style="background-color: rgb(255, 255, 255);"><defs/><g transform="translate(0.5,0.5)"><rect x="1" y="1" width="240" height="531" fill="#fafafa" stroke="#000000" pointer-events="none"/><g transform="translate(16.5,32.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="189" height="466" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 15px; font-family: &quot;Courier New&quot;; color: rgb(26, 26, 26); line-height: 1.2; vertical-align: top; width: 190px; white-space: nowrap; word-wrap: normal;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;"><div><b>my-site/</b></div><div>  index.js</div><div>  package.json</div><div>  config/</div><div>  npm_modules/</div><div>  <b>blacklight_modules/</b></div><div><font color="#333333">    blacklight/</font></div><div>    my-site/</div><div>    <b>  area-one/</b></div><div>        <font color="#009900">components/</font></div><div>        <font color="#ff8000">public/</font></div><div>        <font color="#cc0000">apps/</font></div><div>        docs/</div><div>      area-two/</div><div>  <b>components/</b></div><div>    my-site/</div><div>    <font color="#009900">  area-one/</font></div><div><font color="#333333">      area-two/</font></div><div>  <b>public/</b></div><div>    my-site/</div><div>     <font color="#ff8000"> area-one/</font></div><div><span>      area-two/</span><font color="#ff8000"><br /></font></div><div>  <b>apps/</b></div><div>    my-site/</div><div>      <font color="#cc0000">area-one/</font></div><div><span>      area-two/</span><font color="#cc0000"><br /></font></div></div></div></foreignObject><text x="95" y="241" fill="#1A1A1A" text-anchor="middle" font-size="15px" font-family="Courier New">[Not supported by viewer]</text></switch></g><path d="M -199 277 L 247 277" fill="none" stroke="#0000cc" stroke-miterlimit="10" transform="rotate(90,24,277)" pointer-events="none"/><path d="M -27 214 L 113 214" fill="none" stroke="#0000cc" stroke-miterlimit="10" transform="rotate(90,43,214)" pointer-events="none"/><g transform="translate(12.5,12.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="219" height="16" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 15px; font-family: Helvetica; color: rgb(0, 127, 255); line-height: 1.2; vertical-align: top; overflow: hidden; max-height: 26px; max-width: 286px; width: 220px; white-space: normal; word-wrap: normal; font-weight: bold;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">Blacklight Module Soft Linking</div></div></foreignObject><text x="110" y="16" fill="#007FFF" text-anchor="middle" font-size="15px" font-family="Helvetica" font-weight="bold">Blacklight Module Soft Linking</text></switch></g><path d="M 9 233 L 111 233" fill="none" stroke="#0000cc" stroke-miterlimit="10" transform="rotate(90,60,233)" pointer-events="none"/><path d="M 195.17 203.67 L 314.33 203.67 Q 324.33 203.67 324.33 213.67 L 324.33 321.17 Q 324.33 331.17 314.33 331.17 L 169.24 331.17" fill="none" stroke="#009900" stroke-width="2" stroke-miterlimit="10" pointer-events="none"/><path d="M 163.24 331.17 L 171.24 327.17 L 169.24 331.17 L 171.24 335.17 Z" fill="#009900" stroke="#009900" stroke-width="2" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(313.5,282.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="20" height="24" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(102, 102, 102); line-height: 1.2; vertical-align: top; white-space: nowrap; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;background-color:#ffffff;"><font color="#009900">Soft</font><div><font color="#009900">Link</font></div></div></div></foreignObject><text x="10" y="18" fill="#666666" text-anchor="middle" font-size="11px" font-family="Helvetica">[Not supported by viewer]</text></switch></g><path d="M 166.83 222 L 294.33 222 Q 304.33 222 304.33 232 L 304.33 396.17 Q 304.33 406.17 294.33 406.17 L 175.07 406.17" fill="none" stroke="#ff8000" stroke-width="2" stroke-miterlimit="10" pointer-events="none"/><path d="M 169.07 406.17 L 177.07 402.17 L 175.07 406.17 L 177.07 410.17 Z" fill="#ff8000" stroke="#ff8000" stroke-width="2" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(294.5,362.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="20" height="24" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(102, 102, 102); line-height: 1.2; vertical-align: top; white-space: nowrap; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;background-color:#ffffff;"><font color="#ff8000">Soft</font><div><font color="#ff8000">Link</font></div></div></div></foreignObject><text x="10" y="18" fill="#666666" text-anchor="middle" font-size="11px" font-family="Helvetica">[Not supported by viewer]</text></switch></g><path d="M 152.67 240.33 L 274.33 240.33 Q 284.33 240.33 284.33 250.33 L 284.33 463.67 Q 284.33 473.67 274.33 473.67 L 175.9 473.67" fill="none" stroke="#cc0000" stroke-width="2" stroke-miterlimit="10" pointer-events="none"/><path d="M 169.9 473.67 L 177.9 469.67 L 175.9 473.67 L 177.9 477.67 Z" fill="#cc0000" stroke="#cc0000" stroke-width="2" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(273.5,431.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="20" height="24" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(102, 102, 102); line-height: 1.2; vertical-align: top; white-space: nowrap; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;background-color:#ffffff;"><font color="#cc0000">Soft</font><div><font color="#cc0000">Link</font></div></div></div></foreignObject><text x="10" y="18" fill="#666666" text-anchor="middle" font-size="11px" font-family="Helvetica">[Not supported by viewer]</text></switch></g><path d="M 43.5 233.5 L 110.5 233.5" fill="none" stroke="#0000cc" stroke-miterlimit="10" transform="rotate(90,77,233.5)" pointer-events="none"/><path d="M 19.5 327.5 L 66.5 327.5" fill="none" stroke="#0000cc" stroke-miterlimit="10" transform="rotate(90,43,327.5)" pointer-events="none"/><path d="M 22 401 L 64 401" fill="none" stroke="#0000cc" stroke-miterlimit="10" transform="rotate(90,43,401)" pointer-events="none"/><path d="M 18.5 475.5 L 67.5 475.5" fill="none" stroke="#0000cc" stroke-miterlimit="10" transform="rotate(90,43,475.5)" pointer-events="none"/></g></svg>
\ No newline at end of file
This diff is collapsed.
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="783px" height="293px" version="1.1" style="background-color: rgb(255, 255, 255);"><defs><linearGradient x1="0%" y1="0%" x2="0%" y2="100%" id="mx-gradient-dae8fc-1-7ea6e0-1-s-0"><stop offset="0%" style="stop-color:#DAE8FC"/><stop offset="100%" style="stop-color:#7EA6E0"/></linearGradient><linearGradient x1="0%" y1="0%" x2="0%" y2="100%" id="mx-gradient-d5e8d4-1-97d077-1-s-0"><stop offset="0%" style="stop-color:#D5E8D4"/><stop offset="100%" style="stop-color:#97D077"/></linearGradient><linearGradient x1="0%" y1="0%" x2="0%" y2="100%" id="mx-gradient-fff2cc-1-ffd966-1-s-0"><stop offset="0%" style="stop-color:#FFF2CC"/><stop offset="100%" style="stop-color:#FFD966"/></linearGradient></defs><g transform="translate(0.5,0.5)"><rect x="1" y="1" width="780" height="290" fill="#e6e6e6" stroke="#b3b3b3" pointer-events="none"/><rect x="367" y="107" width="130" height="80" fill="url(#mx-gradient-dae8fc-1-7ea6e0-1-s-0)" stroke="#6c8ebf" pointer-events="none"/><g transform="translate(368.5,119.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="126" height="54" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 15px; font-family: &quot;Courier New&quot;; color: rgb(0, 102, 204); line-height: 1.2; vertical-align: top; width: 126px; white-space: normal; word-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;"><div style="text-align: center"><span style="color: rgb(26 , 26 , 26) ; font-family: &quot;helvetica&quot; ; line-height: 1.2"><b>Blacklight</b></span></div><div style="text-align: center"><font face="Helvetica" color="#1a1a1a" style="font-size: 11px">Node.js app that a</font><span style="font-size: 11px ; color: rgb(26 , 26 , 26) ; font-family: &quot;helvetica&quot; ; line-height: 1.2">cts as a web server </span><span style="font-size: 11px ; color: rgb(26 , 26 , 26) ; font-family: &quot;helvetica&quot; ; line-height: 1.2">and CMS</span></div></div></div></foreignObject><text x="63" y="35" fill="#0066CC" text-anchor="middle" font-size="15px" font-family="Courier New">[Not supported by viewer]</text></switch></g><path d="M 141 161 L 184.63 161" fill="none" stroke="#999999" stroke-miterlimit="10" pointer-events="none"/><path d="M 189.88 161 L 182.88 164.5 L 184.63 161 L 182.88 157.5 Z" fill="#999999" stroke="#999999" stroke-miterlimit="10" pointer-events="none"/><path d="M 191 141 L 147.37 141" fill="none" stroke="#999999" stroke-miterlimit="10" pointer-events="none"/><path d="M 142.12 141 L 149.12 137.5 L 147.37 141 L 149.12 144.5 Z" fill="#999999" stroke="#999999" stroke-miterlimit="10" pointer-events="none"/><path d="M 543.71 211 L 543.71 186.79 L 536 186.79 L 549.5 171 L 563 186.79 L 555.29 186.79 L 555.29 211 Z" fill="#ffffff" stroke="#b3b3b3" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(483.5,218.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="131" height="32" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 14px; font-family: &quot;Courier New&quot;; color: rgb(0, 102, 204); line-height: 1.2; vertical-align: top; white-space: nowrap; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;"><font face="Helvetica" color="#4d4d4d">Content Read</font><div><span style="color: rgb(77 , 77 , 77) ; font-family: &quot;helvetica&quot; ; line-height: 1.2">and Written as JSON</span></div></div></div></foreignObject><text x="66" y="23" fill="#0066CC" text-anchor="middle" font-size="14px" font-family="Courier New">[Not supported by viewer]</text></switch></g><path d="M 426.71 103 L 426.71 78.79 L 419 78.79 L 432.5 63 L 446 78.79 L 438.29 78.79 L 438.29 103 Z" fill="#ffffff" stroke="#b3b3b3" stroke-miterlimit="10" transform="rotate(180,432.5,83)" pointer-events="none"/><g transform="translate(367.5,9.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="129" height="49" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 14px; font-family: &quot;Courier New&quot;; color: rgb(0, 102, 204); line-height: 1.2; vertical-align: top; white-space: nowrap; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;"><font color="#4d4d4d" face="Helvetica"><span style="font-size: 12px ; line-height: 14.4px">All <i>public pages</i> and</span></font><div><font color="#4d4d4d" face="Helvetica"><span style="font-size: 12px ; line-height: 14.4px">private <i>edit UI</i> rendered </span></font></div><div><font color="#4d4d4d" face="Helvetica"><span style="font-size: 12px ; line-height: 14.4px">by Blacklight</span></font></div></div></div></foreignObject><text x="65" y="32" fill="#0066CC" text-anchor="middle" font-size="14px" font-family="Courier New">[Not supported by viewer]</text></switch></g><rect x="203" y="111" width="84" height="80" fill="url(#mx-gradient-d5e8d4-1-97d077-1-s-0)" stroke="#82b366" pointer-events="none"/><g transform="translate(207.5,119.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="74" height="62" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 13px; font-family: &quot;Courier New&quot;; color: rgb(0, 102, 204); line-height: 1.2; vertical-align: top; width: 74px; white-space: nowrap; word-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;"><div style="text-align: center"><span style="color: rgb(26 , 26 , 26) ; font-family: &quot;helvetica&quot; ; line-height: 1.2"><b>Cache</b></span></div><div style="text-align: center"><font color="#1a1a1a" face="Helvetica" style="font-size: 13px"><span style="font-size: 11px ; line-height: 13.2px">(optional)</span></font></div><div style="text-align: center"><font color="#1a1a1a" face="Helvetica" style="font-size: 13px"><span style="font-size: 11px ; line-height: 13.2px">Nginx / Akamai</span></font></div><div style="text-align: center"><font color="#1a1a1a" face="Helvetica" style="font-size: 13px"><span style="font-size: 11px ; line-height: 13.2px">etc.</span></font></div></div></div></foreignObject><text x="37" y="38" fill="#0066CC" text-anchor="middle" font-size="13px" font-family="Courier New">[Not supported by viewer]</text></switch></g><path d="M 287 221 C 263 221 257 241 276.2 245 C 257 253.8 278.6 273 294.2 265 C 305 281 341 281 353 265 C 377 265 377 249 362 241 C 377 225 353 209 332 217 C 317 205 293 205 287 221 Z" fill="#ffffff" stroke="#b3b3b3" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(291.5,224.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="50" height="32" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 14px; font-family: &quot;Courier New&quot;; color: rgb(0, 102, 204); line-height: 1.2; vertical-align: top; width: 50px; white-space: nowrap; word-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;"><font color="#000000" face="Helvetica">Content</font><div><font color="#000000" face="Helvetica">Editors</font></div></div></div></foreignObject><text x="25" y="23" fill="#0066CC" text-anchor="middle" font-size="14px" font-family="Courier New">[Not supported by viewer]</text></switch></g><rect x="601" y="111" width="130" height="80" fill="url(#mx-gradient-fff2cc-1-ffd966-1-s-0)" stroke="#d6b656" pointer-events="none"/><g transform="translate(618.5,123.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="94" height="54" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 15px; font-family: &quot;Courier New&quot;; color: rgb(0, 102, 204); line-height: 1.2; vertical-align: top; width: 96px; white-space: nowrap; word-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;"><font style="line-height: 120%"><div style="text-align: center"><span style="color: rgb(26 , 26 , 26) ; font-family: &quot;helvetica&quot; ; line-height: 1.2"><b>Sling + JCR</b></span></div><div style="text-align: center"><font face="Helvetica" color="#1a1a1a" style="font-size: 11px">JVM-Based</font></div><div style="text-align: center"><font face="Helvetica" color="#1a1a1a" style="font-size: 11px">Content Repository</font></div></font></div></div></foreignObject><text x="47" y="35" fill="#0066CC" text-anchor="middle" font-size="15px" font-family="Courier New">[Not supported by viewer]</text></switch></g><path d="M 662.71 105 L 662.71 80.79 L 655 80.79 L 668.5 65 L 682 80.79 L 674.29 80.79 L 674.29 105 Z" fill="#ffffff" stroke="#b3b3b3" stroke-miterlimit="10" transform="rotate(180,668.5,85)" pointer-events="none"/><g transform="translate(595.5,28.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="145" height="32" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 14px; font-family: &quot;Courier New&quot;; color: rgb(0, 102, 204); line-height: 1.2; vertical-align: top; white-space: nowrap; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;"><font color="#4d4d4d" face="Helvetica"><span style="font-size: 12px ; line-height: 14.4px">Sling Provides a restful API</span></font><div><font color="#4d4d4d" face="Helvetica"><span style="font-size: 12px ; line-height: 14.4px">to all site content</span></font></div></div></div></foreignObject><text x="73" y="23" fill="#0066CC" text-anchor="middle" font-size="14px" font-family="Courier New">[Not supported by viewer]</text></switch></g><path d="M 49 131 C 25 131 19 151 38.2 155 C 19 163.8 40.6 183 56.2 175 C 67 191 103 191 115 175 C 139 175 139 159 124 151 C 139 135 115 119 94 127 C 79 115 55 115 49 131 Z" fill="#ffffff" stroke="#b3b3b3" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(43.5,134.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="70" height="32" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 14px; font-family: &quot;Courier New&quot;; color: rgb(0, 102, 204); line-height: 1.2; vertical-align: top; width: 72px; white-space: nowrap; word-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;"><font face="Helvetica" color="#000000">Public Web</font><div><font face="Helvetica" color="#000000">Traffic</font></div></div></div></foreignObject><text x="35" y="23" fill="#0066CC" text-anchor="middle" font-size="14px" font-family="Courier New">[Not supported by viewer]</text></switch></g><path d="M 509 161 L 582.63 161" fill="none" stroke="#999999" stroke-miterlimit="10" pointer-events="none"/><path d="M 587.88 161 L 580.88 164.5 L 582.63 161 L 580.88 157.5 Z" fill="#999999" stroke="#999999" stroke-miterlimit="10" pointer-events="none"/><path d="M 589 141 L 515.37 141" fill="none" stroke="#999999" stroke-miterlimit="10" pointer-events="none"/><path d="M 510.12 141 L 517.12 137.5 L 515.37 141 L 517.12 144.5 Z" fill="#999999" stroke="#999999" stroke-miterlimit="10" pointer-events="none"/><path d="M 381.37 241 L 424 241 Q 434 241 434 231 L 434 207.37" fill="none" stroke="#999999" stroke-miterlimit="10" pointer-events="none"/><path d="M 376.12 241 L 383.12 237.5 L 381.37 241 L 383.12 244.5 Z" fill="#999999" stroke="#999999" stroke-miterlimit="10" pointer-events="none"/><path d="M 434 202.12 L 437.5 209.12 L 434 207.37 L 430.5 209.12 Z" fill="#999999" stroke="#999999" stroke-miterlimit="10" pointer-events="none"/><path d="M 351 140 L 304.37 140" fill="none" stroke="#999999" stroke-miterlimit="10" pointer-events="none"/><path d="M 299.12 140 L 306.12 136.5 L 304.37 140 L 306.12 143.5 Z" fill="#999999" stroke="#999999" stroke-miterlimit="10" pointer-events="none"/><path d="M 298 161 L 344.63 161" fill="none" stroke="#999999" stroke-miterlimit="10" pointer-events="none"/><path d="M 349.88 161 L 342.88 164.5 L 344.63 161 L 342.88 157.5 Z" fill="#999999" stroke="#999999" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(312.5,147.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="23" height="14" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 14px; font-family: &quot;Courier New&quot;; color: rgb(0, 102, 204); line-height: 1.2; vertical-align: top; white-space: nowrap; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;"><font face="Helvetica" color="#333333" style="font-size: 7px">request</font></div></div></foreignObject><text x="12" y="14" fill="#0066CC" text-anchor="middle" font-size="14px" font-family="Courier New">[Not supported by viewer]</text></switch></g><g transform="translate(20.5,11.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="266" height="22" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 14px; font-family: &quot;Courier New&quot;; color: rgb(0, 102, 204); line-height: 1.2; vertical-align: top; overflow: hidden; max-height: 36px; max-width: 295px; width: 267px; white-space: normal; word-wrap: normal;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;"><font face="Helvetica"><span style="font-size: 20px ; line-height: 24px"><b>Blacklight Network Diagram</b></span></font></div></div></foreignObject><text x="133" y="18" fill="#0066CC" text-anchor="middle" font-size="14px" font-family="Courier New">[Not supported by viewer]</text></switch></g><path d="M 315.71 130 L 315.71 105.79 L 308 105.79 L 321.5 90 L 335 105.79 L 327.29 105.79 L 327.29 130 Z" fill="#ffffff" stroke="#b3b3b3" stroke-miterlimit="10" transform="rotate(180,321.5,110)" pointer-events="none"/><g transform="translate(295.5,53.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="52" height="32" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 14px; font-family: &quot;Courier New&quot;; color: rgb(0, 102, 204); line-height: 1.2; vertical-align: top; white-space: nowrap; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;"><font color="#4d4d4d" face="Helvetica"><span style="font-size: 12px ; line-height: 14.4px">Finished </span></font><div><font color="#4d4d4d" face="Helvetica"><span style="font-size: 12px ; line-height: 14.4px">web </span></font><span style="font-size: 12px ; line-height: 14.4px ; color: rgb(77 , 77 , 77) ; font-family: &quot;helvetica&quot;">page</span></div></div></div></foreignObject><text x="26" y="23" fill="#0066CC" text-anchor="middle" font-size="14px" font-family="Courier New">[Not supported by viewer]</text></switch></g></g></svg>
\ No newline at end of file
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="783px" height="303px" version="1.1" style="background-color: rgb(255, 255, 255);"><defs><linearGradient x1="0%" y1="0%" x2="0%" y2="100%" id="mx-gradient-dae8fc-1-7ea6e0-1-s-0"><stop offset="0%" style="stop-color:#DAE8FC"/><stop offset="100%" style="stop-color:#7EA6E0"/></linearGradient><linearGradient x1="0%" y1="0%" x2="0%" y2="100%" id="mx-gradient-fff2cc-1-ffd966-1-s-0"><stop offset="0%" style="stop-color:#FFF2CC"/><stop offset="100%" style="stop-color:#FFD966"/></linearGradient><linearGradient x1="0%" y1="0%" x2="0%" y2="100%" id="mx-gradient-d5e8d4-1-97d077-1-s-0"><stop offset="0%" style="stop-color:#D5E8D4"/><stop offset="100%" style="stop-color:#97D077"/></linearGradient><linearGradient x1="0%" y1="0%" x2="100%" y2="0%" id="mx-gradient-ff99cc-1-ffb570-1-e-0"><stop offset="0%" style="stop-color:#FF99CC"/><stop offset="100%" style="stop-color:#FFB570"/></linearGradient></defs><g transform="translate(0.5,0.5)"><rect x="1" y="1" width="780" height="300" fill="#e6e6e6" stroke="#b3b3b3" pointer-events="none"/><rect x="601" y="116" width="130" height="80" fill="url(#mx-gradient-dae8fc-1-7ea6e0-1-s-0)" stroke="#6c8ebf" pointer-events="none"/><g transform="translate(633.5,137.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="64" height="36" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 15px; font-family: &quot;Courier New&quot;; color: rgb(0, 102, 204); line-height: 1.2; vertical-align: top; width: 66px; white-space: nowrap; word-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;"><div style="text-align: center"><span style="color: rgb(26 , 26 , 26) ; font-family: &quot;helvetica&quot; ; line-height: 1.2">Blacklight</span></div><div style="text-align: center"><font face="Helvetica" color="#1a1a1a" style="font-size: 11px">Node.js App</font></div></div></div></foreignObject><text x="32" y="26" fill="#0066CC" text-anchor="middle" font-size="15px" font-family="Courier New">[Not supported by viewer]</text></switch></g><rect x="371" y="116" width="130" height="80" fill="url(#mx-gradient-fff2cc-1-ffd966-1-s-0)" stroke="#d6b656" pointer-events="none"/><g transform="translate(388.5,128.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="94" height="54" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 15px; font-family: &quot;Courier New&quot;; color: rgb(0, 102, 204); line-height: 1.2; vertical-align: top; width: 96px; white-space: nowrap; word-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;"><font style="line-height: 120%"><div style="text-align: center"><span style="color: rgb(26 , 26 , 26) ; font-family: &quot;helvetica&quot; ; line-height: 1.2">Sling + JCR</span></div><div style="text-align: center"><font face="Helvetica" color="#1a1a1a" style="font-size: 11px">JVM-Based</font></div><div style="text-align: center"><font face="Helvetica" color="#1a1a1a" style="font-size: 11px">Content Repository</font></div></font></div></div></foreignObject><text x="47" y="35" fill="#0066CC" text-anchor="middle" font-size="15px" font-family="Courier New">[Not supported by viewer]</text></switch></g><path d="M 511 142 L 584.63 142" fill="none" stroke="#999999" stroke-miterlimit="10" pointer-events="none"/><path d="M 589.88 142 L 582.88 145.5 L 584.63 142 L 582.88 138.5 Z" fill="#999999" stroke="#999999" stroke-miterlimit="10" pointer-events="none"/><path d="M 591 162 L 517.37 162" fill="none" stroke="#999999" stroke-miterlimit="10" pointer-events="none"/><path d="M 512.12 162 L 519.12 158.5 L 517.37 162 L 519.12 165.5 Z" fill="#999999" stroke="#999999" stroke-miterlimit="10" pointer-events="none"/><path d="M 548.71 226 L 548.71 201.79 L 541 201.79 L 554.5 186 L 568 201.79 L 560.29 201.79 L 560.29 226 Z" fill="#ffffff" stroke="#b3b3b3" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(486.5,233.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="135" height="30" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 14px; font-family: &quot;Courier New&quot;; color: rgb(0, 102, 204); line-height: 1.2; vertical-align: top; white-space: nowrap; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;"><font face="Helvetica" color="#4d4d4d" style="font-size: 12px">JSON Data from Sling</font><div><font face="Helvetica" color="#4d4d4d" style="font-size: 12px">Rendered Pages from BL</font></div></div></div></foreignObject><text x="68" y="22" fill="#0066CC" text-anchor="middle" font-size="14px" font-family="Courier New">[Not supported by viewer]</text></switch></g><path d="M 680.71 112 L 680.71 87.79 L 673 87.79 L 686.5 72 L 700 87.79 L 692.29 87.79 L 692.29 112 Z" fill="#ffffff" stroke="#b3b3b3" stroke-miterlimit="10" transform="rotate(180,686.5,92)" pointer-events="none"/><g transform="translate(602.5,35.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="167" height="32" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 14px; font-family: &quot;Courier New&quot;; color: rgb(0, 102, 204); line-height: 1.2; vertical-align: top; white-space: nowrap; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;"><font color="#4d4d4d" face="Helvetica"><span style="font-size: 12px ; line-height: 14.4px">Some Public Pages and</span></font><div><font color="#4d4d4d" face="Helvetica"><span style="font-size: 12px ; line-height: 14.4px">Private Edit UI Rendered by BL</span></font></div></div></div></foreignObject><text x="84" y="23" fill="#0066CC" text-anchor="middle" font-size="14px" font-family="Courier New">[Not supported by viewer]</text></switch></g><path d="M 483.71 113 L 483.71 88.79 L 476 88.79 L 489.5 73 L 503 88.79 L 495.29 88.79 L 495.29 113 Z" fill="#ffffff" stroke="#b3b3b3" stroke-miterlimit="10" transform="rotate(180,489.5,93)" pointer-events="none"/><g transform="translate(416.5,19.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="145" height="49" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 14px; font-family: &quot;Courier New&quot;; color: rgb(0, 102, 204); line-height: 1.2; vertical-align: top; white-space: nowrap; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;"><font color="#4d4d4d" face="Helvetica"><span style="font-size: 12px ; line-height: 14.4px">Some pages rendered, and</span></font><div><font color="#4d4d4d" face="Helvetica"><span style="font-size: 12px ; line-height: 14.4px">all content provided</span></font></div><div><font color="#4d4d4d" face="Helvetica"><span style="font-size: 12px ; line-height: 14.4px">by </span></font><span style="font-size: 12px ; line-height: 14.4px ; color: rgb(77 , 77 , 77) ; font-family: &quot;helvetica&quot;">Sling on JVM</span></div></div></div></foreignObject><text x="73" y="32" fill="#0066CC" text-anchor="middle" font-size="14px" font-family="Courier New">[Not supported by viewer]</text></switch></g><path d="M 49 136 C 25 136 19 156 38.2 160 C 19 168.8 40.6 188 56.2 180 C 67 196 103 196 115 180 C 139 180 139 164 124 156 C 139 140 115 124 94 132 C 79 120 55 120 49 136 Z" fill="#ffffff" stroke="#b3b3b3" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(59.5,139.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="38" height="32" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 14px; font-family: &quot;Courier New&quot;; color: rgb(0, 102, 204); line-height: 1.2; vertical-align: top; width: 40px; white-space: nowrap; word-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;"><font face="Helvetica" color="#000000">Web</font><div><font face="Helvetica" color="#000000">Traffic</font></div></div></div></foreignObject><text x="19" y="23" fill="#0066CC" text-anchor="middle" font-size="14px" font-family="Courier New">[Not supported by viewer]</text></switch></g><path d="M 139 166 L 184.63 166" fill="none" stroke="#999999" stroke-miterlimit="10" pointer-events="none"/><path d="M 189.88 166 L 182.88 169.5 L 184.63 166 L 182.88 162.5 Z" fill="#999999" stroke="#999999" stroke-miterlimit="10" pointer-events="none"/><path d="M 191 146 L 145.37 146" fill="none" stroke="#999999" stroke-miterlimit="10" pointer-events="none"/><path d="M 140.12 146 L 147.12 142.5 L 145.37 146 L 147.12 149.5 Z" fill="#999999" stroke="#999999" stroke-miterlimit="10" pointer-events="none"/><rect x="194" y="116" width="80" height="80" fill="url(#mx-gradient-d5e8d4-1-97d077-1-s-0)" stroke="#82b366" pointer-events="none"/><g transform="translate(197.5,128.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="72" height="54" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 15px; font-family: &quot;Courier New&quot;; color: rgb(0, 102, 204); line-height: 1.2; vertical-align: top; width: 74px; white-space: nowrap; word-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;"><div style="text-align: center"><span style="color: rgb(26 , 26 , 26) ; font-family: &quot;helvetica&quot; ; line-height: 1.2">Cache</span></div><div style="text-align: center"><font color="#1a1a1a" face="Helvetica" style="font-size: 10px"><span style="line-height: 13.2px">Sling Dispatcher</span></font></div><div style="text-align: center"><font color="#1a1a1a" face="Helvetica" style="font-size: 10px"><span style="line-height: 13.2px">CloudFlare, etc</span></font></div></div></div></foreignObject><text x="36" y="35" fill="#0066CC" text-anchor="middle" font-size="15px" font-family="Courier New">[Not supported by viewer]</text></switch></g><path d="M 387.37 248 L 430 248 Q 440 248 440 238 L 440 214.37" fill="none" stroke="#999999" stroke-miterlimit="10" pointer-events="none"/><path d="M 382.12 248 L 389.12 244.5 L 387.37 248 L 389.12 251.5 Z" fill="#999999" stroke="#999999" stroke-miterlimit="10" pointer-events="none"/><path d="M 440 209.12 L 443.5 216.12 L 440 214.37 L 436.5 216.12 Z" fill="#999999" stroke="#999999" stroke-miterlimit="10" pointer-events="none"/><path d="M 291 227 C 267 227 261 247 280.2 251 C 261 259.8 282.6 279 298.2 271 C 309 287 345 287 357 271 C 381 271 381 255 366 247 C 381 231 357 215 336 223 C 321 211 297 211 291 227 Z" fill="#ffffff" stroke="#b3b3b3" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(295.5,230.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="50" height="32" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 14px; font-family: &quot;Courier New&quot;; color: rgb(0, 102, 204); line-height: 1.2; vertical-align: top; width: 50px; white-space: nowrap; word-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;"><font color="#000000" face="Helvetica">Content</font><div><font color="#000000" face="Helvetica">Editors</font></div></div></div></foreignObject><text x="25" y="23" fill="#0066CC" text-anchor="middle" font-size="14px" font-family="Courier New">[Not supported by viewer]</text></switch></g><path d="M 321 146 L 287.37 146" fill="none" stroke="#999999" stroke-miterlimit="10" pointer-events="none"/><path d="M 282.12 146 L 289.12 142.5 L 287.37 146 L 289.12 149.5 Z" fill="#999999" stroke="#999999" stroke-miterlimit="10" pointer-events="none"/><rect x="331" y="116" width="40" height="80" fill="url(#mx-gradient-ff99cc-1-ffb570-1-e-0)" stroke="#9673a6" pointer-events="none"/><g transform="translate(312.5,136.5)rotate(-90,38,19)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="76" height="38" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 15px; font-family: &quot;Courier New&quot;; color: rgb(0, 102, 204); line-height: 1.2; vertical-align: top; width: 76px; white-space: normal; word-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;"><div style="text-align: center"><span style="color: rgb(26 , 26 , 26) ; font-family: &quot;helvetica&quot; ; line-height: 1.2">Blacklight Proxy</span></div></div></div></foreignObject><text x="38" y="27" fill="#0066CC" text-anchor="middle" font-size="15px" font-family="Courier New">[Not supported by viewer]</text></switch></g><path d="M 281 167 L 315.63 167" fill="none" stroke="#999999" stroke-miterlimit="10" pointer-events="none"/><path d="M 320.88 167 L 313.88 170.5 L 315.63 167 L 313.88 163.5 Z" fill="#999999" stroke="#999999" stroke-miterlimit="10" pointer-events="none"/><path d="M 318.44 135 L 318.44 108.73 C 318.44 108.02 318.21 107.34 317.81 106.84 C 317.4 106.33 316.85 106.05 316.28 106.05 L 305.45 106.05 L 305.45 113.02 L 289 98.01 L 305.45 83 L 305.45 89.97 L 316.28 89.97 C 324.47 90.26 331 98.58 331 108.73 L 331 135 Z" fill="#ffffff" stroke="#b3b3b3" stroke-miterlimit="10" transform="rotate(180,310,109)" pointer-events="none"/><g transform="translate(235.5,22.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="148" height="64" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 14px; font-family: &quot;Courier New&quot;; color: rgb(0, 102, 204); line-height: 1.2; vertical-align: top; white-space: nowrap; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;"><font face="Helvetica" style="font-size: 12px" color="#666666">BL Proxy Decides whether</font><div><font face="Helvetica" color="#666666"><span style="font-size: 12px ; line-height: 14.4px">Sling or BL handles </span></font></div><div><font face="Helvetica" color="#666666"><span style="font-size: 12px ; line-height: 14.4px">rendering </span></font><span style="font-size: 12px ; line-height: 14.4px ; color: rgb(102 , 102 , 102) ; font-family: &quot;helvetica&quot;">of current request</span></div><div><div><br /></div></div></div></div></foreignObject><text x="74" y="39" fill="#0066CC" text-anchor="middle" font-size="14px" font-family="Courier New">[Not supported by viewer]</text></switch></g><g transform="translate(23.5,21.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="198" height="22" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 14px; font-family: &quot;Courier New&quot;; color: rgb(0, 102, 204); line-height: 1.2; vertical-align: top; overflow: hidden; max-height: 36px; max-width: 256px; width: 199px; white-space: normal; word-wrap: normal;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;"><font face="Helvetica"><span style="font-size: 20px ; line-height: 24px"><b>Sling-First Approach</b></span></font></div></div></foreignObject><text x="99" y="18" fill="#0066CC" text-anchor="middle" font-size="14px" font-family="Courier New">[Not supported by viewer]</text></switch></g></g></svg>
\ No newline at end of file
This diff is collapsed.
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment