From 5cb26cb16391bbf6e0eb7c90d599e73b99ed2346 Mon Sep 17 00:00:00 2001 From: Mahmoud Ben Hassine Date: Wed, 1 Oct 2014 20:53:16 +0200 Subject: [PATCH] add new site for documentation --- EasyRules.uml | 54 -- EasyRulesEngine.uml | 34 - site/CNAME | 1 + site/README | 1 + site/_config.yml | 20 + site/_includes/analytics.html | 10 + site/_includes/bottom.html | 1 + site/_includes/docs_contents.html | 53 ++ site/_includes/footer.html | 13 + site/_includes/header.html | 14 + site/_includes/primary-nav-items.html | 12 + site/_includes/section_nav.html | 22 + site/_includes/top.html | 16 + site/_layouts/default.html | 16 + site/_layouts/docs.html | 21 + site/about/getting-started.md | 41 + site/about/overview.md | 21 + site/css/gridism.css | 110 +++ site/css/normalize.css | 504 ++++++++++++ site/css/pygments.css | 70 ++ site/css/style.css | 1007 +++++++++++++++++++++++ site/favicon.ico | Bin 0 -> 73070 bytes site/img/article-footer.png | Bin 0 -> 1898 bytes site/img/jmx-suspectOrderRule.png | Bin 0 -> 57657 bytes site/index.html | 95 +++ site/js/modernizr-2.5.3.min.js | 4 + site/tutorials/dynamic-configuration.md | 206 +++++ site/tutorials/hello-world.md | 108 +++ site/user-guide/defining-rules.md | 131 +++ site/user-guide/introduction.md | 21 + site/user-guide/managing-rules.md | 28 + site/user-guide/rules-engine.md | 75 ++ 32 files changed, 2621 insertions(+), 88 deletions(-) delete mode 100644 EasyRules.uml delete mode 100644 EasyRulesEngine.uml create mode 100644 site/CNAME create mode 100644 site/README create mode 100644 site/_config.yml create mode 100644 site/_includes/analytics.html create mode 100644 site/_includes/bottom.html create mode 100644 site/_includes/docs_contents.html create mode 100644 site/_includes/footer.html create mode 100644 site/_includes/header.html create mode 100644 site/_includes/primary-nav-items.html create mode 100644 site/_includes/section_nav.html create mode 100644 site/_includes/top.html create mode 100644 site/_layouts/default.html create mode 100644 site/_layouts/docs.html create mode 100644 site/about/getting-started.md create mode 100644 site/about/overview.md create mode 100644 site/css/gridism.css create mode 100755 site/css/normalize.css create mode 100644 site/css/pygments.css create mode 100644 site/css/style.css create mode 100644 site/favicon.ico create mode 100644 site/img/article-footer.png create mode 100644 site/img/jmx-suspectOrderRule.png create mode 100644 site/index.html create mode 100755 site/js/modernizr-2.5.3.min.js create mode 100644 site/tutorials/dynamic-configuration.md create mode 100644 site/tutorials/hello-world.md create mode 100644 site/user-guide/defining-rules.md create mode 100644 site/user-guide/introduction.md create mode 100644 site/user-guide/managing-rules.md create mode 100644 site/user-guide/rules-engine.md diff --git a/EasyRules.uml b/EasyRules.uml deleted file mode 100644 index c9f9044..0000000 --- a/EasyRules.uml +++ /dev/null @@ -1,54 +0,0 @@ - - - JAVA - net.benas.easyrules.core.BasicRule - - net.benas.easyrules.core.CompositeRule - java.lang.Comparable - net.benas.easyrules.core.BasicRule - net.benas.easyrules.api.JmxManagedRule - net.benas.easyrules.api.Rule - net.benas.easyrules.core.BasicJmxManagedRule - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Methods - Inner Classes - Properties - - All - private - - diff --git a/EasyRulesEngine.uml b/EasyRulesEngine.uml deleted file mode 100644 index 2bed900..0000000 --- a/EasyRulesEngine.uml +++ /dev/null @@ -1,34 +0,0 @@ - - - JAVA - net.benas.easyrules.core.DefaultRulesEngine - - net.benas.easyrules.api.RulesEngine - net.benas.easyrules.core.DefaultRulesEngine - net.benas.easyrules.api.Rule - - - - - - - - - - - - - - - - - net.benas.easyrules.core.DefaultRulesEngine - - - Methods - Properties - - All - private - - diff --git a/site/CNAME b/site/CNAME new file mode 100644 index 0000000..483a633 --- /dev/null +++ b/site/CNAME @@ -0,0 +1 @@ +www.easyrules.org diff --git a/site/README b/site/README new file mode 100644 index 0000000..9513f3d --- /dev/null +++ b/site/README @@ -0,0 +1 @@ +Easy Rules website. diff --git a/site/_config.yml b/site/_config.yml new file mode 100644 index 0000000..f7d96a2 --- /dev/null +++ b/site/_config.yml @@ -0,0 +1,20 @@ +version: 1.1.0 +highlighter: pygments +url: http://www.easyrules.org +google_analytics_id: UA-46301888-1 +exclude: ["CNAME", "README"] + +author : + name : Mahmoud Ben Hassine + email : md.benhassine@gmail.com + github : benas + twitter : md_benhassine + web : http://www.mahmoudbenhassine.com + +project: + name: Easy Rules + github: easy-rules + +markdown: redcarpet +redcarpet: + extensions: ["no_intra_emphasis", "fenced_code_blocks", "autolink", "strikethrough", "superscript", "with_toc_data"] diff --git a/site/_includes/analytics.html b/site/_includes/analytics.html new file mode 100644 index 0000000..6cc8d09 --- /dev/null +++ b/site/_includes/analytics.html @@ -0,0 +1,10 @@ + diff --git a/site/_includes/bottom.html b/site/_includes/bottom.html new file mode 100644 index 0000000..62d09b8 --- /dev/null +++ b/site/_includes/bottom.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/site/_includes/docs_contents.html b/site/_includes/docs_contents.html new file mode 100644 index 0000000..0f237f6 --- /dev/null +++ b/site/_includes/docs_contents.html @@ -0,0 +1,53 @@ +
+ +
diff --git a/site/_includes/footer.html b/site/_includes/footer.html new file mode 100644 index 0000000..f3eec84 --- /dev/null +++ b/site/_includes/footer.html @@ -0,0 +1,13 @@ + \ No newline at end of file diff --git a/site/_includes/header.html b/site/_includes/header.html new file mode 100644 index 0000000..b844d49 --- /dev/null +++ b/site/_includes/header.html @@ -0,0 +1,14 @@ +
+
+ + +
+
diff --git a/site/_includes/primary-nav-items.html b/site/_includes/primary-nav-items.html new file mode 100644 index 0000000..75dbb1a --- /dev/null +++ b/site/_includes/primary-nav-items.html @@ -0,0 +1,12 @@ + diff --git a/site/_includes/section_nav.html b/site/_includes/section_nav.html new file mode 100644 index 0000000..fbcc456 --- /dev/null +++ b/site/_includes/section_nav.html @@ -0,0 +1,22 @@ +
+
+ {% if page.prev_section != null %} + + {% else %} + Back + {% endif %} +
+
+ {% if page.next_section != null %} + + {% else %} + Next + {% endif %} +
+
+
+ diff --git a/site/_includes/top.html b/site/_includes/top.html new file mode 100644 index 0000000..5781388 --- /dev/null +++ b/site/_includes/top.html @@ -0,0 +1,16 @@ + + + + + {{ page.title }} + + + + + + + + + + + diff --git a/site/_layouts/default.html b/site/_layouts/default.html new file mode 100644 index 0000000..06203d8 --- /dev/null +++ b/site/_layouts/default.html @@ -0,0 +1,16 @@ +{% include top.html %} + + + + {% include header.html %} + + {{ content }} + + {% include footer.html %} + + {% include analytics.html %} + + + +{% include bottom.html %} + diff --git a/site/_layouts/docs.html b/site/_layouts/docs.html new file mode 100644 index 0000000..a54585a --- /dev/null +++ b/site/_layouts/docs.html @@ -0,0 +1,21 @@ +--- +layout: default +--- + +
+
+ +
+
+

{{ page.header }}

+ {{ content }} + {% include section_nav.html %} +
+
+ + {% include docs_contents.html %} + +
+ +
+
diff --git a/site/about/getting-started.md b/site/about/getting-started.md new file mode 100644 index 0000000..8c71ed4 --- /dev/null +++ b/site/about/getting-started.md @@ -0,0 +1,41 @@ +--- +layout: docs +title: Getting started +header: Getting started +prev_section: about/overview +next_section: user-guide/introduction +doc: true +--- + +Easy Rules is a Java library. It requires a Java 1.5+ runtime. + +## Building form source + +To build Easy Rules from sources, you need to have [git](http://www.git-scm.com) and [maven](http://maven.apache.org/) installed and set up. + +Please follow these instructions : + +{% highlight bash %} +$ git clone https://github.com/benas/easy-rules.git +$ mvn package +{% endhighlight %} + +Easy Rules core jar **_easyrules-core-${version}.jar_** will be generated in the target folder. + +## Use with maven + +Easy Rules is a single jar file with no dependencies. You have to simply add the jar **_easyrules-core-{{site.version}}.jar_** to your application's classpath. + +Using maven, you should add the following dependency to your pom.xml : + +```xml + + + org.easyrules + easyrules-core + {{site.version}} + + +``` + + diff --git a/site/about/overview.md b/site/about/overview.md new file mode 100644 index 0000000..2c361ae --- /dev/null +++ b/site/about/overview.md @@ -0,0 +1,21 @@ +--- +layout: docs +title: Overview +header: What is Easy rules? +next_section: about/getting-started +doc: true +--- + +Easy Rules is a simple yet powerful Java rules engine providing the following features: + +* Lightweight framework and easy to learn API +* POJO based development +* Useful abstractions to define business rules and apply them easily +* The ability to create composite rules from primitive ones +* Dynamic rule configuration at runtime using JMX + +In a very interesting [article](http://martinfowler.com/bliki/RulesEngine.html) about rules engines, [Martin Fowler](http://martinfowler.com/) says the following : + +>You can build a simple rules engine yourself. All you need is to create a bunch of objects with conditions and actions, store them in a collection, and run through them to evaluate the conditions and execute the actions. + +This is exactly what Easy Rules does, with more features like rule composition and dynamic configuration. diff --git a/site/css/gridism.css b/site/css/gridism.css new file mode 100644 index 0000000..7231987 --- /dev/null +++ b/site/css/gridism.css @@ -0,0 +1,110 @@ +/* + * Gridism + * A simple, responsive, and handy CSS grid by @cobyism + * https://github.com/cobyism/gridism + */ + +/* Preserve some sanity */ +.grid, +.unit { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +/* Set up some rules to govern the grid */ +.grid { + display: block; + clear: both; +} +.grid .unit { + float: left; + width: 100%; + padding: 10px; +} + +/* This ensures the outer gutters are equal to the (doubled) inner gutters. */ +.grid .unit:first-child { padding-left: 10px; } +.grid .unit:last-child { padding-right: 10px; } + +/* Nested grids already have padding though, so let’s nuke it */ +.unit .unit:first-child { padding-left: 0; } +.unit .unit:last-child { padding-right: 0; } +.unit .grid:first-child > .unit { padding-top: 0; } +.unit .grid:last-child > .unit { padding-bottom: 0; } + +/* Let people nuke the gutters/padding completely in a couple of ways */ +.no-gutters .unit, +.unit.no-gutters { + padding: 0 !important; +} + +/* Wrapping at a maximum width is optional */ +.wrap .grid, +.grid.wrap { + max-width: 978px; + margin: 0 auto; +} + +/* Width classes also have shorthand versions numbered as fractions + * For example: for a grid unit 1/3 (one third) of the parent width, + * simply apply class="w-1-3" to the element. */ +.grid .whole, .grid .w-1-1 { width: 100%; } +.grid .half, .grid .w-1-2 { width: 50%; } +.grid .one-third, .grid .w-1-3 { width: 33.3332%; } +.grid .two-thirds, .grid .w-2-3 { width: 66.6665%; } +.grid .one-quarter, .grid .w-1-4 { width: 25%; } +.grid .three-quarters, .grid .w-3-4 { width: 75%; } +.grid .one-fifth, .grid .w-1-5 { width: 20%; } +.grid .two-fifths, .grid .w-2-5 { width: 40%; } +.grid .three-fifths, .grid .w-3-5 { width: 60%; } +.grid .four-fifths, .grid .w-4-5 { width: 80%; } +.grid .golden-small, .grid .w-g-s { width: 38.2716%; } /* Golden section: smaller piece */ +.grid .golden-large, .grid .w-g-l { width: 61.7283%; } /* Golden section: larger piece */ + +/* Utility classes */ +.align-center { text-align: center; } +.align-left { text-align: left; } +.align-right { text-align: right; } +.pull-left { float: left; } +.pull-right { float: right; } + +.show-on-mobiles { + display: none; +} + +/* Responsive Stuff */ +@media screen and (max-width: 568px) { + /* Stack anything that isn’t full-width on smaller screens */ + .grid .unit { + width: 100% !important; + padding-left: 20px; + padding-right: 20px; + } + .unit .grid .unit { + padding-left: 0px; + padding-right: 0px; + } + + /* Sometimes, you just want to be different on small screens */ + .center-on-mobiles { + text-align: center !important; + } + .hide-on-mobiles { + display: none !important; + } + .show-on-mobiles { + display: block !important; + } + a .show-on-mobiles { + display: inline !important; + } +} + +/* Expand the wrap a bit further on larger screens */ +/*@media screen and (min-width: 1180px) { + .wrap .grid { + max-width: 1180px; + margin: 0 auto; + } +}*/ diff --git a/site/css/normalize.css b/site/css/normalize.css new file mode 100755 index 0000000..e1adf43 --- /dev/null +++ b/site/css/normalize.css @@ -0,0 +1,504 @@ +/*! normalize.css 2012-03-11T12:53 UTC - http://github.com/necolas/normalize.css */ + +/* ============================================================================= + HTML5 display definitions + ========================================================================== */ + +/* + * Corrects block display not defined in IE6/7/8/9 & FF3 + */ + +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +nav, +section, +summary { + display: block; +} + +/* + * Corrects inline-block display not defined in IE6/7/8/9 & FF3 + */ + +audio, +canvas, +video { + display: inline-block; + *display: inline; + *zoom: 1; +} + +/* + * Prevents modern browsers from displaying 'audio' without controls + * Remove excess height in iOS5 devices + */ + +audio:not([controls]) { + display: none; + height: 0; +} + +/* + * Addresses styling for 'hidden' attribute not present in IE7/8/9, FF3, S4 + * Known issue: no IE6 support + */ + +[hidden] { + display: none; +} + + +/* ============================================================================= + Base + ========================================================================== */ + +/* + * 1. Corrects text resizing oddly in IE6/7 when body font-size is set using em units + * http://clagnut.com/blog/348/#c790 + * 2. Prevents iOS text size adjust after orientation change, without disabling user zoom + * www.456bereastreet.com/archive/201012/controlling_text_size_in_safari_for_ios_without_disabling_user_zoom/ + */ + +html { + font-size: 100%; /* 1 */ + -webkit-text-size-adjust: 100%; /* 2 */ + -ms-text-size-adjust: 100%; /* 2 */ +} + +/* + * Addresses font-family inconsistency between 'textarea' and other form elements. + */ + +html, +button, +input, +select, +textarea { + font-family: sans-serif; +} + +/* + * Addresses margins handled incorrectly in IE6/7 + */ + +body { + margin: 0; +} + + +/* ============================================================================= + Links + ========================================================================== */ + +/* + * Addresses outline displayed oddly in Chrome + */ + +a:focus { + outline: thin dotted; +} + +/* + * Improves readability when focused and also mouse hovered in all browsers + * people.opera.com/patrickl/experiments/keyboard/test + */ + +a:hover, +a:active { + outline: 0; +} + + +/* ============================================================================= + Typography + ========================================================================== */ + +/* + * Addresses font sizes and margins set differently in IE6/7 + * Addresses font sizes within 'section' and 'article' in FF4+, Chrome, S5 + */ + +h1 { + font-size: 2em; + margin: 0.67em 0; +} + +h2 { + font-size: 1.5em; + margin: 0.83em 0; +} + +h3 { + font-size: 1.17em; + margin: 1em 0; +} + +h4 { + font-size: 1em; + margin: 1.33em 0; +} + +h5 { + font-size: 0.83em; + margin: 1.67em 0; +} + +h6 { + font-size: 0.75em; + margin: 2.33em 0; +} + +/* + * Addresses styling not present in IE7/8/9, S5, Chrome + */ + +abbr[title] { + border-bottom: 1px dotted; +} + +/* + * Addresses style set to 'bolder' in FF3+, S4/5, Chrome +*/ + +b, +strong { + font-weight: bold; +} + +blockquote { + margin: 1em 40px; +} + +/* + * Addresses styling not present in S5, Chrome + */ + +dfn { + font-style: italic; +} + +/* + * Addresses styling not present in IE6/7/8/9 + */ + +mark { + background: #ff0; + color: #000; +} + +/* + * Addresses margins set differently in IE6/7 + */ + +p, +pre { + margin: 1em 0; +} + +/* + * Corrects font family set oddly in IE6, S4/5, Chrome + * en.wikipedia.org/wiki/User:Davidgothberg/Test59 + */ + +pre, +code, +kbd, +samp { + font-family: monospace, serif; + _font-family: 'courier new', monospace; + font-size: 1em; +} + +/* + * Improves readability of pre-formatted text in all browsers + */ + +pre { + white-space: pre; + white-space: pre-wrap; + word-wrap: break-word; +} + +/* + * 1. Addresses CSS quotes not supported in IE6/7 + * 2. Addresses quote property not supported in S4 + */ + +/* 1 */ + +q { + quotes: none; +} + +/* 2 */ + +q:before, +q:after { + content: ''; + content: none; +} + +small { + font-size: 75%; +} + +/* + * Prevents sub and sup affecting line-height in all browsers + * gist.github.com/413930 + */ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sup { + top: -0.5em; +} + +sub { + bottom: -0.25em; +} + + +/* ============================================================================= + Lists + ========================================================================== */ + +/* + * Addresses margins set differently in IE6/7 + */ + +dl, +menu, +ol, +ul { + margin: 1em 0; +} + +dd { + margin: 0 0 0 40px; +} + +/* + * Addresses paddings set differently in IE6/7 + */ + +menu, +ol, +ul { + padding: 0 0 0 40px; +} + +/* + * Corrects list images handled incorrectly in IE7 + */ + +nav ul, +nav ol { + list-style: none; + list-style-image: none; +} + + +/* ============================================================================= + Embedded content + ========================================================================== */ + +/* + * 1. Removes border when inside 'a' element in IE6/7/8/9, FF3 + * 2. Improves image quality when scaled in IE7 + * code.flickr.com/blog/2008/11/12/on-ui-quality-the-little-things-client-side-image-resizing/ + */ + +img { + border: 0; /* 1 */ + -ms-interpolation-mode: bicubic; /* 2 */ +} + +/* + * Corrects overflow displayed oddly in IE9 + */ + +svg:not(:root) { + overflow: hidden; +} + + +/* ============================================================================= + Figures + ========================================================================== */ + +/* + * Addresses margin not present in IE6/7/8/9, S5, O11 + */ + +figure { + margin: 0; +} + + +/* ============================================================================= + Forms + ========================================================================== */ + +/* + * Corrects margin displayed oddly in IE6/7 + */ + +form { + margin: 0; +} + +/* + * Define consistent border, margin, and padding + */ + +fieldset { + border: 1px solid #c0c0c0; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; +} + +/* + * 1. Corrects color not being inherited in IE6/7/8/9 + * 2. Corrects text not wrapping in FF3 + * 3. Corrects alignment displayed oddly in IE6/7 + */ + +legend { + border: 0; /* 1 */ + padding: 0; + white-space: normal; /* 2 */ + *margin-left: -7px; /* 3 */ +} + +/* + * 1. Corrects font size not being inherited in all browsers + * 2. Addresses margins set differently in IE6/7, FF3+, S5, Chrome + * 3. Improves appearance and consistency in all browsers + */ + +button, +input, +select, +textarea { + font-size: 100%; /* 1 */ + margin: 0; /* 2 */ + vertical-align: baseline; /* 3 */ + *vertical-align: middle; /* 3 */ +} + +/* + * Addresses FF3/4 setting line-height on 'input' using !important in the UA stylesheet + */ + +button, +input { + line-height: normal; /* 1 */ +} + +/* + * 1. Improves usability and consistency of cursor style between image-type 'input' and others + * 2. Corrects inability to style clickable 'input' types in iOS + * 3. Removes inner spacing in IE7 without affecting normal text inputs + * Known issue: inner spacing remains in IE6 + */ + +button, +input[type="button"], +input[type="reset"], +input[type="submit"] { + cursor: pointer; /* 1 */ + -webkit-appearance: button; /* 2 */ + *overflow: visible; /* 3 */ +} + +/* + * Re-set default cursor for disabled elements + */ + +button[disabled], +input[disabled] { + cursor: default; +} + +/* + * 1. Addresses box sizing set to content-box in IE8/9 + * 2. Removes excess padding in IE8/9 + * 3. Removes excess padding in IE7 + Known issue: excess padding remains in IE6 + */ + +input[type="checkbox"], +input[type="radio"] { + box-sizing: border-box; /* 1 */ + padding: 0; /* 2 */ + *height: 13px; /* 3 */ + *width: 13px; /* 3 */ +} + +/* + * 1. Addresses appearance set to searchfield in S5, Chrome + * 2. Addresses box-sizing set to border-box in S5, Chrome (include -moz to future-proof) + */ + +input[type="search"] { + -webkit-appearance: textfield; /* 1 */ + -moz-box-sizing: content-box; + -webkit-box-sizing: content-box; /* 2 */ + box-sizing: content-box; +} + +/* + * Removes inner padding and search cancel button in S5, Chrome on OS X + */ + +input[type="search"]::-webkit-search-decoration, +input[type="search"]::-webkit-search-cancel-button { + -webkit-appearance: none; +} + +/* + * Removes inner padding and border in FF3+ + * www.sitepen.com/blog/2008/05/14/the-devils-in-the-details-fixing-dojos-toolbar-buttons/ + */ + +button::-moz-focus-inner, +input::-moz-focus-inner { + border: 0; + padding: 0; +} + +/* + * 1. Removes default vertical scrollbar in IE6/7/8/9 + * 2. Improves readability and alignment in all browsers + */ + +textarea { + overflow: auto; /* 1 */ + vertical-align: top; /* 2 */ +} + + +/* ============================================================================= + Tables + ========================================================================== */ + +/* + * Remove most spacing between table cells + */ + +table { + border-collapse: collapse; + border-spacing: 0; +} \ No newline at end of file diff --git a/site/css/pygments.css b/site/css/pygments.css new file mode 100644 index 0000000..a6dcbc5 --- /dev/null +++ b/site/css/pygments.css @@ -0,0 +1,70 @@ +.highlight .hll { background-color: #222222 } +/* .highlight { background: #000000; color: #cccccc } */ +.highlight .c { color: #777777; font-style: italic } /* Comment */ +.highlight .err { color: #cccccc; border: 1px solid #FF0000 } /* Error */ +.highlight .g { color: #cccccc } /* Generic */ +.highlight .k { color: #cdcd00 } /* Keyword */ +.highlight .l { color: #cccccc } /* Literal */ +.highlight .n { color: #cccccc } /* Name */ +.highlight .o { color: #3399cc } /* Operator */ +.highlight .x { color: #cccccc } /* Other */ +.highlight .p { color: #cccccc } /* Punctuation */ +.highlight .cm { color: #777777; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #777777; font-style: italic } /* Comment.Preproc */ +.highlight .c1 { color: #777777; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #cd5c5c; font-weight: bold } /* Comment.Special */ +.highlight .gd { color: #cd5c5c } /* Generic.Deleted */ +.highlight .ge { color: #cccccc; font-style: italic } /* Generic.Emph */ +.highlight .gr { color: #FF0000 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #00cd00 } /* Generic.Inserted */ +.highlight .go { color: #888888 } /* Generic.Output */ +.highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ +.highlight .gs { color: #cccccc; font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #0044DD } /* Generic.Traceback */ +.highlight .kc { color: #cdcd00 } /* Keyword.Constant */ +.highlight .kd { color: #00cd00 } /* Keyword.Declaration */ +.highlight .kn { color: #cd00cd } /* Keyword.Namespace */ +.highlight .kp { color: #cdcd00 } /* Keyword.Pseudo */ +.highlight .kr { color: #cdcd00 } /* Keyword.Reserved */ +.highlight .kt { color: #00cd00 } /* Keyword.Type */ +.highlight .ld { color: #cccccc } /* Literal.Date */ +.highlight .m { color: #cd00cd } /* Literal.Number */ +.highlight .s { color: #cd5c5c } /* Literal.String */ +.highlight .na { color: #008080 } /* Name.Attribute */ +.highlight .nb { color: #cd00cd } /* Name.Builtin */ +.highlight .nc { color: #00cdcd } /* Name.Class */ +.highlight .no { color: #cccccc } /* Name.Constant */ +.highlight .nd { color: #cccc00 } /* Name.Decorator */ +.highlight .ni { color: #cccccc } /* Name.Entity */ +.highlight .ne { color: #666699; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #f0e68c } /* Name.Function */ +.highlight .nl { color: #cccccc } /* Name.Label */ +.highlight .nn { color: #cccccc } /* Name.Namespace */ +.highlight .nx { color: #cccccc } /* Name.Other */ +.highlight .py { color: #cccccc } /* Name.Property */ +.highlight .nt { color: #00cccc } /* Name.Tag */ +.highlight .nv { color: #00cdcd } /* Name.Variable */ +.highlight .ow { color: #cdcd00 } /* Operator.Word */ +.highlight .w { color: #cccccc } /* Text.Whitespace */ +.highlight .mf { color: #cd00cd } /* Literal.Number.Float */ +.highlight .mh { color: #cd00cd } /* Literal.Number.Hex */ +.highlight .mi { color: #cd00cd } /* Literal.Number.Integer */ +.highlight .mo { color: #cd00cd } /* Literal.Number.Oct */ +.highlight .sb { color: #cd5c5c } /* Literal.String.Backtick */ +.highlight .sc { color: #cd5c5c } /* Literal.String.Char */ +.highlight .sd { color: #cd5c5c } /* Literal.String.Doc */ +.highlight .s2 { color: #cd5c5c } /* Literal.String.Double */ +.highlight .se { color: #cd5c5c } /* Literal.String.Escape */ +.highlight .sh { color: #cd5c5c } /* Literal.String.Heredoc */ +.highlight .si { color: #cd5c5c } /* Literal.String.Interpol */ +.highlight .sx { color: #cd5c5c } /* Literal.String.Other */ +.highlight .sr { color: #cd5c5c } /* Literal.String.Regex */ +.highlight .s1 { color: #cd5c5c } /* Literal.String.Single */ +.highlight .ss { color: #cd5c5c } /* Literal.String.Symbol */ +.highlight .bp { color: #cd00cd } /* Name.Builtin.Pseudo */ +.highlight .vc { color: #00cdcd } /* Name.Variable.Class */ +.highlight .vg { color: #00cdcd } /* Name.Variable.Global */ +.highlight .vi { color: #00cdcd } /* Name.Variable.Instance */ +.highlight .il { color: #cd00cd } /* Literal.Number.Integer.Long */ diff --git a/site/css/style.css b/site/css/style.css new file mode 100644 index 0000000..71818c0 --- /dev/null +++ b/site/css/style.css @@ -0,0 +1,1007 @@ +/* Base */ + +* { + box-sizing: border-box; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; +} + +body { + font-family: Lato, 'Helvetica Neue', Helvetica, Arial, sans-serif; + font-size: 21px; + font-weight: 300; + color: #ddd; + background: #333; + border-top: 5px solid #fc0; + box-shadow: inset 0 3px 30px rgba(0,0,0,.3); + text-shadow: 0 1px 3px rgba(0,0,0,.5); +} + +.clear { + display: block; +} + +.clear:after { + content: " "; + display: block; + height: 0; + clear: both; + visibility: hidden; +} + +/* Sections */ + +body > header, body > section, body > footer { + float: left; + width: 100%; + clear: both; +} + +/* Header */ + +body > header h1, body > header nav { + display: inline-block; +} + +body > header h1 { + margin-top: 20px; +} + +body > header small { + margin-bottom: 20px; + display: block; + font-size: 1em; + font-style: italic; + font-weight: bold; + white-space: nowrap; +} + +body > header h1 span { + font-size: 1.5em; +} + +body > header .shadow { + text-shadow: 0px 3.2px 0px rgba(0,0,0,.5); +} + +nav ul { + padding: 0; + margin: 0; +} + +nav li { + display: inline-block; +} + +.main-nav { + margin-top: 52px; +} + +.main-nav li { + margin-right: 10px; +} + +.main-nav li a { + border-radius: 5px; + font-weight: 800; + font-size: 14px; + padding: 0.5em 1em; + text-shadow: none; + text-transform: uppercase; + transition: all .25s; + -moz-transition: all .25s; + -webkit-transition: all .25s; +} + +.main-nav li a:hover { + background: #252525; + box-shadow: inset 0 1px 3px rgba(0,0,0,.5), 0 1px 0 rgba(255,255,255,.1); + text-shadow: 0 1px 3px rgba(0,0,0,.5); +} + +.main-nav li.current a { + background: #fc0; + color: #222; + box-shadow: inset 0 1px 0 rgba(255,255,255,.5), 0 1px 5px rgba(0,0,0,.5); + text-shadow: 0 1px 0 rgba(255,255,255,.3); +} + +.mobile-nav ul { + overflow: hidden; + width: 100%; + display: table; +} + +.mobile-nav a { + float: left; + width: 100%; + background: #333; + color: #fc0; + text-align: center; + text-transform: uppercase; + font-size: 14px; + font-weight: 800; + padding: 5px; + border-radius: 5px; +} + +.mobile-nav .current a { + background: #fc0; + color: #222; + box-shadow: inset 0 1px 0 rgba(255,255,255,.5), 0 1px 5px rgba(0,0,0,.5); + text-shadow: 0 1px 0 rgba(255,255,255,.3); +} + +.mobile-nav li { + display: table-cell; + width: 25%; + padding: 8px; +} + +@media (max-width: 768px){ + .main-nav ul { + text-align: right; + } +} +@media (max-width: 830px){ + .main-nav .show-on-mobiles { + display: inline; + } + .main-nav .hide-on-mobiles { + display: none; + } +} + +/* Footer */ + +body > footer { + background: #222; + font-size: 16px; + padding-bottom: 5px; + color: #888; + margin-top: 40px; +} + +body > footer a { + color: #fff; +} + +body > footer .align-right p, body > footer img { + display: inline-block; +} + +body > footer img { + position: relative; + top: 8px; + margin-left: 5px; + width: 100px; + height: 30px; + opacity: .8; + padding: 1px; + -webkit-transition: opacity .2s; + -moz-transition: opacity .2s; + transition: opacity .2s; +} + +body > footer a:hover img { + opacity: 1; +} + +@media (max-width: 568px){ + footer .one-third p { + margin-bottom: 0; + } + footer .two-thirds p { + margin-top: -20px; + } +} + +/* Intro */ + +.intro .unit { + padding: 10px 0 40px; + font-style: italic; +} + +.intro p { + font-size: 1.75em; + line-height: 1em; + margin: 0; +} + +@media (min-width: 569px){ + .intro p { + font-size: 3.2em; + } +} + +/* Quickstart */ + +.quickstart { + background: #3F1F1F; + color: #fff; + margin: 60px 0; + box-shadow: inset 0 3px 10px rgba(0,0,0,.4); +} + +.quickstart .content { + padding: 0px 0; +} + +.quickstart h4 { + font-size: 24px; + line-height: 24px; + margin-top: 20px; + text-shadow: 0 1px 3px rgba(0,0,0,.8); +} + +.quickstart .code { + font-size: 12px; + display: block; + margin: 0 0 -30px; +} + +@media (min-width: 768px){ + .quickstart .code { + font-size: 18px; + margin: -30px 0; + float: right; + } + .quickstart h4 { + margin: 50px 0 0; + text-align: center; + } +} + +/* Code */ + +.quickstart .code { + display: block; + padding: 0; + font-family: Menlo, Consolas, "Courier New", Courier, "Liberation Mono", monospace; + line-height: 1.3em; +} + +.quickstart .code .title { + display: block; + text-align: center; + margin: 0 20px; + padding: 5px 0; + border-radius: 5px 5px 0 0; + box-shadow: 0 3px 10px rgba(0,0,0,.5); + font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; + font-size: 16px; + font-weight: normal; + color: #444; + text-shadow: 0 1px 0 rgba(255,255,255,.5); + background: #f7f7f7; + background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2Y3ZjdmNyIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjclIiBzdG9wLWNvbG9yPSIjY2ZjZmNmIiBzdG9wLW9wYWNpdHk9IjEiLz4KICAgIDxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2FhYWFhYSIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cmVjdCB4PSIwIiB5PSIwIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBmaWxsPSJ1cmwoI2dyYWQtdWNnZy1nZW5lcmF0ZWQpIiAvPgo8L3N2Zz4=); + background: -moz-linear-gradient(top, #f7f7f7 0%, #cfcfcf 7%, #aaaaaa 100%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#f7f7f7), color-stop(7%,#cfcfcf), color-stop(100%,#aaaaaa)); + background: -webkit-linear-gradient(top, #f7f7f7 0%,#cfcfcf 7%,#aaaaaa 100%); + background: -o-linear-gradient(top, #f7f7f7 0%,#cfcfcf 7%,#aaaaaa 100%); + background: -ms-linear-gradient(top, #f7f7f7 0%,#cfcfcf 7%,#aaaaaa 100%); + background: linear-gradient(top, #f7f7f7 0%,#cfcfcf 7%,#aaaaaa 100%); + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f7f7f7', endColorstr='#aaaaaa',GradientType=0 ); + border-bottom: 1px solid #111; +} + +.quickstart .code .shell { + padding: 0px; + text-shadow: none; + margin: 0 20px; + background: #3d3d3d; + border-radius: 0 0 5px 5px; + box-shadow: 0 5px 30px rgba(0,0,0,.3); +} + +.quickstart .code .line { + display: block; + margin: 0; + padding: 0; +} + +.quickstart .code .line span { + display: inline-block; +} + +.quickstart .code .path { + color: #87ceeb; +} + +.quickstart .code .prompt { + color: #cd5c5c; +} + +.quickstart .code .command { + color: #f0e68c; +} + +.quickstart .code .output { + color: #888; +} + +/* Free Hosting */ + +.free-hosting .pane { + background: #444; + border-radius: 10px; + text-shadow: none; + position: relative; + padding: 0 20px 30px; +} + +.free-hosting img { + margin: -30px 0 0; + width: 180px; + height: 150px; +} + +.free-hosting h2 { + font-size: 28px; +} + +.free-hosting p, +.free-hosting a { + font-size: 16px; +} + +.free-hosting p { + margin: .75em 0; +} + +@media (min-width: 768px){ + .free-hosting img { + float: left; + margin: -20px -30px -30px -50px; + width: 300px; + height: 251px; + } + .free-hosting .pane-content { + margin-top: 35px; + padding-right: 30px; + } + .free-hosting p, + .free-hosting a { + font-size: 18px; + } + .free-hosting .pane:after { + content: " "; + float: right; + background: url(../img/footer-arrow.png) top left no-repeat; + width: 73px; + height: 186px; + position: absolute; + right: 0; + bottom: -30px; + } +} + +/* Article - Used for both docs and news */ + + +article { + background: #444; + border-radius: 10px; + padding: 20px; + margin: 0 10px; + box-shadow: 0 3px 10px rgba(0,0,0,.1); + font-size: 16px; +} + +@media (max-width: 480px){ + article ul { + padding-left: 20px; + } +} + +@media (max-width: 568px){ + article { + margin: 0; + } +} + +@media (min-width: 768px){ + article { + padding: 40px 40px 30px; + font-size: 21px; + } +} + +/* Right-side nav - used by both docs and news */ + +aside { + padding-top: 30px; +} + +aside h4 { + text-transform: uppercase; + font-size: 14px; + font-weight: 700; + padding: 0 0 10px 30px; + margin-left: -30px; + display: inline-block; + border-bottom: 1px solid #c00; +} + +aside ul { + padding-left: 0; +} + +aside ul:first-child { + margin-top: 0; +} + +aside li { + list-style-type: none; +} + +aside li a { + font-size: 16px; + position: relative +} + +aside li.current a:before { + content: ""; + border-color: transparent transparent transparent #444; + border-style: solid; + border-width: 10px; + width: 0; + height: 0; + position: absolute; + top: 0; + left: -30px; +} + +/* Documentation */ + +.docs article { + min-height: 800px; +} + +.docs .content { + padding: 0; +} + +.section-nav { + text-align: center; + padding-top: 40px; + position: relative; + background: url(../img/article-footer.png) top center no-repeat; + margin: 40px -20px 10px; +} + +.section-nav > div { + width: 49.5%; +} + +.section-nav a, .section-nav span { + color: #fff; + font-size: 16px; + text-transform: uppercase; + font-weight: 700; + padding: 8px 12px 10px; + border-radius: 5px; + /*border: 1px solid #333;*/ + box-shadow: 0 1px 3px rgba(0,0,0,.3), inset 0 1px 1px rgba(255,255,255,.5); + background: #777; +} + +.section-nav a:hover { + color: #fff; + background: #888; +} + +.section-nav .next, .section-nav .prev { + position: relative; +} + +.section-nav .next:after, .section-nav .prev:before { + font-size: 36px; + color: #222; + font-weight: 800; + text-shadow: 0 1px 0 rgba(255,255,255,.4); + position: absolute; + top: -7px; +} + +.section-nav .next:after { + content: "›"; + right: 10px; +} + +.section-nav .prev:before { + content: "‹"; + left: 10px; +} + +.section-nav .prev, .section-nav .prev:hover { + /*float: left;*/ + padding-left: 30px; +} + +.section-nav .next, .section-nav .next:hover { + /*float: right;*/ + padding-right: 30px; +} + +.section-nav .disabled { + opacity: .5; + /*filter: alpha*/ + cursor: default; +} + +.docs-nav-mobile select { + width: 100%; +} + +/* News */ + +article h2:first-child { + margin-top: 0; +} + +.post-category, +.post-meta { + display: inline-block; + vertical-align: middle; + font-size: .8em; +} + +.post-category { + display: inline-block; + margin-left: -30px; + padding: 6px 10px 8px; + padding-left: 50px; + border-radius: 0 5px 5px 0; + position: relative; + box-shadow: 0 1px 5px rgba(0, 0, 0, .3), inset 0 1px 0 rgba(255,255,255,.2), inset 0 -1px 0 rgba(0,0,0,.3); + background: #9e2812; + background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzllMjgxMiIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiM2ZjBkMGQiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+); + background: -moz-linear-gradient(top, #9e2812 0%, #6f0d0d 100%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#9e2812), color-stop(100%,#6f0d0d)); + background: -webkit-linear-gradient(top, #9e2812 0%,#6f0d0d 100%); + background: -o-linear-gradient(top, #9e2812 0%,#6f0d0d 100%); + background: -ms-linear-gradient(top, #9e2812 0%,#6f0d0d 100%); + background: linear-gradient(to bottom, #9e2812 0%,#6f0d0d 100%); + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#9e2812', endColorstr='#6f0d0d',GradientType=0 ); +} + +.label { + float: left; + text-transform: uppercase; + font-weight: bold; + text-shadow: 0 -1px 0 rgba(0,0,0,.5); +} + +@media (max-width: 568px){ + .post-category { + padding-left: 30px; + } +} + +@media (min-width: 768px){ + .post-category { + margin-left: -50px; + } +} + +.post-category:before { + content: ""; + position: absolute; + top: -10px; + left: 0px; + border-color: transparent #6f0d0d #6f0d0d transparent; + border-style: solid; + border-width: 5px; + width: 0; + height: 0; +} + +.avatar { + width: 24px; + height: 24px; + border-radius: 3px; + display: inline-block; + vertical-align: middle; +} + +.post-meta { + padding: 5px 0; + color: #aaa; + font-weight: 600; + text-shadow: 0 -1px 0 #000; +} + +.post-date, +.post-author { + margin-left: 10px; +} + +.news article + article { + margin-top: -10px; + border-radius: 0 0 10px 10px; + border-top: 1px solid #555; + box-shadow: 0 -1px 0 #2f2f2f; +} + +/* Code Highlighting */ + + +pre, code { + white-space: pre; + display: inline-block; + margin: 0; + padding: 0; + font-family: Menlo, Consolas, "Courier New", Courier, "Liberation Mono", monospace; + font-size: 14px; + padding: 0 .5em; + line-height: 1.8em; +} + +@media (min-width: 768px){ + pre, code { + font-size: 16px; + } +} + +.highlight, p > pre, p > code, p > nobr > code, li > code, h5 > code, .note > code { + background: #333; + color: #fff; + border-radius: 5px; + box-shadow: inset 0 1px 10px rgba(0,0,0,.3), + 0 1px 0 rgba(255,255,255,.1), + 0 -1px 0 rgba(0,0,0,.5); +} + +.note code { + background-color: rgba(0,0,0,0.2); + margin-left: 2.5px; + margin-right: 2.5px; + font-size: 0.8em; +} + +.highlight { + padding: 10px 0; + width: 100%; + overflow: auto; +} + +/* HTML Elements */ + +h1, h2, h3, h4, h5, h6 { + margin: 0; +} + +a { + color: #fc0; + text-decoration: none; + transition: all .25s; + -moz-transition: all .25s; + -webkit-transition: all .25s; +} + +a:hover { + color: #f90; +} + +strong { + font-weight: 700; +} + +p { + line-height: 1.5em; +} + +.left { float: left; } +.right { float: right; } +.align-right { text-align: right; } +.align-left { text-align: left; } +.align-center { text-align: center; } + +/* Article HTML */ + +article h2, +article h3, +article h4, +article h5, +article h6 { + margin: 1em 0; +} + +article h4 { + color: #fff; +} + +h5, h6 { + font-size: 1em; + font-style: italic; +} + +article ul li p { + margin: 0; +} + +article ul li, article ol li { + line-height: 1.5em; + margin-bottom: 0.5em; +} + +article ul li blockquote { + margin: 10px 0; +} + +blockquote { + border-left: 2px solid #777; + padding-left: 20px; + font-style: italic; + font-size: 18px; + font-weight: 500; +} + + +/* Tables */ + +table { + width: 100%; + background: #555; + margin: .5em 0; + border-radius: 5px; + box-shadow: 0 1px 3px rgba(0,0,0,.3); +} + +thead { + border-top-left-radius: 5px; + border-top-right-radius: 5px; + color: #fff; + background: #3a3a3a; + background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzNhM2EzYSIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiMxZTFlMWUiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+); + background: -moz-linear-gradient(top, #3a3a3a 0%, #1e1e1e 100%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#3a3a3a), color-stop(100%,#1e1e1e)); + background: -webkit-linear-gradient(top, #3a3a3a 0%,#1e1e1e 100%); + background: -o-linear-gradient(top, #3a3a3a 0%,#1e1e1e 100%); + background: -ms-linear-gradient(top, #3a3a3a 0%,#1e1e1e 100%); + background: linear-gradient(to bottom, #3a3a3a 0%,#1e1e1e 100%); + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#3a3a3a', endColorstr='#1e1e1e',GradientType=0 ); +} + +thead th { + position: relative; + box-shadow: inset 0 1px 0 rgba(255,255,255,.1); +} + +thead th:first-child { + border-top-left-radius: 5px; +} + +thead th:last-child { + border-top-right-radius: 5px; +} + +td { + padding: .5em .75em; +} + +td p { + margin: 0; +} + +th { + text-transform: uppercase; + font-size: 16px; + padding: .5em .75em; + text-shadow: 0 -1px 0 rgba(0,0,0,.9); + color: #888; +} + +tbody td { + border-top: 1px solid rgba(0,0,0,.1); + box-shadow: inset 0 1px 0 rgba(255,255,255,.1); + background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2ZmZmZmZiIgc3RvcC1vcGFjaXR5PSIwLjEiLz4KICAgIDxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2ZmZmZmZiIgc3RvcC1vcGFjaXR5PSIwIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cmVjdCB4PSIwIiB5PSIwIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBmaWxsPSJ1cmwoI2dyYWQtdWNnZy1nZW5lcmF0ZWQpIiAvPgo8L3N2Zz4=); + background: -moz-linear-gradient(top, rgba(255,255,255,0.1) 0%, rgba(255,255,255,0) 100%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(255,255,255,0.1)), color-stop(100%,rgba(255,255,255,0))); + background: -webkit-linear-gradient(top, rgba(255,255,255,0.1) 0%,rgba(255,255,255,0) 100%); + background: -o-linear-gradient(top, rgba(255,255,255,0.1) 0%,rgba(255,255,255,0) 100%); + background: -ms-linear-gradient(top, rgba(255,255,255,0.1) 0%,rgba(255,255,255,0) 100%); + background: linear-gradient(to bottom, rgba(255,255,255,0.1) 0%,rgba(255,255,255,0) 100%); + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#1affffff', endColorstr='#00ffffff',GradientType=0 ); +} + +td p { + font-size: 16px; +} + +td p code { + font-size: 14px; +} + +code.option, th .option, code.filter, th .filter { + color: #50B600; +} + +code.flag, th .flag, code.output, th .output { + color: #049DCE; +} + +code.option, code.flag, code.filter, code.output { + margin-bottom: 2px; +} + +/* Note types */ + +.note { + margin: 30px 0; + margin-left: -30px; + padding: 20px 20px 24px; + padding-left: 50px; + border-radius: 0 5px 5px 0; + position: relative; + box-shadow: 0 1px 5px rgba(0, 0, 0, .3), inset 0 1px 0 rgba(255,255,255,.2), inset 0 -1px 0 rgba(0,0,0,.3); + background: #7e6d42; + background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzdlNmQ0MiIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiM1YzRlMzUiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+); + background: -moz-linear-gradient(top, #7e6d42 0%, #5c4e35 100%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#7e6d42), color-stop(100%,#5c4e35)); + background: -webkit-linear-gradient(top, #7e6d42 0%,#5c4e35 100%); + background: -o-linear-gradient(top, #7e6d42 0%,#5c4e35 100%); + background: -ms-linear-gradient(top, #7e6d42 0%,#5c4e35 100%); + background: linear-gradient(to bottom, #7e6d42 0%,#5c4e35 100%); + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#7e6d42', endColorstr='#5c4e35',GradientType=0 ); +} + +@media (max-width: 568px){ + .note { + margin-right: -30px; + } +} + +@media (min-width: 768px){ + .note { + margin-left: -50px; + } +} + +.note:before { + content: ""; + position: absolute; + top: -10px; + left: 0px; + border-color: transparent #222 #222 transparent; + border-style: solid; + border-width: 5px; + width: 0; + height: 0; +} + +.note h5, .note p { + margin: 0; + color: #fff; +} + +.note h5 { + line-height: 1.5em; + font-weight: 800; + font-style: normal; +} + +.note p { + font-weight: 400; + font-size: .75em; +} + +.info { + background: #0389aa; + background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzAzODlhYSIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiMwMDYxN2YiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+); + background: -moz-linear-gradient(top, #0389aa 0%, #00617f 100%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#0389aa), color-stop(100%,#00617f)); + background: -webkit-linear-gradient(top, #0389aa 0%,#00617f 100%); + background: -o-linear-gradient(top, #0389aa 0%,#00617f 100%); + background: -ms-linear-gradient(top, #0389aa 0%,#00617f 100%); + background: linear-gradient(to bottom, #0389aa 0%,#00617f 100%); + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#0389aa', endColorstr='#00617f',GradientType=0 ); +} + +.warning { + background: #9e2812; + background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzllMjgxMiIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiM2ZjBkMGQiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+); + background: -moz-linear-gradient(top, #9e2812 0%, #6f0d0d 100%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#9e2812), color-stop(100%,#6f0d0d)); + background: -webkit-linear-gradient(top, #9e2812 0%,#6f0d0d 100%); + background: -o-linear-gradient(top, #9e2812 0%,#6f0d0d 100%); + background: -ms-linear-gradient(top, #9e2812 0%,#6f0d0d 100%); + background: linear-gradient(to bottom, #9e2812 0%,#6f0d0d 100%); + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#9e2812', endColorstr='#6f0d0d',GradientType=0 ); +} + +.unreleased { + background: rgb(205,146,57); /* Old browsers */ + /* IE9 SVG, needs conditional override of 'filter' to 'none' */ + background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzllMjgxMiIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiM2ZjBkMGQiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+); + background: -moz-linear-gradient(top, rgba(205,146,57,1) 0%, rgba(162,117,40,1) 100%); /* FF3.6+ */ + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(205,146,57,1)), color-stop(100%,rgba(162,117,40,1))); /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, rgba(205,146,57,1) 0%,rgba(162,117,40,1) 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, rgba(205,146,57,1) 0%,rgba(162,117,40,1) 100%); /* Opera 11.10+ */ + background: -ms-linear-gradient(top, rgba(205,146,57,1) 0%,rgba(162,117,40,1) 100%); /* IE10+ */ + background: linear-gradient(to bottom, rgba(205,146,57,1) 0%,rgba(162,117,40,1) 100%); /* W3C */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#cd9239', endColorstr='#a27528',GradientType=0 ); /* IE6-8 */ +} + + +.info:before { + border-color: transparent #00617f #00617f transparent; +} + +.warning:before { + border-color: transparent #6f0d0d #6f0d0d transparent; +} + +.unreleased:before { + border-color: transparent #664719 #664719 transparent; +} + +.note:after { + content: "★"; + color: #fc0; + position: absolute; + top: 14px; + left: 14px; + font-size: 28px; + font-weight: bold; + text-shadow: 0 -1px 0 rgba(0,0,0,.5); +} + +.info:after { + content: "ⓘ"; + color: #fff; + position: absolute; + top: 15px; + left: 15px; + font-size: 28px; + font-weight: bold; + text-shadow: 0 -1px 0 rgba(0,0,0,.5); +} + +.warning:after { + content: "‼"; + color: #fc0; + position: absolute; + top: 15px; + left: 15px; + font-size: 32px; + font-weight: bold; + text-shadow: 0 -1px 0 rgba(0,0,0,.5); +} + +.unreleased:after { + content: "⚒"; + color: #2b2a12; + position: absolute; + top: 8px; + left: 15px; + font-size: 38px; + font-weight: 700; + text-shadow: 0 1px 0 rgba(255,255,255,.25); +} + +/* Responsive tables */ + +@media (max-width: 768px){ + .mobile-side-scroller { + overflow-x: scroll; + margin: 0 -40px; + padding: 0 10px; + } +} + +/* GitHub ribbon display rules */ + +@media (max-width: 800px){ + .ribbon { + display: none; + } +} + +@media (min-width: 800px){ + .ribbon { + display: inline; + } +} diff --git a/site/favicon.ico b/site/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..e4569726aee105c5ffd2579fe376859764789c25 GIT binary patch literal 73070 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 +

+ + +
+
+ + + +
+
+
+ +
+
+
+

Then, fire it!

+
+
public class Test {
+    public static void main(String[] args) {
+        // create a rules engine
+        AnnotatedRulesEngine rulesEngine =
+                            new AnnotatedRulesEngine();
+        //register the rule
+        rulesEngine.registerRule(new MyRule());
+        //fire rules!
+        rulesEngine.fireRules();
+    }
+}
+
+
+
+

First, define your rule..

+
+
@Rule (name = "my awesome rule" )
+public class MyRule {
+    @Condition
+    public boolean when() {
+        return true;
+    }
+    @Action
+    public void then() {
+        System.out.println("Easy Rules rocks!");
+    }
+}
+
+
+
+
+
+ +
+
+
+
+
+
+

License

+

Easy Rules is open source, hosted on GitHub and is released under the MIT License.

+
+
+
+
+
+
+
+ diff --git a/site/js/modernizr-2.5.3.min.js b/site/js/modernizr-2.5.3.min.js new file mode 100755 index 0000000..27fcdae --- /dev/null +++ b/site/js/modernizr-2.5.3.min.js @@ -0,0 +1,4 @@ +/* Modernizr 2.5.3 (Custom Build) | MIT & BSD + * Build: http://www.modernizr.com/download/#-fontface-backgroundsize-borderimage-borderradius-boxshadow-flexbox-hsla-multiplebgs-opacity-rgba-textshadow-cssanimations-csscolumns-generatedcontent-cssgradients-cssreflections-csstransforms-csstransforms3d-csstransitions-applicationcache-canvas-canvastext-draganddrop-hashchange-history-audio-video-indexeddb-input-inputtypes-localstorage-postmessage-sessionstorage-websockets-websqldatabase-webworkers-geolocation-inlinesvg-smil-svg-svgclippaths-touch-webgl-shiv-mq-cssclasses-addtest-prefixed-teststyles-testprop-testallprops-hasevent-prefixes-domprefixes-load + */ +;window.Modernizr=function(a,b,c){function D(a){j.cssText=a}function E(a,b){return D(n.join(a+";")+(b||""))}function F(a,b){return typeof a===b}function G(a,b){return!!~(""+a).indexOf(b)}function H(a,b){for(var d in a)if(j[a[d]]!==c)return b=="pfx"?a[d]:!0;return!1}function I(a,b,d){for(var e in a){var f=b[a[e]];if(f!==c)return d===!1?a[e]:F(f,"function")?f.bind(d||b):f}return!1}function J(a,b,c){var d=a.charAt(0).toUpperCase()+a.substr(1),e=(a+" "+p.join(d+" ")+d).split(" ");return F(b,"string")||F(b,"undefined")?H(e,b):(e=(a+" "+q.join(d+" ")+d).split(" "),I(e,b,c))}function L(){e.input=function(c){for(var d=0,e=c.length;d",a,""].join(""),k.id=h,m.innerHTML+=f,m.appendChild(k),l||(m.style.background="",g.appendChild(m)),i=c(k,a),l?k.parentNode.removeChild(k):m.parentNode.removeChild(m),!!i},z=function(b){var c=a.matchMedia||a.msMatchMedia;if(c)return c(b).matches;var d;return y("@media "+b+" { #"+h+" { position: absolute; } }",function(b){d=(a.getComputedStyle?getComputedStyle(b,null):b.currentStyle)["position"]=="absolute"}),d},A=function(){function d(d,e){e=e||b.createElement(a[d]||"div"),d="on"+d;var f=d in e;return f||(e.setAttribute||(e=b.createElement("div")),e.setAttribute&&e.removeAttribute&&(e.setAttribute(d,""),f=F(e[d],"function"),F(e[d],"undefined")||(e[d]=c),e.removeAttribute(d))),e=null,f}var a={select:"input",change:"input",submit:"form",reset:"form",error:"img",load:"img",abort:"img"};return d}(),B={}.hasOwnProperty,C;!F(B,"undefined")&&!F(B.call,"undefined")?C=function(a,b){return B.call(a,b)}:C=function(a,b){return b in a&&F(a.constructor.prototype[b],"undefined")},Function.prototype.bind||(Function.prototype.bind=function(b){var c=this;if(typeof c!="function")throw new TypeError;var d=w.call(arguments,1),e=function(){if(this instanceof e){var a=function(){};a.prototype=c.prototype;var f=new a,g=c.apply(f,d.concat(w.call(arguments)));return Object(g)===g?g:f}return c.apply(b,d.concat(w.call(arguments)))};return e});var K=function(c,d){var f=c.join(""),g=d.length;y(f,function(c,d){var f=b.styleSheets[b.styleSheets.length-1],h=f?f.cssRules&&f.cssRules[0]?f.cssRules[0].cssText:f.cssText||"":"",i=c.childNodes,j={};while(g--)j[i[g].id]=i[g];e.touch="ontouchstart"in a||a.DocumentTouch&&b instanceof DocumentTouch||(j.touch&&j.touch.offsetTop)===9,e.csstransforms3d=(j.csstransforms3d&&j.csstransforms3d.offsetLeft)===9&&j.csstransforms3d.offsetHeight===3,e.generatedcontent=(j.generatedcontent&&j.generatedcontent.offsetHeight)>=1,e.fontface=/src/i.test(h)&&h.indexOf(d.split(" ")[0])===0},g,d)}(['@font-face {font-family:"font";src:url("https://")}',["@media (",n.join("touch-enabled),("),h,")","{#touch{top:9px;position:absolute}}"].join(""),["@media (",n.join("transform-3d),("),h,")","{#csstransforms3d{left:9px;position:absolute;height:3px;}}"].join(""),['#generatedcontent:after{content:"',l,'";visibility:hidden}'].join("")],["fontface","touch","csstransforms3d","generatedcontent"]);s.flexbox=function(){return J("flexOrder")},s.canvas=function(){var a=b.createElement("canvas");return!!a.getContext&&!!a.getContext("2d")},s.canvastext=function(){return!!e.canvas&&!!F(b.createElement("canvas").getContext("2d").fillText,"function")},s.webgl=function(){try{var d=b.createElement("canvas"),e;e=!(!a.WebGLRenderingContext||!d.getContext("experimental-webgl")&&!d.getContext("webgl")),d=c}catch(f){e=!1}return e},s.touch=function(){return e.touch},s.geolocation=function(){return!!navigator.geolocation},s.postmessage=function(){return!!a.postMessage},s.websqldatabase=function(){return!!a.openDatabase},s.indexedDB=function(){return!!J("indexedDB",a)},s.hashchange=function(){return A("hashchange",a)&&(b.documentMode===c||b.documentMode>7)},s.history=function(){return!!a.history&&!!history.pushState},s.draganddrop=function(){var a=b.createElement("div");return"draggable"in a||"ondragstart"in a&&"ondrop"in a},s.websockets=function(){for(var b=-1,c=p.length;++b",d.insertBefore(c.lastChild,d.firstChild)}function h(){var a=k.elements;return typeof a=="string"?a.split(" "):a}function i(a){var b={},c=a.createElement,e=a.createDocumentFragment,f=e();a.createElement=function(a){var e=(b[a]||(b[a]=c(a))).cloneNode();return k.shivMethods&&e.canHaveChildren&&!d.test(a)?f.appendChild(e):e},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+h().join().replace(/\w+/g,function(a){return b[a]=c(a),f.createElement(a),'c("'+a+'")'})+");return n}")(k,f)}function j(a){var b;return a.documentShived?a:(k.shivCSS&&!e&&(b=!!g(a,"article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio{display:none}canvas,video{display:inline-block;*display:inline;*zoom:1}[hidden]{display:none}audio[controls]{display:inline-block;*display:inline;*zoom:1}mark{background:#FF0;color:#000}")),f||(b=!i(a)),b&&(a.documentShived=b),a)}var c=a.html5||{},d=/^<|^(?:button|form|map|select|textarea)$/i,e,f;(function(){var a=b.createElement("a");a.innerHTML="",e="hidden"in a,f=a.childNodes.length==1||function(){try{b.createElement("a")}catch(a){return!0}var c=b.createDocumentFragment();return typeof c.cloneNode=="undefined"||typeof c.createDocumentFragment=="undefined"||typeof c.createElement=="undefined"}()})();var k={elements:c.elements||"abbr article aside audio bdi canvas data datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video",shivCSS:c.shivCSS!==!1,shivMethods:c.shivMethods!==!1,type:"default",shivDocument:j};a.html5=k,j(b)}(this,b),e._version=d,e._prefixes=n,e._domPrefixes=q,e._cssomPrefixes=p,e.mq=z,e.hasEvent=A,e.testProp=function(a){return H([a])},e.testAllProps=J,e.testStyles=y,e.prefixed=function(a,b,c){return b?J(a,b,c):J(a,"pfx")},g.className=g.className.replace(/(^|\s)no-js(\s|$)/,"$1$2")+(f?" js "+v.join(" "):""),e}(this,this.document),function(a,b,c){function d(a){return o.call(a)=="[object Function]"}function e(a){return typeof a=="string"}function f(){}function g(a){return!a||a=="loaded"||a=="complete"||a=="uninitialized"}function h(){var a=p.shift();q=1,a?a.t?m(function(){(a.t=="c"?B.injectCss:B.injectJs)(a.s,0,a.a,a.x,a.e,1)},0):(a(),h()):q=0}function i(a,c,d,e,f,i,j){function k(b){if(!o&&g(l.readyState)&&(u.r=o=1,!q&&h(),l.onload=l.onreadystatechange=null,b)){a!="img"&&m(function(){t.removeChild(l)},50);for(var d in y[c])y[c].hasOwnProperty(d)&&y[c][d].onload()}}var j=j||B.errorTimeout,l={},o=0,r=0,u={t:d,s:c,e:f,a:i,x:j};y[c]===1&&(r=1,y[c]=[],l=b.createElement(a)),a=="object"?l.data=c:(l.src=c,l.type=a),l.width=l.height="0",l.onerror=l.onload=l.onreadystatechange=function(){k.call(this,r)},p.splice(e,0,u),a!="img"&&(r||y[c]===2?(t.insertBefore(l,s?null:n),m(k,j)):y[c].push(l))}function j(a,b,c,d,f){return q=0,b=b||"j",e(a)?i(b=="c"?v:u,a,b,this.i++,c,d,f):(p.splice(this.i++,0,a),p.length==1&&h()),this}function k(){var a=B;return a.loader={load:j,i:0},a}var l=b.documentElement,m=a.setTimeout,n=b.getElementsByTagName("script")[0],o={}.toString,p=[],q=0,r="MozAppearance"in l.style,s=r&&!!b.createRange().compareNode,t=s?l:n.parentNode,l=a.opera&&o.call(a.opera)=="[object Opera]",l=!!b.attachEvent&&!l,u=r?"object":l?"script":"img",v=l?"script":u,w=Array.isArray||function(a){return o.call(a)=="[object Array]"},x=[],y={},z={timeout:function(a,b){return b.length&&(a.timeout=b[0]),a}},A,B;B=function(a){function b(a){var a=a.split("!"),b=x.length,c=a.pop(),d=a.length,c={url:c,origUrl:c,prefixes:a},e,f,g;for(f=0;f suspectOrderAmountThreshold + && customer.isNew(); + } + + @Override + public void performActions() throws Exception { + System.out.printf("Alert : A new customer [id=%s] has placed an order [id=%s] with amount %f > %f\n", + customer.getCustomerId(), order.getOrderId(), order.getAmount(), suspectOrderAmountThreshold); + } + + // getters and setters for customer and order fields omitted + +} +``` + +This rule operates on an order and a customer instances which represent the business data to operate on. + +The `evaluateConditions` method evaluates to true when the customer is new and the order amount is greater than the defined threshold. + +The `performActions` method simply writes to the console the specified alert (this could be sending an email or another action in a real use case). + +Then, let's create an Easy Rules engine and register the `SuspectOrderRule` rule: + +```java +public class OrderSampleLauncher { + + public static void main(String[] args) { + + Order order = new Order(6654, 1200); + Customer customer = new Customer(2356, true); + + /** + * Create a business rule instance + */ + SuspectOrderRule suspectOrderRule = new SuspectOrderRule( + "Suspect Order", + "Send alert if a new customer places an order with amount greater than a threshold"); + + /** + * Set data to operate on + */ + suspectOrderRule.setOrder(order); + suspectOrderRule.setCustomer(customer); + + /** + * Create a default rules engine and register the business rule + */ + DefaultRulesEngine rulesEngine = new DefaultRulesEngine(); + rulesEngine.registerRule(suspectOrderRule); + + /** + * Fire rules + */ + rulesEngine.fireRules(); + + } +} +``` + +To run this tutorial, you can follow these instructions from the root directory of Easy Rules : + +{% highlight bash %} +$ mvn install +$ cd easyrules-samples +$ mvn exec:java -P runOnlineShopTutorial +{% endhighlight %} + +When you run this tutorial, the rule named _Suspect Order_ that we registered will be applied since the order amount (1200) is greater than the threshold (1000) and the customer 2356 is a new customer. + +## Part 2 : Changing the order amount threshold at runtime + +In this tutorial, we need to expose the order amount threshold as a JMX attribute. So first, let's define an interface that allows us to change order amount threshold via JMX: + +```java +@javax.management.MXBean +public interface SuspectOrderJmxRule extends Rule { + + /** + * Get the current suspect order amount threshold + * @return current suspect order amount threshold + */ + float getSuspectOrderAmountThreshold(); + + /** + * Set the suspect order amount threshold + * @param suspectOrderAmountThreshold the new suspect order amount threshold + */ + void setSuspectOrderAmountThreshold(float suspectOrderAmountThreshold); + +} +``` + +Then, we should make our `SuspectOrderRule` implement the `SuspectOrderJmxRule` interface to expose the order amount threshold as a JMX attribute. + +So here is the new `SuspectOrderRule` class: + +```java +public class SuspectOrderRule extends BasicRule implements SuspectOrderJmxRule { + + // same implementation of the rule + + public float getSuspectOrderAmountThreshold() { + return suspectOrderAmountThreshold; + } + + public void setSuspectOrderAmountThreshold(float suspectOrderAmountThreshold) { + this.suspectOrderAmountThreshold = suspectOrderAmountThreshold; + } + +} +``` + +Finally, let's suspend the program to change the order amount threshold value at runtime via any compliant JMX client and see the engine behavior after this change: + +```java +public class OrderSampleLauncher { + + public static void main(String[] args) throws InterruptedException { + + Order order = new Order(6654, 1200); + Customer customer = new Customer(2356, true); + + /** + * Create a business rule instance + */ + SuspectOrderRule suspectOrderRule = new SuspectOrderRule( + "Suspect Order", + "Send alert if a new customer places an order with amount greater than a threshold"); + + /** + * Set data to operate on + */ + suspectOrderRule.setOrder(order); + suspectOrderRule.setCustomer(customer); + + /** + * Create a default rules engine and register the business rule + */ + DefaultRulesEngine rulesEngine = new DefaultRulesEngine(); + rulesEngine.registerJmxRule(suspectOrderRule); + + /** + * Fire rules + */ + rulesEngine.fireRules(); + + // Update suspect order amount threshold via a JMX client. + Scanner scanner = new Scanner(System.in); + System.out.println("Change suspect order amount threshold to a value > 1200 via a JMX client and then press enter"); + scanner.nextLine(); + + System.out.println("**************************************************************"); + System.out.println("Re fire rules after updating suspect order amount threshold..."); + System.out.println("**************************************************************"); + + rulesEngine.fireRules(); + + } +} +``` + +In the next screenshot, we use VisualVM to change the threshold value: + + + +If you change the threshold value to 1400 for example, you will see that the rule _Suspect Order_ will not be applied the second time since the order amount (1200) is no longer greater than the new threshold (1400). + +That's all! In this tutorial, we have seen how to create a real business rule with Easy Rules and how to reconfigure it at runtime. \ No newline at end of file diff --git a/site/tutorials/hello-world.md b/site/tutorials/hello-world.md new file mode 100644 index 0000000..a1113b3 --- /dev/null +++ b/site/tutorials/hello-world.md @@ -0,0 +1,108 @@ +--- +layout: docs +title: Hello World +header: Hello World tutorial +prev_section: user-guide/managing-rules +next_section: tutorials/dynamic-configuration +doc: true +--- + +This tutorial shows how to use Easy Rules on a very simple application. + The program should ask the user if he is a friend of duke and says 'Hello duke's friend!' only if he replies 'yes'. + +Based on this requirement, the rule is pretty straightforward : + +* The condition is that the user input must be equal to 'yes' +* The action is to say 'Hello duke's friend!' to the user + +First, let's create a rule class: + +```java +@Rule(name = "Hello World rule", + description = "Say Hello to only duke's friends") +public class HelloWorldRule { + + /** + * The user input which represents the data + * that the rule will operate on. + */ + private String input; + + @Condition + public boolean checkInput() { + //The rule should be applied only if + //the user's response is yes (duke friend) + return input.equalsIgnoreCase("yes"); + } + + @Action + public void sayHelloToDukeFriend() throws Exception { + //When rule conditions are satisfied, + //prints 'Hello duke's friend!' to the console + System.out.println("Hello duke's friend!"); + } + + public void setInput(String input) { + this.input = input; + } + +} +``` + +Then, we have to register an instance of this rule to an Easy Rules engine and launch the program with the following class : + +```java +public class HelloWorldSampleLauncher { + + public static void main(String[] args) { + + Scanner scanner = new Scanner(System.in); + System.out.println("Are you a friend of duke?[yes/no]:"); + String input = scanner.nextLine(); + + /** + * Declare the rule + */ + HelloWorldRule helloWorldRule = new HelloWorldRule(); + + /** + * Set business data to operate on + */ + helloWorldRule.setInput(input.trim()); + + /** + * Create a rules engine and register the business rule + */ + AnnotatedRulesEngine rulesEngine = + new AnnotatedRulesEngine(); + rulesEngine.registerRule(helloWorldRule); + + /** + * Fire rules + */ + rulesEngine.fireRules(); + + } +} +``` + +To run this tutorial, you can follow these instructions from the root directory of Easy Rules : + +{% highlight bash %} +$ mvn install +$ cd easyrules-samples +$ mvn exec:java -P runHelloWorldTutorial +{% endhighlight %} + +If you run this tutorial, you would get the following output: + +``` +Are you a friend of duke? [yes/no]: +yes +10 sep. 2014 13:26:19 io.github.benas.easyrules.core.DefaultRulesEngine fireRules +INFO: Rule 'Hello World rule' triggered. +Hello duke's friend! +10 sep. 2014 13:26:19 io.github.benas.easyrules.core.DefaultRulesEngine fireRules +INFO: Rule 'Hello World rule' performed successfully. +``` + diff --git a/site/user-guide/defining-rules.md b/site/user-guide/defining-rules.md new file mode 100644 index 0000000..9649763 --- /dev/null +++ b/site/user-guide/defining-rules.md @@ -0,0 +1,131 @@ +--- +layout: docs +title: Defining rules +header: Defining rules +prev_section: user-guide/introduction +next_section: user-guide/rules-engine +doc: true +--- + +The key API in Easy Rules is the `Rule` interface: + +```java +public interface Rule { + + /** + * This method encapsulates the rule's conditions. + * @return true if the rule should be applied, false else + */ + boolean evaluateConditions(); + + /** + * This method encapsulates the rule's actions. + * @throws Exception thrown if an exception occurs + * during actions performing + */ + void performActions() throws Exception; + + //Getters and setters for rule name, + //description and priority omitted. + +} +``` + +The `evaluateConditions` method encapsulates conditions that must evaluate to _TRUE_ to trigger the rule. + +The `performActions` method encapsulates actions that should be performed when rule's conditions are satisfied. + +## Defining rules by extending _BasicRule_ + +Easy Rules provides a simple implementation of the `Rule` interface named `BasicRule`. This class implements most of methods +defined in the `Rule` interface. You can extends this class and override `evaluateConditions` and +`performActions` methods to provide your conditions and actions logic. Here is an example: + +```java +public class MyRule extends BasicRule { + + private BusinessData myBusinessData; //data to operate on + + @Override + public boolean evaluateConditions() { + //my rule conditions + return true; + } + + @Override + public void performActions() throws Exception { + //my actions + } + +} +``` + +## Defining rules using annotations + +Easy Rules provides the `@Rule` annotation that can turn a POJO into a rule. Here is an example: + +```java +@Rule(name = "my rule", description = "my rule description") +public class MyRule { + + private BusinessData myBusinessData; //data to operate on + + @Condition + public boolean checkConditions() { + //my rule conditions + return true; + } + + @Action + public void performActions() throws Exception { + //my actions + } + +} +``` + +You can use `@Condition` and `@Action` annotations to mark methods to execute to check rule conditions and perform rule actions +respectively. + +
+
Rules can have multiple actions
+

You can annotate multiple methods with the Action annotation. You can also define the execution order of actions with the + order attribute: @Action(order = 1).

+
+ + +## Composite rules + +Easy Rules allows you to create complex rules from primitive ones. A `CompositeRule` is composed of a set of rules. + +This is typically an implementation of the [composite design pattern](http://en.wikipedia.org/wiki/Composite_pattern). + +A composite rule is triggered if _all_ conditions of its composing rules are satisfied. +When a composite rule is applied, actions of _all_ composing rules are performed in the natural order of +rules which is rules priorities by default. + +To create a composite rule from two primitive rules, you can use the following snippet: + +```java +//Create the composite rule from two primitive rules +CompositeRule myCompositeRule = + new CompositeRule("myCompositeRule", "a composite rule"); +myCompositeRule.addRule(myRule1); +myCompositeRule.addRule(myRule2); + +//Register the composite rule as a regular rule +RulesEngine rulesEngine = new DefaultRulesEngine(); +rulesEngine.registerRule(myCompositeRule); +``` + +## Rules priorities + +Each rule in Easy Rules has a priority. This represents the default order in which registered rules are fired. + By default, lower values represent higher priorities. + To override this behavior, you should override the `compareTo` method to provide a custom priority strategy. + +* If you decided to extend the `BasicRule` class, you can specify rule priority at construction time or by overriding +the `getPriority()` method + +* If your rule is a annotated POJO, you should annotate the method that provides priority with `@Priority` annotation. +This method must be public, have no arguments and return an Integer type \ No newline at end of file diff --git a/site/user-guide/introduction.md b/site/user-guide/introduction.md new file mode 100644 index 0000000..f25a0d6 --- /dev/null +++ b/site/user-guide/introduction.md @@ -0,0 +1,21 @@ +--- +layout: docs +title: Introduction +header: Introduction +prev_section: about/getting-started +next_section: user-guide/defining-rules +doc: true +--- + +Most business rules can be represented by the following rule definition: + +* _Name_: a unique rule name within a rules namespace +* _Description_: a brief description of the rule +* _Priority_: rule priority regarding to other rules +* _Conditions_: set of conditions that should be satisfied to apply the rule +* _Actions_: set of actions to perform when conditions are satisfied + +Easy Rules provides an abstraction for each of these key points that define a business rule. + +Next section will show you how to define a rule in Easy Rules either by extending a base class or by annotating your +own domain class. diff --git a/site/user-guide/managing-rules.md b/site/user-guide/managing-rules.md new file mode 100644 index 0000000..de9ae83 --- /dev/null +++ b/site/user-guide/managing-rules.md @@ -0,0 +1,28 @@ +--- +layout: docs +title: Managing rules +header: Managing rules at runtime +prev_section: user-guide/rules-engine +next_section: tutorials/hello-world +doc: true +--- + +Being able to dynamically reconfigure business rules at runtime in production systems is a recurrent requirement. + +Thanks to JMX, Easy Rules can expose rules attributes to be managed via any JMX compliant client. + +To make your rule manageable via JMX, you can register it in Easy Rules engine as a JMX managed rule: + +```java +RulesEngine rulesEngine = new DefaultRulesEngine(); +rulesEngine.registerJmxRule(myRule); +``` + +This will register your rule as a JMX managed bean with the following object name: + +`org.easyrules.core.jmx:type=YourRuleClassName,name=YourRuleName` + +By default, rule description and priority are exposed as JMX manageable attributes. +If you need to expose more specific attributes, you can extend the `Rule` interface and add getters and setters of your manageable attributes. + +An example of using dynamic rule reconfiguration at runtime is provided in the [online shop tutorial]({{site.url}}/tutorials/dynamic-configuration.html). diff --git a/site/user-guide/rules-engine.md b/site/user-guide/rules-engine.md new file mode 100644 index 0000000..fb99081 --- /dev/null +++ b/site/user-guide/rules-engine.md @@ -0,0 +1,75 @@ +--- +layout: docs +title: Rules engine +header: Rules engine +prev_section: user-guide/defining-rules +next_section: user-guide/managing-rules +doc: true +--- + +Easy Rules engine handles a registry of rules with unique names. Each instance of Easy Rules engine can be seen as a separate namespace. + +Rules are applied according to their natural order. + +Easy Rules engine provides the following parameters: + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterTypeRequiredDefault
skipOnFirstAppliedRulebooleannofalse
rulePriorityThresholdintnoInteger.MAX_VALUE
+ +The `skipOnFirstAppliedRule` parameter tells the engine to skip next applicable rules when a rule is applied. + +The `rulePriorityThreshold` parameters tells the engine to skip next rules if priority exceeds the defined threshold. + +You can specify these parameters at rules engine construction time. + +## Create a default rules engine + +To create a default Easy Rules engine and register a rule, use the following snippet: + +```java +RulesEngine rulesEngine = new DefaultRulesEngine(); +rulesEngine.registerRule(myRule); +``` + +You can fire registered rules as follows: + +```java +rulesEngine.fireRules(); +``` + +## Create a annotated rules engine + +If your rules are annotated POJOs, you have to use the `AnnotatedRulesEngine` to register them: + +```java +AnnotatedRulesEngine rulesEngine = new AnnotatedRulesEngine(); +rulesEngine.registerRule(myRule); +``` + +As with default engine, you can fire rules using the following snippet : + +```java +rulesEngine.fireRules(); +``` \ No newline at end of file