http://git-wip-us.apache.org/repos/asf/polygene-website/blob/ea4d77b0/content/java/latest/howto-configure-service.html ---------------------------------------------------------------------- diff --git a/content/java/latest/howto-configure-service.html b/content/java/latest/howto-configure-service.html deleted file mode 100644 index a0da0a2..0000000 --- a/content/java/latest/howto-configure-service.html +++ /dev/null @@ -1,182 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><title>Configure a Service</title><link rel="stylesheet" type="text/css" href="css/style.css" /><meta name="generator" content="DocBook XSL Stylesheets V1.76.1" /><link rel="home" href="index.html" title="" /><link rel="up" href="tutorials.html" title="Tutorials" /><link rel="prev" href="howto-create-entity.html" title="Create an Entity" /><link rel="next" href="howto-invocation-annotation.html" title="Use @Invocation" /> - - -<!-- favicon --> - -<link rel="shortcut icon" href="http://qi4j.org/favicon.ico" type="image/vnd.microsoft.icon" /> -<link rel="icon" href="http://qi4j.org/favicon.ico" type="image/x-icon" /> - -<!-- style --> - -<link href="css/shCore.css" rel="stylesheet" type="text/css" /> -<link href="css/shCoreEclipse.css" rel="stylesheet" type="text/css" /> -<link href="css/shThemeEclipse.css" rel="stylesheet" type="text/css" /> -<link href="css/qi4j.css" rel="stylesheet" type="text/css" /> - -<!-- Syntax Highlighter --> - -<script type="text/javascript" src="js/shCore.js"></script> -<script type="text/javascript" src="js/shBrushJava.js"></script> -<script type="text/javascript" src="js/shBrushScala.js"></script> -<script type="text/javascript" src="js/shBrushJScript.js"></script> -<script type="text/javascript" src="js/shBrushBash.js"></script> -<script type="text/javascript" src="js/shBrushPlain.js"></script> -<script type="text/javascript" src="js/shBrushXml.js"></script> -<script type="text/javascript" src="js/shBrushGroovy.js"></script> -<script type="text/javascript" src="js/shBrushPython.js"></script> -<script type="text/javascript" src="js/shBrushRuby.js"></script> -<script type="text/javascript" src="js/shBrushCSharp.js"></script> - -<script type="text/javascript"> - SyntaxHighlighter.defaults['tab-size'] = 4; - SyntaxHighlighter.defaults['gutter'] = false; - SyntaxHighlighter.defaults['toolbar'] = false; - SyntaxHighlighter.all() -</script> - -<!-- JQuery --> - -<script type="text/javascript" src="js/jquery-1.6.4.min.js"></script> - -<!-- Image Scaler --> - -<script type="text/javascript" src="js/imagescaler.js"></script> - -<!-- Table Styler --> - -<script type="text/javascript" src="js/tablestyler.js"></script> - -<!-- Qi4j WebSite Progressive Enhancement --> - -<link href="css/progressive-enhancement.css" rel="stylesheet" type="text/css" /> -<script type="text/javascript" src="js/jquery.scrollTo-1.4.2.js"></script> -<script type="text/javascript" src="js/progressive-enhancement.js"></script> - -<!-- Analytics --> - <script type="text/javascript"> - var _gaq = _gaq || []; - _gaq.push(['_setAccount', 'UA-89723617-1']); - _gaq.push(['_trackPageview']); - - (function() { - var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; - ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; - var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); - })(); - </script> - - </head><body><div xmlns="" xmlns:exsl="http://exslt.org/common" class="logo"><a href="index.html"><img src="images/logo-standard.png" /></a></div><div xmlns="" xmlns:exsl="http://exslt.org/common" class="top-nav"><div xmlns="http://www.w3.org/1999/xhtml" class="toc"><dl><dt><span class="section"><a href="index.html#home">Zestâ¢</a></span></dt><dt><span class="section"><a href="intro.html">Introduction</a></span></dt><dt><span class="section"><span xmlns="" href="tutorials.html">Tutorials</span></span></dt><dt><span class="section"><a href="javadocs.html">Javadoc</a></span></dt><dt><span class="section"><a href="samples.html">Samples</a></span></dt><dt><span class="section"><a href="core.html">Core</a></span></dt><dt><span class="section"><a href="libraries.html">Libraries</a></span></dt><dt><span class="section"><a href="extensions.html">Extensions</a></span></dt><dt><span class="section"><a href="tools.html">Tools</a></span></dt><dt><span class="section"><a href="glossary.html"> Glossary </a></span></dt></dl></div></div><div xmlns="" xmlns:exsl="http://exslt.org/common" class="sub-nav"><div xmlns="http://www.w3.org/1999/xhtml" class="toc"><dl><dt><span class="section"><a href="tutorials.html#_overview">Overview</a></span></dt><dt><span class="section"><a href="two-minutes-intro.html">Zest⢠in 2 minutes</a></span></dt><dt><span class="section"><a href="ten-minutes-intro.html">Zest⢠in 10 minutes</a></span></dt><dt><span class="section"><a href="thirty-minutes-intro.html">Zest⢠in 30 minutes</a></span></dt><dt><span class="section"><a href="howto-depend-on-zest.html">Depend on Zest⢠in your build</a></span></dt><dt><span class="section"><a href="howto-assemble-application.html">Assemble an Application</a></span></dt><dt><span class="section"><a href="tut-composites.html">Transient Composites Tutorial</a></span></dt><dt><span class="section"><a href="tut-services.html">Services Composites Tutorial</a></span></dt><dt><span class="section"><a href="howt o-contextual-fragments.html">Use contextual fragments</a></span></dt><dt><span class="section"><a href="howto-leverage-properties.html">Leverage Properties</a></span></dt><dt><span class="section"><a href="howto-create-constraint.html">Create a Constraint</a></span></dt><dt><span class="section"><a href="howto-create-concern.html">Create a Concern</a></span></dt><dt><span class="section"><a href="howto-create-sideeffect.html">Create a SideEffect</a></span></dt><dt><span class="section"><a href="howto-create-entity.html">Create an Entity</a></span></dt><dt><span class="section"><span xmlns="" href="howto-configure-service.html">Configure a Service</span></span></dt><dt><span class="section"><a href="howto-invocation-annotation.html">Use @Invocation</a></span></dt><dt><span class="section"><a href="howto-use-io.html">Use I/O API</a></span></dt><dt><span class="section"><a href="build-system.html">Zest⢠Build System</a></span></dt><dt><span class="section"><a href="community-docs.htm l">Writing Zest⢠Documentation</a></span></dt><dt><span class="section"><a href="releasing-apache.html">Releasing Zestâ¢</a></span></dt></dl></div></div><div class="section" title="Configure a Service"><div class="titlepage"><div><div><h3 class="title"><a id="howto-configure-service"></a>Configure a Service</h3></div></div></div><p>Zest⢠supports a Configuration system for services. The configuration instance itself is an Entity and is therefor -readable, writeable and queryable, just like other Entities. This should make Configuration management much simpler, -since you can easily build GUI tools to allow editing of these in runtime. However, to simplify the initial values of -the Configuration instance, Zest⢠also does the initial bootstrapping of the Configuration entity for you. This HowTo is -going to show how.</p><p>If you want to reproduce whatâs explained in this tutorial, remember to depend on the Core Bootstrap artifact:</p><div class="table"><a id="idm371059800928"></a><p class="title"><strong>Table 13. Artifact</strong></p><div class="table-contents"><table summary="Artifact" border="1"><colgroup><col class="col_1" /><col class="col_2" /><col class="col_3" /></colgroup><thead><tr><th align="left" valign="top">Group ID</th><th align="left" valign="top">Artifact ID</th><th align="left" valign="top">Version</th></tr></thead><tbody><tr><td align="left" valign="top"><p>org.qi4j.core</p></td><td align="left" valign="top"><p>org.qi4j.core.bootstrap</p></td><td align="left" valign="top"><p>2.1</p></td></tr></tbody></table></div></div><br class="table-break" /><p>At runtime you will need the Core Runtime artifact too. See the <a class="xref" href="howto-depend-on-zest.html" title="Depend on Zest⢠in your build">Depend on Zest⢠in your build</a> tutorial for details .</p><div class="section" title="We need a Service"><div class="titlepage"><div><div><h4 class="title"><a id="_we_need_a_service"></a>We need a Service</h4></div></div></div><p>To illustrate these features we create an TravelPlan service, which allows clients to find and make Reservations to -Destinations. For the sake of simplicity, we are leaving out the domain detailsâ¦</p><pre class="programlisting brush: java">public interface TravelPlan -{ - // Domain methods, which are beyond the discussion at hand. -} -</pre><p>So, then there is the ServiceCompositeâ¦</p><pre class="programlisting brush: java">// The package is relevant to the Initial Values discussed later. -package org.qi4j.manual.travel; - [...snip...] - -@Mixins( { TravelPlanMixin.class } ) -public interface TravelPlanService extends TravelPlan, ServiceComposite -{} -</pre><p>And then in the Mixin we actually need to connect to a foreign system to obtain the various details that the service -can provide to the clients. For instance, it needs a host name and port and a protocol to use. We put these into a -configuration interface.</p><pre class="programlisting brush: java">public interface TravelPlanConfiguration -{ - Property<String> hostName(); - - @Range( min=0, max=65535 ) - Property<Integer> portNumber(); - - @Matches( "(ssh|rlogin|telnet)" ) - Property<String> protocol(); -} -</pre><p>We used the recommended type-safe Property subtype pattern, and for each PortNumber and Protocol we have defined a -Constraint required.</p><p>Now we can access this configuration in the TravelPlanMixin like this;</p><pre class="programlisting brush: java">import org.qi4j.api.configuration.Configuration; - -public class TravelPlanMixin implements TravelPlan -{ - @This - Configuration<TravelPlanConfiguration> config; - - private void foo() - { - TravelPlanConfiguration tpConf = config.get(); - String hostName = tpConf.hostName().get(); - // ... - } - [...snip...] - -} -</pre><p>And from the Service point of view, it doesnât need to worry about where the configuration really comes from. But it may -want to control when the Configuration should be refreshed, to ensure that atomic changes are happening. This is done -with the refresh() method in the Configuration interface;</p><pre class="programlisting brush: java">public void doSomething() -{ - // Refresh Configuration before reading it. - config.refresh(); - - TravelPlanConfiguration tpConf = config.get(); - // ... -} -</pre><p>This ensures that any updates to the Configuration that has occurred will be retrieved and available to the Service. -Since Configuration instance is an Entity, the UnitOfWork system will ensure that the Configuration is consistent and -not in the middle of value changes.</p><div class="section" title="Initial Values"><div class="titlepage"><div><div><h5 class="title"><a id="_initial_values"></a>Initial Values</h5></div></div></div><p>The initial Configuration instance will be created automatically behind the scenes, by reading a properties file and -create an Entity with the same identity as the identity of the service. That was a handful. Services are, as we know, -singletons and have an identity specified at assembly. Even if it is not provided, one will automatically be assigned. -The serviceâs "identifiedBy" will be used as the identifier for the Configuration entity and stored in the visible -EntityStore. This identity is also used to locate a properties file in the same package as the ServiceComposite belongs -to.</p><p>So, we create a properties file, where the keys are the names of the properties in TravelPlanConfiguration.</p><pre class="programlisting brush: bash"># Hostname to the TravelPlan service -hostName=niclas.hedhman.org - -# Port number to use for the connection -portNumber=5439 - -# Protocol to use; Valid options "ssh", "rlogin", "telnet" -protocol=ssh - -</pre><p>File: org/hedhman/niclas/travel/TravelPlanService.properties</p><p>Note that the file resides in the directory equivalent to the package name of the TravelPlanService.</p><p>And this would work with the standard assembly.</p><pre class="programlisting brush: java">public void assemble(ModuleAssembly module) throws AssemblyException -{ - module.addServices(TravelPlanService.class).instantiateOnStartup(); -} -</pre></div></div><div class="section" title="Non-default Identity"><div class="titlepage"><div><div><h4 class="title"><a id="_non_default_identity"></a>Non-default Identity</h4></div></div></div><p>If you need to use multiple instances of the same service, or that the service has a non-default Identity, then you need -to name the properties file according to the Identity of the service declaration, but the file will still need to be in -the same package as the ServiceComposite sub type, the TravelPlanService in the above example. For instance;</p><pre class="programlisting brush: java">public void assemble(ModuleAssembly module) throws AssemblyException -{ - module.addServices(TravelPlanService.class) - .instantiateOnStartup() - .identifiedBy("ExpediaService"); - - module.addServices(TravelPlanService.class) - .instantiateOnStartup() - .identifiedBy("OrbitzService"); -} -</pre><p>And the two files for configuration,</p><pre class="programlisting brush: bash"># Hostname to the TravelPlan service -hostName=expedia.hedhman.org - -# Port number to use for the connection -portNumber=9251 - -# Protocol to use; Valid options "ssh", "rlogin", "telnet" -protocol=ssh -</pre><p>File: org/qi4j/manual/travel/ExpediaService.properties</p><pre class="programlisting brush: bash"># Hostname to the TravelPlan service -hostName=orbitz.hedhman.org - -# Port number to use for the connection -portNumber=7412 - -# Protocol to use; Valid options "ssh", "rlogin", "telnet" -protocol=rlogin -</pre><p>File: org/qi4j/manual/travel/OrbitzService.properties</p></div><div class="section" title="Changing Configuration in runtime"><div class="titlepage"><div><div><h4 class="title"><a id="_changing_configuration_in_runtime"></a>Changing Configuration in runtime</h4></div></div></div><p>Unlike most frameworks, the Configuration in Zest⢠is an active Entity, and once the properties file has been read once -at the first(!) startup, it no longer serves any purpose. The Configuration will always be retrieved from the -EntityStore. Changes to the properties file are not taken into consideration if the Configuration entity is found in the -entity store.</p><p>But that also means that applications should not cache the configuration values, and instead read them from the -Configuration instance every time needed, and do a refresh() method call when it is safe to update the Configuration -Entity with new values.</p></div></div><div xmlns="" xmlns:exsl="http://exslt.org/common" class="footer"><p> - Copyright © 2015 The Apache Software Foundation, Licensed under the <a href="http://www.apache.org/licenses/" target="_blank">Apache License, Version 2.0</a>. - <br /><small> - Apache Zest, Zest, Apache, the Apache feather logo, and the Apache Zest project logo are trademarks of The Apache Software Foundation.<br /> - All other marks mentioned may be trademarks or registered trademarks of their respective owners. - </small></p></div></body></html> \ No newline at end of file
http://git-wip-us.apache.org/repos/asf/polygene-website/blob/ea4d77b0/content/java/latest/howto-contextual-fragments.html ---------------------------------------------------------------------- diff --git a/content/java/latest/howto-contextual-fragments.html b/content/java/latest/howto-contextual-fragments.html deleted file mode 100644 index f112a10..0000000 --- a/content/java/latest/howto-contextual-fragments.html +++ /dev/null @@ -1,93 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><title>Use contextual fragments</title><link rel="stylesheet" type="text/css" href="css/style.css" /><meta name="generator" content="DocBook XSL Stylesheets V1.76.1" /><link rel="home" href="index.html" title="" /><link rel="up" href="tutorials.html" title="Tutorials" /><link rel="prev" href="tut-services.html" title="Services Composites Tutorial" /><link rel="next" href="howto-leverage-properties.html" title="Leverage Properties" /> - - -<!-- favicon --> - -<link rel="shortcut icon" href="http://qi4j.org/favicon.ico" type="image/vnd.microsoft.icon" /> -<link rel="icon" href="http://qi4j.org/favicon.ico" type="image/x-icon" /> - -<!-- style --> - -<link href="css/shCore.css" rel="stylesheet" type="text/css" /> -<link href="css/shCoreEclipse.css" rel="stylesheet" type="text/css" /> -<link href="css/shThemeEclipse.css" rel="stylesheet" type="text/css" /> -<link href="css/qi4j.css" rel="stylesheet" type="text/css" /> - -<!-- Syntax Highlighter --> - -<script type="text/javascript" src="js/shCore.js"></script> -<script type="text/javascript" src="js/shBrushJava.js"></script> -<script type="text/javascript" src="js/shBrushScala.js"></script> -<script type="text/javascript" src="js/shBrushJScript.js"></script> -<script type="text/javascript" src="js/shBrushBash.js"></script> -<script type="text/javascript" src="js/shBrushPlain.js"></script> -<script type="text/javascript" src="js/shBrushXml.js"></script> -<script type="text/javascript" src="js/shBrushGroovy.js"></script> -<script type="text/javascript" src="js/shBrushPython.js"></script> -<script type="text/javascript" src="js/shBrushRuby.js"></script> -<script type="text/javascript" src="js/shBrushCSharp.js"></script> - -<script type="text/javascript"> - SyntaxHighlighter.defaults['tab-size'] = 4; - SyntaxHighlighter.defaults['gutter'] = false; - SyntaxHighlighter.defaults['toolbar'] = false; - SyntaxHighlighter.all() -</script> - -<!-- JQuery --> - -<script type="text/javascript" src="js/jquery-1.6.4.min.js"></script> - -<!-- Image Scaler --> - -<script type="text/javascript" src="js/imagescaler.js"></script> - -<!-- Table Styler --> - -<script type="text/javascript" src="js/tablestyler.js"></script> - -<!-- Qi4j WebSite Progressive Enhancement --> - -<link href="css/progressive-enhancement.css" rel="stylesheet" type="text/css" /> -<script type="text/javascript" src="js/jquery.scrollTo-1.4.2.js"></script> -<script type="text/javascript" src="js/progressive-enhancement.js"></script> - -<!-- Analytics --> - <script type="text/javascript"> - var _gaq = _gaq || []; - _gaq.push(['_setAccount', 'UA-89723617-1']); - _gaq.push(['_trackPageview']); - - (function() { - var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; - ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; - var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); - })(); - </script> - - </head><body><div xmlns="" xmlns:exsl="http://exslt.org/common" class="logo"><a href="index.html"><img src="images/logo-standard.png" /></a></div><div xmlns="" xmlns:exsl="http://exslt.org/common" class="top-nav"><div xmlns="http://www.w3.org/1999/xhtml" class="toc"><dl><dt><span class="section"><a href="index.html#home">Zestâ¢</a></span></dt><dt><span class="section"><a href="intro.html">Introduction</a></span></dt><dt><span class="section"><span xmlns="" href="tutorials.html">Tutorials</span></span></dt><dt><span class="section"><a href="javadocs.html">Javadoc</a></span></dt><dt><span class="section"><a href="samples.html">Samples</a></span></dt><dt><span class="section"><a href="core.html">Core</a></span></dt><dt><span class="section"><a href="libraries.html">Libraries</a></span></dt><dt><span class="section"><a href="extensions.html">Extensions</a></span></dt><dt><span class="section"><a href="tools.html">Tools</a></span></dt><dt><span class="section"><a href="glossary.html"> Glossary </a></span></dt></dl></div></div><div xmlns="" xmlns:exsl="http://exslt.org/common" class="sub-nav"><div xmlns="http://www.w3.org/1999/xhtml" class="toc"><dl><dt><span class="section"><a href="tutorials.html#_overview">Overview</a></span></dt><dt><span class="section"><a href="two-minutes-intro.html">Zest⢠in 2 minutes</a></span></dt><dt><span class="section"><a href="ten-minutes-intro.html">Zest⢠in 10 minutes</a></span></dt><dt><span class="section"><a href="thirty-minutes-intro.html">Zest⢠in 30 minutes</a></span></dt><dt><span class="section"><a href="howto-depend-on-zest.html">Depend on Zest⢠in your build</a></span></dt><dt><span class="section"><a href="howto-assemble-application.html">Assemble an Application</a></span></dt><dt><span class="section"><a href="tut-composites.html">Transient Composites Tutorial</a></span></dt><dt><span class="section"><a href="tut-services.html">Services Composites Tutorial</a></span></dt><dt><span class="section"><span xmlns=" " href="howto-contextual-fragments.html">Use contextual fragments</span></span></dt><dt><span class="section"><a href="howto-leverage-properties.html">Leverage Properties</a></span></dt><dt><span class="section"><a href="howto-create-constraint.html">Create a Constraint</a></span></dt><dt><span class="section"><a href="howto-create-concern.html">Create a Concern</a></span></dt><dt><span class="section"><a href="howto-create-sideeffect.html">Create a SideEffect</a></span></dt><dt><span class="section"><a href="howto-create-entity.html">Create an Entity</a></span></dt><dt><span class="section"><a href="howto-configure-service.html">Configure a Service</a></span></dt><dt><span class="section"><a href="howto-invocation-annotation.html">Use @Invocation</a></span></dt><dt><span class="section"><a href="howto-use-io.html">Use I/O API</a></span></dt><dt><span class="section"><a href="build-system.html">Zest⢠Build System</a></span></dt><dt><span class="section"><a href="community-docs.htm l">Writing Zest⢠Documentation</a></span></dt><dt><span class="section"><a href="releasing-apache.html">Releasing Zestâ¢</a></span></dt></dl></div></div><div class="section" title="Use contextual fragments"><div class="titlepage"><div><div><h3 class="title"><a id="howto-contextual-fragments"></a>Use contextual fragments</h3></div></div></div><p>Contextual fragments are fragments that are added to the composites during assembly time. That means that they are not -present in the composite declarations, but a start-up decision what should be added. Once the application instance is -created, it is no longer possible to modify which fragments are attached.</p><p>Typical use-case is tracing and debugging. Other potential uses are additional security or context interfaces needing -access to internal mixins not originally intended for, such as GUI frameworks doing reflection on certain composites. -We strongly recommend against using this feature, as it is not needed as commonly as you may think.</p><div class="note" title="Note" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Note</h3><p>Constraints are not supported to be contextual at the moment.</p></div><p>If you want to reproduce whatâs explained in this tutorial, remember to depend on the Core Bootstrap artifact:</p><div class="table"><a id="idm371060011984"></a><p class="title"><strong>Table 7. Artifact</strong></p><div class="table-contents"><table summary="Artifact" border="1"><colgroup><col class="col_1" /><col class="col_2" /><col class="col_3" /></colgroup><thead><tr><th align="left" valign="top">Group ID</th><th align="left" valign="top">Artifact ID</th><th align="left" valign="top">Version</th></tr></thead><tbody><tr><td align="left" valign="top"><p>org.qi4j.core</p></td><td align="left" valign="top"><p>org.qi4j.core.bootstrap</p></td><td align="left" valign="top"><p>2.1</p></td></tr></tbo dy></table></div></div><br class="table-break" /><p>At runtime you will need the Core Runtime artifact too. See the <a class="xref" href="howto-depend-on-zest.html" title="Depend on Zest⢠in your build">Depend on Zest⢠in your build</a> tutorial for details.</p><p>The mixins, sideeffects and concerns are added during the bootstrap phase. It is very straight-forward;</p><pre class="programlisting brush: java">public class TraceAll -{ - public void assemble( ModuleAssembly module ) - throws AssemblyException - { - ServiceDeclaration decl = module.addServices( PinSearchService.class ); - if( Boolean.getBoolean( "trace.all" ) ) - { - decl.withConcerns( TraceAllConcern.class ); - } - } -} - -</pre><p>In the example above, we add the TraceAllConcern from the Logging Library if the system property "trace.all" is true. -If the system property is not set to true, there will be no TraceAllConcern on the PinSearchService.</p><p>Concerns that are added in this way will be at the top of the method invocation stack, i.e. will be the first one to be -called and last one to be completed.</p><p>SideEffects that are added in this way will be the last oneâs to be executed.</p></div><div xmlns="" xmlns:exsl="http://exslt.org/common" class="footer"><p> - Copyright © 2015 The Apache Software Foundation, Licensed under the <a href="http://www.apache.org/licenses/" target="_blank">Apache License, Version 2.0</a>. - <br /><small> - Apache Zest, Zest, Apache, the Apache feather logo, and the Apache Zest project logo are trademarks of The Apache Software Foundation.<br /> - All other marks mentioned may be trademarks or registered trademarks of their respective owners. - </small></p></div></body></html> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/polygene-website/blob/ea4d77b0/content/java/latest/howto-create-concern.html ---------------------------------------------------------------------- diff --git a/content/java/latest/howto-create-concern.html b/content/java/latest/howto-create-concern.html deleted file mode 100644 index 68cfe86..0000000 --- a/content/java/latest/howto-create-concern.html +++ /dev/null @@ -1,163 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><title>Create a Concern</title><link rel="stylesheet" type="text/css" href="css/style.css" /><meta name="generator" content="DocBook XSL Stylesheets V1.76.1" /><link rel="home" href="index.html" title="" /><link rel="up" href="tutorials.html" title="Tutorials" /><link rel="prev" href="howto-create-constraint.html" title="Create a Constraint" /><link rel="next" href="howto-create-sideeffect.html" title="Create a SideEffect" /> - - -<!-- favicon --> - -<link rel="shortcut icon" href="http://qi4j.org/favicon.ico" type="image/vnd.microsoft.icon" /> -<link rel="icon" href="http://qi4j.org/favicon.ico" type="image/x-icon" /> - -<!-- style --> - -<link href="css/shCore.css" rel="stylesheet" type="text/css" /> -<link href="css/shCoreEclipse.css" rel="stylesheet" type="text/css" /> -<link href="css/shThemeEclipse.css" rel="stylesheet" type="text/css" /> -<link href="css/qi4j.css" rel="stylesheet" type="text/css" /> - -<!-- Syntax Highlighter --> - -<script type="text/javascript" src="js/shCore.js"></script> -<script type="text/javascript" src="js/shBrushJava.js"></script> -<script type="text/javascript" src="js/shBrushScala.js"></script> -<script type="text/javascript" src="js/shBrushJScript.js"></script> -<script type="text/javascript" src="js/shBrushBash.js"></script> -<script type="text/javascript" src="js/shBrushPlain.js"></script> -<script type="text/javascript" src="js/shBrushXml.js"></script> -<script type="text/javascript" src="js/shBrushGroovy.js"></script> -<script type="text/javascript" src="js/shBrushPython.js"></script> -<script type="text/javascript" src="js/shBrushRuby.js"></script> -<script type="text/javascript" src="js/shBrushCSharp.js"></script> - -<script type="text/javascript"> - SyntaxHighlighter.defaults['tab-size'] = 4; - SyntaxHighlighter.defaults['gutter'] = false; - SyntaxHighlighter.defaults['toolbar'] = false; - SyntaxHighlighter.all() -</script> - -<!-- JQuery --> - -<script type="text/javascript" src="js/jquery-1.6.4.min.js"></script> - -<!-- Image Scaler --> - -<script type="text/javascript" src="js/imagescaler.js"></script> - -<!-- Table Styler --> - -<script type="text/javascript" src="js/tablestyler.js"></script> - -<!-- Qi4j WebSite Progressive Enhancement --> - -<link href="css/progressive-enhancement.css" rel="stylesheet" type="text/css" /> -<script type="text/javascript" src="js/jquery.scrollTo-1.4.2.js"></script> -<script type="text/javascript" src="js/progressive-enhancement.js"></script> - -<!-- Analytics --> - <script type="text/javascript"> - var _gaq = _gaq || []; - _gaq.push(['_setAccount', 'UA-89723617-1']); - _gaq.push(['_trackPageview']); - - (function() { - var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; - ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; - var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); - })(); - </script> - - </head><body><div xmlns="" xmlns:exsl="http://exslt.org/common" class="logo"><a href="index.html"><img src="images/logo-standard.png" /></a></div><div xmlns="" xmlns:exsl="http://exslt.org/common" class="top-nav"><div xmlns="http://www.w3.org/1999/xhtml" class="toc"><dl><dt><span class="section"><a href="index.html#home">Zestâ¢</a></span></dt><dt><span class="section"><a href="intro.html">Introduction</a></span></dt><dt><span class="section"><span xmlns="" href="tutorials.html">Tutorials</span></span></dt><dt><span class="section"><a href="javadocs.html">Javadoc</a></span></dt><dt><span class="section"><a href="samples.html">Samples</a></span></dt><dt><span class="section"><a href="core.html">Core</a></span></dt><dt><span class="section"><a href="libraries.html">Libraries</a></span></dt><dt><span class="section"><a href="extensions.html">Extensions</a></span></dt><dt><span class="section"><a href="tools.html">Tools</a></span></dt><dt><span class="section"><a href="glossary.html"> Glossary </a></span></dt></dl></div></div><div xmlns="" xmlns:exsl="http://exslt.org/common" class="sub-nav"><div xmlns="http://www.w3.org/1999/xhtml" class="toc"><dl><dt><span class="section"><a href="tutorials.html#_overview">Overview</a></span></dt><dt><span class="section"><a href="two-minutes-intro.html">Zest⢠in 2 minutes</a></span></dt><dt><span class="section"><a href="ten-minutes-intro.html">Zest⢠in 10 minutes</a></span></dt><dt><span class="section"><a href="thirty-minutes-intro.html">Zest⢠in 30 minutes</a></span></dt><dt><span class="section"><a href="howto-depend-on-zest.html">Depend on Zest⢠in your build</a></span></dt><dt><span class="section"><a href="howto-assemble-application.html">Assemble an Application</a></span></dt><dt><span class="section"><a href="tut-composites.html">Transient Composites Tutorial</a></span></dt><dt><span class="section"><a href="tut-services.html">Services Composites Tutorial</a></span></dt><dt><span class="section"><a href="howt o-contextual-fragments.html">Use contextual fragments</a></span></dt><dt><span class="section"><a href="howto-leverage-properties.html">Leverage Properties</a></span></dt><dt><span class="section"><a href="howto-create-constraint.html">Create a Constraint</a></span></dt><dt><span class="section"><span xmlns="" href="howto-create-concern.html">Create a Concern</span></span></dt><dt><span class="section"><a href="howto-create-sideeffect.html">Create a SideEffect</a></span></dt><dt><span class="section"><a href="howto-create-entity.html">Create an Entity</a></span></dt><dt><span class="section"><a href="howto-configure-service.html">Configure a Service</a></span></dt><dt><span class="section"><a href="howto-invocation-annotation.html">Use @Invocation</a></span></dt><dt><span class="section"><a href="howto-use-io.html">Use I/O API</a></span></dt><dt><span class="section"><a href="build-system.html">Zest⢠Build System</a></span></dt><dt><span class="section"><a href="community-docs.htm l">Writing Zest⢠Documentation</a></span></dt><dt><span class="section"><a href="releasing-apache.html">Releasing Zestâ¢</a></span></dt></dl></div></div><div class="section" title="Create a Concern"><div class="titlepage"><div><div><h3 class="title"><a id="howto-create-concern"></a>Create a Concern</h3></div></div></div><p>Concerns are defined in <a class="xref" href="glossary.html#def-concern">Concern</a>.</p><p>If you want to reproduce whatâs explained in this tutorial, remember to depend on the Core Bootstrap artifact:</p><div class="table"><a id="idm371059923696"></a><p class="title"><strong>Table 10. Artifact</strong></p><div class="table-contents"><table summary="Artifact" border="1"><colgroup><col class="col_1" /><col class="col_2" /><col class="col_3" /></colgroup><thead><tr><th align="left" valign="top">Group ID</th><th align="left" valign="top">Artifact ID</th><th align="left" valign="top">Version</th></tr></thead><tbody><tr><td align="left" valign="top"><p>org.qi4j .core</p></td><td align="left" valign="top"><p>org.qi4j.core.bootstrap</p></td><td align="left" valign="top"><p>2.1</p></td></tr></tbody></table></div></div><br class="table-break" /><p>At runtime you will need the Core Runtime artifact too. See the <a class="xref" href="howto-depend-on-zest.html" title="Depend on Zest⢠in your build">Depend on Zest⢠in your build</a> tutorial for details.</p><div class="section" title="Typed Concern"><div class="titlepage"><div><div><h4 class="title"><a id="_typed_concern"></a>Typed Concern</h4></div></div></div><p>A typed Concern is a Java class that implements the MixinType it can be used on:</p><pre class="programlisting brush: java">public class InventoryConcern extends ConcernOf<Order> - implements Order -{ - @Service - private InventoryService inventory; - - @Override - public void addLineItem( LineItem item ) - { - String productCode = item.productCode().get(); - int quantity = item.quantity().get(); - inventory.remove( productCode, quantity ); - next.addLineItem( item ); - } - - @Override - public void removeLineItem( LineItem item ) - { - String productCode = item.productCode().get(); - int quantity = item.quantity().get(); - inventory.add( productCode, quantity ); - next.removeLineItem( item ); - } -} -</pre><p>Note that we could have implemented the InventoryConcern as an abstract class if we were not interested in <span class="emphasis"><em>all</em></span> the methods in the Order interface. -Extending the ConcernOf is a convenience mechanism, instead of an explicit @ConcernFor annotation on -a private field, which can be used in rare occasions when you are not able to extend. This base class defines the next -field, which is set up by the Zest⢠runtime and points to the next fragment in the call stack. We can also see that the -InventoryService is provided to the concern, which is done with dependency injection. Zest⢠also supports dependency -injection via constructors and methods.</p><p>It can be used as follows;</p><pre class="programlisting brush: java">@Concerns( InventoryConcern.class ) -public interface Order -{ - void addLineItem( LineItem item ); - void removeLineItem( LineItem item ); - - [...snip...] - -</pre><p>Methods of the Concern Fragment will be called before the Mixin invocation.</p></div><div class="section" title="Generic Concern"><div class="titlepage"><div><div><h4 class="title"><a id="_generic_concern"></a>Generic Concern</h4></div></div></div><p>A generic Concern is a Java class that implements java.lang.reflect.InvocationHandler which allows it to be used on any -arbitrary MixinType.</p><pre class="programlisting brush: java">public class MyGenericConcern extends GenericConcern -{ - @Override - public Object invoke( Object proxy, Method method, Object[] args ) - throws Throwable - { - // Do whatever you want - - [...snip...] - -</pre><p>It can be used as follows;</p><pre class="programlisting brush: java">@Concerns( MyGenericConcern.class ) -public interface AnyMixinType -{ - - [...snip...] - - @MyAnnotation - void doSomething(); - - void doSomethingElse(); - -</pre><p>Methods of the Concern Fragment will be called before the Mixin invocation.</p><div class="section" title="AppliesTo"><div class="titlepage"><div><div><h5 class="title"><a id="_appliesto"></a>AppliesTo</h5></div></div></div><p>For generic Concerns that should only trigger on methods with specific annotations or fulfilling some expression, add -@AppliesTo annotation to the Concern class which points to either triggering annotation(s), or to AppliesToFilter -implementation(s).</p><p>The Concern is invoked if one of the triggering annotations is found or one of the AppliesToFilter accepts the -invocation. In other words the AppliesTo arguments are ORâed.</p><p>Here is how the declaration goes ;</p><pre class="programlisting brush: java">@AppliesTo( { MyAnnotation.class, MyAppliesToFilter.class } ) -public class MyGenericConcern extends GenericConcern -{ -</pre><p>And how to use the annotation ;</p><pre class="programlisting brush: java">@Concerns( MyGenericConcern.class ) -public interface AnyMixinType -{ - - @MyAnnotation - void doSomething(); - - void doSomethingElse(); - -} -</pre><p>Here only the doSomething() method will see the Concern applied whereas the doSomethingElse() method wonât.</p><p>Finally here is how to implement an AppliesToFilter:</p><pre class="programlisting brush: java">public class MyAppliesToFilter implements AppliesToFilter -{ - public boolean appliesTo( Method method, Class<?> mixin, Class<?> compositeType, Class<?> modifierClass ) - { - boolean appliesTo = evaluate(method); // Do whatever you want - return appliesTo; - } - - [...snip...] - - private boolean evaluate( Method method ) - { - return true; - } -</pre></div></div></div><div xmlns="" xmlns:exsl="http://exslt.org/common" class="footer"><p> - Copyright © 2015 The Apache Software Foundation, Licensed under the <a href="http://www.apache.org/licenses/" target="_blank">Apache License, Version 2.0</a>. - <br /><small> - Apache Zest, Zest, Apache, the Apache feather logo, and the Apache Zest project logo are trademarks of The Apache Software Foundation.<br /> - All other marks mentioned may be trademarks or registered trademarks of their respective owners. - </small></p></div></body></html> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/polygene-website/blob/ea4d77b0/content/java/latest/howto-create-constraint.html ---------------------------------------------------------------------- diff --git a/content/java/latest/howto-create-constraint.html b/content/java/latest/howto-create-constraint.html deleted file mode 100644 index 3977cbd..0000000 --- a/content/java/latest/howto-create-constraint.html +++ /dev/null @@ -1,166 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><title>Create a Constraint</title><link rel="stylesheet" type="text/css" href="css/style.css" /><meta name="generator" content="DocBook XSL Stylesheets V1.76.1" /><link rel="home" href="index.html" title="" /><link rel="up" href="tutorials.html" title="Tutorials" /><link rel="prev" href="howto-leverage-properties.html" title="Leverage Properties" /><link rel="next" href="howto-create-concern.html" title="Create a Concern" /> - - -<!-- favicon --> - -<link rel="shortcut icon" href="http://qi4j.org/favicon.ico" type="image/vnd.microsoft.icon" /> -<link rel="icon" href="http://qi4j.org/favicon.ico" type="image/x-icon" /> - -<!-- style --> - -<link href="css/shCore.css" rel="stylesheet" type="text/css" /> -<link href="css/shCoreEclipse.css" rel="stylesheet" type="text/css" /> -<link href="css/shThemeEclipse.css" rel="stylesheet" type="text/css" /> -<link href="css/qi4j.css" rel="stylesheet" type="text/css" /> - -<!-- Syntax Highlighter --> - -<script type="text/javascript" src="js/shCore.js"></script> -<script type="text/javascript" src="js/shBrushJava.js"></script> -<script type="text/javascript" src="js/shBrushScala.js"></script> -<script type="text/javascript" src="js/shBrushJScript.js"></script> -<script type="text/javascript" src="js/shBrushBash.js"></script> -<script type="text/javascript" src="js/shBrushPlain.js"></script> -<script type="text/javascript" src="js/shBrushXml.js"></script> -<script type="text/javascript" src="js/shBrushGroovy.js"></script> -<script type="text/javascript" src="js/shBrushPython.js"></script> -<script type="text/javascript" src="js/shBrushRuby.js"></script> -<script type="text/javascript" src="js/shBrushCSharp.js"></script> - -<script type="text/javascript"> - SyntaxHighlighter.defaults['tab-size'] = 4; - SyntaxHighlighter.defaults['gutter'] = false; - SyntaxHighlighter.defaults['toolbar'] = false; - SyntaxHighlighter.all() -</script> - -<!-- JQuery --> - -<script type="text/javascript" src="js/jquery-1.6.4.min.js"></script> - -<!-- Image Scaler --> - -<script type="text/javascript" src="js/imagescaler.js"></script> - -<!-- Table Styler --> - -<script type="text/javascript" src="js/tablestyler.js"></script> - -<!-- Qi4j WebSite Progressive Enhancement --> - -<link href="css/progressive-enhancement.css" rel="stylesheet" type="text/css" /> -<script type="text/javascript" src="js/jquery.scrollTo-1.4.2.js"></script> -<script type="text/javascript" src="js/progressive-enhancement.js"></script> - -<!-- Analytics --> - <script type="text/javascript"> - var _gaq = _gaq || []; - _gaq.push(['_setAccount', 'UA-89723617-1']); - _gaq.push(['_trackPageview']); - - (function() { - var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; - ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; - var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); - })(); - </script> - - </head><body><div xmlns="" xmlns:exsl="http://exslt.org/common" class="logo"><a href="index.html"><img src="images/logo-standard.png" /></a></div><div xmlns="" xmlns:exsl="http://exslt.org/common" class="top-nav"><div xmlns="http://www.w3.org/1999/xhtml" class="toc"><dl><dt><span class="section"><a href="index.html#home">Zestâ¢</a></span></dt><dt><span class="section"><a href="intro.html">Introduction</a></span></dt><dt><span class="section"><span xmlns="" href="tutorials.html">Tutorials</span></span></dt><dt><span class="section"><a href="javadocs.html">Javadoc</a></span></dt><dt><span class="section"><a href="samples.html">Samples</a></span></dt><dt><span class="section"><a href="core.html">Core</a></span></dt><dt><span class="section"><a href="libraries.html">Libraries</a></span></dt><dt><span class="section"><a href="extensions.html">Extensions</a></span></dt><dt><span class="section"><a href="tools.html">Tools</a></span></dt><dt><span class="section"><a href="glossary.html"> Glossary </a></span></dt></dl></div></div><div xmlns="" xmlns:exsl="http://exslt.org/common" class="sub-nav"><div xmlns="http://www.w3.org/1999/xhtml" class="toc"><dl><dt><span class="section"><a href="tutorials.html#_overview">Overview</a></span></dt><dt><span class="section"><a href="two-minutes-intro.html">Zest⢠in 2 minutes</a></span></dt><dt><span class="section"><a href="ten-minutes-intro.html">Zest⢠in 10 minutes</a></span></dt><dt><span class="section"><a href="thirty-minutes-intro.html">Zest⢠in 30 minutes</a></span></dt><dt><span class="section"><a href="howto-depend-on-zest.html">Depend on Zest⢠in your build</a></span></dt><dt><span class="section"><a href="howto-assemble-application.html">Assemble an Application</a></span></dt><dt><span class="section"><a href="tut-composites.html">Transient Composites Tutorial</a></span></dt><dt><span class="section"><a href="tut-services.html">Services Composites Tutorial</a></span></dt><dt><span class="section"><a href="howt o-contextual-fragments.html">Use contextual fragments</a></span></dt><dt><span class="section"><a href="howto-leverage-properties.html">Leverage Properties</a></span></dt><dt><span class="section"><span xmlns="" href="howto-create-constraint.html">Create a Constraint</span></span></dt><dt><span class="section"><a href="howto-create-concern.html">Create a Concern</a></span></dt><dt><span class="section"><a href="howto-create-sideeffect.html">Create a SideEffect</a></span></dt><dt><span class="section"><a href="howto-create-entity.html">Create an Entity</a></span></dt><dt><span class="section"><a href="howto-configure-service.html">Configure a Service</a></span></dt><dt><span class="section"><a href="howto-invocation-annotation.html">Use @Invocation</a></span></dt><dt><span class="section"><a href="howto-use-io.html">Use I/O API</a></span></dt><dt><span class="section"><a href="build-system.html">Zest⢠Build System</a></span></dt><dt><span class="section"><a href="community-docs.htm l">Writing Zest⢠Documentation</a></span></dt><dt><span class="section"><a href="releasing-apache.html">Releasing Zestâ¢</a></span></dt></dl></div></div><div class="section" title="Create a Constraint"><div class="titlepage"><div><div><h3 class="title"><a id="howto-create-constraint"></a>Create a Constraint</h3></div></div></div><p>Constraints are defined in <a class="xref" href="glossary.html#def-constraint">Constraint</a>.</p><p>If you want to reproduce whatâs explained in this tutorial, remember to depend on the Core Bootstrap artifact:</p><div class="table"><a id="idm371059950496"></a><p class="title"><strong>Table 9. Artifact</strong></p><div class="table-contents"><table summary="Artifact" border="1"><colgroup><col class="col_1" /><col class="col_2" /><col class="col_3" /></colgroup><thead><tr><th align="left" valign="top">Group ID</th><th align="left" valign="top">Artifact ID</th><th align="left" valign="top">Version</th></tr></thead><tbody><tr><td align="left" valign= "top"><p>org.qi4j.core</p></td><td align="left" valign="top"><p>org.qi4j.core.bootstrap</p></td><td align="left" valign="top"><p>2.1</p></td></tr></tbody></table></div></div><br class="table-break" /><p>At runtime you will need the Core Runtime artifact too. See the <a class="xref" href="howto-depend-on-zest.html" title="Depend on Zest⢠in your build">Depend on Zest⢠in your build</a> tutorial for details.</p><div class="section" title="Method Constraint"><div class="titlepage"><div><div><h4 class="title"><a id="_method_constraint"></a>Method Constraint</h4></div></div></div><p>Method Constraints are declared with annotations on the method argument. The annotation itself is custom, and it is possible to make your own.</p><pre class="programlisting brush: java">public interface Dialer -{ - void callPhoneNumber(@PhoneNumber String phoneNo); - -} -</pre><p>In the code above we say that we want the argument to the callPhoneNumber() method to be a valid phone number. This annotation is not built-in, so we need to declare it.</p><pre class="programlisting brush: java">@ConstraintDeclaration -@Retention( RetentionPolicy.RUNTIME ) -@Target( { ElementType.PARAMETER, ElementType.ANNOTATION_TYPE, ElementType.METHOD } ) -public @interface PhoneNumber -{ -} -</pre><p>We then need to provide the Constraint implementation.</p><pre class="programlisting brush: java">public class PhoneNumberConstraint - implements Constraint<PhoneNumber, String> -{ - public boolean isValid( PhoneNumber annotation, String number ) - { - boolean validPhoneNumber = true; // check phone number format... - return validPhoneNumber; // return true if valid phone number. - } -} -</pre><p>We also need to include the Constraint on the Composites we want to have them present.</p><pre class="programlisting brush: java">@Constraints( PhoneNumberConstraint.class ) -public interface DialerComposite extends ServiceComposite, Dialer -{ -} -</pre><p>If a Constraint is violated, then a ConstraintViolationException is thrown. The Exception contains ALL violations found -in the method invocation. Concerns can be used to catch and report these violations.</p><pre class="programlisting brush: java">public class ParameterViolationConcern extends ConcernOf<InvocationHandler> - implements InvocationHandler -{ - public Object invoke( Object proxy, Method method, Object[] args ) - throws Throwable - { - try - { - return next.invoke( proxy, method, args ); - } - catch( ConstraintViolationException e ) - { - for( ConstraintViolation violation : e.constraintViolations() ) - { - String name = violation.name(); - Object value = violation.value(); - Annotation constraint = violation.constraint(); - report( name, value, constraint ); - } - throw new IllegalArgumentException("Invalid argument(s)", e); - } - } - - [...snip...] - - private void report( String name, Object value, Annotation constraint ) - { - } -} -</pre></div><div class="section" title="Property Constraint"><div class="titlepage"><div><div><h4 class="title"><a id="_property_constraint"></a>Property Constraint</h4></div></div></div><p>Property Constraints are declared on the Property method.</p><pre class="programlisting brush: java">public interface HasPhoneNumber -{ - @PhoneNumber - Property<String> phoneNumber(); -} -</pre><p>In this case, the Constraint associated with the phoneNumber() method, will be called before the set() method on that -Property is called. If there is a constraint violation, the Exception thrown will be part of the caller, and not the -composite containing the Property, so a reporting constraint on the containing Composite will not see it. If you want -the containing Composite to handle the Constraint Violation, then you need to add a Concern on the Property itself, -which can be done like this;</p><pre class="programlisting brush: java">public abstract class PhoneNumberParameterViolationConcern extends ConcernOf<HasPhoneNumber> - implements HasPhoneNumber -{ - @Concerns( CheckViolation.class ) - public abstract Property<String> phoneNumber(); - - private abstract class CheckViolation extends ConcernOf<Property<String>> - implements Property<String> - { - public void set( String number ) - { - try - { - next.set( number ); - } - catch( ConstraintViolationException e ) - { - Collection<ConstraintViolation> violations = e.constraintViolations(); - report( violations ); - } - } - - [...snip...] - - private void report( Collection<ConstraintViolation> violations ) - { - } - } -} -</pre></div></div><div xmlns="" xmlns:exsl="http://exslt.org/common" class="footer"><p> - Copyright © 2015 The Apache Software Foundation, Licensed under the <a href="http://www.apache.org/licenses/" target="_blank">Apache License, Version 2.0</a>. - <br /><small> - Apache Zest, Zest, Apache, the Apache feather logo, and the Apache Zest project logo are trademarks of The Apache Software Foundation.<br /> - All other marks mentioned may be trademarks or registered trademarks of their respective owners. - </small></p></div></body></html> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/polygene-website/blob/ea4d77b0/content/java/latest/howto-create-entity.html ---------------------------------------------------------------------- diff --git a/content/java/latest/howto-create-entity.html b/content/java/latest/howto-create-entity.html deleted file mode 100644 index 0b742da..0000000 --- a/content/java/latest/howto-create-entity.html +++ /dev/null @@ -1,242 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><title>Create an Entity</title><link rel="stylesheet" type="text/css" href="css/style.css" /><meta name="generator" content="DocBook XSL Stylesheets V1.76.1" /><link rel="home" href="index.html" title="" /><link rel="up" href="tutorials.html" title="Tutorials" /><link rel="prev" href="howto-create-sideeffect.html" title="Create a SideEffect" /><link rel="next" href="howto-configure-service.html" title="Configure a Service" /> - - -<!-- favicon --> - -<link rel="shortcut icon" href="http://qi4j.org/favicon.ico" type="image/vnd.microsoft.icon" /> -<link rel="icon" href="http://qi4j.org/favicon.ico" type="image/x-icon" /> - -<!-- style --> - -<link href="css/shCore.css" rel="stylesheet" type="text/css" /> -<link href="css/shCoreEclipse.css" rel="stylesheet" type="text/css" /> -<link href="css/shThemeEclipse.css" rel="stylesheet" type="text/css" /> -<link href="css/qi4j.css" rel="stylesheet" type="text/css" /> - -<!-- Syntax Highlighter --> - -<script type="text/javascript" src="js/shCore.js"></script> -<script type="text/javascript" src="js/shBrushJava.js"></script> -<script type="text/javascript" src="js/shBrushScala.js"></script> -<script type="text/javascript" src="js/shBrushJScript.js"></script> -<script type="text/javascript" src="js/shBrushBash.js"></script> -<script type="text/javascript" src="js/shBrushPlain.js"></script> -<script type="text/javascript" src="js/shBrushXml.js"></script> -<script type="text/javascript" src="js/shBrushGroovy.js"></script> -<script type="text/javascript" src="js/shBrushPython.js"></script> -<script type="text/javascript" src="js/shBrushRuby.js"></script> -<script type="text/javascript" src="js/shBrushCSharp.js"></script> - -<script type="text/javascript"> - SyntaxHighlighter.defaults['tab-size'] = 4; - SyntaxHighlighter.defaults['gutter'] = false; - SyntaxHighlighter.defaults['toolbar'] = false; - SyntaxHighlighter.all() -</script> - -<!-- JQuery --> - -<script type="text/javascript" src="js/jquery-1.6.4.min.js"></script> - -<!-- Image Scaler --> - -<script type="text/javascript" src="js/imagescaler.js"></script> - -<!-- Table Styler --> - -<script type="text/javascript" src="js/tablestyler.js"></script> - -<!-- Qi4j WebSite Progressive Enhancement --> - -<link href="css/progressive-enhancement.css" rel="stylesheet" type="text/css" /> -<script type="text/javascript" src="js/jquery.scrollTo-1.4.2.js"></script> -<script type="text/javascript" src="js/progressive-enhancement.js"></script> - -<!-- Analytics --> - <script type="text/javascript"> - var _gaq = _gaq || []; - _gaq.push(['_setAccount', 'UA-89723617-1']); - _gaq.push(['_trackPageview']); - - (function() { - var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; - ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; - var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); - })(); - </script> - - </head><body><div xmlns="" xmlns:exsl="http://exslt.org/common" class="logo"><a href="index.html"><img src="images/logo-standard.png" /></a></div><div xmlns="" xmlns:exsl="http://exslt.org/common" class="top-nav"><div xmlns="http://www.w3.org/1999/xhtml" class="toc"><dl><dt><span class="section"><a href="index.html#home">Zestâ¢</a></span></dt><dt><span class="section"><a href="intro.html">Introduction</a></span></dt><dt><span class="section"><span xmlns="" href="tutorials.html">Tutorials</span></span></dt><dt><span class="section"><a href="javadocs.html">Javadoc</a></span></dt><dt><span class="section"><a href="samples.html">Samples</a></span></dt><dt><span class="section"><a href="core.html">Core</a></span></dt><dt><span class="section"><a href="libraries.html">Libraries</a></span></dt><dt><span class="section"><a href="extensions.html">Extensions</a></span></dt><dt><span class="section"><a href="tools.html">Tools</a></span></dt><dt><span class="section"><a href="glossary.html"> Glossary </a></span></dt></dl></div></div><div xmlns="" xmlns:exsl="http://exslt.org/common" class="sub-nav"><div xmlns="http://www.w3.org/1999/xhtml" class="toc"><dl><dt><span class="section"><a href="tutorials.html#_overview">Overview</a></span></dt><dt><span class="section"><a href="two-minutes-intro.html">Zest⢠in 2 minutes</a></span></dt><dt><span class="section"><a href="ten-minutes-intro.html">Zest⢠in 10 minutes</a></span></dt><dt><span class="section"><a href="thirty-minutes-intro.html">Zest⢠in 30 minutes</a></span></dt><dt><span class="section"><a href="howto-depend-on-zest.html">Depend on Zest⢠in your build</a></span></dt><dt><span class="section"><a href="howto-assemble-application.html">Assemble an Application</a></span></dt><dt><span class="section"><a href="tut-composites.html">Transient Composites Tutorial</a></span></dt><dt><span class="section"><a href="tut-services.html">Services Composites Tutorial</a></span></dt><dt><span class="section"><a href="howt o-contextual-fragments.html">Use contextual fragments</a></span></dt><dt><span class="section"><a href="howto-leverage-properties.html">Leverage Properties</a></span></dt><dt><span class="section"><a href="howto-create-constraint.html">Create a Constraint</a></span></dt><dt><span class="section"><a href="howto-create-concern.html">Create a Concern</a></span></dt><dt><span class="section"><a href="howto-create-sideeffect.html">Create a SideEffect</a></span></dt><dt><span class="section"><span xmlns="" href="howto-create-entity.html">Create an Entity</span></span></dt><dt><span class="section"><a href="howto-configure-service.html">Configure a Service</a></span></dt><dt><span class="section"><a href="howto-invocation-annotation.html">Use @Invocation</a></span></dt><dt><span class="section"><a href="howto-use-io.html">Use I/O API</a></span></dt><dt><span class="section"><a href="build-system.html">Zest⢠Build System</a></span></dt><dt><span class="section"><a href="community-docs.htm l">Writing Zest⢠Documentation</a></span></dt><dt><span class="section"><a href="releasing-apache.html">Releasing Zestâ¢</a></span></dt></dl></div></div><div class="section" title="Create an Entity"><div class="titlepage"><div><div><h3 class="title"><a id="howto-create-entity"></a>Create an Entity</h3></div></div></div><p>One of the most common tasks in Zest⢠is the management of the life cycle of Entities. Since Zest⢠is capable of -delivering much higher performance than traditional Object-Relational Mapping technologies, we also expect that people -use Entities more frequently in Zest⢠applications, so it is a very important topic to cover.</p><p>If you want to reproduce whatâs explained in this tutorial, remember to depend on the Core Bootstrap artifact:</p><div class="table"><a id="idm371059863392"></a><p class="title"><strong>Table 12. Artifact</strong></p><div class="table-contents"><table summary="Artifact" border="1"><colgroup><col class="col_1" /><col class="col_2" /><col class="col_3" /></colgroup><thead><tr><th align="left" valign="top">Group ID</th><th align="left" valign="top">Artifact ID</th><th align="left" valign="top">Version</th></tr></thead><tbody><tr><td align="left" valign="top"><p>org.qi4j.core</p></td><td align="left" valign="top"><p>org.qi4j.core.bootstrap</p></td><td align="left" valign="top"><p>2.1</p></td></tr></tbody></table></div></div><br class="table-break" /><p>Moreover, youâll need an EntityStore for persistence and an Indexing engine for querying. Choose among the available -implementations listed in the <a class="xref" href="extensions.html" title="Extensions">Extensions</a> section.</p><p>At runtime you will need the Core Runtime artifact too. See the <a class="xref" href="howto-depend-on-zest.html" title="Depend on Zest⢠in your build">Depend on Zest⢠in your build</a> tutorial for details.</p><div class="section" title="Basics First"><div class="titlepage"><div><div><h4 class="title"><a id="_basics_first"></a>Basics First</h4></div></div></div><p>All Entity operations MUST be done within a UnitOfWork. UnitOfWorks can be nested and if underlying UnitOfWorks are not -completed (method complete()), then none of the operations will be persisted permanently.</p><p>Entity composites are subtypes of the EntityComposite interface.</p><p>Domain code typically donât need to know of the EntityComposite types directly, and is instead using the domain specific -interface. The Visibility rules will be applied to associate the right EntityComposite when a domain type is requested. -Ambiguities are not accepted and will result in runtime exceptions.</p><p>Zest⢠supports that each entity instance can have more than one entity type, and it is managed per instance. This feature -is beyond the scope of this HowTO and will be covered subsequently.</p></div><div class="section" title="Good Practice"><div class="titlepage"><div><div><h4 class="title"><a id="_good_practice"></a>Good Practice</h4></div></div></div><p>We have made the observation that it is good practice to separate the internal state from the observable behavior. By -this we mean that it is not a good practice to allow client code to manipulate or even view the internal states of -objects, which is such a common (bad) practice in the so called POJO world.</p><p>Instead, we recommend that the programmer defines the client requirement of what each participant within the client -context needs to conform to, and then create composites accordingly and hide all the state internal to the composite in -private mixins. By doing so, the same entity can participate in multiple contexts with different behavioral requirements -but using the same internal state.</p><p>We recommend limited use of primitive types for Properties and instead subtype the Property.</p><p>And try to use ValueComposites instead of Entities.</p></div><div class="section" title="The Entity"><div class="titlepage"><div><div><h4 class="title"><a id="_the_entity"></a>The Entity</h4></div></div></div><p>We need an entity to illustrate how we recommend to separate internal state from public behavior and observable state. -We will for the sake of simplicity use a trivial example. Please refer to other (possibly future) HowTos on patterns on -Entity management.</p><pre class="programlisting brush: java">public interface Car -{ - @Immutable - Association<Manufacturer> manufacturer(); - - @Immutable - Property<String> model(); - - ManyAssociation<Accident> accidents(); -} - -</pre><pre class="programlisting brush: java">public interface Manufacturer -{ - Property<String> name(); - Property<String> country(); - - @UseDefaults - Property<Long> carsProduced(); -} - -</pre><pre class="programlisting brush: java">public interface Accident -{ - Property<String> description(); - Property<Date> occured(); - Property<Date> repaired(); -} - -</pre><p>Above we define a Car domain object, which is of a particular Manufacturer (also an Entity), a model and a record of -Accidents.</p><p>We will also need to define the composites for the above domain structure;</p><pre class="programlisting brush: java">public interface CarEntity extends Car, EntityComposite -{} - -</pre><pre class="programlisting brush: java">public interface ManufacturerEntity extends Manufacturer, EntityComposite -{} - -</pre><pre class="programlisting brush: java">public interface AccidentValue extends Accident, ValueComposite -{} - -</pre><p>For this case, we define both the Car and the Manufacturer as Entities, whereas the Accident is a Value, since it is an -immutable event that can not be modified.</p></div><div class="section" title="Assembly"><div class="titlepage"><div><div><h4 class="title"><a id="_assembly"></a>Assembly</h4></div></div></div><p>All of the above must also be declared in the assembly. We MUST associate the EntityComposites with a relevant Module. -We must also assemble an EntityStore for the entire application, but that is outside the scope of this HowTo.</p><pre class="programlisting brush: java">public class MyAssembler - implements Assembler -{ - public void assemble( ModuleAssembly module ) - { - module.entities( CarEntity.class, - ManufacturerEntity.class ); - - module.values( AccidentValue.class ); - [...snip...] - - } -} -</pre><p>We have no other Composites involved yet, so we can proceed to look at the usage code.</p><p>We recommend that the life cycle management of entities is placed inside domain factories, one for each type and made -available as services.</p></div><div class="section" title="The Entity Factory"><div class="titlepage"><div><div><h4 class="title"><a id="_the_entity_factory"></a>The Entity Factory</h4></div></div></div><p>The entity factory is something you need to write yourself, but as with most things in Zest⢠it will end up being a -fairly small implementation. So how is that done?</p><pre class="programlisting brush: java">public interface CarEntityFactory -{ - Car create(Manufacturer manufacturer, String model); -} - -</pre><p>That is just the domain interface. We now need to make the service interface, which Zest⢠needs to identify services and -make it possible for the service injection later.</p><pre class="programlisting brush: java">@Mixins( { CarEntityFactoryMixin.class } ) -public interface CarEntityFactoryService - extends CarEntityFactory, ServiceComposite -{} -</pre><p>Then we need an implementation of the mixin.</p><pre class="programlisting brush: java">public class CarEntityFactoryMixin - implements CarEntityFactory -{ - -</pre><p>And doing that, first of all we need to request Zest⢠runtime to give us the Module -that our code belongs to, and the UnitOfWork current context the execution is happening in.</p><p>Injections that are related to the Visibility rules are handled by the @Structure annotation. And the easiest way for us -to obtain a Module is simply to;</p><pre class="programlisting brush: java">public class CarEntityFactoryMixin - implements CarEntityFactory -{ - - @Structure - Module module; -</pre><p>Here Zest⢠will inject the member module with the correct Module. In case we only need the Module -during the construction, we can also request it in the same manner as constructor argument.</p><pre class="programlisting brush: java">public CarEntityFactoryMixin( @Structure Module module ) -{ -} - -</pre><p>This is important to know, since the injected member will not be available until AFTER the constructor has been -completed.</p><p>We then need to provide the implementation for the create() method.</p><pre class="programlisting brush: java">public Car create(Manufacturer manufacturer, String model) -{ - UnitOfWork uow = module.currentUnitOfWork(); - EntityBuilder<Car> builder = uow.newEntityBuilder( Car.class ); - - Car prototype = builder.instance(); - prototype.manufacturer().set( manufacturer ); - prototype.model().set( model ); - - return builder.newInstance(); -} -</pre><p>So far so good. But how about the Manufacturer input into the create() method?</p><p>DDD promotes the use of Repositories. They are the type-safe domain interfaces into locating entities without getting -bogged down with querying infrastructure details. And one Repository per Entity type, so we keep it nice, tidy and -re-usable. So letâs create one for the Manufacturer type.</p><pre class="programlisting brush: java">public interface ManufacturerRepository -{ - Manufacturer findByIdentity(String identity); - - Manufacturer findByName(String name); -} -</pre><p>And then we repeat the process for creating a Serviceâ¦</p><pre class="programlisting brush: java">@Mixins( ManufacturerRepositoryMixin.class ) -public interface ManufacturerRepositoryService - extends ManufacturerRepository, ServiceComposite -{} -</pre><p>and a Mixin that implements itâ¦</p><pre class="programlisting brush: java">public class ManufacturerRepositoryMixin - implements ManufacturerRepository -{ - @Structure - private UnitOfWorkFactory uowf; - - @Structure - private Module module; - - public Manufacturer findByIdentity( String identity ) - { - UnitOfWork uow = uowf.currentUnitOfWork(); - return uow.get(Manufacturer.class, identity); - } - - public Manufacturer findByName( String name ) - { - UnitOfWork uow = uowf.currentUnitOfWork(); - QueryBuilder<Manufacturer> builder = - module.newQueryBuilder( Manufacturer.class ); - - Manufacturer template = templateFor( Manufacturer.class ); - builder.where( eq( template.name(), name ) ); - - Query<Manufacturer> query = uow.newQuery( builder); - return query.find(); - } -} - -</pre><p>But now we have introduced 2 services that also are required to be declared in the assembly. In this case, we want the -Services to be available to the application layer above, and not restricted to within this domain model.</p><pre class="programlisting brush: java">public class MyAssembler - implements Assembler -{ - public void assemble( ModuleAssembly module ) - { - module.entities( CarEntity.class, - ManufacturerEntity.class ); - - module.values( AccidentValue.class ); - module.addServices( - ManufacturerRepositoryService.class, - CarEntityFactoryService.class - ).visibleIn( Visibility.application ); - } -} -</pre></div><div class="section" title="The UnitOfWork"><div class="titlepage"><div><div><h4 class="title"><a id="_the_unitofwork"></a>The UnitOfWork</h4></div></div></div><p>If you notice, there is a couple of calls to Module.currentUnitOfWork(), but what is current UnitOfWork, and -who is setting that up?</p><p>Well, the domain layer should not worry about UoW, it is probably the responsibility of the application/service layer -sitting on top. That could be a web application creating and completing a UoW per request, or some other co-ordinator -doing long-running UnitOfWorks.</p><p>There are of course a lot more details to get all this completed, but that is beyond the scope of this HowTo. -See <a class="xref" href="core-api.html#core-api-unitofwork" title="Unit Of Work">UnitOfWork</a> in Core API.</p></div></div><div xmlns="" xmlns:exsl="http://exslt.org/common" class="footer"><p> - Copyright © 2015 The Apache Software Foundation, Licensed under the <a href="http://www.apache.org/licenses/" target="_blank">Apache License, Version 2.0</a>. - <br /><small> - Apache Zest, Zest, Apache, the Apache feather logo, and the Apache Zest project logo are trademarks of The Apache Software Foundation.<br /> - All other marks mentioned may be trademarks or registered trademarks of their respective owners. - </small></p></div></body></html> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/polygene-website/blob/ea4d77b0/content/java/latest/howto-create-sideeffect.html ---------------------------------------------------------------------- diff --git a/content/java/latest/howto-create-sideeffect.html b/content/java/latest/howto-create-sideeffect.html deleted file mode 100644 index f11edcb..0000000 --- a/content/java/latest/howto-create-sideeffect.html +++ /dev/null @@ -1,177 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><title>Create a SideEffect</title><link rel="stylesheet" type="text/css" href="css/style.css" /><meta name="generator" content="DocBook XSL Stylesheets V1.76.1" /><link rel="home" href="index.html" title="" /><link rel="up" href="tutorials.html" title="Tutorials" /><link rel="prev" href="howto-create-concern.html" title="Create a Concern" /><link rel="next" href="howto-create-entity.html" title="Create an Entity" /> - - -<!-- favicon --> - -<link rel="shortcut icon" href="http://qi4j.org/favicon.ico" type="image/vnd.microsoft.icon" /> -<link rel="icon" href="http://qi4j.org/favicon.ico" type="image/x-icon" /> - -<!-- style --> - -<link href="css/shCore.css" rel="stylesheet" type="text/css" /> -<link href="css/shCoreEclipse.css" rel="stylesheet" type="text/css" /> -<link href="css/shThemeEclipse.css" rel="stylesheet" type="text/css" /> -<link href="css/qi4j.css" rel="stylesheet" type="text/css" /> - -<!-- Syntax Highlighter --> - -<script type="text/javascript" src="js/shCore.js"></script> -<script type="text/javascript" src="js/shBrushJava.js"></script> -<script type="text/javascript" src="js/shBrushScala.js"></script> -<script type="text/javascript" src="js/shBrushJScript.js"></script> -<script type="text/javascript" src="js/shBrushBash.js"></script> -<script type="text/javascript" src="js/shBrushPlain.js"></script> -<script type="text/javascript" src="js/shBrushXml.js"></script> -<script type="text/javascript" src="js/shBrushGroovy.js"></script> -<script type="text/javascript" src="js/shBrushPython.js"></script> -<script type="text/javascript" src="js/shBrushRuby.js"></script> -<script type="text/javascript" src="js/shBrushCSharp.js"></script> - -<script type="text/javascript"> - SyntaxHighlighter.defaults['tab-size'] = 4; - SyntaxHighlighter.defaults['gutter'] = false; - SyntaxHighlighter.defaults['toolbar'] = false; - SyntaxHighlighter.all() -</script> - -<!-- JQuery --> - -<script type="text/javascript" src="js/jquery-1.6.4.min.js"></script> - -<!-- Image Scaler --> - -<script type="text/javascript" src="js/imagescaler.js"></script> - -<!-- Table Styler --> - -<script type="text/javascript" src="js/tablestyler.js"></script> - -<!-- Qi4j WebSite Progressive Enhancement --> - -<link href="css/progressive-enhancement.css" rel="stylesheet" type="text/css" /> -<script type="text/javascript" src="js/jquery.scrollTo-1.4.2.js"></script> -<script type="text/javascript" src="js/progressive-enhancement.js"></script> - -<!-- Analytics --> - <script type="text/javascript"> - var _gaq = _gaq || []; - _gaq.push(['_setAccount', 'UA-89723617-1']); - _gaq.push(['_trackPageview']); - - (function() { - var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; - ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; - var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); - })(); - </script> - - </head><body><div xmlns="" xmlns:exsl="http://exslt.org/common" class="logo"><a href="index.html"><img src="images/logo-standard.png" /></a></div><div xmlns="" xmlns:exsl="http://exslt.org/common" class="top-nav"><div xmlns="http://www.w3.org/1999/xhtml" class="toc"><dl><dt><span class="section"><a href="index.html#home">Zestâ¢</a></span></dt><dt><span class="section"><a href="intro.html">Introduction</a></span></dt><dt><span class="section"><span xmlns="" href="tutorials.html">Tutorials</span></span></dt><dt><span class="section"><a href="javadocs.html">Javadoc</a></span></dt><dt><span class="section"><a href="samples.html">Samples</a></span></dt><dt><span class="section"><a href="core.html">Core</a></span></dt><dt><span class="section"><a href="libraries.html">Libraries</a></span></dt><dt><span class="section"><a href="extensions.html">Extensions</a></span></dt><dt><span class="section"><a href="tools.html">Tools</a></span></dt><dt><span class="section"><a href="glossary.html"> Glossary </a></span></dt></dl></div></div><div xmlns="" xmlns:exsl="http://exslt.org/common" class="sub-nav"><div xmlns="http://www.w3.org/1999/xhtml" class="toc"><dl><dt><span class="section"><a href="tutorials.html#_overview">Overview</a></span></dt><dt><span class="section"><a href="two-minutes-intro.html">Zest⢠in 2 minutes</a></span></dt><dt><span class="section"><a href="ten-minutes-intro.html">Zest⢠in 10 minutes</a></span></dt><dt><span class="section"><a href="thirty-minutes-intro.html">Zest⢠in 30 minutes</a></span></dt><dt><span class="section"><a href="howto-depend-on-zest.html">Depend on Zest⢠in your build</a></span></dt><dt><span class="section"><a href="howto-assemble-application.html">Assemble an Application</a></span></dt><dt><span class="section"><a href="tut-composites.html">Transient Composites Tutorial</a></span></dt><dt><span class="section"><a href="tut-services.html">Services Composites Tutorial</a></span></dt><dt><span class="section"><a href="howt o-contextual-fragments.html">Use contextual fragments</a></span></dt><dt><span class="section"><a href="howto-leverage-properties.html">Leverage Properties</a></span></dt><dt><span class="section"><a href="howto-create-constraint.html">Create a Constraint</a></span></dt><dt><span class="section"><a href="howto-create-concern.html">Create a Concern</a></span></dt><dt><span class="section"><span xmlns="" href="howto-create-sideeffect.html">Create a SideEffect</span></span></dt><dt><span class="section"><a href="howto-create-entity.html">Create an Entity</a></span></dt><dt><span class="section"><a href="howto-configure-service.html">Configure a Service</a></span></dt><dt><span class="section"><a href="howto-invocation-annotation.html">Use @Invocation</a></span></dt><dt><span class="section"><a href="howto-use-io.html">Use I/O API</a></span></dt><dt><span class="section"><a href="build-system.html">Zest⢠Build System</a></span></dt><dt><span class="section"><a href="community-docs.htm l">Writing Zest⢠Documentation</a></span></dt><dt><span class="section"><a href="releasing-apache.html">Releasing Zestâ¢</a></span></dt></dl></div></div><div class="section" title="Create a SideEffect"><div class="titlepage"><div><div><h3 class="title"><a id="howto-create-sideeffect"></a>Create a SideEffect</h3></div></div></div><p>SideEffects are defined in <a class="xref" href="glossary.html#def-sideeffect">SideEffect</a>.</p><p>If you want to reproduce whatâs explained in this tutorial, remember to depend on the Core Bootstrap artifact:</p><div class="table"><a id="idm371059893520"></a><p class="title"><strong>Table 11. Artifact</strong></p><div class="table-contents"><table summary="Artifact" border="1"><colgroup><col class="col_1" /><col class="col_2" /><col class="col_3" /></colgroup><thead><tr><th align="left" valign="top">Group ID</th><th align="left" valign="top">Artifact ID</th><th align="left" valign="top">Version</th></tr></thead><tbody><tr><td align="left" valign ="top"><p>org.qi4j.core</p></td><td align="left" valign="top"><p>org.qi4j.core.bootstrap</p></td><td align="left" valign="top"><p>2.1</p></td></tr></tbody></table></div></div><br class="table-break" /><p>At runtime you will need the Core Runtime artifact too. See the <a class="xref" href="howto-depend-on-zest.html" title="Depend on Zest⢠in your build">Depend on Zest⢠in your build</a> tutorial for details.</p><div class="section" title="Typed SideEffect"><div class="titlepage"><div><div><h4 class="title"><a id="_typed_sideeffect"></a>Typed SideEffect</h4></div></div></div><p>A typed SideEffect is a Java class that implements the MixinType it can be used on:</p><pre class="programlisting brush: java">public abstract class MailNotifySideEffect extends SideEffectOf<Confirmable> - implements Confirmable -{ - @Service - private MailService mailer; - - @This - private HasLineItems hasItems; - - @This - private HasCustomer hasCustomer; - - @Override - public void confirm() - { - StringBuilder builder = new StringBuilder(); - builder.append( "An Order has been made.\n\n\n" ); - builder.append( "Customer:" ); - builder.append( hasCustomer.name().get() ); - builder.append( "\n\nItems ordered:\n" ); - for( LineItem item : hasItems.lineItems().get() ) - { - builder.append( item.name().get() ); - builder.append( " : " ); - builder.append( item.quantity().get() ); - builder.append( "\n" ); - } - mailer.send( "[email protected]", builder.toString() ); - } -} -</pre><p>The MailNotifySideEffect is implemented as an abstract class, since we are not interested in the many other methods in -the Confirmable interface. Extending the SideEffectOf is a convenience mechanism, instead of an explicit @SideEffectFor -annotation on a private field, which can be used in rare occasions when you are not able to extend. This base class -defines the next field, which is set up by the Zest⢠runtime and points to the next fragment in the call stack. We can -also see that the MailService, HasLineItems and HasCustomer are provided to the side-effect, which is done with -dependency injection. Zest⢠also supports dependency injection via constructors and methods.</p><p>It can be used as follows;</p><pre class="programlisting brush: java">@SideEffects( MailNotifySideEffect.class ) -public interface OrderEntity - extends Order, HasSequenceNumber, HasCustomer, - HasLineItems, Confirmable, EntityComposite -{ -} -</pre><p>Methods of the SideEffect Fragment will be called after the Mixin invocation.</p></div><div class="section" title="Generic SideEffect"><div class="titlepage"><div><div><h4 class="title"><a id="_generic_sideeffect"></a>Generic SideEffect</h4></div></div></div><p>A generic SideEffect is a Java class that implements java.lang.reflect.InvocationHandler which allows it to be used on any -arbitrary MixinType.</p><pre class="programlisting brush: java">public class MyGenericSideEffect extends GenericSideEffect -{ - @Override - public Object invoke( Object proxy, Method method, Object[] args ) - throws Throwable - { - // Do whatever you need... - - try - { - // It is possible to obtain the returned values by using 'result' member; - Object returnedValue = result.invoke( proxy, method, args ); - } catch( NumberFormatException e ) - { - // And Exception will be thrown accordingly, in case you need to know. - throw new IllegalArgumentException(); // But any thrown exceptions are ignored. - } - return 23; // Return values will also be ignored. - } -} -</pre><p>It can be used as follows;</p><pre class="programlisting brush: java">@Concerns( MyGenericSideEffect.class ) -public interface AnyMixinType -{ - [...snip...] - -} -</pre><p>Methods of the SideEffect Fragment will be called before the Mixin invocation.</p><div class="section" title="AppliesTo"><div class="titlepage"><div><div><h5 class="title"><a id="_appliesto_2"></a>AppliesTo</h5></div></div></div><p>For generic SideEffects that should only trigger on methods with specific annotations or fulfilling some expression, add -@AppliesTo annotation to the SideEffect class which points to either triggering annotation(s), or to AppliesToFilter -implementation(s).</p><p>The SideEffect is invoked if one of the triggering annotations is found or one of the AppliesToFilter accepts the -invocation. In other words the AppliesTo arguments are ORâed.</p><p>Here is how the declaration goes ;</p><pre class="programlisting brush: java">@AppliesTo( { MyAnnotation.class, MyAppliesToFilter.class } ) -public class MyGenericSideEffect extends GenericSideEffect -{ - [...snip...] - -} -</pre><p>And how to use the annotation ;</p><pre class="programlisting brush: java">@Concerns( MyGenericSideEffect.class ) -public interface AnyMixinType -{ - - @MyAnnotation - void doSomething(); - - void doSomethingElse(); - -} - [...snip...] - -</pre><p>Here only the doSomething() method will see the SideEffect applied whereas the doSomethingElse() method wonât.</p><p>Finally here is how to implement an AppliesToFilter:</p><pre class="programlisting brush: java">public class MyAppliesToFilter implements AppliesToFilter -{ - public boolean appliesTo( Method method, Class<?> mixin, Class<?> compositeType, Class<?> modifierClass ) - { - boolean appliesTo = evaluate(method); // Do whatever you want - return appliesTo; - } - - [...snip...] - - private boolean evaluate( Method method ) - { - return true; - } -</pre></div></div></div><div xmlns="" xmlns:exsl="http://exslt.org/common" class="footer"><p> - Copyright © 2015 The Apache Software Foundation, Licensed under the <a href="http://www.apache.org/licenses/" target="_blank">Apache License, Version 2.0</a>. - <br /><small> - Apache Zest, Zest, Apache, the Apache feather logo, and the Apache Zest project logo are trademarks of The Apache Software Foundation.<br /> - All other marks mentioned may be trademarks or registered trademarks of their respective owners. - </small></p></div></body></html> \ No newline at end of file
