blob: 8a9ff3c8d48457771b14f077237139a28f8527d0 [file] [log] [blame]
<!DOCTYPE html>
<!--
| Generated by Apache Maven Doxia Site Renderer 1.8.1 from src/site/asciidoc/index.adoc
| Rendered using Apache Maven Fluido Skin 1.7
-->
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="Content-Language" content="en" />
<title>Spring Registry Component &#x2013; </title>
<link rel="stylesheet" href="./css/apache-maven-fluido-1.7.min.css" />
<link rel="stylesheet" href="./css/site.css" />
<link rel="stylesheet" href="./css/print.css" media="print" />
<script type="text/javascript" src="./js/apache-maven-fluido-1.7.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.5.0/css/font-awesome.min.css">
<link rel="stylesheet" href="../css/site.css">
<!-- Google Analytics -->
<script type="text/javascript">
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-140879-5']);
_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 class="topBarEnabled">
<a href="https://github.com/apache/archiva-components">
<img style="position: absolute; top: 0; right: 0; border: 0; z-index: 10000;"
src="https://s3.amazonaws.com/github/ribbons/forkme_right_darkblue_121621.png"
alt="Fork me on GitHub">
</a>
<div id="topbar" class="navbar navbar-fixed-top ">
<div class="navbar-inner">
<div class="container"><div class="nav-collapse">
<ul class="nav">
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">Modules <b class="caret"></b></a>
<ul class="dropdown-menu">
<li><a href="archiva-components-spring-registry-api/index.html" title="Archiva Components :: Spring Registry Api">Archiva Components :: Spring Registry Api</a></li>
<li><a href="archiva-components-spring-registry-commons/index.html" title="Archiva Components :: Spring Registry Commons">Archiva Components :: Spring Registry Commons</a></li>
</ul>
</li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">Project Documentation <b class="caret"></b></a>
<ul class="dropdown-menu">
<li class="dropdown-submenu">
<a href="project-info.html" title="Project Information">Project Information</a>
<ul class="dropdown-menu">
<li><a href="index.html" title="About">About</a></li>
</ul>
</li>
<li class="dropdown-submenu">
<a href="project-reports.html" title="Project Reports">Project Reports</a>
<ul class="dropdown-menu">
<li><a href="apidocs/index.html" title="Javadoc">Javadoc</a></li>
</ul>
</li>
</ul>
</li>
</ul>
<form id="search-form" action="https://www.google.com/search" method="get" class="navbar-search pull-right" >
<input value="http://archiva.apache.org/components" name="sitesearch" type="hidden"/>
<input class="search-query" name="q" id="query" type="text" />
</form>
<script type="text/javascript">asyncJs( 'https://cse.google.com/brand?form=search-form' )</script>
<ul class="nav pull-right">
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">External Links <b class="caret"></b></a>
<ul class="dropdown-menu">
<li><a href="../../index.html" title="Archiva">Archiva</a></li>
</ul>
</li>
</ul>
</div>
</div>
</div>
</div>
<div class="container">
<div id="banner">
<div class="pull-left"><a href="http://archiva.apache.org/index.html" id="bannerLeft"><img src="http://archiva.apache.org/images/archiva.png" alt="Apache Archiva"/></a></div>
<div class="pull-right"><a href="http://www.apache.org/" id="bannerRight"><img src="http://www.apache.org/images/asf_logo_wide_2016.png" alt="Apache Software Foundation"/></a></div>
<div class="clear"><hr/></div>
</div>
<div id="breadcrumbs">
<ul class="breadcrumb">
<li class=""><a href="../../index.html" title="Archiva">Archiva</a><span class="divider">/</span></li>
<li class=""><a href="../index.html" title="Archiva Components">Archiva Components</a><span class="divider">/</span></li>
<li class=""><a href="index.html" title="Spring Registry">Spring Registry</a><span class="divider">/</span></li>
<li class="active "></li>
</ul>
</div>
<div id="bodyColumn" >
<h1>Spring Registry Component</h1>
<div class="sect1">
<h2 id="about">About</h2>
<div class="sectionbody">
<div class="paragraph">
<p>The Spring registry is a single source of external configuration for Spring components and applications.
It can be used by components to source configuration, knowing that it can be used from within applications
without the information being hard coded into the component.</p>
</div>
<div class="paragraph">
<p>To facilitate a variety of providers, <a href="http://jakarta.apache.org/commons/configuration/">Commons Configuration</a>
is used to implement the backing storage.</p>
</div>
<div class="paragraph">
<p>This relies on a pull-based (or lookup) mechanism - the applications request specific pieces of configuration at
the time they need them, and it is retrieved from the registry.</p>
</div>
<div class="paragraph">
<p>The registry is configurable so that configuration can be placed in any location desired, and is shared container
wide. A registry using the same file as other running VMs should operate correctly.</p>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<i class="fa icon-note" title="Note"></i>
</td>
<td class="content">
<div class="paragraph">
<p>Inside the application server, this means that the scope is application wide as each application has it&#8217;s
own container. It may be feasible to provide a single registry for the whole server, but this has not yet been
tested. This would only be necessary if the server was to dictate configuration locations that the registry was
not already configured to use. Of course, such additional locations could be added to the application registry
instances programmatically as well.</p>
</div>
</td>
</tr>
</table>
</div>
<div class="sect2">
<h3 id="example_configuration">Example Configuration</h3>
<div class="listingblock">
<div class="content">
<pre>&lt;component&gt;
&lt;role&gt;org.apache.archiva.components.registry.Registry&lt;/role&gt;
&lt;implementation&gt;org.apache.archiva.components.registry.CommonsConfigurationRegistry&lt;/implementation&gt;
&lt;role-hint&gt;commons-configuration&lt;/role-hint&gt;
&lt;configuration&gt;
&lt;properties&gt;
&lt;system/&gt;
&lt;jndi prefix="java:comp/env" config-optional="true"/&gt;
&lt;xml fileName="${user.home}/.m2/archiva.xml" config-optional="true" config-name="org.apache.maven.archiva"
config-at="org.apache.maven.archiva" config-forceCreate="true"/&gt;
&lt;properties fileName="${user.home}/.m2/security.properties" config-optional="true"
config-at="org.codehaus.plexus.security"/&gt;
&lt;/properties&gt;
&lt;/configuration&gt;
&lt;/component&gt;</pre>
</div>
</div>
<div class="paragraph">
<p>The configuration inside the outer <code>properties</code> element is equivalent to the
<a href="http://jakarta.apache.org/commons/configuration/howto_configurationbuilder.html#Using_DefaultConfigurationBuilder">builder syntax</a>
for Commons Configuration. This maps to similar concepts in the registry.</p>
</div>
<div class="paragraph">
<p>In this example, the precedence is to first look in the system properties, then JNDI, then the given XML file, and
finally the given properties file.</p>
</div>
<div class="paragraph">
<p>Registries can have 'sections', which are declared as partitioned areas of the registry. This is done using the
<code>config-name</code> attribute in Commons Configuration. While the sections behave normally as a part of the global
registry, they can easily be retrieved independently. This is particularly useful for write-back operations so the
file the section is stored in can be saved when the registry is modified.</p>
</div>
<div class="paragraph">
<p>Each configuration source can be configured with a given mount-point in the registry using the <code>config-at</code>
attribute. This will cause all of the properties to be stored with the given prefix.</p>
</div>
</div>
<div class="sect2">
<h3 id="using_the_registry">Using the Registry</h3>
<div class="paragraph">
<p>The registry can be used as a simple directory, for example:</p>
</div>
<div class="listingblock">
<div class="content">
<pre>int value = registry.getInt( "test.property" );
String text = registry.getString( "text.data" );
boolean enabled = registry.getBoolean( "system.enabled", true );</pre>
</div>
</div>
<div class="paragraph">
<p>The first parameter is always a key. The registry is hierachical, so in the key, a <code>.</code> (period) represents a
nested configuration, and can be traversed to any level.</p>
</div>
<div class="paragraph">
<p>The second parameter specifies a default value. If it is not given, then <code>null</code> is returned for strings if the
key is not found in the registry, and an exception is thrown for integers and booleans under the same circumstances.</p>
</div>
</div>
<div class="sect2">
<h3 id="subsets_and_sections">Subsets and Sections</h3>
<div class="paragraph">
<p>There are two ways to work with a portion of the registry at a time: subsets and sections.</p>
</div>
<div class="paragraph">
<p>Sections were encountered earlier - and while they return a subset it may span a number of different base prefixes,
depending on whether <code>config-at</code> was specified on the section or not. Even so, if it is a subset of the
hierachy, some elements of the hierachy at the same level might not be returned because they come from a different
section.</p>
</div>
<div class="paragraph">
<p>On the other hand, subsets are reductions of the registry to keys descending from a given prefix.</p>
</div>
<div class="paragraph">
<p>Once a subset (or section) is obtained, it behaves the same as the registry as a whole, however it will have fewer
values, and looking up values will not have the prefix as a part of the key.</p>
</div>
<div class="paragraph">
<p>For example:</p>
</div>
<div class="listingblock">
<div class="content">
<pre>String value = registry.getString( "org.codehaus.plexus.registry.value" );
Registry subset = registry.getSubset( "org.codehaus.plexus.registry" );
value = subset.getString( "value" ); // this will equal the earlier value retrieved</pre>
</div>
</div>
</div>
<div class="sect2">
<h3 id="lists_and_maps">Lists and Maps</h3>
<div class="paragraph">
<p>It is also possible to retrieve subsets of the registry as collections.</p>
</div>
<div class="ulist">
<ul>
<li>
<p><code>getProperties(key)</code>: Maps and properties are straightforward - the subset is converted into key/value pairs
and returned as a map.</p>
</li>
<li>
<p><code>getSubsetList(key)</code>: For lists of complex types that will still contain more than one key/value pair,
this method can be used to retrieve them as a list of subset registries.</p>
</li>
<li>
<p><code>getList(key)</code>: For lists of simple types, this method can be used to get a list of value objects.</p>
</li>
</ul>
</div>
</div>
<div class="sect2">
<h3 id="using_models">Using Models</h3>
<div class="paragraph">
<p>To simplify the translation of configuration into reusable beans and to produce a self-documenting system, Modello
can be used to generate registry I/O classes. The appropriate goals in the plugin are <code>registry-reader</code> and
<code>registry-writer</code>.</p>
</div>
</div>
<div class="sect2">
<h3 id="saving_changes">Saving Changes</h3>
<div class="paragraph">
<p>Saving changes to a registry is quite simple:</p>
</div>
<div class="listingblock">
<div class="content">
<pre>registry.save();</pre>
</div>
</div>
<div class="paragraph">
<p>Note that the registry must be a file-based section (saving the entire registry will not succeed). It will be saved
to the same location that it was loaded from.</p>
</div>
</div>
<div class="sect2">
<h3 id="adding_change_listeners">Adding Change Listeners</h3>
<div class="paragraph">
<p>~~TODO</p>
</div>
</div>
</div>
</div>
</div>
</div>
<hr/>
<footer>
<div class="container">
<div class="row">
<p>Copyright &copy;2006&#x2013;2019
<a href="http://www.apache.org/">The Apache Software Foundation</a>.
All rights reserved.</p>
</div>
<p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
</p>
<div id="ohloh" class="pull-right">
<script type="text/javascript" src="https://www.ohloh.net/p/6670/widgets/project_thin_badge.js"></script>
</div>
</div>
</footer>
</body>
</html>