DNA SVN: r544 - in trunk: build/assembly and 2 other directories.
by dna-commits@lists.jboss.org
Author: rhauch
Date: 2008-09-25 23:36:03 -0400 (Thu, 25 Sep 2008)
New Revision: 544
Added:
trunk/build/assembly/all.xml
Modified:
trunk/build/assembly/dist.xml
trunk/build/assembly/examples.xml
trunk/docs/gettingstarted/pom.xml
trunk/docs/reference/src/main/docbook/en-US/content/development_tools.xml
trunk/docs/reference/src/main/docbook/en-US/content/introduction.xml
trunk/pom.xml
Log:
DNA-214 Update documentation to describe the repository, federation, JCR and other 0.2 features
https://jira.jboss.org/jira/browse/DNA-214
Documented the release build process, and added another 'all' assembly that contains all of the code
Added: trunk/build/assembly/all.xml
===================================================================
--- trunk/build/assembly/all.xml (rev 0)
+++ trunk/build/assembly/all.xml 2008-09-26 03:36:03 UTC (rev 544)
@@ -0,0 +1,21 @@
+<assembly>
+ <id>all</id>
+ <formats>
+ <!--<format>tar.gz</format>
+ <format>tar.bz2</format-->
+ <format>zip</format>
+ </formats>
+ <fileSets>
+ <fileSet>
+ <!--
+ Gather into the distribution the various text files for inclusion
+ -->
+ <directory></directory>
+ <outputDirectory></outputDirectory>
+ <excludes>
+ <exclude>target/**</exclude>
+ <exclude>**/target/**</exclude>
+ </excludes>
+ </fileSet>
+ </fileSets>
+</assembly>
Modified: trunk/build/assembly/dist.xml
===================================================================
--- trunk/build/assembly/dist.xml 2008-09-25 21:52:52 UTC (rev 543)
+++ trunk/build/assembly/dist.xml 2008-09-26 03:36:03 UTC (rev 544)
@@ -33,6 +33,13 @@
<directory>docs/gettingstarted/target/docbook/publish/en-US</directory>
<outputDirectory>manuals/gettingstarted</outputDirectory>
</fileSet>
+ <fileSet>
+ <!--
+ Gather into the distribution the Getting Started document
+ -->
+ <directory>docs/reference/target/docbook/publish/en-US</directory>
+ <outputDirectory>manuals/reference</outputDirectory>
+ </fileSet>
</fileSets>
<moduleSets>
<moduleSet>
Modified: trunk/build/assembly/examples.xml
===================================================================
--- trunk/build/assembly/examples.xml 2008-09-25 21:52:52 UTC (rev 543)
+++ trunk/build/assembly/examples.xml 2008-09-26 03:36:03 UTC (rev 544)
@@ -34,6 +34,16 @@
<!--
Gather into the distribution the examples
-->
+ <directory>docs/examples/gettingstarted/repositories</directory>
+ <outputDirectory>examples/repositories</outputDirectory>
+ <excludes>
+ <exclude>target/**</exclude>
+ </excludes>
+ </fileSet>
+ <fileSet>
+ <!--
+ Gather into the distribution the examples
+ -->
<directory>docs/examples/gettingstarted</directory>
<outputDirectory>examples</outputDirectory>
<includes>
Modified: trunk/docs/gettingstarted/pom.xml
===================================================================
--- trunk/docs/gettingstarted/pom.xml 2008-09-25 21:52:52 UTC (rev 543)
+++ trunk/docs/gettingstarted/pom.xml 2008-09-26 03:36:03 UTC (rev 544)
@@ -54,12 +54,12 @@
<stylesheetResource>classpath:/xslt/org/jboss/xhtml-single.xsl</stylesheetResource>
<finalName>index.html</finalName>
</format>
- -->
<format>
<formatName>pdf</formatName>
<stylesheetResource>classpath:/xslt/org/jboss/pdf.xsl</stylesheetResource>
<finalName>userguide_en.pdf</finalName>
</format>
+ -->
</formats>
<options>
<xincludeSupported>true</xincludeSupported>
Modified: trunk/docs/reference/src/main/docbook/en-US/content/development_tools.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/development_tools.xml 2008-09-25 21:52:52 UTC (rev 543)
+++ trunk/docs/reference/src/main/docbook/en-US/content/development_tools.xml 2008-09-26 03:36:03 UTC (rev 544)
@@ -209,6 +209,30 @@
</tbody>
</tgroup>
</table>
+ <sect2 id="build-releases">
+ <title>Building releases</title>
+ <para>
+ The process of building JBoss DNA releases involves running a Maven build with some extra parameters.
+ Building these artifacts, including all documentation and JavaDocs, does take extra time, which is why
+ they are not included in the default parameters.
+ </para>
+ <para>
+ To build the release, issue the following command while in the <code>target/</code> directory:
+ </para>
+ <programlisting>mvn -P assembly clean javadoc:javadoc install</programlisting>
+ <para>
+ This command runs "clean", "javadoc:javadoc", and "install" goals using the "assembly" profile,
+ which adds the production JavaDocs, the Getting Started document, the Reference Guide document,
+ the Getting Started examples, and several ZIP archives. The order of the goals is important,
+ since the "install" goal attempts to include the JavaDoc in the archives.
+ </para>
+ <note>
+ <para>
+ Before running the above command, increase the memory available to Maven with this command:
+ </para>
+ <programlisting>export MAVEN_OPTS=-Xmx256m</programlisting>
+ </note>
+ </sect2>
</sect1>
<sect1 id="hudson">
<title>Continuous integration with Hudson</title>
Modified: trunk/docs/reference/src/main/docbook/en-US/content/introduction.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/introduction.xml 2008-09-25 21:52:52 UTC (rev 543)
+++ trunk/docs/reference/src/main/docbook/en-US/content/introduction.xml 2008-09-26 03:36:03 UTC (rev 544)
@@ -250,7 +250,7 @@
and several other guidelines. Lean software development can be thought of as an evolution of agile techniques
in the same way that behavior-driven development is an evolution of test-driven development. Lean techniques
help the developer to recognize and understand how and why features, bugs, and even their processes impact the development
- of software - and JBoss DNA.
+ of software.
</para>
</listitem>
</itemizedlist>
Modified: trunk/pom.xml
===================================================================
--- trunk/pom.xml 2008-09-25 21:52:52 UTC (rev 543)
+++ trunk/pom.xml 2008-09-26 03:36:03 UTC (rev 544)
@@ -191,23 +191,26 @@
</execution>
</executions>
<configuration>
- <finalName>
- jboss-dna-${project.version}
- </finalName>
- <descriptors>
- <descriptor>
- build/assembly/examples.xml
- </descriptor>
- <descriptor>
- build/assembly/javadoc.xml
- </descriptor>
- <descriptor>
- build/assembly/dist.xml
- </descriptor>
- <descriptor>
- build/assembly/src.xml
- </descriptor>
- </descriptors>
+ <finalName>
+ jboss-dna-${project.version}
+ </finalName>
+ <descriptors>
+ <descriptor>
+ build/assembly/examples.xml
+ </descriptor>
+ <descriptor>
+ build/assembly/javadoc.xml
+ </descriptor>
+ <descriptor>
+ build/assembly/dist.xml
+ </descriptor>
+ <descriptor>
+ build/assembly/src.xml
+ </descriptor>
+ <descriptor>
+ build/assembly/all.xml
+ </descriptor>
+ </descriptors>
</configuration>
</plugin>
</plugins>
@@ -216,6 +219,19 @@
<module>docs</module>
<module>docs/examples/gettingstarted</module>
</modules>
+ <reporting>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-javadoc-plugin</artifactId>
+ <configuration>
+ <aggregate>true</aggregate>
+ <show>public</show>
+ <title>JBoss DNA ${project.version}</title>
+ </configuration>
+ </plugin>
+ </plugins>
+ </reporting>
</profile>
</profiles>
<build>
@@ -234,28 +250,26 @@
<version>2.2</version>
<configuration>
<aggregate>true</aggregate>
- <doclet>net.gleamynode.apiviz.APIviz</doclet>
- <docletArtifact>
- <groupId>net.gleamynode.apiviz</groupId>
- <artifactId>apiviz</artifactId>
- <version>1.1.1</version>
- </docletArtifact>
- <additionalparam>
- -charset UTF-8
- -docencoding UTF-8
- -version
- -author
- -breakiterator
- -linksource
- -sourcetab 4
- -windowtitle "${project.name} ${project.version} API Reference"
- -doctitle "${project.name} ${project.version} API Reference"
- -bottom "Copyright © ${project.inceptionYear}-Present JBoss a division of Red Hat. All Rights Reserved."
- -link http://java.sun.com/javase/6/docs/api/
- </additionalparam>
- <encoding>UTF-8</encoding>
-
-
+ <doclet>net.gleamynode.apiviz.APIviz</doclet>
+ <docletArtifact>
+ <groupId>net.gleamynode.apiviz</groupId>
+ <artifactId>apiviz</artifactId>
+ <version>1.1.1</version>
+ </docletArtifact>
+ <additionalparam>
+ -charset UTF-8
+ -docencoding UTF-8
+ -version
+ -author
+ -breakiterator
+ -linksource
+ -sourcetab 4
+ -windowtitle "${project.name} ${project.version} API Reference"
+ -doctitle "${project.name} ${project.version} API Reference"
+ -bottom "Copyright © ${project.inceptionYear}-Present JBoss a division of Red Hat. All Rights Reserved."
+ -link http://java.sun.com/javase/6/docs/api/
+ </additionalparam>
+ <encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
15 years, 7 months
DNA SVN: r543 - in trunk: docs/reference/src/main/docbook/en-US and 3 other directories.
by dna-commits@lists.jboss.org
Author: rhauch
Date: 2008-09-25 17:52:52 -0400 (Thu, 25 Sep 2008)
New Revision: 543
Added:
trunk/docs/reference/src/main/docbook/en-US/images/dna-connector-federation.graffle
trunk/docs/reference/src/main/docbook/en-US/images/dna-connector-federation.png
Modified:
trunk/docs/gettingstarted/src/main/docbook/en-US/content/understanding_dna.xml
trunk/docs/reference/src/main/docbook/en-US/content/introduction.xml
trunk/docs/reference/src/main/docbook/en-US/content/jcr.xml
trunk/docs/reference/src/main/docbook/en-US/content/preface.xml
trunk/docs/reference/src/main/docbook/en-US/content/repositories.xml
trunk/docs/reference/src/main/docbook/en-US/custom.dtd
trunk/docs/reference/src/main/docbook/en-US/master.xml
trunk/extensions/dna-connector-jbosscache/src/main/java/org/jboss/dna/connector/jbosscache/JBossCacheSource.java
Log:
DNA-214 Update documentation to describe the repository, federation, JCR and other 0.2 features
http://jira.jboss.org/jira/browse/DNA-214
Added remaining content and corrected a number of typos and errors. Also corrected a minor JavaDoc error in the code.
Modified: trunk/docs/gettingstarted/src/main/docbook/en-US/content/understanding_dna.xml
===================================================================
--- trunk/docs/gettingstarted/src/main/docbook/en-US/content/understanding_dna.xml 2008-09-25 18:24:59 UTC (rev 542)
+++ trunk/docs/gettingstarted/src/main/docbook/en-US/content/understanding_dna.xml 2008-09-25 21:52:52 UTC (rev 543)
@@ -483,7 +483,7 @@
</sect2>
<sect2 id="federation_queries">
<title>Searching and querying</title>
- <para> The JBoss DNA federated repository will also support queries against the integrated and unified graph. In some
+ <para> The JBoss DNA federated repository will support queries against the integrated and unified graph. In some
situations the query can be determined to apply to a single source, but in most situations the query must be planned
(and possibly rewritten) such that it can be pushed down to all the appropriate sources. Also, the cached results must
be consulted prior to returning the query results, as the results from one source might have contributions from another
Modified: trunk/docs/reference/src/main/docbook/en-US/content/introduction.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/introduction.xml 2008-09-25 18:24:59 UTC (rev 542)
+++ trunk/docs/reference/src/main/docbook/en-US/content/introduction.xml 2008-09-25 21:52:52 UTC (rev 543)
@@ -245,7 +245,7 @@
<emphasis role="strong"><ulink url="&Wikipedia;Lean_software_development">Lean software development</ulink></emphasis>
is an adaptation of <ulink url="&Wikipedia;Lean_manufacturing">lean manufacturing techniques</ulink>,
where emphasis is placed on eliminating waste (e.g., defects, unnecessary complexity, unnecessary code/functionality/features),
- delivering as fast as passible, deferring irrevocable decisions as much as possible,
+ delivering as fast as possible, deferring irrevocable decisions as much as possible,
continuous learning (continuously adapting and improving the process), empowering the team (or community, in our case),
and several other guidelines. Lean software development can be thought of as an evolution of agile techniques
in the same way that behavior-driven development is an evolution of test-driven development. Lean techniques
Modified: trunk/docs/reference/src/main/docbook/en-US/content/jcr.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/jcr.xml 2008-09-25 18:24:59 UTC (rev 542)
+++ trunk/docs/reference/src/main/docbook/en-US/content/jcr.xml 2008-09-25 21:52:52 UTC (rev 543)
@@ -28,26 +28,47 @@
]>
<chapter id="jcr">
<title>Content Repositories for Java (JCR)</title>
- <para></para>
+ <para>
+ The
+ <ulink url="&JSR170;">Content Repository for Java technology API</ulink>
+ provides a standard Java API for working with content repositories. Abbreviated "JCR", this API was developed as part of the
+ Java Community Process under <ulink url="&JSR170;">JSR-170</ulink> (JCR 1.0) and is being revised under <ulink url="&JSR283;">JSR-283</ulink>.
+ JBoss DNA provides a JCR 1.0 implementation that allows you to work with the contents of a repository using the
+ JCR API. For information about how to use the JCR API, please see the <ulink url="&JSR170;">JSR-170</ulink> specification.
+ </para>
<sect1 id="jcr-repositories">
<title>Obtaining JCR repositories</title>
- <para>Discuss how to obtain JCR repository instances (from the Repository Service).</para>
+ <para>The JCR API doesn't define how your application first obtains a reference to a &Repository; implementation.
+ With JBoss DNA, you simply creating a &JcrRepository; object and supply
+ an &ExecutionContextFactory; and a &RepositoryConnectionFactory; (such as a &RepositoryLibrary; or &RepositoryService;).
+ Since &JcrRepository; implements the JCR &Repository; interface, from this point forward you can just use the
+ standard JCR API.
+ </para>
+ <note>
+ <para>
+ For more information about the &ExecutionContextFactory; and &RepositoryConnectionFactory; classes, see
+ the chapter on <link linkend="environment">setting up a JBoss DNA environment</link> and
+ <link linkend="repositories">setting up the &RepositoryService;</link>.
+ </para>
+ </note>
</sect1>
<sect1 id="jcr-sessions">
<title>Creating JCR sessions</title>
- <para>Discuss how to obtain JCR sessions and how the credentials work. Also discuss that sessions should be created,
- used, and closed.</para>
- <para>But how does JAAS authentication work with the JCR API and the JBoss DNA JCR implementation?
- In JCR, a &Session; represents our connection. So after we create a &JcrRepository; instance,
- we just have to call one of the <code>login(...)</code> methods:
+ <para>Creating sessions is done using a &Repository; one of its <code>login(...)</code> methods, where the
+ name of the workspace corresponds to the name of the &RepositorySource;:
</para>
- <programlisting role="JAVA"><![CDATA[
-JcrRepository jcrRepository = new JcrRepository(contextFactory, sources);
-Session session = jcrRepository.login(sourceName);
- ]]></programlisting>
- <para>Now, this code doesn't do any authentication; it essentially trusts the caller has the appropriate privileges.
+ <programlisting>
+&JcrRepository; jcrRepository = new &JcrRepository;(contextFactory, sources);
+&Session; session = jcrRepository.login(sourceName);
+</programlisting>
+ <para>
+ Now, this code doesn't do any authentication; it essentially trusts the caller has the appropriate privileges.
Normally, your application will need to authenticate the user, so let's look at how that's done.
</para>
+ <para>
+ As we mentioned in the <link linkend="security">security section</link>, JBoss DNA uses JAAS for authentication
+ and authorization. So how does this work with the JCR API?
+ </para>
<para>The JCR API defines a &Credentials; marker interface, an instance of which can be passed to the
<code>&Session;.login(...)</code> method. Rather than provide a concrete implementation of this interface, JBoss DNA
allows you to pass any implementation of &Credentials; that also has one of the following methods:
Modified: trunk/docs/reference/src/main/docbook/en-US/content/preface.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/preface.xml 2008-09-25 18:24:59 UTC (rev 542)
+++ trunk/docs/reference/src/main/docbook/en-US/content/preface.xml 2008-09-25 21:52:52 UTC (rev 543)
@@ -29,7 +29,7 @@
<preface id="preface">
<title>Target audience</title>
<para>
- This guide is for the developers of JBoss DNA and those users that want to have a better understanding of how JBoss DNA
+ This reference guide is for the developers of JBoss DNA and those users that want to have a better understanding of how JBoss DNA
works or how to extend the functionality. For a higher-level introduction to JBoss DNA, see the &GettingStarted; document.
</para>
<para>
Modified: trunk/docs/reference/src/main/docbook/en-US/content/repositories.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/repositories.xml 2008-09-25 18:24:59 UTC (rev 542)
+++ trunk/docs/reference/src/main/docbook/en-US/content/repositories.xml 2008-09-25 21:52:52 UTC (rev 543)
@@ -217,22 +217,282 @@
</sect1>
<sect1 id="connector-library">
<title>Repository connectors and sources</title>
- <para></para>
+ <para>
+ A number of repository connectors are already available in JBoss DNA, and are outlined in the following sections.
+ Note that we do want to build <ulink url="https://jira.jboss.org/jira/secure/IssueNavigator.jspa?reset=true&mod...">more connectors</ulink>
+ in the upcoming releases.
+ </para>
<sect2 id="dna-connector-inmemory">
<title>In-memory connector</title>
- <para></para>
+ <para>
+ The in-memory repository connector is a simple connector that creates a transient, in-memory repository.
+ This repository is used as a very simple in-memory cache or as a standalone transient repository.
+ </para>
+ <para>
+ The &InMemoryRepositorySource; class provides a number of JavaBean properties that control its behavior:
+ </para>
+ <table frame='all'>
+ <title>&InMemoryRepositorySource; properties</title>
+ <tgroup cols='2' align='left' colsep='1' rowsep='1'>
+ <colspec colname='c1' colwidth="1*"/>
+ <colspec colname='c2' colwidth="1*"/>
+ <thead>
+ <row>
+ <entry>Property</entry>
+ <entry>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>name</entry>
+ <entry>The name of the repository source, which is used by the &RepositoryService; when obtaining a &RepositoryConnection; by name.</entry>
+ </row>
+ <row>
+ <entry>jndiName</entry>
+ <entry>Optional property that, if used, specifies the name in JNDI where an &InMemoryRepository; instance can be found.
+ This is an advanced property that is infrequently used.</entry>
+ </row>
+ <row>
+ <entry>rootNodeUuid</entry>
+ <entry>Optional property that, if used, defines the UUID of the root node in the in-memory repository. If not used,
+ then a new UUID is generated.</entry>
+ </row>
+ <row>
+ <entry>retryLimit</entry>
+ <entry>Optional property that, if used, defines the number of times that any single operation on a &RepositoryConnection; to this source should be retried
+ following a communication failure. The default value is '0'.</entry>
+ </row>
+ <row>
+ <entry>defaultCachePolicy</entry>
+ <entry>Optional property that, if used, defines the default for how long this information provided by this source may to be
+ cached by other, higher-level components. The default value of null implies that this source does not define a specific
+ duration for caching information provided by this repository source.</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
</sect2>
<sect2 id="dna-connector-jbosscache">
<title>JBoss Cache connector</title>
- <para></para>
+ <para>
+ The JBoss Cache repository connector allows a <ulink url="http://www.jboss.org/jbosscache/">JBoss Cache</ulink> instance to be
+ used as a JBoss DNA (and thus JCR) repository. This provides a repository that is an effective, scalable, and distributed cache,
+ and is often paired with other repository sources to provide a local or <link linkend="dna-connector-federation">federated</link>
+ repository.
+ </para>
+ <para>
+ The &JBossCacheSource; class provides a number of JavaBean properties that control its behavior:
+ </para>
+ <table frame='all'>
+ <title>&JBossCacheSource; properties</title>
+ <tgroup cols='2' align='left' colsep='1' rowsep='1'>
+ <colspec colname='c1' colwidth="1*"/>
+ <colspec colname='c2' colwidth="1*"/>
+ <thead>
+ <row>
+ <entry>Property</entry>
+ <entry>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>name</entry>
+ <entry>The name of the repository source, which is used by the &RepositoryService; when obtaining a &RepositoryConnection; by name.</entry>
+ </row>
+ <row>
+ <entry>cacheFactoryJndiName</entry>
+ <entry>Optional property that, if used, specifies the name in JNDI where an existing JBoss Cache Factory instance can be found.
+ That factory would then be used if needed to create a JBoss Cache instance. If no value is provided, then the
+ JBoss Cache <code>DefaultCacheFactory</code> class is used.</entry>
+ </row>
+ <row>
+ <entry>cacheConfigurationName</entry>
+ <entry>Optional property that, if used, specifies the name of the configuration that is supplied to the cache factory
+ when creating a new JBoss Cache instance.</entry>
+ </row>
+ <row>
+ <entry>cacheJndiName</entry>
+ <entry>Optional property that, if used, specifies the name in JNDI where an existing JBoss Cache instance can be found.
+ This should be used if your application already has a cache that is used, or if you need to configure the cache in
+ a special way.</entry>
+ </row>
+ <row>
+ <entry>uuidPropertyName</entry>
+ <entry>Optional property that, if used, defines the property that should be used to find the UUID value for each node
+ in the cache. "<code>dna:uuid</code>" is the default.</entry>
+ </row>
+ <row>
+ <entry>retryLimit</entry>
+ <entry>Optional property that, if used, defines the number of times that any single operation on a &RepositoryConnection; to this source should be retried
+ following a communication failure. The default value is '0'.</entry>
+ </row>
+ <row>
+ <entry>defaultCachePolicy</entry>
+ <entry>Optional property that, if used, defines the default for how long this information provided by this source may to be
+ cached by other, higher-level components. The default value of null implies that this source does not define a specific
+ duration for caching information provided by this repository source.</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
</sect2>
<sect2 id="dna-connector-federation">
<title>Federating connector</title>
- <para></para>
+ <para>
+ The federated repository source provides a unified repository consisting of information that is dynamically federated from multiple other
+ &RepositorySource; instances. This is a very powerful repository source that appears to be a single repository, when in
+ fact the content is stored and managed in multiple other systems. Each &FederatedRepositorySource; is typically configured
+ with the name of another &RepositorySource; that should be used as the local, unified cache of the federated content.
+ The configuration also contains the names of the other &RepositorySource; instances that are to be federated along with
+ the &Projection; definition describing where in the unified repository the content is to appear.
+ </para>
+ <figure id="dna-connector-federation-image">
+ <title>Federating multiple sources using the Federated Repository Connector</title>
+ <graphic align="center" scale="100" fileref="dna-connector-federation.png"/>
+ </figure>
+ <para> The federation connector works by effectively building up a single graph by querying each source and merging or
+ unifying the responses. This information is cached, which improves performance, reduces the number of (potentially
+ expensive) remote calls, reduces the load on the sources, and helps mitigate problems with source availability. As
+ clients interact with the repository, this cache is consulted first. When the requested portion of the graph (or
+ "subgraph") is contained completely in the cache, it is retuned immediately. However, if any part of the requested
+ subgraph is not in the cache, each source is consulted for their contributions to that subgraph, and any results are
+ cached.</para>
+ <para> This basic flow makes it possible for the federated repository to build up a local cache of the integrated graph
+ (or at least the portions that are used by clients). In fact, the federated repository caches information in a manner
+ that is similar to that of the Domain Name System (DNS). As sources are consulted for their contributions, the source
+ also specifies whether it is the authoritative source for this information (some sources that are themselves federated
+ may not be the information's authority), whether the information may be modified, the time-to-live (TTL) value (the time
+ after which the cached information should be refreshed), and the expiration time (the time after which the cached
+ information is no longer valid). In effect, the source has complete control over how the information it contributes is
+ cached and used.</para>
+ <para>
+ The federated repository also needs to incorporate
+ <emphasis>negative caching</emphasis>
+ , which is storage of the knowledge that something does not exist. Sources can be configured to contribute information
+ only below certain paths (e.g.,
+ <code>/A/B/C</code>
+ ), and the federation engine can take advantage of this by never consulting that source for contributions to information
+ on other paths. However, below that path, any negative responses must also be cached (with appropriate TTL and expiry
+ parameters) to prevent the exclusion of that source (in case the source has information to contribute at a later time)
+ or the frequent checking with the source.
+ </para>
+ <para>
+ The federated repository uses other &RepositorySource;s that are to be federated and a &RepositorySource; that is to be used as the
+ cache of the unified contents. These are configured in another &RepositorySource; that is treated as a configuration repository.
+ The name of the configuration repository is provided by JavaBean properties, and is the path to the "dna:federation" node
+ in that configuration repository containing the information about the cache and federated sources. This graph
+ structure is as follows (using XML elements to represent nodes and XML attributes to represent properties):
+ </para>
+ <programlisting><![CDATA[<!-- Define the federation configuration. -->
+<dna:federation dna:timeToCache="100000">
+ <!-- Define how the content in the 'Cache' source is to map to the federated cache -->
+ <dna:cache>
+ <dna:projection jcr:name="Cache" dna:projectionRules="/ => /" />
+ </dna:cache>
+ <!-- Define how the content in the two sources maps to the federated/unified repository.
+ This example puts the 'Cars' and 'Aircraft' content underneath '/vehicles', but the
+ 'Configuration' content (which is defined by this file) will appear under '/'. -->
+ <dna:projections>
+ <dna:projection jcr:name="Cars" dna:projectionRules="/Vehicles => /" />
+ <dna:projection jcr:name="Aircraft" dna:projectionRules="/Vehicles => /" />
+ <dna:projection jcr:name="Configuration" dna:projectionRules="/ => /" />
+ </dna:projections>
+</dna:federation>
+]]></programlisting>
+ <para>
+ Here, the "<code>dna</code>" prefix denotes the "<code>http://www.jboss.org/dna</code>" namespace, while the
+ "<code>jcr</code>" prefix denotes the standard JCR namespace "<code>http://www.jcp.org/jcr/1.0</code>".
+ Notice that there is a cache projection and three source projections, and each projection defines
+ one or more <emphasis>projection rules</emphasis> that are of the form:
+ </para>
+ <programlisting>pathInFederatedRepository => pathInSourceRepository</programlisting>
+ <para>
+ So, a projection rule <code>/Vehicles => /</code> projects the entire contents of the source so that
+ it appears in the federated repository under the "<code>/Vehicles</code>" node.
+ </para>
+ <para>
+ The &FederatedRepositorySource; class provides a number of JavaBean properties that control its behavior:
+ </para>
+ <table frame='all'>
+ <title>&InMemoryRepositorySource; properties</title>
+ <tgroup cols='2' align='left' colsep='1' rowsep='1'>
+ <colspec colname='c1' colwidth="1*"/>
+ <colspec colname='c2' colwidth="1*"/>
+ <thead>
+ <row>
+ <entry>Property</entry>
+ <entry>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>name</entry>
+ <entry>The name of the repository source, which is used by the &RepositoryService; when obtaining a &RepositoryConnection; by name.</entry>
+ </row>
+ <row>
+ <entry>repositoryName</entry>
+ <entry>The name for the federated repository.</entry>
+ </row>
+ <row>
+ <entry>configurationSourceName</entry>
+ <entry>The name of the &RepositorySource; that should be used as the configuration repository, and in which is defined
+ how this federated repository is to be set up and configured.
+ This name is supplied to the &RepositoryConnectionFactory; that is provided to this instance when added to the
+ &RepositoryLibrary;.</entry>
+ </row>
+ <row>
+ <entry>configurationSourcePath</entry>
+ <entry>The path to the node in the configuration repository below which a "dna:federation" node exists with the
+ graph structure describing how this federated repository is to be configured.</entry>
+ </row>
+ <row>
+ <entry>securityDomain</entry>
+ <entry>Optional property that, if used, specifies the name of the JAAS application context that should be used
+ to establish the <link linkend="execution-contenxt">execution context</link> for this repository.
+ This should correspond to the JAAS login configuration located within the JAAS login configuration file,
+ and should be used only if a "<code>username</code>" property is defined.</entry>
+ </row>
+ <row>
+ <entry>username</entry>
+ <entry>Optional property that, if used, defines the name of the JAAS subject that should be used
+ to establish the <link linkend="execution-contenxt">execution context</link> for this repository.
+ This should be used if a "<code>securityDomain</code>" property is defined.</entry>
+ </row>
+ <row>
+ <entry>password</entry>
+ <entry>Optional property that, if used, defines the password of the JAAS subject that should be used
+ to establish the <link linkend="execution-contenxt">execution context</link> for this repository.
+ If the password is not provided but values for the "<code>securityDomain</code>" and "<code>username</code>" properties are,
+ then authentication will use the default JAAS callback handlers.</entry>
+ </row>
+ <row>
+ <entry>retryLimit</entry>
+ <entry>Optional property that, if used, defines the number of times that any single operation on a &RepositoryConnection; to this source should be retried
+ following a communication failure. The default value is '0'.</entry>
+ </row>
+ <row>
+ <entry>defaultCachePolicy</entry>
+ <entry>Optional property that, if used, defines the default for how long this information provided by this source may to be
+ cached by other, higher-level components. The default value of null implies that this source does not define a specific
+ duration for caching information provided by this repository source.</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
</sect2>
</sect1>
<sect1 id="custom-connectors">
<title>Writing custom connectors</title>
- <para></para>
+ <para>
+ The current release of JBoss DNA comes with six sequencers. However, JBoss DNA was designed so that you can create your own
+ connectors and to then configure JBoss DNA to use them in your own application.
+ </para>
+ <caution>
+ <para>
+ At this time, we recommend consulting with the JBoss DNA project team before writing a connector. The 0.3 release
+ will have a few changes in the connector SPI that may have a large impact on your connectors. Please contact us
+ using any of the ways listed in the <link linkend="preface">Preface</link>.
+ </para>
+ </caution>
</sect1>
</chapter>
Modified: trunk/docs/reference/src/main/docbook/en-US/custom.dtd
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/custom.dtd 2008-09-25 18:24:59 UTC (rev 542)
+++ trunk/docs/reference/src/main/docbook/en-US/custom.dtd 2008-09-25 21:52:52 UTC (rev 543)
@@ -1,4 +1,4 @@
-<!ENTITY versionNumber "0.3">
+<!ENTITY versionNumber "0.2">
<!ENTITY copyrightYear "2008">
<!ENTITY copyrightHolder "Red Hat Middleware, LLC.">
@@ -88,8 +88,13 @@
<!-- Types in extensions/ -->
+<!ENTITY InMemoryRepository "<ulink url='&API;connector/inmemory/InMemoryRepository.html'><classname>InMemoryRepository</classname></ulink>">
<!ENTITY InMemoryRepositorySource "<ulink url='&API;connector/inmemory/InMemoryRepositorySource.html'><classname>InMemoryRepositorySource</classname></ulink>">
-<!ENTITY FederatedRepositorySource "<ulink url='&API;connector/federated/FederatedRepositorySource.html'><classname>FederatedRepositorySource</classname></ulink>">
+<!ENTITY JBossCacheRepository "<ulink url='&API;connector/jbosscache/JBossCacheRepository.html'><classname>JBossCacheRepository</classname></ulink>">
+<!ENTITY JBossCacheSource "<ulink url='&API;connector/jbosscache/JBossCacheSource.html'><classname>JBossCacheSource</classname></ulink>">
+<!ENTITY FederatedRepositorySource "<ulink url='&API;connector/federation/FederatedRepositorySource.html'><classname>FederatedRepositorySource</classname></ulink>">
+<!ENTITY FederatedRepository "<ulink url='&API;connector/federation/FederatedRepository.html'><classname>FederatedRepository</classname></ulink>">
+<!ENTITY Projection "<ulink url='&API;connector/federation/Projection.html'><classname>Projection</classname></ulink>">
<!ENTITY ImageMetadataSequencer "<ulink url='&API;sequencer/image/ImageMetadataSequencer.html'><classname>ImageMetadataSequencer</classname></ulink>">
<!ENTITY ImageMetadata "<ulink url='&API;sequencer/image/ImageMetadata.html'><classname>ImageMetadata</classname></ulink>">
<!ENTITY ImageSequencerI18n "<ulink url='&API;sequencer/image/ImageSequencerI18n.html'><classname>ImageSequencerI18n</classname></ulink>">
Added: trunk/docs/reference/src/main/docbook/en-US/images/dna-connector-federation.graffle
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/images/dna-connector-federation.graffle (rev 0)
+++ trunk/docs/reference/src/main/docbook/en-US/images/dna-connector-federation.graffle 2008-09-25 21:52:52 UTC (rev 543)
@@ -0,0 +1,2537 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>ActiveLayerIndex</key>
+ <integer>0</integer>
+ <key>ApplicationVersion</key>
+ <array>
+ <string>com.omnigroup.OmniGraffle</string>
+ <string>136.19.0.104178</string>
+ </array>
+ <key>AutoAdjust</key>
+ <true/>
+ <key>BackgroundGraphic</key>
+ <dict>
+ <key>Bounds</key>
+ <string>{{0, 0}, {576, 733}}</string>
+ <key>Class</key>
+ <string>SolidGraphic</string>
+ <key>ID</key>
+ <integer>2</integer>
+ <key>Style</key>
+ <dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ </dict>
+ <key>CanvasOrigin</key>
+ <string>{0, 0}</string>
+ <key>ColumnAlign</key>
+ <integer>1</integer>
+ <key>ColumnSpacing</key>
+ <real>36</real>
+ <key>CreationDate</key>
+ <string>2008-09-19 10:35:27 -0500</string>
+ <key>Creator</key>
+ <string>Randall Hauch</string>
+ <key>DisplayScale</key>
+ <string>1 0/72 in = 1.0000 in</string>
+ <key>GraphDocumentVersion</key>
+ <integer>6</integer>
+ <key>GraphicsList</key>
+ <array>
+ <dict>
+ <key>Bounds</key>
+ <string>{{478.568, 405}, {55, 23}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>Helvetica</string>
+ <key>NSKern</key>
+ <real>0.0</real>
+ <key>Size</key>
+ <real>9</real>
+ </dict>
+ <key>ID</key>
+ <integer>233</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0, -0.5}</string>
+ <string>{-0.5, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Bezier</string>
+ <key>ShapeData</key>
+ <dict>
+ <key>UnitPoints</key>
+ <array>
+ <string>{-0.5, -0.5}</string>
+ <string>{-0.5, -0.5}</string>
+ <string>{0.5, -0.5}</string>
+ <string>{0.5, -0.5}</string>
+ <string>{0.5, -0.5}</string>
+ <string>{0.5, 0.499996}</string>
+ <string>{0.5, 0.499996}</string>
+ <string>{0.166667, 0.499996}</string>
+ <string>{-0.333334, 0.500008}</string>
+ <string>{-0.5, 0.499996}</string>
+ <string>{-0.499999, 0.499996}</string>
+ <string>{-0.5, -0.5}</string>
+ </array>
+ </dict>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.939516</string>
+ <key>g</key>
+ <string>0.939516</string>
+ <key>r</key>
+ <string>0.939516</string>
+ </dict>
+ <key>FillType</key>
+ <integer>3</integer>
+ <key>GradientColor</key>
+ <dict>
+ <key>w</key>
+ <string>0.657258</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ <key>Fuzziness</key>
+ <real>5.7921171188354492</real>
+ <key>ShadowVector</key>
+ <string>{3, 4}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>archive</key>
+ <data>
+ YnBsaXN0MDDUAQIDBAUGCQpYJHZl
+ cnNpb25UJHRvcFkkYXJjaGl2ZXJY
+ JG9iamVjdHMSAAGGoNEHCFRyb290
+ gAFfEA9OU0tleWVkQXJjaGl2ZXKl
+ CwwVGR5VJG51bGzUDQ4PEBESExRW
+ JGNsYXNzXE5TQ29sb3JTcGFjZV8Q
+ Ek5TQ3VzdG9tQ29sb3JTcGFjZVdO
+ U1doaXRlgAQQA4ACRDAuNQDSDRYX
+ GFROU0lEgAMQAtIaGxwOWCRjbGFz
+ c2VzWiRjbGFzc25hbWWiDh1YTlNP
+ YmplY3TSGhsfIKIgHVdOU0NvbG9y
+ CBEaHykyNzo/QVNZX2hvfJGZm52f
+ pKmusLK3wMvO19zfAAAAAAAAAQEA
+ AAAAAAAAIQAAAAAAAAAAAAAAAAAA
+ AOc=
+ </data>
+ <key>b</key>
+ <string>0.500023</string>
+ <key>g</key>
+ <string>0.500023</string>
+ <key>r</key>
+ <string>0.500023</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>9</real>
+ <key>Width</key>
+ <real>2</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs18 \cf0 Repository Source}</string>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{389.068, 405}, {55, 23}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>Helvetica</string>
+ <key>NSKern</key>
+ <real>0.0</real>
+ <key>Size</key>
+ <real>9</real>
+ </dict>
+ <key>ID</key>
+ <integer>222</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0, -0.5}</string>
+ <string>{-0.5, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Bezier</string>
+ <key>ShapeData</key>
+ <dict>
+ <key>UnitPoints</key>
+ <array>
+ <string>{-0.5, -0.5}</string>
+ <string>{-0.5, -0.5}</string>
+ <string>{0.5, -0.5}</string>
+ <string>{0.5, -0.5}</string>
+ <string>{0.5, -0.5}</string>
+ <string>{0.5, 0.499996}</string>
+ <string>{0.5, 0.499996}</string>
+ <string>{0.166667, 0.499996}</string>
+ <string>{-0.333334, 0.500008}</string>
+ <string>{-0.5, 0.499996}</string>
+ <string>{-0.499999, 0.499996}</string>
+ <string>{-0.5, -0.5}</string>
+ </array>
+ </dict>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.939516</string>
+ <key>g</key>
+ <string>0.939516</string>
+ <key>r</key>
+ <string>0.939516</string>
+ </dict>
+ <key>FillType</key>
+ <integer>3</integer>
+ <key>GradientColor</key>
+ <dict>
+ <key>w</key>
+ <string>0.657258</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ <key>Fuzziness</key>
+ <real>5.7921171188354492</real>
+ <key>ShadowVector</key>
+ <string>{3, 4}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>archive</key>
+ <data>
+ YnBsaXN0MDDUAQIDBAUGCQpYJHZl
+ cnNpb25UJHRvcFkkYXJjaGl2ZXJY
+ JG9iamVjdHMSAAGGoNEHCFRyb290
+ gAFfEA9OU0tleWVkQXJjaGl2ZXKl
+ CwwVGR5VJG51bGzUDQ4PEBESExRW
+ JGNsYXNzXE5TQ29sb3JTcGFjZV8Q
+ Ek5TQ3VzdG9tQ29sb3JTcGFjZVdO
+ U1doaXRlgAQQA4ACRDAuNQDSDRYX
+ GFROU0lEgAMQAtIaGxwOWCRjbGFz
+ c2VzWiRjbGFzc25hbWWiDh1YTlNP
+ YmplY3TSGhsfIKIgHVdOU0NvbG9y
+ CBEaHykyNzo/QVNZX2hvfJGZm52f
+ pKmusLK3wMvO19zfAAAAAAAAAQEA
+ AAAAAAAAIQAAAAAAAAAAAAAAAAAA
+ AOc=
+ </data>
+ <key>b</key>
+ <string>0.500023</string>
+ <key>g</key>
+ <string>0.500023</string>
+ <key>r</key>
+ <string>0.500023</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>9</real>
+ <key>Width</key>
+ <real>2</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs18 \cf0 Repository Source}</string>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{322.318, 405}, {55, 23}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>Helvetica</string>
+ <key>NSKern</key>
+ <real>0.0</real>
+ <key>Size</key>
+ <real>9</real>
+ </dict>
+ <key>ID</key>
+ <integer>232</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0, -0.5}</string>
+ <string>{-0.5, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Bezier</string>
+ <key>ShapeData</key>
+ <dict>
+ <key>UnitPoints</key>
+ <array>
+ <string>{-0.5, -0.5}</string>
+ <string>{-0.5, -0.5}</string>
+ <string>{0.5, -0.5}</string>
+ <string>{0.5, -0.5}</string>
+ <string>{0.5, -0.5}</string>
+ <string>{0.5, 0.499996}</string>
+ <string>{0.5, 0.499996}</string>
+ <string>{0.166667, 0.499996}</string>
+ <string>{-0.333334, 0.500008}</string>
+ <string>{-0.5, 0.499996}</string>
+ <string>{-0.499999, 0.499996}</string>
+ <string>{-0.5, -0.5}</string>
+ </array>
+ </dict>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.939516</string>
+ <key>g</key>
+ <string>0.939516</string>
+ <key>r</key>
+ <string>0.939516</string>
+ </dict>
+ <key>FillType</key>
+ <integer>3</integer>
+ <key>GradientColor</key>
+ <dict>
+ <key>w</key>
+ <string>0.657258</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ <key>Fuzziness</key>
+ <real>5.7921171188354492</real>
+ <key>ShadowVector</key>
+ <string>{3, 4}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>archive</key>
+ <data>
+ YnBsaXN0MDDUAQIDBAUGCQpYJHZl
+ cnNpb25UJHRvcFkkYXJjaGl2ZXJY
+ JG9iamVjdHMSAAGGoNEHCFRyb290
+ gAFfEA9OU0tleWVkQXJjaGl2ZXKl
+ CwwVGR5VJG51bGzUDQ4PEBESExRW
+ JGNsYXNzXE5TQ29sb3JTcGFjZV8Q
+ Ek5TQ3VzdG9tQ29sb3JTcGFjZVdO
+ U1doaXRlgAQQA4ACRDAuNQDSDRYX
+ GFROU0lEgAMQAtIaGxwOWCRjbGFz
+ c2VzWiRjbGFzc25hbWWiDh1YTlNP
+ YmplY3TSGhsfIKIgHVdOU0NvbG9y
+ CBEaHykyNzo/QVNZX2hvfJGZm52f
+ pKmusLK3wMvO19zfAAAAAAAAAQEA
+ AAAAAAAAIQAAAAAAAAAAAAAAAAAA
+ AOc=
+ </data>
+ <key>b</key>
+ <string>0.500023</string>
+ <key>g</key>
+ <string>0.500023</string>
+ <key>r</key>
+ <string>0.500023</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>9</real>
+ <key>Width</key>
+ <real>2</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs18 \cf0 Repository Source}</string>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{255.568, 405}, {55, 23}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>Helvetica</string>
+ <key>NSKern</key>
+ <real>0.0</real>
+ <key>Size</key>
+ <real>9</real>
+ </dict>
+ <key>ID</key>
+ <integer>231</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0, -0.5}</string>
+ <string>{-0.5, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Bezier</string>
+ <key>ShapeData</key>
+ <dict>
+ <key>UnitPoints</key>
+ <array>
+ <string>{-0.5, -0.5}</string>
+ <string>{-0.5, -0.5}</string>
+ <string>{0.5, -0.5}</string>
+ <string>{0.5, -0.5}</string>
+ <string>{0.5, -0.5}</string>
+ <string>{0.5, 0.499996}</string>
+ <string>{0.5, 0.499996}</string>
+ <string>{0.166667, 0.499996}</string>
+ <string>{-0.333334, 0.500008}</string>
+ <string>{-0.5, 0.499996}</string>
+ <string>{-0.499999, 0.499996}</string>
+ <string>{-0.5, -0.5}</string>
+ </array>
+ </dict>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.939516</string>
+ <key>g</key>
+ <string>0.939516</string>
+ <key>r</key>
+ <string>0.939516</string>
+ </dict>
+ <key>FillType</key>
+ <integer>3</integer>
+ <key>GradientColor</key>
+ <dict>
+ <key>w</key>
+ <string>0.657258</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ <key>Fuzziness</key>
+ <real>5.7921171188354492</real>
+ <key>ShadowVector</key>
+ <string>{3, 4}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>archive</key>
+ <data>
+ YnBsaXN0MDDUAQIDBAUGCQpYJHZl
+ cnNpb25UJHRvcFkkYXJjaGl2ZXJY
+ JG9iamVjdHMSAAGGoNEHCFRyb290
+ gAFfEA9OU0tleWVkQXJjaGl2ZXKl
+ CwwVGR5VJG51bGzUDQ4PEBESExRW
+ JGNsYXNzXE5TQ29sb3JTcGFjZV8Q
+ Ek5TQ3VzdG9tQ29sb3JTcGFjZVdO
+ U1doaXRlgAQQA4ACRDAuNQDSDRYX
+ GFROU0lEgAMQAtIaGxwOWCRjbGFz
+ c2VzWiRjbGFzc25hbWWiDh1YTlNP
+ YmplY3TSGhsfIKIgHVdOU0NvbG9y
+ CBEaHykyNzo/QVNZX2hvfJGZm52f
+ pKmusLK3wMvO19zfAAAAAAAAAQEA
+ AAAAAAAAIQAAAAAAAAAAAAAAAAAA
+ AOc=
+ </data>
+ <key>b</key>
+ <string>0.500023</string>
+ <key>g</key>
+ <string>0.500023</string>
+ <key>r</key>
+ <string>0.500023</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>9</real>
+ <key>Width</key>
+ <real>2</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs18 \cf0 Repository Source}</string>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>199</integer>
+ </dict>
+ <key>ID</key>
+ <integer>230</integer>
+ <key>Points</key>
+ <array>
+ <string>{436.068, 312}</string>
+ <string>{478.568, 312.5}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>197</integer>
+ <key>Info</key>
+ <integer>1</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{455.818, 409.5}, {11, 14}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>YES</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>Helvetica</string>
+ <key>Size</key>
+ <real>12</real>
+ </dict>
+ <key>ID</key>
+ <integer>229</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Pad</key>
+ <integer>0</integer>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\b\fs24 \cf0 ...}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ <key>Wrap</key>
+ <string>NO</string>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>222</integer>
+ <key>Info</key>
+ <integer>1</integer>
+ </dict>
+ <key>ID</key>
+ <integer>223</integer>
+ <key>Points</key>
+ <array>
+ <string>{398.235, 335}</string>
+ <string>{416.568, 405}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>197</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>232</integer>
+ </dict>
+ <key>ID</key>
+ <integer>228</integer>
+ <key>Points</key>
+ <array>
+ <string>{387.11, 335}</string>
+ <string>{349.818, 405}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>197</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>231</integer>
+ <key>Info</key>
+ <integer>1</integer>
+ </dict>
+ <key>ID</key>
+ <integer>227</integer>
+ <key>Points</key>
+ <array>
+ <string>{375.985, 335}</string>
+ <string>{283.068, 405}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>197</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{463.204, 328}, {89.7277, 12}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>Vertical</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>Helvetica-Oblique</string>
+ <key>Size</key>
+ <real>10</real>
+ </dict>
+ <key>ID</key>
+ <integer>200</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Pad</key>
+ <integer>0</integer>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\i\fs20 \cf0 federated cache}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{478.568, 301}, {59, 23}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>Helvetica</string>
+ <key>NSKern</key>
+ <real>0.0</real>
+ <key>Size</key>
+ <real>9</real>
+ </dict>
+ <key>ID</key>
+ <integer>199</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0, -0.5}</string>
+ <string>{-0.5, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Bezier</string>
+ <key>ShapeData</key>
+ <dict>
+ <key>UnitPoints</key>
+ <array>
+ <string>{-0.5, -0.5}</string>
+ <string>{-0.5, -0.5}</string>
+ <string>{0.5, -0.5}</string>
+ <string>{0.5, -0.5}</string>
+ <string>{0.5, -0.5}</string>
+ <string>{0.5, 0.499996}</string>
+ <string>{0.5, 0.499996}</string>
+ <string>{0.166667, 0.499996}</string>
+ <string>{-0.333334, 0.500008}</string>
+ <string>{-0.5, 0.499996}</string>
+ <string>{-0.499999, 0.499996}</string>
+ <string>{-0.5, -0.5}</string>
+ </array>
+ </dict>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.939516</string>
+ <key>g</key>
+ <string>0.939516</string>
+ <key>r</key>
+ <string>0.939516</string>
+ </dict>
+ <key>FillType</key>
+ <integer>3</integer>
+ <key>GradientColor</key>
+ <dict>
+ <key>w</key>
+ <string>0.657258</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ <key>Fuzziness</key>
+ <real>5.7921171188354492</real>
+ <key>ShadowVector</key>
+ <string>{3, 4}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>archive</key>
+ <data>
+ YnBsaXN0MDDUAQIDBAUGCQpYJHZl
+ cnNpb25UJHRvcFkkYXJjaGl2ZXJY
+ JG9iamVjdHMSAAGGoNEHCFRyb290
+ gAFfEA9OU0tleWVkQXJjaGl2ZXKl
+ CwwVGR5VJG51bGzUDQ4PEBESExRW
+ JGNsYXNzXE5TQ29sb3JTcGFjZV8Q
+ Ek5TQ3VzdG9tQ29sb3JTcGFjZVdO
+ U1doaXRlgAQQA4ACRDAuNQDSDRYX
+ GFROU0lEgAMQAtIaGxwOWCRjbGFz
+ c2VzWiRjbGFzc25hbWWiDh1YTlNP
+ YmplY3TSGhsfIKIgHVdOU0NvbG9y
+ CBEaHykyNzo/QVNZX2hvfJGZm52f
+ pKmusLK3wMvO19zfAAAAAAAAAQEA
+ AAAAAAAAIQAAAAAAAAAAAAAAAAAA
+ AOc=
+ </data>
+ <key>b</key>
+ <string>0.500023</string>
+ <key>g</key>
+ <string>0.500023</string>
+ <key>r</key>
+ <string>0.500023</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>9</real>
+ <key>Width</key>
+ <real>2</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs18 \cf0 Repository Source}</string>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{353.068, 269}, {83, 29.0002}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>Helvetica</string>
+ <key>NSKern</key>
+ <real>0.0</real>
+ <key>Size</key>
+ <real>12</real>
+ </dict>
+ <key>ID</key>
+ <integer>198</integer>
+ <key>Shape</key>
+ <string>Bezier</string>
+ <key>ShapeData</key>
+ <dict>
+ <key>UnitPoints</key>
+ <array>
+ <string>{-0.5, -0.5}</string>
+ <string>{-0.5, -0.5}</string>
+ <string>{0.5, -0.5}</string>
+ <string>{0.5, -0.5}</string>
+ <string>{0.5, -0.5}</string>
+ <string>{0.5, 0.499996}</string>
+ <string>{0.5, 0.499996}</string>
+ <string>{0.166667, 0.499996}</string>
+ <string>{-0.333334, 0.500008}</string>
+ <string>{-0.5, 0.499996}</string>
+ <string>{-0.499999, 0.499996}</string>
+ <string>{-0.5, -0.5}</string>
+ </array>
+ </dict>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.284764</string>
+ <key>g</key>
+ <string>0.341238</string>
+ <key>r</key>
+ <string>0.527916</string>
+ </dict>
+ <key>GradientColor</key>
+ <dict>
+ <key>w</key>
+ <string>0.666667</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Fuzziness</key>
+ <real>5.7921171188354492</real>
+ <key>ShadowVector</key>
+ <string>{3, 4}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>CornerRadius</key>
+ <real>9</real>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 Repository Source}</string>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{353.068, 298}, {83, 37}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>197</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0.5, -0.121622}</string>
+ <string>{0, 0.121622}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.441947</string>
+ <key>g</key>
+ <string>0.595697</string>
+ <key>r</key>
+ <string>0.630182</string>
+ </dict>
+ <key>GradientCenter</key>
+ <string>{-0.0761905, -0.114286}</string>
+ <key>MiddleFraction</key>
+ <real>0.4841269850730896</real>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Fuzziness</key>
+ <real>5.7921171188354492</real>
+ <key>ShadowVector</key>
+ <string>{3, 4}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 Federation}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>233</integer>
+ <key>Info</key>
+ <integer>1</integer>
+ </dict>
+ <key>ID</key>
+ <integer>226</integer>
+ <key>Points</key>
+ <array>
+ <string>{394.568, 321}</string>
+ <string>{506.068, 405}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>197</integer>
+ <key>Info</key>
+ <integer>2</integer>
+ </dict>
+ </dict>
+ </array>
+ <key>GridInfo</key>
+ <dict/>
+ <key>GuidesLocked</key>
+ <string>NO</string>
+ <key>GuidesVisible</key>
+ <string>YES</string>
+ <key>HPages</key>
+ <integer>1</integer>
+ <key>ImageCounter</key>
+ <integer>1</integer>
+ <key>KeepToScale</key>
+ <false/>
+ <key>Layers</key>
+ <array>
+ <dict>
+ <key>Lock</key>
+ <string>NO</string>
+ <key>Name</key>
+ <string>Layer 1</string>
+ <key>Print</key>
+ <string>YES</string>
+ <key>View</key>
+ <string>YES</string>
+ </dict>
+ </array>
+ <key>LayoutInfo</key>
+ <dict>
+ <key>Animate</key>
+ <string>NO</string>
+ <key>circoMinDist</key>
+ <real>18</real>
+ <key>circoSeparation</key>
+ <real>0.0</real>
+ <key>layoutEngine</key>
+ <string>dot</string>
+ <key>neatoSeparation</key>
+ <real>0.0</real>
+ <key>twopiSeparation</key>
+ <real>0.0</real>
+ </dict>
+ <key>LinksVisible</key>
+ <string>NO</string>
+ <key>MagnetsVisible</key>
+ <string>NO</string>
+ <key>MasterSheets</key>
+ <array/>
+ <key>ModificationDate</key>
+ <string>2008-09-25 15:58:55 -0500</string>
+ <key>Modifier</key>
+ <string>Randall Hauch</string>
+ <key>NotesVisible</key>
+ <string>NO</string>
+ <key>Orientation</key>
+ <integer>2</integer>
+ <key>OriginVisible</key>
+ <string>NO</string>
+ <key>PageBreaks</key>
+ <string>YES</string>
+ <key>PrintInfo</key>
+ <dict>
+ <key>NSBottomMargin</key>
+ <array>
+ <string>float</string>
+ <string>41</string>
+ </array>
+ <key>NSLeftMargin</key>
+ <array>
+ <string>float</string>
+ <string>18</string>
+ </array>
+ <key>NSPaperSize</key>
+ <array>
+ <string>size</string>
+ <string>{612, 792}</string>
+ </array>
+ <key>NSRightMargin</key>
+ <array>
+ <string>float</string>
+ <string>18</string>
+ </array>
+ <key>NSTopMargin</key>
+ <array>
+ <string>float</string>
+ <string>18</string>
+ </array>
+ </dict>
+ <key>PrintOnePage</key>
+ <false/>
+ <key>QuickLookPreview</key>
+ <data>
+ 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
+ 5JRUtaIszqG7yaWnEqUPZKJ0qUU8lhvP+jETpTZME1HQA+dd2zJA3YYKUZrUiZKQ7Xk1
+ zUQp1g+i7JwmEwW34VKyXkAU9kF50UQU98ZEqZYz1NjmFBwoTThQbI7uROkDmShdGhWl
+ 4zCIUnGYiFLcvEOU6vlKlCZ1ojQcaJSdrM9EKfIzibLj7tckyvGNX0aUfvvORPG40+cI
+ gYTLPzr7/A0HMYlPBfigMxOlD2SidKlFPL8d+L3Wi8rYeg2itE80U0XpQ5koXWpEGd8O
+ YGO1vhNl9zTzN5wXVRSPnjPTdyKKf1uiNMsLURoOhSgdB4rN0Z0ofSATpUuDKB2HTpSG
+ wyBK+4bTp4xvOIUoDYemdnzDoVGz9SRKlZ9JlB13vyZRjm/8AqL8D8PTVswKZW5kc3Ry
+ ZWFtCmVuZG9iago1IDAgb2JqCjE5NTUKZW5kb2JqCjIgMCBvYmoKPDwgL1R5cGUgL1Bh
+ Z2UgL1BhcmVudCAzIDAgUiAvUmVzb3VyY2VzIDYgMCBSIC9Db250ZW50cyA0IDAgUiAv
+ TWVkaWFCb3ggWzAgMCA1NzYgNzMzXQo+PgplbmRvYmoKNiAwIG9iago8PCAvUHJvY1Nl
+ dCBbIC9QREYgL1RleHQgL0ltYWdlQiAvSW1hZ2VDIC9JbWFnZUkgXSAvQ29sb3JTcGFj
+ ZSA8PCAvQ3MyIDEyIDAgUgovQ3MxIDcgMCBSID4+IC9Gb250IDw8IC9GMS4wIDEzIDAg
+ UiAvRjIuMCAxNSAwIFIgL0YzLjAgMTYgMCBSID4+IC9YT2JqZWN0Cjw8IC9JbTIgMTAg
+ MCBSIC9JbTEgOCAwIFIgPj4gL1NoYWRpbmcgPDwgL1NoNCAxOSAwIFIgL1NoMyAxOCAw
+ IFIgL1NoNSAyMCAwIFIKL1NoMiAxNyAwIFIgL1NoMSAxNCAwIFIgPj4gPj4KZW5kb2Jq
+ CjE5IDAgb2JqCjw8IC9Db2xvclNwYWNlIDcgMCBSIC9TaGFkaW5nVHlwZSAzIC9Db29y
+ ZHMgWyAwIDAgMCAwIDAgMzAuNDYzMDkgXSAvRG9tYWluClsgMCAxIF0gL0V4dGVuZCBb
+ IGZhbHNlIGZhbHNlIF0gL0Z1bmN0aW9uIDIxIDAgUiA+PgplbmRvYmoKMTggMCBvYmoK
+ PDwgL0NvbG9yU3BhY2UgNyAwIFIgL1NoYWRpbmdUeXBlIDMgL0Nvb3JkcyBbIDAgMCAw
+ IDAgMCAzMC40NjMwOSBdIC9Eb21haW4KWyAwIDEgXSAvRXh0ZW5kIFsgZmFsc2UgZmFs
+ c2UgXSAvRnVuY3Rpb24gMjIgMCBSID4+CmVuZG9iagoyMCAwIG9iago8PCAvQ29sb3JT
+ cGFjZSA3IDAgUiAvU2hhZGluZ1R5cGUgMyAvQ29vcmRzIFsgMCAwIDAgMCAwIDMwLjQ2
+ MzA5IF0gL0RvbWFpbgpbIDAgMSBdIC9FeHRlbmQgWyBmYWxzZSBmYWxzZSBdIC9GdW5j
+ dGlvbiAyMyAwIFIgPj4KZW5kb2JqCjE3IDAgb2JqCjw8IC9Db2xvclNwYWNlIDcgMCBS
+ IC9TaGFkaW5nVHlwZSAzIC9Db29yZHMgWyAwIDAgMCAwIDAgMzAuNDYzMDkgXSAvRG9t
+ YWluClsgMCAxIF0gL0V4dGVuZCBbIGZhbHNlIGZhbHNlIF0gL0Z1bmN0aW9uIDI0IDAg
+ UiA+PgplbmRvYmoKMTQgMCBvYmoKPDwgL0NvbG9yU3BhY2UgNyAwIFIgL1NoYWRpbmdU
+ eXBlIDMgL0Nvb3JkcyBbIDAgMCAwIDAgMCAzMi4zMTA5OSBdIC9Eb21haW4KWyAwIDEg
+ XSAvRXh0ZW5kIFsgZmFsc2UgZmFsc2UgXSAvRnVuY3Rpb24gMjUgMCBSID4+CmVuZG9i
+ agoxMCAwIG9iago8PCAvTGVuZ3RoIDExIDAgUiAvVHlwZSAvWE9iamVjdCAvU3VidHlw
+ ZSAvSW1hZ2UgL1dpZHRoIDE5NCAvSGVpZ2h0IDg2IC9Db2xvclNwYWNlCjI2IDAgUiAv
+ U01hc2sgMjcgMCBSIC9CaXRzUGVyQ29tcG9uZW50IDggL0ZpbHRlciAvRmxhdGVEZWNv
+ ZGUgPj4Kc3RyZWFtCngB7dCBAAAAAMOg+VMf5IVQYcCAAQMGDBgwYMCAAQMGDBgwYMCA
+ AQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgw
+ YMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMG
+ DBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCA
+ AQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgw8D4ww4QAAQpl
+ bmRzdHJlYW0KZW5kb2JqCjExIDAgb2JqCjI0MAplbmRvYmoKOCAwIG9iago8PCAvTGVu
+ Z3RoIDkgMCBSIC9UeXBlIC9YT2JqZWN0IC9TdWJ0eXBlIC9JbWFnZSAvV2lkdGggMTk0
+ IC9IZWlnaHQgMTAyIC9Db2xvclNwYWNlCjI5IDAgUiAvU01hc2sgMzAgMCBSIC9CaXRz
+ UGVyQ29tcG9uZW50IDggL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCngB7dCB
+ AAAAAMOg+VNf4AiFUGHAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+ gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+ MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+ BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+ gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+ MGDAgAEDBgwYMGDAgAEDBv7AAOfkAAEKZW5kc3RyZWFtCmVuZG9iago5IDAgb2JqCjI4
+ MwplbmRvYmoKMzAgMCBvYmoKPDwgL0xlbmd0aCAzMSAwIFIgL1R5cGUgL1hPYmplY3Qg
+ L1N1YnR5cGUgL0ltYWdlIC9XaWR0aCAxOTQgL0hlaWdodCAxMDIgL0NvbG9yU3BhY2UK
+ L0RldmljZUdyYXkgL0JpdHNQZXJDb21wb25lbnQgOCAvRmlsdGVyIC9GbGF0ZURlY29k
+ ZSA+PgpzdHJlYW0KeAHtXOtXUmkflTt4OEeBoyiXxEDUAUEmCMXL0CioXbwVXpalpkbW
+ wiFxMBuNxGU646VmvI9OaKVZljrFjGnWev+19zmQFxzX+XjWM7PO/uCX58Pv2XvzwHKt
+ 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
+ fQ+JGIoIolUJxwlEKRA28InCDQjrNqL9HyhRucEn7n+yruLAhmjpCVF5IoAQxL1A78nX
+ xpBYB6JvOtI8E+md4UAK0IgTqZ45vXnmgAUo/yHqaeBEpJkoelP6L60ArcBxBf4PP9iX
+ DwplbmRzdHJlYW0KZW5kb2JqCjMxIDAgb2JqCjE5MjcKZW5kb2JqCjI3IDAgb2JqCjw8
+ IC9MZW5ndGggMjggMCBSIC9UeXBlIC9YT2JqZWN0IC9TdWJ0eXBlIC9JbWFnZSAvV2lk
+ dGggMTk0IC9IZWlnaHQgODYgL0NvbG9yU3BhY2UKL0RldmljZUdyYXkgL0JpdHNQZXJD
+ b21wb25lbnQgOCAvRmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeAHtW/k7W1sX
+ NiYhA4kMZNCQCGlDpEVQ2vQGpdUipPS6VUQN/bQIWqoN8Riu4OpFWq2aqqh5akPQ5/5r
+ 39onQnS8X7U95/ke7y/8cs5e717D2dlrvW5uJyD2DrgTAN+5Q+7uHgienp5euAIMwAxx
+ d/9fiGDWe3p5e3uTyGQyBV+QySQwxAvx+Lcs0OaD9SQKxceXSqXR6HQ6AyfA0jQalerr
+ Q6GQHSz+hSfAfth9MsWHSqMz/JhMFiuAjSMCAlhMpj+DQaP6IBLgiW9wgPjB7KfSGP7M
+ ADaXFxjE5wsEQpwgEPD5/EAej8Nm+SMS3+YADkD7T6X7MdncQL4oWCwOlUgkUmkYLpBK
+ pRJJaIg4WMQP4iESiIPX19wADoDw96X7sTiBApFYEhYuP61QREZFKXFCVFSkQnFaHi6T
+ hAQLArkB/nQqhQSh9KVIQgTAAQwmJ1AolsjkCqXqXGycOj4hIREnJCTEq9WxMSpl5Olw
+ iVgUxGExaOCGL1HACPjQ/AJ4ArE0QhEdo05MvqjRalNS0/BDqlZ76WJyojpGFSkPEwt5
+ bH+675coYAR86Ux2kEgSEalSn9do0zIys7J1utw8PU7Iy9XpsrMyr1xO0SSpz0bJJcF8
+ DpPhS/m8F1AIAQEOXyxTqNTJ2vTMHH1BYVFxSanBUFZ2BweUlRkMpSXFRYU39bprGdoL
+ 8WcVMrGA+yUK7h5eZB86kysICY+KSdJmZOkLbxsq7lbfr6kzGusdaPhl2F/QaKyrram+
+ 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
+ 8dqKH14tAUP3VCNojHNNxNPXOXOkiO8x1BmY90Y5pgsxd5aqEzeAO2EfWapmCrFd+67q
+ Je57AnfT4zvRmzkLXKAcSXKxFdkU0DwJWBR9i7BJDjw+zh5V4HeomMAcuYnczSj3HtUR
+ G2ejUoFWeo1Xxk/jufHF+GVsGM+Afqx213t8/+njFXXXtj48+Y163DmuvZ0bVWFWcWUL
+ 3f/HMoSP2Sc5psHToVlYa9h25A+azEywDCjEfwU+l/qSE1Xc1e7tuEUSzFA+LGwluktU
+ binU6j2DSqwcK9gAdnCSxCxaHLhTa7o5eHfYInpt+U1XsuuG/vr2evva8h5tyqgpKBPN
+ s0RmlLFbo+TdeNv9ZpERnzg6vue9ilrJ/klFED+FOVoq8hRV9FZQ1sRvZw5+G7Z+XD+l
+ 5/VB/TwJPa2f0a/ooxG+DHRJz8JzUR+jSfCwaSHiEqCKgzPUTlRjjQPiKfHytFtkkf0P
+ QBn9ZgplbmRzdHJlYW0KZW5kb2JqCjMzIDAgb2JqCjcwNAplbmRvYmoKMTIgMCBvYmoK
+ WyAvSUNDQmFzZWQgMzIgMCBSIF0KZW5kb2JqCjM0IDAgb2JqCjw8IC9MZW5ndGggMzUg
+ MCBSIC9OIDMgL0FsdGVybmF0ZSAvRGV2aWNlUkdCIC9GaWx0ZXIgL0ZsYXRlRGVjb2Rl
+ ID4+CnN0cmVhbQp4AYWUTUgUYRjH/7ONBLEG0ZcIxdDBJFQmC1IC0/UrU7Zl1UwJYp19
+ d50cZ6eZ3S1FIoTomHWMLlZEh4hO4aFDpzpEBJl1iaCjRRAFXiK2/zuTu2NUvjAzv3me
+ //t8vcMAVY9SjmNFNGDKzrvJ3ph2enRM2/waVahGFFwpw3M6EokBn6mVz/Vr9S0UaVlq
+ lLHW+zZ8q3aZEFA0KndkAz4seTzg45Iv5J08NWckGxOpNNkhN7hDyU7yLfLWbIjHQ5wW
+ ngFUtVOTMxyXcSI7yC1FIytjPiDrdtq0ye+lPe0ZU9Sw38g3OQvauPL9QNseYNOLim3M
+ Ax7cA3bXVWz1NcDOEWDxUMX2PenPR9n1ysscavbDKdEYa/pQKn2vAzbfAH5eL5V+3C6V
+ ft5hDtbx1DIKbtHXsjDlJRDUG+xm/OQa/YuDnnxVC7DAOY5sAfqvADc/AvsfAtsfA4lq
+ YKgVkctsN7jy4iLnAnTmnGnXzE7ktWZdP6J18GiF1mcbTQ1ayrI03+VprvCEWxTpJkxZ
+ Bc7ZX9t4jwp7eJBP9he5JLzu36zMpVNdnCWa2NantOjqJjeQ72fMnj5yPa/3GbdnOGDl
+ gJnvGwo4csq24jwXqYnU2OPxk2TGV1QnH5PzkDznFQdlTN9+LnUiQa6lPTmZ65eaXdzb
+ PjMxxDOSrFgzE53x3/zGLSRl3n3U3HUs/5tnbZFnGIUFARM27zY0JNGLGBrhwEUOGXpM
+ KkxapV/QasLD5F+VFhLlXRYVvVjhnhV/z3kUuFvGP4VYHHMN5Qia/k7/oi/rC/pd/fN8
+ baG+4plzz5rGq2tfGVdmltXIuEGNMr6sKYhvsNoOei1kaZ3iFfTklfWN4eoy9nxt2aPJ
+ HOJqfDXUpQhlasQ448muZfdFssU34edby/av6VH7fPZJTSXXsrp4Zin6fDZcDWv/s6tg
+ 0rKr8OSNkC48a6HuVQ+qfWqL2gpNPaa2q21qF9+OqgPlHcOclYkLrNtl9Sn2YGOa3spJ
+ V2aL4N/CL4b/pV5hC9c0NPkPTbi5jGkJ3xHcNnCHlP/DX7MDDd4KZW5kc3RyZWFtCmVu
+ ZG9iagozNSAwIG9iago3OTIKZW5kb2JqCjcgMCBvYmoKWyAvSUNDQmFzZWQgMzQgMCBS
+ IF0KZW5kb2JqCjM2IDAgb2JqCjw8IC9MZW5ndGggMzcgMCBSIC9OIDMgL0FsdGVybmF0
+ ZSAvRGV2aWNlUkdCIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4Aa1YZ1ST
+ S7eedAKhBwi9SO9dmnSQLlKVJhBCkVAMSBMVPGBDQYoIiihSREWkKEVA6YoQwEYRFEUs
+ iMABFUEpd4J6zrfWXd+6f+6slcwzz+w95d3zzt77BYBj3C8ykooEAISFR9OctpuK7drt
+ IYYbAUyAHXACXUD0I0dFmjg62kGR/1KWhgCC0fVUiTGW+2hdV0Pa1fA99wJ1nLqG7/8X
+ pT80Gw1OCABCERLEoF/YmIH9f2EXBo6NjoyGMsEMTA72C4A4EWJFmouTGcTlELMF/cIN
+ DOz/Cz9k4BhyEEN3BAAsV3hASDgAuM8QGwZQosiwmzFvQEAUOQziM1BuPSwsAo7PATGQ
+ JUfSoC4HY0xJxnOBNSze1wDYCneMXfqXi1IHoJYLALGSfzmpnwDwMgFwI+1f7ovT5rNC
+ 8A5EBWpAHVgQBFMAMK82Nr5Iw7VlAbCWubHx88rGxloxAKhxAFqp5P20mE1ZKI2gA/B/
+ tX/t+bcGCi6VYWAisASZ4CvCF/EKGYpiQtWggzFymDXsa1wXUw3+JnMtyz0CnXWGHceh
+ yOnOlcbdzoPk1eVLJj0UEBIMFKoTYRL1EquXIG7xl7wvTZSJk30iL6NwVnFR2V7luhpe
+ PVCjTYtNm7q1W5eoF6bftI3LcLdRkfFXU12zWPM6i5/bPazoNkq2F+yxDtQdvTsVnHKc
+ 512d3Op3Se0+4jHt5ehdtYfVl+LXQhYJOETpDZIIjgvpD1WgJoR1RwhEkveV05aidfbH
+ xLTHgXj9hP0HqhKnD4ketk9KTa48MpyCTFU+6nns+PGyE10n353CnZZJN80IOHM481xW
+ UXZTDv3sx9wv52by3uSPnu+90FrQcLG+sOxS0eWTRQeuRBQHlriVWpXpXZUr5ylfv/bh
+ +tCNrorqmxmVsbcoVbbVSjWcNd9rR27fuVNQF1fv1qDdyNP4993eprLmIy2e9zTus9yf
+ bK1rO9Ue0GHYyds53dXUnfGA8lC3B98z8uhab2KfE12avtTfOZA56PlY9PHLJ8VPg57J
+ Pfv0vHooclhleGGkZjT6hdaLb2P14/tfqr+ce3VrIuy1/OtPb8onKW/F376cOv9u93u+
+ 908+ZH90nGadfvwpY8b+M8vnvtn0uZ3zPPPP/s5f8F4UXZz6UvGV9k1vCbtE/5677LMi
+ vbL0497PE6vua1Jrc+vtGyEbG9D+nEAPxINHCEXEeSQJWYzSR71GZ2BssOzYaXgCyvGZ
+ zMksCYRE1uNseezlHG2cE9wYohqPH286XwdpSUBOMFLopvCsqJJYuHi5xJykvlScdLss
+ Qs5MPlNhWImk7KFSoPpCnaBhr5mmdV97VcdAN1AvS/+BwaIhn5GO8R6TItN5cxWLRMsu
+ K4K1g0267bA90cFjR7HjopOmc7JLnxu3u/uuc7tHPCW8qN4lPu995fxC/evJSxSNwMSg
+ 28Gze5VDKdQLYWMRXJEW++JpN6Mm9xNjjGKj4y7EdyTMJpIOWh6KPpyddDt55Mhainiq
+ 0dHAYynHi05UnxxImz7NlC6QIXiGP5OURczmzOE+y5tLPMeRx5QP8tfPr15YKli8OFf4
+ 4dLLy4NF7VdaiutLKktzy05ePVYedy3ouvsN2wq9m7KVpFvYW4tV76qf1LTUXr+deyel
+ bl+9R4NFo8pdviZE01zzeAv9Xs39/NaUtsh2rw6zTtkujq7V7k8PXjy811P66HRvTJ8b
+ XaOfp39l4MVgw+PCJ4lPvZ5tey42hB56Pdw5Ujqa8sJ3zHBceHz55cir+ons1xFvrCcl
+ Jn+8HZuqenf8vd8HnY+sHz9Nt3w6M0P+rD3LMvt6rnY+9W/XBemFr4udX3K/Ur5pLuGW
+ nn4vWqau6PzA/Rj8eWE1aE1jbWW9Z4O6aX88EAXGIBRcBq8Q0ohYxGOkJrIIxYvKQvOi
+ izCaGDo2FMeOa2IKw0vi3zIXsVAIaoQ11j62S+wxHDs5lbnQXB+4+4hVPLm8iXx7SBb8
+ ygIkQaTgnNBj4QaRItETYhHiLhKmW2Qk8ZJvpO5LX4Q3hLOcrDxWfkShXDFJKUTZV8VO
+ 1VhNS11Kg1NjQ3NB65V2/9Z2nQbdm3pF+vkG6duSDfcZ+Rv7mLibmpkZmGtaKFqqbJey
+ ErYWtuGxZbdjt2d2wOzAO+J2op1QzmgXnCveDe/OuottN5sHpyefl7i3go/SHlVfbT8j
+ f1uyfYAvhRIYERQSHB+SuDczNJ9aEFYYXhZREnl1XwWtPqohunF/bUx1bHXcnfjqhCp4
+ n9w4WHLo/OHTSWnJx44k/7U3xTfV5+jOY8bH1U5In+RJw6QtnXp3+kl6d8btM5czT2Ul
+ ZIfkuJ01yVU6R8pD5s3mj8Gbpbmg9OLpwvhLIZfdi4yvyBZzlyBKFkvfltGv1pUXX8u5
+ nnojtiLo5s5Kg1vyVXzV2Oqlmje1vbe77lTVXazPbzjRGHs3tCmo2bvF5Z7zfadWpzaX
+ dvcOz87Arqju+AcnHhb23HnU3/uTzt+vP0AdvPJ47CnPM7fnZUPrI+6jt8fkxi+/Epmo
+ eeP3ljhFf1/68fqn5lkwH7rI/A21nLe6yrD/L9/H8AlYbQByowDY3QqASwIAadCHygwA
+ wOMLgCMr5HQBcucMQArJAgTs/+M/ZIAzSAKV8PSwIgwQ4YgixFMkFqmP3IcsQ76C52gH
+ 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
+ Yv/REwICoMQfnvxHgzFPWE1gTF5EvJ5bMHzD1dFaaFP0NrQhWheIwWhRACihNaGfN0Eb
+ ofVhn27/5/rP/8z8a8/+/+zIFq6DAvbDlVDgav/s+3/NCkLgN4jN3Bs+PYCFdi6ADADt
+ RupJjPo/SzQlDublAJhFRMbTQoKCo8VM4JcHiqKYdThZWVFMXVVVB/wPCLFULwplbmRz
+ dHJlYW0KZW5kb2JqCjM3IDAgb2JqCjM4NzgKZW5kb2JqCjI2IDAgb2JqClsgL0lDQ0Jh
+ c2VkIDM2IDAgUiBdCmVuZG9iagozOCAwIG9iago8PCAvTGVuZ3RoIDM5IDAgUiAvTiAz
+ IC9BbHRlcm5hdGUgL0RldmljZVJHQiAvRmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJl
+ YW0KeAGtWGdUk0u3nnQCoQcIvUjvXZp0kC5SlSYQQpFQDEgTFTxgQ0GKCIooUkRFpChF
+ QOmKEMBGERRFLIjAARVBKXeCes631l3fun/urJXMM8/sPeXd887e+wWAY9wvMpKKBACE
+ hUfTnLabiu3a7SGGGwFMgB1wAl1A9CNHRZo4OtpBkf9SloYAgtH1VIkxlvtoXVdD2tXw
+ PfcCdZy6hu//F6U/NBsNTggAQhESxKBf2JiB/X9hFwaOjY6MhjLBDEwO9guAOBFiRZqL
+ kxnE5RCzBf3CDQzs/ws/ZOAYchBDdwQALFd4QEg4ALjPEBsGUKLIsJsxb0BAFDkM4jNQ
+ bj0sLAKOzwExkCVH0qAuB2NMScZzgTUs3tcA2Ap3jF36l4tSB6CWCwCxkn85qZ8A8DIB
+ cCPtX+6L0+azQvAORAVqQB1YEARTADCvNja+SMO1ZQGwlrmx8fPKxsZaMQCocQBaqeT9
+ tJhNWSiNoAPwf7V/7fm3BgoulWFgIrAEmeArwhfxChmKYkLVoIMxcpg17GtcF1MN/iZz
+ Lcs9Ap11hh3HocjpzpXG3c6D5NXlSyY9FBASDBSqE2ES9RKrlyBu8Ze8L02UiZN9Ii+j
+ cFZxUdle5boaXj1Qo02LTZu6tVuXqBem37SNy3C3UZHxV1Nds1jzOouf2z2s6DZKthfs
+ sQ7UHb07FZxynOddndzqd0ntPuIx7eXoXbWH1Zfi10IWCThE6Q2SCI4L6Q9VoCaEdUcI
+ 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
+ MQVPa4BP5Z45PzX/OPIIRSaQFjQYorH3dOiXMHJ4Z6T+vptRotEXY4RjL8WLJ1Qk6h7s
+ O0xJWjuSnSKT2nss5oTwybZTUenKGe8y87K3n8XlDuTln99XEFJoe1nnimqJQJlIOf91
+ wQr+Sokq+Zpttz3r9jaculva3H1vrk2ow7Ir4sHVnv4+Qr/aYPiT688mh/lGt4+detky
+ sT6pO0V9f/3j8Axx1m4+a6H1K3rJaJn2o2X1w+b9oQL8QA54CNYQGoggRCFiCMmBtEGm
+ IluRP1G6qDhUPeo7eis6Dt2IXsOYYo5i+rF8WC9sKfZvnD7uOO45kwxTHNNDPAkfgW9n
+ JjHTmPtYtrAcZBkj6BHOE1ZZfVi72NTYzrFtsIexj3NYcdRxKnFe5RLiyuHm5s4hkogF
+ PHw8p3jRvH/xrvLF8S2RYkgr/IcFgECqIIdgrpCIULGwvHCjiKkIXdRTdEbsoDiX+DUJ
+ Q4nBLRRJjORlKQOpUek4GU6Zall32VW5C/IW8osKFxTNFb8plSu7qGBUmlWj1ZTUPqgX
+ QWuLaE5pXYGRjLYOQoeum6dH1lc1wBtMbrtrmG0UamxtomiKMZ0xGzTvsqiwLNieakWz
+ jrZJsc20K7JvdOjbMeY478TsLO+yw5Xmlu5+Z9e4B9JT2cvX+5zPU1+Mn64/jdxOQQbq
+ BqUEP9krGhpMbQvnjgiO7KEJRR2Inogxiy2PZ02IPTB90PVQX5Jpct1fsinnjgoeu3hC
+ 6GTeKYHTNzK2nmnNssjuPrsndykv7bz4hecXD16SuDxw5UiJbOm7q+euOV5fr+ioTKjS
+ rd6opd/JrA9qVG9CNA/fq2nNaT/Q6dht8lDxEV8fkf5zYPXxxjPUEG6E8IJ3XOGV0Wuf
+ yYSp7PfNH4dmMLNq82EL+V9eLJGWd/4oWR3ZtP9uUIXAIDwR1UgmpB+yEcWNoqIeoaXR
+ qej3GCvMDRhHJGDf4Gxw9UySTOfwLPgk+H5HMs+whLPME6IIP1iPsbFDX6LJ/pQjjJOd
+ s4bLhxvD3USM4hHhaeYN5CPw3Sb58XPzdwvECqoJfhAqEHYR4RB5JHpczFqcXXxEIn+L
+ t6SK5LJUp3SWzC5ZRdkNuT75UoVERQclBWWM8guVRtU8tVh1Nw0tTZLmhtYb7d6td3QK
+ dY/CWNTVwGqbnqGCkYAx3gRtMmf60WzC/IPFmOXE9sdWg9bDNm9t39mtOGB38DoK7VR3
+ MncOdElxveLW6D6xG+Eh6Wnvlehd5fPJl+Rn459MHqAQAk2D0oJH924JpVI7Nm33gMYf
+ FRM9GrMt9nI8OoF6YBzGIk1JKslFf3GkHExdPZZ4fPlkZNrs6fgM5JmjWbjslLPcuaV5
+ 6vlNFywK+gt9L60XnS1WLnlU5nN149q1G1oV45VHqtiq62v33F6rS4cR50CTf/OPe6db
+ JdvudNh1DnR7PfjWE/touS+evjLgPTj8xPVp+/MtQynDU6NmL66MfX2p9+rwRMcb3OT2
+ t9FTRe/636985JtW+qQ1Y/DZbNZ6zn7e7G+NBc6FucXeL8VfQ79pfFtYqvpOWeZeblvx
+ Xln+kfWT92feqsBq5urKmt9az7raeu8GhWH/X/kSw38AZrMIagRNzM7MfLP5//cXRt0P
+ c7LNwgH/CeH+DjtgDfMqMBgV42wBawY/GRhiaf0bLwb4mdtCLARTI2RCsJkDxASIRQJp
+ lk4QQ12E/F4/G0eI2SA2oIS7Ov/mbSKjTRkyJMh7UaIs/vDRCcEu7r/lj9L2O7lCLAll
+ ckIjbBnyjPEbAijmv9eD6AynOthBnhfyz0KirV0gJkL8CWZcfoAGggAFKAE7YAbMITO1
+ yfxpu222Q/7p/yWlBAI3NWOgZhSM2d5DnbA9IUdoQOz3OD2ADDk/EP6HUb2hOq26+qcF
+ 54oAVPj7V+PXyGL/0RMCAqDEH578R4MxT1hNYExeRLyeWzB8w9XRWmhT9Da0IVoXiMFo
+ UQAooTWhnzdBG6H1YZ9u/+f6z//M/GvP/v/syBaugwL2w5VQ4Gr/7Pt/zQpC4DeIzdwb
+ Pj2AhXYugAwA7UbqSYz6P0s0JQ7m5QCYRUTG00KCgqPFTOCXB4qimHU4WVlRTF1VVQf8
+ DwixVC8KZW5kc3RyZWFtCmVuZG9iagozOSAwIG9iagozODc4CmVuZG9iagoyOSAwIG9i
+ agpbIC9JQ0NCYXNlZCAzOCAwIFIgXQplbmRvYmoKMjIgMCBvYmoKPDwgL0xlbmd0aCA0
+ MCAwIFIgL0Z1bmN0aW9uVHlwZSAwIC9CaXRzUGVyU2FtcGxlIDggL1NpemUgWyAxMzY1
+ IF0gL0RvbWFpbgpbIDAgMSBdIC9SYW5nZSBbIDAgMSAwIDEgMCAxIF0gL0ZpbHRlciAv
+ RmxhdGVEZWNvZGUgPj4Kc3RyZWFtCngBncEHVgEAAADQ+9/ESrZkVBQaskdpGJlRjuA5
+ gv//4XDyr/7UXu3Ur9qqjVqrlVqShfpRczVTUzVR3+pLfaoPNVbv6k2N1FANVF/1VFd1
+ SFu1VFO9qoZ6Uc/qST2quqqpqnpQ96qiyupO3aobVVJFUlB5da1y6kplVUalVUolVULF
+ VUxdqqi6UBEVViEVVIHzHQFawrliCmVuZHN0cmVhbQplbmRvYmoKNDAgMCBvYmoKMTUy
+ CmVuZG9iagoyMyAwIG9iago8PCAvTGVuZ3RoIDQxIDAgUiAvRnVuY3Rpb25UeXBlIDAg
+ L0JpdHNQZXJTYW1wbGUgOCAvU2l6ZSBbIDEzNjUgXSAvRG9tYWluClsgMCAxIF0gL1Jh
+ bmdlIFsgMCAxIDAgMSAwIDEgXSAvRmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0K
+ eAGdwQdWAQAAAND738RKtmRUFBqyR2kYmVGO4DmC///hcPKv/tRe7dSv2qqNWquVWpKF
+ +lFzNVNTNVHf6kt9qg81Vu/qTY3UUA1UX/VUV3VIW7VUU72qhnpRz+pJPaq6qqmqelD3
+ qqLK6k7dqhtVUkVSUHl1rXLqSmVVRqVVSiVVQsVVTF2qqLpQERVWIRVUgfMdAVrCuWIK
+ ZW5kc3RyZWFtCmVuZG9iago0MSAwIG9iagoxNTIKZW5kb2JqCjIxIDAgb2JqCjw8IC9M
+ ZW5ndGggNDIgMCBSIC9GdW5jdGlvblR5cGUgMCAvQml0c1BlclNhbXBsZSA4IC9TaXpl
+ IFsgMTM2NSBdIC9Eb21haW4KWyAwIDEgXSAvUmFuZ2UgWyAwIDEgMCAxIDAgMSBdIC9G
+ aWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4AZ3BB1YBAAAA0PvfxEq2ZFQUGrJH
+ aRiZUY7gOYL//+Fw8q/+1F7t1K/aqo1aq5VakoX6UXM1U1M1Ud/qS32qDzVW7+pNjdRQ
+ DVRf9VRXdUhbtVRTvaqGelHP6kk9qrqqqap6UPeqosrqTt2qG1VSRVJQeXWtcupKZVVG
+ pVVKJVVCxVVMXaqoulARFVYhFVSB8x0BWsK5YgplbmRzdHJlYW0KZW5kb2JqCjQyIDAg
+ b2JqCjE1MgplbmRvYmoKMjQgMCBvYmoKPDwgL0xlbmd0aCA0MyAwIFIgL0Z1bmN0aW9u
+ VHlwZSAwIC9CaXRzUGVyU2FtcGxlIDggL1NpemUgWyAxMzY1IF0gL0RvbWFpbgpbIDAg
+ MSBdIC9SYW5nZSBbIDAgMSAwIDEgMCAxIF0gL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4K
+ c3RyZWFtCngBncEHVgEAAADQ+9/ESrZkVBQaskdpGJlRjuA5gv//4XDyr/7UXu3Ur9qq
+ jVqrlVqShfpRczVTUzVR3+pLfaoPNVbv6k2N1FANVF/1VFd1SFu1VFO9qoZ6Uc/qST2q
+ uqqpqnpQ96qiyupO3aobVVJFUlB5da1y6kplVUalVUolVULFVUxdqqi6UBEVViEVVIHz
+ HQFawrliCmVuZHN0cmVhbQplbmRvYmoKNDMgMCBvYmoKMTUyCmVuZG9iagoyNSAwIG9i
+ ago8PCAvTGVuZ3RoIDQ0IDAgUiAvRnVuY3Rpb25UeXBlIDAgL0JpdHNQZXJTYW1wbGUg
+ OCAvU2l6ZSBbIDEzNjUgXSAvRG9tYWluClsgMCAxIF0gL1JhbmdlIFsgMCAxIDAgMSAw
+ IDEgXSAvRmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeAGdwQdWAQAAAND738RK
+ tmRUFBqyR2kYmVGO4DmC///hcPKv/tRe7dSv2qqNWquVWpKF+lFzNVNTNVHf6kt9qg81
+ Vu/qTY3UUA1UX/VUV3VIW7VUU72qhnpRz+pJPaq6qqmqelD3qqLK6k7dqhtVUkVSUHl1
+ rXLqSmVVRqVVSiVVQsVVTF2qqLpQERVWIRVUgfMdAVrCuWIKZW5kc3RyZWFtCmVuZG9i
+ ago0NCAwIG9iagoxNTIKZW5kb2JqCjMgMCBvYmoKPDwgL1R5cGUgL1BhZ2VzIC9NZWRp
+ YUJveCBbMCAwIDU3NiA3MzNdIC9Db3VudCAxIC9LaWRzIFsgMiAwIFIgXSA+PgplbmRv
+ YmoKNDUgMCBvYmoKPDwgL1R5cGUgL0NhdGFsb2cgL1BhZ2VzIDMgMCBSIC9WZXJzaW9u
+ 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
+ 62jE5zBMxByNl5qimvo/ft23YoO28kAA1dSBnq6li6XnPXdlWzO+8oXv7cHn1t5Wl2v/
+ 0q7Rt0tvc+vCdvF9qaUt3OVuqwgvdVe49vdI34nFl1UvFqt73BX7YXHl7Ib9i0NtFYM9
+ oZ5K8ZnzQGv58qYrxlo/Ntby8n8xVrnY2XJxrFbpu38aq0msbhXHahLHahLHag21SmOJ
+ EFR21Jff0o3SiU+A+ASXVh+umTWvAV+6GysiZJf4Lngr/A9YjzQ8CmVuZHN0cmVhbQpl
+ bmRvYmoKNDcgMCBvYmoKNjE3MwplbmRvYmoKNDggMCBvYmoKPDwgL1R5cGUgL0ZvbnRE
+ ZXNjcmlwdG9yIC9Bc2NlbnQgNzcwIC9DYXBIZWlnaHQgNzI3IC9EZXNjZW50IC0yMzAg
+ L0ZsYWdzIDMyCi9Gb250QkJveCBbLTk1MSAtNDgxIDE0NDUgMTEyMl0gL0ZvbnROYW1l
+ IC9KVElaQ1orSGVsdmV0aWNhIC9JdGFsaWNBbmdsZSAwCi9TdGVtViA5OCAvTWF4V2lk
+ dGggMTUwMCAvU3RlbUggODUgL1hIZWlnaHQgNTMxIC9Gb250RmlsZTIgNDYgMCBSID4+
+ CmVuZG9iago0OSAwIG9iagpbIDI3OCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAg
+ MCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwCjAgMCAwIDYxMSAw
+ IDAgMCAwIDAgMCAwIDAgMCAwIDAgNzIyIDY2NyAwIDAgMCAwIDAgMCAwIDAgMCAwIDAg
+ MCAwIDU1NiAwIDUwMAo1NTYgNTU2IDAgMCAwIDIyMiAwIDAgMCAwIDU1NiA1NTYgNTU2
+ IDAgMzMzIDUwMCAyNzggNTU2IDAgMCAwIDUwMCBdCmVuZG9iagoxMyAwIG9iago8PCAv
+ VHlwZSAvRm9udCAvU3VidHlwZSAvVHJ1ZVR5cGUgL0Jhc2VGb250IC9KVElaQ1orSGVs
+ dmV0aWNhIC9Gb250RGVzY3JpcHRvcgo0OCAwIFIgL1dpZHRocyA0OSAwIFIgL0ZpcnN0
+ Q2hhciAzMiAvTGFzdENoYXIgMTIxIC9FbmNvZGluZyAvTWFjUm9tYW5FbmNvZGluZwo+
+ PgplbmRvYmoKNTAgMCBvYmoKPDwgL0xlbmd0aCA1MSAwIFIgL0xlbmd0aDEgNjM1NiAv
+ RmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeAHFWGtUVFeW3uc+qoqHyEsoHsWt
+ 8lK8EYEIKo6UWIUgxiCoXWU0VoEgEFBGkaiJNm00UVQmxkFtzbI1pjMqMV6Btgttldja
+ iZ3utLFbuzvjTMdOYj9WMs70tLMyUbnz3QsSyUqy/JGVuWede/bZ57G//e19C84hRkTB
+ 1EY8OaqbfM1UywRofoHaX93aYt3+l6n7idg2Ir6xtnlpU9j7P/05kfApUWDw0sY1tTuD
+ XjpNNBprhPfranxL/uOFQwaiiA+xPq8OiuA7IfVEkfHoJ9Y1taxOzBVeQN+Bfkrj8mqf
+ Md4Qgn4d+lFNvtXNpqZA7B3Zhr51ma+pJsc52ov+AfTTmpevbKE9rAN9DV9e84qa5p88
+ uyybaAzs87+CjqFoTzAZqBetleYNaXT1/9OLg12eBBKBisj4JShM0AWI/RQqnqEUsY1i
+ hSySiNTfo76ntQPz1JvimxQ60KT+F1+A2X1a5QYKp1A/bad9dBx7H4acQk/QHrrEGqiP
+ LQQH11gCjaM2WPfTLPoFU9V3qZZewfwWOk+ddAJcpVATjcFoB7Ora9F3QK6ijerLlEgT
+ 6Tk6Q5Owawd9oh5RezBaAVaPUhfWv81k7oQQob6ufkgmmoM9N2LkXXWWepzCKYOKqBza
+ jXSW2fn31DoyUwHQvUQ/oIP0Bn3MNrBetU5tVS+rN4jDaDxVoqxjvewGf1x4Tn1J/as6
+ ACZSKA1WvbSTDmH/4yj9CLWLPcla2E7WyTm4DVyvsEmMHrgHHlJpBkoJLafNYKCPLtDf
+ 6H/ZLc7Mh/It/EV1gvrfFERl8FLzpIZaUZ5H6YBPp5mBjWfTWTlbx/6ZdbJfc2ncPM7N
+ PcWt5m7ys/mF/Br+18JKoVvcJu4xBA3cVk+rb6pXKZos9DitoPXw7jxdpr/TZ4zHXvHM
+ zgpYEXsCpY3t4/rYQdbHlbN+dpk7yv7APmC32B1O5IK5MVw618Lt5Lq489w7fD3fyX+f
+ /wN/W5gqcuJB8SOD3fivA1UDWwbeUQvUG+qnyCgT2RCZIppNi8kHb5vpEfouvDiGchxR
+ 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
+ jJKMNmOcMdIUbgo1hZiCTYEmk8noZ691F0qG06yLCkFLV4/JYBL97HUohdPsmK489mOT
+ YOJMZIr0q+/jUphRpJ919YZqEoSTBl0y+Nkx5LamOuaQkMr4OPWBUGQV01ILb+KYiaOZ
+ OJlv9xtoU1RrobkwfGrYpGLnV728+sj9d/pXP2ZmUXbhbKgctXhwDIegWjz3p5vvC1/Z
+ tqzCUE1RenpZxZqe1uaGWv1aQXbVeHG7oGxtxTVPW5XVeqKheejOJMlbVV2nnWt9NUqz
+ XONUGmSn9USrvk5TPzBcqw23ys4TVOua6z5R66hxdrc6Wl3a9UpPVdGKRSNsbRm2taLo
+ S2wVaZut0GxV6eu+YGuRNlyl2Vqk2Vqk2apyVOm2NOdd9ZVFK1uQnbh6wNE/pVIpnbPA
+ jRs2j9PPXtXuI1bR/wHYY5P9CmVuZHN0cmVhbQplbmRvYmoKNTEgMCBvYmoKMzcxMQpl
+ bmRvYmoKNTIgMCBvYmoKPDwgL1R5cGUgL0ZvbnREZXNjcmlwdG9yIC9Bc2NlbnQgNzcw
+ IC9DYXBIZWlnaHQgNzI3IC9EZXNjZW50IC0yMzAgL0ZsYWdzIDk2Ci9Gb250QkJveCBb
+ LTkzMyAtNDgxIDE1NzEgMTEzOF0gL0ZvbnROYW1lIC9aWFVLRFkrSGVsdmV0aWNhLU9i
+ bGlxdWUgL0l0YWxpY0FuZ2xlCi0xMiAvU3RlbVYgMCAvTWF4V2lkdGggMTUwMCAvWEhl
+ aWdodCA1MzEgL0ZvbnRGaWxlMiA1MCAwIFIgPj4KZW5kb2JqCjUzIDAgb2JqClsgMjc4
+ IDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAg
+ MCAwIDAgMCAwIDAgMCAwIDAKMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAw
+ IDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgNTU2IDAgNTAwIDU1Ngo1NTYgMjc4IDAg
+ NTU2IDAgMCAwIDAgMCAwIDAgMCAwIDMzMyAwIDI3OCBdCmVuZG9iagoxNSAwIG9iago8
+ PCAvVHlwZSAvRm9udCAvU3VidHlwZSAvVHJ1ZVR5cGUgL0Jhc2VGb250IC9aWFVLRFkr
+ SGVsdmV0aWNhLU9ibGlxdWUgL0ZvbnREZXNjcmlwdG9yCjUyIDAgUiAvV2lkdGhzIDUz
+ IDAgUiAvRmlyc3RDaGFyIDMyIC9MYXN0Q2hhciAxMTYgL0VuY29kaW5nIC9NYWNSb21h
+ bkVuY29kaW5nCj4+CmVuZG9iago1NCAwIG9iago8PCAvTGVuZ3RoIDU1IDAgUiAvTGVu
+ Z3RoMSA1MDgwIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4Ab1XC3BU1Rn+
+ //vYRwiSEJBNwnJ3uZuEJLuEl4RATG7CblgMiSGBuMtDd5MsBprAtqWpSMHIQ2WxDo4V
+ aMYWqczooOjNgniR0ckgjrbK1Ed91Bfq+EBppHV4VCG5/c/dsBLGYTJThnvm3P/8j/P/
+ 3/3O2eQcQABIhU7gQWluD0fBAn6yvE7d1tyx2nF7Rb5C4y8A+HuWRW9vfyPy9R4AoQ0g
+ JeP2tjXLag7syAK4rpNinmqNhFu+++KxsQAj3KRPbyWD9R6zhfQW0l2t7avvsABS/Ij7
+ SLe0rWoOQyNMI30b6ab28B1RSyTlAuk7SXesDLdHjnz03T9I10jPi6769Wr9ToiQ/inp
+ udFfRaJ99VuWAaRRDf7vZENq7EkFE3WAicwi9kC6eAQ84g6wC5VgB9A/oP4hk/0N+inx
+ DUjR+/RenpDgeNaPn8dR8AyY4TlYDwK8BXvRCjL04hT4J9qxAN6HfvgQPocs2AqP0tsH
+ J/AsWOEbnEAx02ED/Bl26VGIQjm1EyjCaJgB3+hr9Vf1H6ASYnAUzZiBdv0QFMG91Lrg
+ EUzlmvRusME8+C2tyAb4K3ygx/VvKf90+BLTsUiYpX8MHIhkKYEtsBeeQyfKWICL9S/J
+ biOMS2CvXqN30LxTFFUEtbCWqn2GEuZiIXbhJ3yv3qk/QN82lnwLoZlaO9wNO+ER2GdE
+ NQljxdGU3wvV5HuA9sIJ+J5ozMdKvIN7h/+W/7cwS+jSjxKOhVQvBLuQJ1ZcuBBbMIr7
+ 8AC+hGe5Yi7Ml/DvCFFhN2FbCPfBbngBXoG34WM4Cb3wI/ShQJjK8GZci3+ieZ9zU7ml
+ 3Drufu4D7hQ/mf9EMAtbxc3iYV3Q39F/JMzjoABmwRyYDwHaBxFYBivhN3AXbEIz7IBu
+ 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
+ yzsmVbPScUlJFJqeyH6Dy0A8JVHW7TosTUhUGM+ilQzJ4Zon2Sm/+9Htktt1q1RRoOET
+ z/knFLj8eduna3jaqMEEAWViZUI0572Aj9NNOB8XQQ7+cb8/nzDjtri0kUTXfv+E4hyN
+ P6GMlPbn+fM2UZ9OPYf6Qg0XKG7zDnOLeaF5qrnQnG/ONTvN48zZ5lGWkZY0y3WWVEuK
+ xWIxWQQLZwHLKE3/VClk+22UKY0Jk8DegjFOo/2DxiajLcmhhYObQDPB5us7ym3lI8vS
+ S6q8P/MKGcaQt/Cnh37WyceGdnU7HdbUvfagOoUNdHsw6f3/BpFKml9dv2Z//ZqTjcZ5
+ X/ZFQnTsV7d20LWss8nh6D65hjnYyTPU1NzKZDiirpEjXvWk7HV01xvzLnM3Mne97O2G
+ Rt+CQHejEvHG65V6dp4P7q/z+envChW5WGtLspbf9zO1fCyZn9WqM+ZdVquWuetYrVpW
+ q5bVqlPqjFqFhb7lDZXwPyVFeM0KZW5kc3RyZWFtCmVuZG9iago1NSAwIG9iagoyNzg0
+ CmVuZG9iago1NiAwIG9iago8PCAvVHlwZSAvRm9udERlc2NyaXB0b3IgL0FzY2VudCA3
+ NzAgL0NhcEhlaWdodCA3MzEgL0Rlc2NlbnQgLTIzMCAvRmxhZ3MgMzIKL0ZvbnRCQm94
+ IFstMTAxOCAtNDgxIDE0MzYgMTE1OV0gL0ZvbnROYW1lIC9CWk5JQUwrSGVsdmV0aWNh
+ LUJvbGQgL0l0YWxpY0FuZ2xlCjAgL1N0ZW1WIDE0OSAvTWF4V2lkdGggMTUwMCAvU3Rl
+ bUggMTI0IC9YSGVpZ2h0IDU0MCAvRm9udEZpbGUyIDU0IDAgUiA+PgplbmRvYmoKNTcg
+ MCBvYmoKWyAyNzggXQplbmRvYmoKMTYgMCBvYmoKPDwgL1R5cGUgL0ZvbnQgL1N1YnR5
+ cGUgL1RydWVUeXBlIC9CYXNlRm9udCAvQlpOSUFMK0hlbHZldGljYS1Cb2xkIC9Gb250
+ RGVzY3JpcHRvcgo1NiAwIFIgL1dpZHRocyA1NyAwIFIgL0ZpcnN0Q2hhciA0NiAvTGFz
+ dENoYXIgNDYgL0VuY29kaW5nIC9NYWNSb21hbkVuY29kaW5nCj4+CmVuZG9iagoxIDAg
+ b2JqCjw8IC9UaXRsZSAoVW50aXRsZWQpIC9BdXRob3IgKFJhbmRhbGwgSGF1Y2gpIC9D
+ cmVhdG9yIChPbW5pR3JhZmZsZSkgL1Byb2R1Y2VyCihNYWMgT1MgWCAxMC41LjUgUXVh
+ cnR6IFBERkNvbnRleHQpIC9DcmVhdGlvbkRhdGUgKEQ6MjAwODA5MjUyMDU5MjZaMDAn
+ MDAnKQovTW9kRGF0ZSAoRDoyMDA4MDkyNTIwNTkyNlowMCcwMCcpID4+CmVuZG9iagp4
+ cmVmCjAgNTgKMDAwMDAwMDAwMCA2NTUzNSBmIAowMDAwMDM1NTQzIDAwMDAwIG4gCjAw
+ MDAwMDIwNzEgMDAwMDAgbiAKMDAwMDAyMDY3NyAwMDAwMCBuIAowMDAwMDAwMDIyIDAw
+ MDAwIG4gCjAwMDAwMDIwNTEgMDAwMDAgbiAKMDAwMDAwMjE3NSAwMDAwMCBuIAowMDAw
+ MDEwODg4IDAwMDAwIG4gCjAwMDAwMDM2MDYgMDAwMDAgbiAKMDAwMDAwNDA3MCAwMDAw
+ MCBuIAowMDAwMDAzMTY0IDAwMDAwIG4gCjAwMDAwMDM1ODYgMDAwMDAgbiAKMDAwMDAw
+ OTkzNiAwMDAwMCBuIAowMDAwMDI3NTc4IDAwMDAwIG4gCjAwMDAwMDMwMjEgMDAwMDAg
+ biAKMDAwMDAzMjAxOCAwMDAwMCBuIAowMDAwMDM1MzY0IDAwMDAwIG4gCjAwMDAwMDI4
+ NzggMDAwMDAgbiAKMDAwMDAwMjU5MiAwMDAwMCBuIAowMDAwMDAyNDQ5IDAwMDAwIG4g
+ CjAwMDAwMDI3MzUgMDAwMDAgbiAKMDAwMDAxOTY3MiAwMDAwMCBuIAowMDAwMDE5MDAy
+ IDAwMDAwIG4gCjAwMDAwMTkzMzcgMDAwMDAgbiAKMDAwMDAyMDAwNyAwMDAwMCBuIAow
+ MDAwMDIwMzQyIDAwMDAwIG4gCjAwMDAwMTQ5MjYgMDAwMDAgbiAKMDAwMDAwNjIxMSAw
+ MDAwMCBuIAowMDAwMDA5MDg3IDAwMDAwIG4gCjAwMDAwMTg5NjUgMDAwMDAgbiAKMDAw
+ MDAwNDA4OSAwMDAwMCBuIAowMDAwMDA2MTkwIDAwMDAwIG4gCjAwMDAwMDkxMDggMDAw
+ MDAgbiAKMDAwMDAwOTkxNiAwMDAwMCBuIAowMDAwMDA5OTczIDAwMDAwIG4gCjAwMDAw
+ MTA4NjggMDAwMDAgbiAKMDAwMDAxMDkyNCAwMDAwMCBuIAowMDAwMDE0OTA1IDAwMDAw
+ IG4gCjAwMDAwMTQ5NjMgMDAwMDAgbiAKMDAwMDAxODk0NCAwMDAwMCBuIAowMDAwMDE5
+ MzE3IDAwMDAwIG4gCjAwMDAwMTk2NTIgMDAwMDAgbiAKMDAwMDAxOTk4NyAwMDAwMCBu
+ IAowMDAwMDIwMzIyIDAwMDAwIG4gCjAwMDAwMjA2NTcgMDAwMDAgbiAKMDAwMDAyMDc2
+ MCAwMDAwMCBuIAowMDAwMDIwODI0IDAwMDAwIG4gCjAwMDAwMjcwODcgMDAwMDAgbiAK
+ MDAwMDAyNzEwOCAwMDAwMCBuIAowMDAwMDI3MzQ0IDAwMDAwIG4gCjAwMDAwMjc3NTMg
+ MDAwMDAgbiAKMDAwMDAzMTU1NCAwMDAwMCBuIAowMDAwMDMxNTc1IDAwMDAwIG4gCjAw
+ MDAwMzE4MTAgMDAwMDAgbiAKMDAwMDAzMjIwMSAwMDAwMCBuIAowMDAwMDM1MDc1IDAw
+ MDAwIG4gCjAwMDAwMzUwOTYgMDAwMDAgbiAKMDAwMDAzNTM0MCAwMDAwMCBuIAp0cmFp
+ bGVyCjw8IC9TaXplIDU4IC9Sb290IDQ1IDAgUiAvSW5mbyAxIDAgUiAvSUQgWyA8MzJi
+ ZWZiMjY2ZTI3ZGZhOTUzMGJjYzE4ZTQ5ZjA2YTg+CjwzMmJlZmIyNjZlMjdkZmE5NTMw
+ YmNjMThlNDlmMDZhOD4gXSA+PgpzdGFydHhyZWYKMzU3NTAKJSVFT0YKMSAwIG9iago8
+ PC9BdXRob3IgKFJhbmRhbGwgSGF1Y2gpL0NyZWF0aW9uRGF0ZSAoRDoyMDA4MDkxOTE1
+ MzUwMFopL0NyZWF0b3IgKE9tbmlHcmFmZmxlIDUuMC4yKS9Nb2REYXRlIChEOjIwMDgw
+ OTI1MjA1ODAwWikvUHJvZHVjZXIgKE1hYyBPUyBYIDEwLjUuNSBRdWFydHogUERGQ29u
+ dGV4dCkvVGl0bGUgKGRuYS1jb25uZWN0b3JzLTAuMik+PgplbmRvYmoKeHJlZgoxIDEK
+ MDAwMDAzNzA2OCAwMDAwMCBuIAp0cmFpbGVyCjw8L0lEIFs8MzJiZWZiMjY2ZTI3ZGZh
+ OTUzMGJjYzE4ZTQ5ZjA2YTg+IDwzMmJlZmIyNjZlMjdkZmE5NTMwYmNjMThlNDlmMDZh
+ OD5dIC9JbmZvIDEgMCBSIC9QcmV2IDM1NzUwIC9Sb290IDQ1IDAgUiAvU2l6ZSA1OD4+
+ CnN0YXJ0eHJlZgozNzI3MgolJUVPRgo=
+ </data>
+ <key>QuickLookThumbnail</key>
+ <data>
+ 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
+ AAADAQAAAgAAABQARgCRAPQBYAHeAmsDCAOyBGgFKQX9BuAHxQiyCa0Kswu+DM0N6w8H
+ ECwRVxKLE8IVAhY5F4EYyBocG2Ycth4IH1wgtyIUI2IkvyYUJ3go0ionK5Us8i5NL6ox
+ CTJmM8E1DjZsN8Y5FDptO7s9Ej5ZP6FA9EI5Q3dEtkX7R1pIzUotS5tNBk5sT8tRK1KU
+ U+9VUla3WCVZglrpXFBdsF8NYGVhvWMeZH5ly2ciaHhpzmsrbHptxm8acGNxqHL2dDh1
+ dnbCeAB5O3p1e7B86X4ff02AhYGugteEAoUuhluHiIimicWK5YwHjSeOQo9kkH+Rl5Kh
+ k7uUzZXolvOX65jhmdmay5vAnLidt56mn6GgiqF7om+jZqRWpUimOqcpqBWo/qnnqtar
+ xayxrY+ud69lsEuxLbIRsvez2LS1tZy2eLdWuDa5Fbnwusu7pryCvVu+M78Lv+LAtsGM
+ wmTDPsQWxOnFu8aPx2XIOckJydjKqct8zFLNJs32zsTPkdBb0R/R3dKj02fUKdTq1bHW
+ cNcv1/HYstl02jXa9du33HXdMt3u3q/fbeAq4OrhqOJl4yHj3eSa5VnmF+bS55PoUOkN
+ 6dHqj+tN7AvszO2O7lHvFe/U8JnxXfIf8uTzrPRy9Tr2BvbN95b4Xvkm+fb6vvuJ/Ff9
+ Jf3u/sL/af//AAAAEQA6AHkAygEsAZoCGAKjAzsD4ASPBUoGDwbpB8UIqAmRCoELegx8
+ DYgOmA+oEMER3xMFFDEVYRaOF8MY9hopG3AcrR3tHy0gbiGoIu4kOyV4JsIoASlDKpEr
+ 1y0YLlovnDDaMgwzTTSLNb82/Dg8OWY6kjvHPPI+Fz84QF9BoULvRC9FfEbFSAxJTkqO
+ S9dNFE5aT6NQ8lI0U4FUzFYTV1dYl1nYWyJcbF2kXuZgKWFrYrdj9mUzZnxntGjtai5r
+ ZWybbdtvEnBFcXlyrXPidRR2P3d0eJt5w3rtfBh9Rn50f5OAtIHYgv2EIYU/hmaHhIih
+ ibGKz4vpjQiOGo8bkBmRGJIUkxGUE5UWlhSXEJgImQCZ/pr8m/ac8p3unuef3aDQocKi
+ vaO3pK6llqaKp4eoeKlnqlerS6w6rSiuGK8Gr/Kw5bHSsr2zqrSWtYS2cbdauEW5L7oX
+ uwG77rzcvc2+sr+ZwITBcMJcw0PEKMUQxfzG6sfayL7JpcqNy3bMVs0zzhXO+c/a0LjR
+ ntJ801zUPdUg1gTW4NfE2KXZhNpg2z7cHdz43djet9+T4G/hSeIi4vrj2+Sw5YjmYec4
+ 6A3o6um96pDrY+w27Qvt4O6z74XwVfEm8fTyxPOW9GX1NPYH9tP3ofhs+Tj6B/rQ+5v8
+ Z/0z/fn+yf9s//8AAAAJAB8AQABrAKAA3gEmAXcB0QI0AqEDFgOSBBYEoQU0Bc0GawcP
+ B7sIbQkkCeMKoQtlDDEM/Q3MDp8PdhBRES4SBBLnE8wUsBWWFnwXXxhFGS4aGBsCG+4c
+ 0R24HqEfiSBvIVQiQiMnJAkk4SW/Jp0neChTKSgqBirYK6gsgC1pLmAvTDBAMTUyJTMR
+ M/808TXeNs43wji4Oa06oTuZPI49gT5xP2JAXkFXQkNDPEQ0RSxGL0clSB1JHUoVSw9M
+ D00KTgVPCVAHUQRSA1MEVAdVCVYJVw1YDlkOWhFbF1whXSteLV8wYDZhP2JLY01kYGVl
+ Zm9naWh5aXxqkWuZbJxtnm6mb6Rwp3GscrdzuHS5dbN2sXexeLV5sXqwe7B8q32kfpp/
+ jYCLgYeCgYNqhGCFXoZRh0CIMYkmihWLBYv2jOWN0o7Gj7SQoJGMknqTaZRWlUGWLZcY
+ mAKY7ZnbmsubvJylnY2eeZ9poFehQKIooxOkAaTypeOmzae2qKOplKqFq3esZ61Rrjyv
+ KrAXsQax9rLhs8u0xbWwtp23mbiJuXe6a7tnvF29VL5Tv1LAUsFUwlfDW8RmxXPGeceJ
+ yJ7JtcrOy/vNGc47z2zQotHb0xXUVtWm1v7YV9m02yncoN4e37LhYeMU5M3mpeiq6rzt
+ AO9r8gr1A/iY/Pz//wAAbmRpbgAAAAAAAAY2AACWcwAAWcAAAFR6AACLQwAAJ88AABVg
+ AABQDQAAVDkAAlHrAAIcKAABVHoAAwEAAAIAAAAnAFMAgACuAN4BDQE8AW4BoQHTAgYC
+ OwJxAqYC3gMWA08DiAPCA/0EOAR3BLME8gUxBW8FsQXzBjYGega/BwQHSQeQB9wIJQhv
+ CL0JBwlVCaUJ9wpDCpQK6As9C5IL6QxADJkM8g1PDbEODQ5rDs0PMw+UD/wQYxDJETcR
+ phISEn4S8hNoE98UWBTNFTsVpBYSFoYW9BdkF9YYShjBGToZsxooGqUbIxueHBsclh0Q
+ HZQeFB6THxUfmiAgIKkhNCHBIksi1SNgI/UkiSUaJa4mRCbXJ2soByimKUEp3SqBKycr
+ yCxtLRktxy5sLxovzTCAMTYx7DKkM100GzTgNZw2ZDcuN/g4wzmOOlo7JzwBPNs9tj6R
+ P2xATEEyQg9C+EPiRNxFxka9R6hInkmsSsdL2Uz6ThdPNVBIUXJSkFPGVPFWHVdFWH1Z
+ rVrkXCFdZF6uX+5hMWJ4Y9hlJ2ZyZ9BpM2qNa/NtY27EcDtxrXMfdJ12HXefeSF6rHw5
+ fcx/ZYD9gpOEJ4XLh3aJHYrBjHOOLo/lkZiTR5UHls+YmZpxnGmeS6A4ojCkGqYeqBmq
+ G6wZriKwKrI9tFu2ariMuqW8xr7uwRzDRsVvx6fJzswMzjHQbtKq1OLXF9lH24zdvd/+
+ 4jnkbOaq6NfrFO1M75LxwPQE9j/4cvq9/Of//wAAAC8AYQCUAMgA/QEzAWcBngHWAhAC
+ SgKFAsAC+wM5A3gDtwP3BDcEeAS5BP0FQgWGBc4GFwZcBqUG8Ac7B4gH1QgnCHgIyAkY
+ CW8JwgoYCnIKzAsjC30L2ww6DJoM/A1eDcUOMQ6XDv8PbQ/cEEgQthEtEacSHBKUExMT
+ lBQYFJwVFxWMFgQWgxb8F3gX9hh2GPkZfxoAGoUbEBuWHB4cox0qHbkeQh7NH1sf6yB9
+ IRIhqSI+ItAjZSQFJKAlPCXZJngnESexKFco/CmbKkUq8iubLEQs9S2oLlQvBS+8MHQx
+ LTHnMqEzXTQeNOQ1ojZsNzY4ATjNOZg6YzswPAk84j26PpM/a0BJQSxCBULrQ9BExUWs
+ RpxHhUhySXRKhEuRTKFNuU7MT9tQ71IKUypUT1VyVo5XtVjcWgJbLlxgXZde02AFYTli
+ cmPCZQJmOWeEaNJqH2tobMFuE29ocMlyHHN7dN92Q3eoeQ16d3vpfVV+zIBCgbaDKISX
+ hhuHnYkcipiMGo2rjzeQwJJFk8aVX5b2mIuaIZvVnX2fIqDPooKkKKXlp5epUKr+rMOu
+ erA5sf+zzbWRt2e5MrsBvNe+ssCUwnvEUMZByCzKF8wUzfvP/NH/1APWB9gM2hbcK94/
+ 4F7ieuST5rzo1usF7THvbfGZ89r2GPhR+qT82P//AAAAWQCwAQUBWwGxAggCYQK5AxMD
+ bAPKBCYEhQTmBUgFqwYPBnoG4QdKB7cIJAiXCQsJgAn3CnAK6wtuC+8Mcwz6DYcODw6f
+ DzQP0xBtEQ8RshJeEwUTuxRzFR4VvBZmFwwXtBhhGRMZxhp3GzEb5xycHVQeEB7KH4gg
+ SSEPIdgimSNdJC8k+CXEJpInWCgsKP8pzCqlK3wsTi0rLgUu2i+5MJgxdzJWMzU0GDT/
+ NeE2yze1OJ45hjptO1U8SD06Pis/GkAJQQRB7kLoQ99E50XbRt9H0UjQSddK40vlTPlO
+ Bk8WUBxRMlJEU2ZUhFWiVrlX31kBWiRbTVx8XbBe6mAYYUpigWPPZQxmQmeLaNlqI2ts
+ bMNuE29ocMdyGXN2dNl2PXegeQR6bHvcfUZ+u4AvgaGDEIR9hfyHfIj4inCL7Y15jwKQ
+ hpIHk4SVE5almDKZu5tFnM6eYJ/+oZWjLqTKpl6n/6mpqzWs3K6CsA6xt7NftP22jrg2
+ uc+7Yrz6vo3AJMG1w0zEz8Zcx/XJd8r4zHnN+c9d0NfSVdPC1SPWhNfk2UPaotv03Tre
+ f9/D4QfiR+N05KHlzub56BfpLeo16zzsQ+1J7k3vQ/Az8RHx7vLL86P0a/Uz9fH2sPdl
+ +BP4wfld+fj6kvsW+5j8GvyR/Pn9Yf3J/jH+y/9l//8AAGRlc2MAAAAAAAAACkNvbG9y
+ IExDRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABtbHVjAAAAAAAAABAAAAAMbmJO
+ TwAAABIAAADQc3ZTRQAAABAAAADiZmlGSQAAABAAAADyZGFESwAAABwAAAECemhDTgAA
+ AAwAAAEeZnJGUgAAABIAAAEqamFKUAAAAA4AAAE8ZW5VUwAAABIAAAFKcHRCUgAAABgA
+ AAFcZXNFUwAAABIAAAF0emhUVwAAAA4AAAGGcnVSVQAAACQAAAGUa29LUgAAAAwAAAG4
+ ZGVERQAAABAAAAHEbmxOTAAAABYAAAHUaXRJVAAAABQAAAHqAEYAYQByAGcAZQAtAEwA
+ QwBEAEYA5AByAGcALQBMAEMARABWAOQAcgBpAC0ATABDAEQATABDAEQALQBmAGEAcgB2
+ AGUAcwBrAOYAcgBtX2mCcgAgAEwAQwBEAMkAYwByAGEAbgAgAEwAQwBEMKsw6TD8ACAA
+ TABDAEQAQwBvAGwAbwByACAATABDAEQATABDAEQAIABDAG8AbABvAHIAaQBkAG8ATABD
+ AEQAIABjAG8AbABvAHJfaYJybbJmdphveTpWaAQmBDIENQRCBD0EPgQ5ACAEFgQaAC0E
+ NAQ4BEEEPwQ7BDUEOc7st+wAIABMAEMARABGAGEAcgBiAC0ATABDAEQASwBsAGUAdQBy
+ AGUAbgAtAEwAQwBEAEwAQwBEACAAYwBvAGwAbwByAGkAAG1tb2QAAAAAAAAGEAAAnGkA
+ AAAAwj8ygAAAAAAAAAAAAAAAAAAAAAB0ZXh0AAAAAENvcHlyaWdodCBBcHBsZSwgSW5j
+ LiwgMjAwOAA=
+ </data>
+ <key>ReadOnly</key>
+ <string>NO</string>
+ <key>RowAlign</key>
+ <integer>1</integer>
+ <key>RowSpacing</key>
+ <real>36</real>
+ <key>SheetTitle</key>
+ <string>Canvas 1</string>
+ <key>SmartAlignmentGuidesActive</key>
+ <string>YES</string>
+ <key>SmartDistanceGuidesActive</key>
+ <string>YES</string>
+ <key>UniqueID</key>
+ <integer>1</integer>
+ <key>UseEntirePage</key>
+ <false/>
+ <key>VPages</key>
+ <integer>1</integer>
+ <key>WindowInfo</key>
+ <dict>
+ <key>CurrentSheet</key>
+ <integer>0</integer>
+ <key>ExpandedCanvases</key>
+ <array>
+ <dict>
+ <key>name</key>
+ <string>Canvas 1</string>
+ </dict>
+ </array>
+ <key>Frame</key>
+ <string>{{88, 214}, {710, 884}}</string>
+ <key>ListView</key>
+ <true/>
+ <key>OutlineWidth</key>
+ <integer>142</integer>
+ <key>RightSidebar</key>
+ <false/>
+ <key>ShowRuler</key>
+ <true/>
+ <key>Sidebar</key>
+ <true/>
+ <key>SidebarWidth</key>
+ <integer>120</integer>
+ <key>VisibleRegion</key>
+ <string>{{0, 0}, {575, 733}}</string>
+ <key>Zoom</key>
+ <real>1</real>
+ <key>ZoomValues</key>
+ <array>
+ <array>
+ <string>Canvas 1</string>
+ <real>1</real>
+ <real>1</real>
+ </array>
+ </array>
+ </dict>
+ <key>saveQuickLookFiles</key>
+ <string>YES</string>
+</dict>
+</plist>
Added: trunk/docs/reference/src/main/docbook/en-US/images/dna-connector-federation.png
===================================================================
(Binary files differ)
Property changes on: trunk/docs/reference/src/main/docbook/en-US/images/dna-connector-federation.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Modified: trunk/docs/reference/src/main/docbook/en-US/master.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/master.xml 2008-09-25 18:24:59 UTC (rev 542)
+++ trunk/docs/reference/src/main/docbook/en-US/master.xml 2008-09-25 21:52:52 UTC (rev 543)
@@ -29,7 +29,7 @@
<book lang="en">
<bookinfo>
<title>JBoss DNA</title>
- <subtitle>Getting Started Guide</subtitle>
+ <subtitle>Reference Guide</subtitle>
<releaseinfo>&versionNumber;</releaseinfo>
<productnumber>&versionNumber;</productnumber>
<issuenum>1</issuenum>
Modified: trunk/extensions/dna-connector-jbosscache/src/main/java/org/jboss/dna/connector/jbosscache/JBossCacheSource.java
===================================================================
--- trunk/extensions/dna-connector-jbosscache/src/main/java/org/jboss/dna/connector/jbosscache/JBossCacheSource.java 2008-09-25 18:24:59 UTC (rev 542)
+++ trunk/extensions/dna-connector-jbosscache/src/main/java/org/jboss/dna/connector/jbosscache/JBossCacheSource.java 2008-09-25 21:52:52 UTC (rev 543)
@@ -68,6 +68,7 @@
* <p>
* Like other {@link RepositorySource} classes, instances of JBossCacheSource can be placed into JNDI and do support the creation
* of {@link Referenceable JNDI referenceable} objects and resolution of references into JBossCacheSource.
+ * </p>
*
* @author Randall Hauch
*/
15 years, 7 months
DNA SVN: r542 - trunk/docs/reference/src/main/docbook/en-US/content.
by dna-commits@lists.jboss.org
Author: rhauch
Date: 2008-09-25 14:24:59 -0400 (Thu, 25 Sep 2008)
New Revision: 542
Modified:
trunk/docs/reference/src/main/docbook/en-US/content/sequencing.xml
Log:
DNA-71 Document development tools and environment
https://jira.jboss.org/jira/browse/DNA-71
Corrected some content in the Reference Guide. Specifically, the example Java sequencer configuration and the MP3 sequencer configuration were in the wrong sections.
Modified: trunk/docs/reference/src/main/docbook/en-US/content/sequencing.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/sequencing.xml 2008-09-25 17:58:08 UTC (rev 541)
+++ trunk/docs/reference/src/main/docbook/en-US/content/sequencing.xml 2008-09-25 18:24:59 UTC (rev 542)
@@ -401,10 +401,11 @@
in your application and configure the Sequencing Service to use this sequencer using something similar to:
</para>
<programlisting>
-String name = "MP3 Sequencer";
-String desc = "Sequences MP3 files to extract the ID3 tags of the audio file";
-String classname = "org.jboss.dna.sequencer.mp3.Mp3MetadataSequencer";
-String[] pathExpressions = {"//(*.mp3[*])/jcr:content[@jcr:data] => /mp3s/$1"};
+String name = "Java Sequencer";
+String desc = "Sequences java files to extract the characteristics of the Java source";
+String classname = "org.jboss.dna.sequencer.java.JavaMetadataSequencer";
+String[] classpath = null; // Use the current classpath
+String[] pathExpressions = {"//(*.java[*])/jcr:content[@jcr:data] => /java/$1"};
&SequencerConfig; sequencerConfig = new &SequencerConfig;(name, desc, classname,
classpath, pathExpressions);
this.sequencingService.addSequencer(sequencerConfig);
@@ -424,11 +425,10 @@
library in your application and configure the Sequencing Service to use this sequencer using something similar to:
</para>
<programlisting>
-String name = "Java Sequencer";
-String desc = "Sequences java files to extract the characteristics of the Java source";
-String classname = "org.jboss.dna.sequencer.java.JavaMetadataSequencer";
-String[] classpath = null; // Use the current classpath
-String[] pathExpressions = {"//(*.java[*])/jcr:content[@jcr:data] => /java/$1"};
+String name = "MP3 Sequencer";
+String desc = "Sequences MP3 files to extract the ID3 tags of the audio file";
+String classname = "org.jboss.dna.sequencer.mp3.Mp3MetadataSequencer";
+String[] pathExpressions = {"//(*.mp3[*])/jcr:content[@jcr:data] => /mp3s/$1"};
&SequencerConfig; sequencerConfig = new &SequencerConfig;(name, desc, classname,
classpath, pathExpressions);
this.sequencingService.addSequencer(sequencerConfig);
15 years, 7 months
DNA SVN: r541 - in trunk/docs/reference/src/main/docbook/en-US: content and 1 other directory.
by dna-commits@lists.jboss.org
Author: rhauch
Date: 2008-09-25 13:58:08 -0400 (Thu, 25 Sep 2008)
New Revision: 541
Modified:
trunk/docs/reference/src/main/docbook/en-US/content/mimetypes.xml
trunk/docs/reference/src/main/docbook/en-US/content/testing.xml
trunk/docs/reference/src/main/docbook/en-US/custom.dtd
Log:
DNA-71 Document development tools and environment
https://jira.jboss.org/jira/browse/DNA-71
Added more content to the Reference Guide.
Modified: trunk/docs/reference/src/main/docbook/en-US/content/mimetypes.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/mimetypes.xml 2008-09-24 21:49:27 UTC (rev 540)
+++ trunk/docs/reference/src/main/docbook/en-US/content/mimetypes.xml 2008-09-25 17:58:08 UTC (rev 541)
@@ -28,17 +28,175 @@
]>
<chapter id="mimetypes">
<title>MIME types</title>
- <para></para>
+ <para>
+ JBoss DNA often needs the ability to determine the MIME type for some binary content. When uploading content into
+ a repository, we may want to add the MIME type as metadata. Or, we may want to make some processing decisions
+ based upon the MIME type. So, JBoss DNA created a small pluggable framework for determining the MIME type by using
+ the name of the file (e.g., extensions) and/or by reading the actual content. Technically, the framework
+ delegates this to one or more extensions. And we've provided one extension that does a very good job at
+ determining the MIME type from a large variety of file types. But if that isn't sufficient, you can always
+ incorporate your own detector into JBoss DNA.
+ </para>
+ <para>
+ To use this system, you simply invoke a static method and supply the name of the content (e.g., the name of the file, with the extension)
+ and the &InputStream; to the actual binary content:
+ </para>
+ <programlisting>&MimeType;.of(name,content)</programlisting>
+ <para>
+ The result is a &String; containing the <ulink url="http://www.iana.org/assignments/media-types/">MIME type</ulink>
+ (e.g., "text/plain") or null if the MIME type cannot be determined. Note that the name or &InputStream; may be
+ null, making this a very versatile utility.
+ </para>
<sect1 id="detectors">
<title>JBoss DNA MIME type detectors</title>
- <para></para>
+ <para>
+ The principle component in this framework is the concept of a <emphasis role="strong">detector</emphasis>.
+ A detector attempts to determine the MIME type using the name of the content (e.g., the file name)
+ and the actual content itself. If the detector is able to determine the MIME type, it simply returns
+ it as a string. If not, it merely returns null. Note, however, that a detector must be thread-safe.
+ </para>
+ <para>
+ Here is the interface:
+ </para>
+ <programlisting>
+package org.jboss.dna.graph.mimetype;
+@ThreadSafe
+public interface &MimeTypeDetector; {
+
+ /**
+ * Returns the MIME-type of a data source, using its supplied content and/or
+ * its supplied name, depending upon the implementation. If the MIME-type
+ * cannot be determined, either a "default" MIME-type or <code>null</code> may
+ * be returned, where the former will prevent earlier registered MIME-type
+ * detectors from being consulted.
+ *
+ * @param name The name of the data source; may be <code>null</code>.
+ * @param content The content of the data source; may be <code>null</code>.
+ * @return The MIME-type of the data source, or optionally <code>null</code>
+ * if the MIME-type could not be determined.
+ * @throws &IOException; If an error occurs reading the supplied content.
+ */
+ &String; mimeTypeOf( &String; name,
+ &InputStream; content ) throws &IOException;;
+}</programlisting>
+ <para>
+ Detectors can be added to the &MimeType; class using the <code>addDetector(&MimeTypeDetectorConfig; config)</code>
+ method, where the &MimeTypeDetectorConfig; defines the name of the detector class, the name of the
+ <link linkend="classloaders">class loader</link>, a name, and a description. It is also possible
+ to set the &ClassLoaderFactory; that the &MimeType; singleton will use.
+ </para>
+ <para>
+ We'll next look at the MIME type detectors that are provided out by JBoss DNA out of the box, and how to write your own.
+ </para>
<sect2 id="dna-mimetype-detector-aperture">
<title>Aperture MIME type detector</title>
- <para></para>
+ <para>
+ The &ApertureMimeTypeDetector; class is an implementation of &MimeTypeDetector; that uses the
+ <ulink url="http://aperture.sourceforge.net/">Aperture</ulink> open-source library, which
+ is a very capable utility for determining the MIME type for a wide range of file types,
+ using both the file name and the actual content.
+ </para>
</sect2>
</sect1>
<sect1 id="custom-detectors">
<title>Writing custom detectors</title>
- <para></para>
+ <para>
+ Creating a custom detector involves the following steps:
+ <itemizedlist>
+ <listitem>
+ <para>Create a Maven 2 project for your detector;</para>
+ </listitem>
+ <listitem>
+ <para>Implement the &MimeTypeDetector; interface with your own implementation, and create unit tests to verify
+ the functionality and expected behavior;</para>
+ </listitem>
+ <listitem>
+ <para>Add a &MimeTypeDetectorConfig; to the &MimeType; class in your application
+ as described <link linkend="detectors">earlier</link>; and</para>
+ </listitem>
+ <listitem>
+ <para>Deploy the JAR file with your implementation (as well as any dependencies), and make them available to JBoss DNA
+ in your application.</para>
+ </listitem>
+ </itemizedlist>
+ It's that simple.
+ </para>
+ <sect2 id="custom_detector_project">
+ <title>Creating the Maven 2 project</title>
+ <para>The first step is to create the Maven 2 project that you can use to compile your code and build the JARs.
+ Maven 2 automates a lot of the work, and since you're already <link linkend="maven">set up to use Maven</link>,
+ using Maven for your project will save you a lot of time and effort. Of course, you don't have to use Maven 2, but then you'll
+ have to get the required libraries and manage the compiling and building process yourself.</para>
+ <note>
+ <para>JBoss DNA may provide in the future a Maven archetype for creating detector projects. If you'd find this useful
+ and would like to help create it, please <link linkend="preface">join the community</link>.</para>
+ </note>
+ <note>
+ <para>
+ The <emphasis role="strong">dna-mimetype-detector-aperture</emphasis> project is a small, self-contained detector implementation that
+ that you can use to help you get going. Starting with this project's source and modifying it to suit your needs
+ may be the easiest way to get started.
+ See the subversion repository:
+ <ulink url="&Subversion;trunk/extensions/dna-mimetype-detector-aperture/">&Subversion;trunk/sequencers/dna-mimetype-detector-aperture/</ulink>
+ </para>
+ </note>
+ <para>You can create your Maven project any way you'd like. For examples, see the <ulink url="http://maven.apache.org/guides/getting-started/index.html#How_do_I_make_m...">Maven 2 documentation</ulink>.
+ Once you've done that, just add the dependencies in your project's <code>pom.xml</code> dependencies section:</para>
+ <programlisting role="XML"><![CDATA[<dependency>
+ <groupId>org.jboss.dna</groupId>
+ <artifactId>dna-common</artifactId>
+ <version>0.1</version>
+</dependency>
+<dependency>
+ <groupId>org.jboss.dna</groupId>
+ <artifactId>dna-graph</artifactId>
+ <version>0.1</version>
+</dependency>
+<dependency>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-api</artifactId>
+</dependency>
+]]></programlisting>
+ <para>These are minimum dependencies required for compiling a detector. Of course, you'll have to add
+ other dependencies that your sequencer needs.</para>
+ <para>As for testing, you probably will want to add more dependencies, such as those listed here:</para>
+ <programlisting role="XML"><![CDATA[<dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>4.4</version>
+ <scope>test</scope>
+</dependency>
+<dependency>
+ <groupId>org.hamcrest</groupId>
+ <artifactId>hamcrest-library</artifactId>
+ <version>1.1</version>
+ <scope>test</scope>
+</dependency>
+<!-- Logging with Log4J -->
+<dependency>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-log4j12</artifactId>
+ <version>1.4.3</version>
+ <scope>test</scope>
+</dependency>
+<dependency>
+ <groupId>log4j</groupId>
+ <artifactId>log4j</artifactId>
+ <version>1.2.14</version>
+ <scope>test</scope>
+</dependency>
+]]></programlisting>
+ <para>
+ After you've created the project, simply implement the &MimeTypeDetector; interface. And testing should be
+ quite straightforward, MIME type detectors don't require any other components. In your tests,
+ simply instantiate your &MimeTypeDetector; implementation, supply various combinations of names and/or &InputStream;s,
+ and verify the output is what you expect.
+ </para>
+ <para>
+ To use in your application, create a &MimeTypeDetectorConfig; object with the name, description, and class information
+ for your detector, and add to the &MimeType; class using the <code>addDetector(&MimeTypeDetectorConfig; config)</code> method.
+ Then, just use the &MimeType; class.
+ </para>
+ </sect2>
</sect1>
</chapter>
Modified: trunk/docs/reference/src/main/docbook/en-US/content/testing.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/testing.xml 2008-09-24 21:49:27 UTC (rev 540)
+++ trunk/docs/reference/src/main/docbook/en-US/content/testing.xml 2008-09-25 17:58:08 UTC (rev 541)
@@ -28,13 +28,103 @@
]>
<chapter id="testing">
<title>Testing</title>
- <para></para>
+ <para>
+ The JBoss DNA project uses automated testing to verify that the software is doing what it's supposed to
+ and not doing what it shouldn't do. These automated tests are run continuously and also act as regression tests,
+ ensuring that we known if any problems we find and fix reappear later. All of our tests are executed as part of
+ our <link linkend="maven">Maven</link> build process, and the entire build process (including the tests)
+ is automatically run using <link linkend="hudson">Hudson</link> continuous integration system.
+ </para>
<sect1 id="unit-tests">
<title>Unit tests</title>
- <para></para>
+ <para>
+ <emphasis role="strong">Unit tests</emphasis> verify the behavior of a single class (or small set of classes) in isolation
+ from other classes.
+ We use the JUnit 4.4 testing framework, which has significant improvements over earlier versions and makes
+ it very easy to quickly write unit tests with little extra code. We also frequently use the Mockito library
+ to help create mock implementations of other classes that are not under test but are used in the tests.
+ </para>
+ <para>
+ Unit tests should generally run quickly and should not require large assemblies of components. Additionally,
+ they may rely upon the file resources included in the project, but these tests should require no external resources
+ (like databases or servers). Note that our unit tests are run during the "test" phase of the standard
+ <ulink url="http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle...">Maven lifecycle</ulink>.
+ This means that they are executed against the raw .class files created during complication.
+ </para>
+ <para>
+ Developers are expected to run all of the JBoss DNA unit tests in their local environment before committing changes to SVN.
+ So, if you're a developer and you've made changes to your local copy of the source, you can run those tests that are
+ related to your changes using your IDE or with Maven (or any other mechanism). But before you commit your changes,
+ you are expected to run a full Maven build using <code>mvn clean install</code> (in the "trunk/" directory).
+ Please do <emphasis>not</emphasis> rely upon continuous integration to run all of the tests for you - the CI
+ system is there to catch the occasional mistakes and to also run the <link linkend="integration-tests">integration tests</link>.
+ </para>
</sect1>
<sect1 id="integration-tests">
<title>Integration tests</title>
- <para></para>
+ <para>
+ While <link linkend="unit-tests">unit tests</link> test individual classes in (relative) isolation, the purpose of
+ <emphasis role="strong">integration tests</emphasis> are to verify that assemblies of classes and components are
+ behaving correctly. These assemblies are often the same ones that end users will actually use. In fact,
+ integration tests are executed during the "integration-test" phase of the standard
+ <ulink url="http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle...">Maven lifecycle</ulink>,
+ meaning they are executed against the packaged JARs and artifacts of the project.
+ </para>
+ <para>
+ Integration tests also use the JUnit 4.4 framework, so they are again easy to write and follow the same pattern
+ as unit tests. However, because they're working with larger assemblies of components, they often will take longer
+ to set up, longer to run, and longer to tear down. They also may require initializing "external resources", like
+ databases or servers.
+ </para>
+ <para>
+ Note, that while external resources may be required, care should be taken to minimize these dependencies and to
+ ensure that most (if not all) integration tests may be run by anyone who downloads the source code. This means
+ that these external resources should be available and set up within the tests. For example, use in-memory databases
+ where possible. Or, if a database is required, use an open-source database (e.g., MySQL or PostgreSQL). And when
+ these external resources are not available, it should be obvious from the test class names and/or test method names
+ that it involved an external resource (e.g., "<code>MySqlConnectorIntegrationTest.shouldFindNodeStoredInDatabase()</code>").
+ </para>
</sect1>
+ <sect1 id="writing-tests">
+ <title>Writing tests</title>
+ <para>
+ As mentioned in <link linkend="methodology">the introduction</link>, the JBoss DNA project doesn't follow any one methodology
+ or process. Instead, we simply have a goal that as much code as possible is tested to ensure it behaves as expected.
+ Do we expect 100% of the code is covered by automated tests? No, but we do want to test as much as we can.
+ Maybe a simple JavaBean class doesn't need many tests, but any class with non-trivial logic should be tested.
+ </para>
+ <para>
+ We do encourage writing tests either before or while you write the code. Again, we're not blindly following a methodology.
+ Instead, there's a very practical reason: writing the tests early on helps you write classes that are testable.
+ If you wait until after the class (or classes) are done, you'll probably find that it's not easy to test all
+ of the logic (especially the complicated logic).
+ </para>
+ <para>
+ Another suggestion is to write tests so that they specify and verify the behavior that is expected from a class or component.
+ One challenge developers often have is knowing what they should even test and what the tests should look like.
+ This is where <emphasis role="strong"><ulink url="http://behaviour-driven.org/">Behavior-driven development (BDD)</ulink></emphasis>
+ helps out. If you think about what a class' behaviors are supposed to be (e.g., requirements), simply capture those
+ requirements as test methods (with no implementations). For example, a test class for sequencer
+ implementation might have a test method <code>shouldNotThrowAnErrorWhenTheSuppliedStreamIsNull() { }</code>. Then, after you enumerate
+ all the requirements you can think of, go back and start implementing the test methods.
+ </para>
+ <para>
+ If you look at the existing test cases, you'll find that the names of the unit and integration tests in JBoss DNA
+ follow a naming style, where the test method names are readable sentences. Actually, we try to name the test methods
+ <emphasis>and</emphasis> the test classes such that they form a concisely-worded requirement. For example,
+ </para>
+ <programlisting>InMemorySequencerTest.shouldNotThrowAnErrorWhenTheSuppliedStreamIsNull()</programlisting>
+ <para>
+ is easily translated into a readable requirement:
+ </para>
+ <programlisting>InMemorySequencer should not throw an error when the supplied stream is null.</programlisting>
+ <para>
+ In fact, at some point in the future, we'd like to process the source to automatically generate a list of the behavior specifications
+ that are asserted by the tests.
+ </para>
+ <para>
+ But for now, we write tests - a lot of them. And by following a few simple conventions and practices, we're able
+ to do it quickly and in a way that makes it easy to understand what the code is supposed to do (or not do).
+ </para>
+ </sect1>
</chapter>
Modified: trunk/docs/reference/src/main/docbook/en-US/custom.dtd
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/custom.dtd 2008-09-24 21:49:27 UTC (rev 540)
+++ trunk/docs/reference/src/main/docbook/en-US/custom.dtd 2008-09-25 17:58:08 UTC (rev 541)
@@ -26,7 +26,9 @@
<!-- Types in JRE -->
+<!ENTITY String "<ulink url='&Java;java/lang/String.html'><interface>String</interface></ulink>">
<!ENTITY InputStream "<ulink url='&Java;java/io/InputStream.html'><interface>InputStream</interface></ulink>">
+<!ENTITY IOException "<ulink url='&Java;java/io/IOException.html'><classname>IOException</classname></ulink>">
<!ENTITY ClassLoader "<ulink url='&Java;java/lang/ClassLoader.html'><interface>ClassLoader</interface></ulink>">
<!ENTITY AccessControlContext "<ulink url='&Java;java/security/AccessController.html'><classname>AccessControlContext</classname></ulink>">
<!ENTITY LoginContext "<ulink url='&Java;javax/security/auth/login/LoginContext.html'><classname>LoginContext</classname></ulink>">
@@ -61,6 +63,7 @@
<!ENTITY RepositoryConnection "<ulink url='&API;graph/connectors/RepositoryConnection.html'><interface>RepositoryConnection</interface></ulink>">
<!ENTITY StreamSequencer "<ulink url='&API;graph/sequencers/StreamSequencer.html'><interface>StreamSequencer</interface></ulink>">
<!ENTITY SequencerOutput "<ulink url='&API;graph/sequencers/SequencerOutput.html'><interface>SequencerOutput</interface></ulink>">
+<!ENTITY MimeTypeDetector "<ulink url='&API;graph/mimetype/MimeTypeDetector.html'><interface>MimeTypeDetector</interface></ulink>">
<!-- Types in dna-repository -->
@@ -74,7 +77,10 @@
<!ENTITY SimpleSessionFactory "<ulink url='&API;repository/util/SimpleSessionFactory.html'><classname>SimpleSessionFactory</classname></ulink>">
<!ENTITY JcrExecutionContext "<ulink url='&API;repository/util/JcrExecutionContext.html'><interface>JcrExecutionContext</interface></ulink>">
<!ENTITY BasicJcrExecutionContext "<ulink url='&API;repository/util/BasicJcrExecutionContext.html'><classname>BasicJcrExecutionContext</classname></ulink>">
+<!ENTITY MimeType "<ulink url='&API;repository/mimetype/MimeType.html'><classname>MimeType</classname></ulink>">
+<!ENTITY MimeTypeDetectorConfig "<ulink url='&API;repository/mimetype/MimeTypeDetectorConfig.html'><interface>MimeTypeDetectorConfig</interface></ulink>">
+
<!-- Types in dna-jcr -->
<!ENTITY JcrRepository "<ulink url='&API;jcr/JcrRepository.html'><classname>JcrRepository</classname></ulink>">
@@ -87,4 +93,5 @@
<!ENTITY ImageMetadataSequencer "<ulink url='&API;sequencer/image/ImageMetadataSequencer.html'><classname>ImageMetadataSequencer</classname></ulink>">
<!ENTITY ImageMetadata "<ulink url='&API;sequencer/image/ImageMetadata.html'><classname>ImageMetadata</classname></ulink>">
<!ENTITY ImageSequencerI18n "<ulink url='&API;sequencer/image/ImageSequencerI18n.html'><classname>ImageSequencerI18n</classname></ulink>">
+<!ENTITY ApertureMimeTypeDetector "<ulink url='&API;mimetype/ApertureMimeTypeDetector.html'><classname>ApertureMimeTypeDetector</classname></ulink>">
15 years, 7 months
DNA SVN: r540 - in trunk: dna-graph/src/main/java/org/jboss/dna/graph/connectors and 10 other directories.
by dna-commits@lists.jboss.org
Author: rhauch
Date: 2008-09-24 17:49:27 -0400 (Wed, 24 Sep 2008)
New Revision: 540
Added:
trunk/docs/reference/src/main/docbook/en-US/content/development_tools.xml
trunk/docs/reference/src/main/docbook/en-US/content/environment.xml
trunk/docs/reference/src/main/docbook/en-US/custom.dtd
trunk/docs/reference/src/main/docbook/en-US/images/dna-connectors-0.2.png
trunk/docs/reference/src/main/docbook/en-US/images/dna-connectors-future.png
trunk/docs/reference/src/main/docbook/en-US/images/dnajcr-and-connector.png
trunk/docs/reference/src/main/docbook/xslt/
trunk/docs/reference/src/main/docbook/xslt/eclipse.xslt
trunk/docs/reference/src/main/docbook/xslt/pdf.xslt
trunk/docs/reference/src/main/docbook/xslt/xhtml-single.xslt
trunk/docs/reference/src/main/docbook/xslt/xhtml.xslt
Removed:
trunk/docs/reference/src/main/docbook/en-US/content/development_environment.xml
trunk/docs/reference/src/main/docbook/en-US/content/security.xml
Modified:
trunk/dna-graph/src/main/java/org/jboss/dna/graph/ExecutionContext.java
trunk/dna-graph/src/main/java/org/jboss/dna/graph/ExecutionContexts.java
trunk/dna-graph/src/main/java/org/jboss/dna/graph/connectors/BasicExecutionContext.java
trunk/dna-repository/src/main/java/org/jboss/dna/repository/RepositoryService.java
trunk/dna-repository/src/main/java/org/jboss/dna/repository/sequencers/SequencingService.java
trunk/dna-repository/src/test/java/org/jboss/dna/repository/RepositoryServiceTest.java
trunk/docs/examples/gettingstarted/repositories/src/main/java/org/jboss/example/dna/repository/RepositoryClient.java
trunk/docs/gettingstarted/src/main/docbook/en-US/content/custom_sequencers.xml
trunk/docs/gettingstarted/src/main/docbook/en-US/content/future.xml
trunk/docs/gettingstarted/src/main/docbook/en-US/content/understanding_dna.xml
trunk/docs/gettingstarted/src/main/docbook/en-US/content/using_dna_for_sequencing.xml
trunk/docs/gettingstarted/src/main/docbook/en-US/content/using_dna_repositories.xml
trunk/docs/reference/src/main/docbook/en-US/content/author_group.xml
trunk/docs/reference/src/main/docbook/en-US/content/classloaders.xml
trunk/docs/reference/src/main/docbook/en-US/content/configuration.xml
trunk/docs/reference/src/main/docbook/en-US/content/future.xml
trunk/docs/reference/src/main/docbook/en-US/content/introduction.xml
trunk/docs/reference/src/main/docbook/en-US/content/jcr.xml
trunk/docs/reference/src/main/docbook/en-US/content/legal_notice.xml
trunk/docs/reference/src/main/docbook/en-US/content/mimetypes.xml
trunk/docs/reference/src/main/docbook/en-US/content/preface.xml
trunk/docs/reference/src/main/docbook/en-US/content/repositories.xml
trunk/docs/reference/src/main/docbook/en-US/content/sequencing.xml
trunk/docs/reference/src/main/docbook/en-US/content/testing.xml
trunk/docs/reference/src/main/docbook/en-US/master.xml
Log:
DNA-71 Document development tools and environment
https://jira.jboss.org/jira/browse/DNA-71
Added quite a bit of content to the Reference Guide, and also corrected a few minor things in the code.
Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/ExecutionContext.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/ExecutionContext.java 2008-09-22 22:58:15 UTC (rev 539)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/ExecutionContext.java 2008-09-24 21:49:27 UTC (rev 540)
@@ -24,6 +24,7 @@
import java.security.AccessControlContext;
import javax.security.auth.Subject;
import javax.security.auth.login.LoginContext;
+import org.jboss.dna.common.component.ClassLoaderFactory;
import org.jboss.dna.common.util.Logger;
import org.jboss.dna.graph.properties.NamespaceRegistry;
import org.jboss.dna.graph.properties.Property;
@@ -31,10 +32,16 @@
import org.jboss.dna.graph.properties.ValueFactories;
/**
+ * An ExecutionContext is a representation of the environment or context in which a component or operation is operating. Some
+ * components require this context to be passed into individual methods, allowing the context to vary with each method invocation.
+ * Other components require the context to be provided before it's used, and will use that context for all its operations (until
+ * it is given a different one).
+ *
* @author Randall Hauch
* @author John Verhaeg
+ * @see ExecutionContextFactory
*/
-public interface ExecutionContext {
+public interface ExecutionContext extends ClassLoaderFactory {
/**
* @return the access control context; may be <code>null</code>
Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/ExecutionContexts.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/ExecutionContexts.java 2008-09-22 22:58:15 UTC (rev 539)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/ExecutionContexts.java 2008-09-24 21:49:27 UTC (rev 540)
@@ -150,6 +150,15 @@
/**
* {@inheritDoc}
*
+ * @see org.jboss.dna.common.component.ClassLoaderFactory#getClassLoader(java.lang.String[])
+ */
+ public ClassLoader getClassLoader( String... classpath ) {
+ return this.delegate.getClassLoader(classpath);
+ }
+
+ /**
+ * {@inheritDoc}
+ *
* @see org.jboss.dna.graph.ExecutionContext#getAccessControlContext()
*/
public AccessControlContext getAccessControlContext() {
Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/connectors/BasicExecutionContext.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/connectors/BasicExecutionContext.java 2008-09-22 22:58:15 UTC (rev 539)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connectors/BasicExecutionContext.java 2008-09-24 21:49:27 UTC (rev 540)
@@ -25,6 +25,8 @@
import java.security.AccessController;
import javax.security.auth.Subject;
import javax.security.auth.login.LoginContext;
+import org.jboss.dna.common.component.ClassLoaderFactory;
+import org.jboss.dna.common.component.StandardClassLoaderFactory;
import org.jboss.dna.common.util.CheckArg;
import org.jboss.dna.common.util.Logger;
import org.jboss.dna.graph.ExecutionContext;
@@ -41,6 +43,7 @@
*/
public class BasicExecutionContext implements ExecutionContext {
+ private final ClassLoaderFactory classLoaderFactory;
private final LoginContext loginContext;
private final AccessControlContext accessControlContext;
private final Subject subject;
@@ -110,11 +113,21 @@
this.namespaceRegistry = namespaceRegistry;
this.valueFactories = valueFactories != null ? valueFactories : new StandardValueFactories(this.namespaceRegistry);
this.propertyFactory = propertyFactory != null ? propertyFactory : new BasicPropertyFactory(this.valueFactories);
+ this.classLoaderFactory = new StandardClassLoaderFactory();
}
/**
* {@inheritDoc}
*
+ * @see org.jboss.dna.common.component.ClassLoaderFactory#getClassLoader(java.lang.String[])
+ */
+ public ClassLoader getClassLoader( String... classpath ) {
+ return this.classLoaderFactory.getClassLoader(classpath);
+ }
+
+ /**
+ * {@inheritDoc}
+ *
* @see org.jboss.dna.graph.ExecutionContext#getAccessControlContext()
*/
public AccessControlContext getAccessControlContext() {
Modified: trunk/dna-repository/src/main/java/org/jboss/dna/repository/RepositoryService.java
===================================================================
--- trunk/dna-repository/src/main/java/org/jboss/dna/repository/RepositoryService.java 2008-09-22 22:58:15 UTC (rev 539)
+++ trunk/dna-repository/src/main/java/org/jboss/dna/repository/RepositoryService.java 2008-09-24 21:49:27 UTC (rev 540)
@@ -29,8 +29,6 @@
import net.jcip.annotations.ThreadSafe;
import org.jboss.dna.common.collection.Problems;
import org.jboss.dna.common.collection.SimpleProblems;
-import org.jboss.dna.common.component.ClassLoaderFactory;
-import org.jboss.dna.common.component.StandardClassLoaderFactory;
import org.jboss.dna.common.util.CheckArg;
import org.jboss.dna.common.util.Reflection;
import org.jboss.dna.connector.federation.FederationException;
@@ -99,7 +97,6 @@
}
}
- private final ClassLoaderFactory classLoaderFactory;
private final ExecutionContext context;
private final RepositoryLibrary sources;
private final String configurationSourceName;
@@ -114,17 +111,12 @@
* @param sources the source manager
* @param configurationSourceName the name of the {@link RepositorySource} that is the configuration repository
* @param context the execution context in which this service should run
- * @param classLoaderFactory the class loader factory used to instantiate {@link RepositorySource} instances; may be null if
- * this instance should use a default factory that attempts to load classes first from the
- * {@link Thread#getContextClassLoader() thread's current context class loader} and then from the class loader that
- * loaded this class.
* @throws IllegalArgumentException if the bootstrap source is null or the execution context is null
*/
public RepositoryService( RepositoryLibrary sources,
String configurationSourceName,
- ExecutionContext context,
- ClassLoaderFactory classLoaderFactory ) {
- this(sources, configurationSourceName, null, context, classLoaderFactory);
+ ExecutionContext context ) {
+ this(sources, configurationSourceName, null, context);
}
/**
@@ -136,17 +128,12 @@
* @param pathToConfigurationRoot the path of the node in the configuration source repository that should be treated by this
* service as the root of the service's configuration; if null, then "/dna:system" is used
* @param context the execution context in which this service should run
- * @param classLoaderFactory the class loader factory used to instantiate {@link RepositorySource} instances; may be null if
- * this instance should use a default factory that attempts to load classes first from the
- * {@link Thread#getContextClassLoader() thread's current context class loader} and then from the class loader that
- * loaded this class.
* @throws IllegalArgumentException if the bootstrap source is null or the execution context is null
*/
public RepositoryService( RepositoryLibrary sources,
String configurationSourceName,
Path pathToConfigurationRoot,
- ExecutionContext context,
- ClassLoaderFactory classLoaderFactory ) {
+ ExecutionContext context ) {
CheckArg.isNotNull(configurationSourceName, "configurationSourceName");
CheckArg.isNotNull(sources, "sources");
CheckArg.isNotNull(context, "context");
@@ -155,7 +142,6 @@
this.pathToConfigurationRoot = pathToConfigurationRoot;
this.configurationSourceName = configurationSourceName;
this.context = context;
- this.classLoaderFactory = classLoaderFactory != null ? classLoaderFactory : new StandardClassLoaderFactory();
}
/**
@@ -186,13 +172,6 @@
return context;
}
- /**
- * @return classLoaderFactory
- */
- public ClassLoaderFactory getClassLoaderFactory() {
- return this.classLoaderFactory;
- }
-
public String getJndiName() {
// TODO
return null;
@@ -279,7 +258,7 @@
// Create the instance ...
String classname = stringFactory.create(classnameProperty.getValues().next());
String[] classpath = classpathProperty == null ? new String[] {} : stringFactory.create(classpathProperty.getValuesAsArray());
- ClassLoader classLoader = this.classLoaderFactory.getClassLoader(classpath);
+ ClassLoader classLoader = context.getClassLoader(classpath);
RepositorySource source = null;
try {
Class<?> sourceClass = classLoader.loadClass(classname);
Modified: trunk/dna-repository/src/main/java/org/jboss/dna/repository/sequencers/SequencingService.java
===================================================================
--- trunk/dna-repository/src/main/java/org/jboss/dna/repository/sequencers/SequencingService.java 2008-09-22 22:58:15 UTC (rev 539)
+++ trunk/dna-repository/src/main/java/org/jboss/dna/repository/sequencers/SequencingService.java 2008-09-24 21:49:27 UTC (rev 540)
@@ -249,30 +249,6 @@
}
/**
- * Get the class loader factory that should be used to load sequencers. By default, this service uses a factory that will
- * return either the {@link Thread#getContextClassLoader() current thread's context class loader} (if not null) or the class
- * loader that loaded this class.
- *
- * @return the class loader factory; never null
- * @see #setClassLoaderFactory(ClassLoaderFactory)
- */
- public ClassLoaderFactory getClassLoaderFactory() {
- return this.sequencerLibrary.getClassLoaderFactory();
- }
-
- /**
- * Set the Maven Repository that should be used to load the sequencer classes. By default, this service uses a class loader
- * factory that will return either the {@link Thread#getContextClassLoader() current thread's context class loader} (if not
- * null) or the class loader that loaded this class.
- *
- * @param classLoaderFactory the class loader factory reference, or null if the default class loader factory should be used.
- * @see #getClassLoaderFactory()
- */
- public void setClassLoaderFactory( ClassLoaderFactory classLoaderFactory ) {
- this.sequencerLibrary.setClassLoaderFactory(classLoaderFactory != null ? classLoaderFactory : DEFAULT_CLASSLOADER_FACTORY);
- }
-
- /**
* Add the configuration for a sequencer, or update any existing one that represents the
* {@link SequencerConfig#equals(Object) same configuration}
*
@@ -331,6 +307,7 @@
throw new IllegalStateException(RepositoryI18n.unableToChangeExecutionContextWhileRunning.text());
}
this.executionContext = executionContext;
+ this.sequencerLibrary.setClassLoaderFactory(executionContext);
}
/**
@@ -630,6 +607,15 @@
/**
* {@inheritDoc}
*
+ * @see org.jboss.dna.common.component.ClassLoaderFactory#getClassLoader(java.lang.String[])
+ */
+ public ClassLoader getClassLoader( String... classpath ) {
+ return delegate.getClassLoader(classpath);
+ }
+
+ /**
+ * {@inheritDoc}
+ *
* @see org.jboss.dna.graph.ExecutionContext#getAccessControlContext()
*/
public AccessControlContext getAccessControlContext() {
Modified: trunk/dna-repository/src/test/java/org/jboss/dna/repository/RepositoryServiceTest.java
===================================================================
--- trunk/dna-repository/src/test/java/org/jboss/dna/repository/RepositoryServiceTest.java 2008-09-22 22:58:15 UTC (rev 539)
+++ trunk/dna-repository/src/test/java/org/jboss/dna/repository/RepositoryServiceTest.java 2008-09-24 21:49:27 UTC (rev 540)
@@ -28,13 +28,11 @@
import static org.hamcrest.core.IsSame.sameInstance;
import static org.junit.Assert.assertThat;
import static org.junit.matchers.JUnitMatchers.hasItems;
-import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.stub;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import java.util.concurrent.TimeUnit;
-import org.jboss.dna.common.component.ClassLoaderFactory;
import org.jboss.dna.common.util.Logger;
import org.jboss.dna.connector.federation.FederationException;
import org.jboss.dna.graph.DnaLexicon;
@@ -80,7 +78,7 @@
configRepositoryConnection = configRepositorySource.getConnection();
stub(sources.createConnection(configSourceName)).toReturn(configRepositoryConnection);
root = context.getValueFactories().getPathFactory().createRootPath();
- service = new RepositoryService(sources, configSourceName, context, null);
+ service = new RepositoryService(sources, configSourceName, context);
}
@After
@@ -109,19 +107,6 @@
}
@Test
- public void shouldHaveNonNullClassLoaderFactoryAfterInstantiatingWithNullClassLoaderFactoryReference() {
- assertThat(service.getClassLoaderFactory(), is(notNullValue()));
- }
-
- @Test
- public void shouldHaveNonNullClassLoaderFactoryAfterInstantiatingWithClassLoaderFactoryReference() {
- ClassLoaderFactory classLoaderFactory = mock(ClassLoaderFactory.class);
- service = new RepositoryService(sources, configSourceName, context, classLoaderFactory);
- assertThat(service.getClassLoaderFactory(), is(notNullValue()));
- assertThat(service.getClassLoaderFactory(), is(sameInstance(classLoaderFactory)));
- }
-
- @Test
public void shouldHaveNullJndiNameAfterInstantiation() {
assertThat(service.getJndiName(), is(nullValue()));
}
@@ -153,7 +138,7 @@
sources.addSource(configRepositorySource);
assertThat(sources.getSources(), hasItems((RepositorySource)configRepositorySource));
assertThat(sources.getSources().size(), is(1));
- service = new RepositoryService(sources, configSourceName, root, context, null);
+ service = new RepositoryService(sources, configSourceName, root, context);
// Set up the configuration repository to contain 3 sources ...
final String className = SimpleRepositorySource.class.getName();
Modified: trunk/docs/examples/gettingstarted/repositories/src/main/java/org/jboss/example/dna/repository/RepositoryClient.java
===================================================================
--- trunk/docs/examples/gettingstarted/repositories/src/main/java/org/jboss/example/dna/repository/RepositoryClient.java 2008-09-22 22:58:15 UTC (rev 539)
+++ trunk/docs/examples/gettingstarted/repositories/src/main/java/org/jboss/example/dna/repository/RepositoryClient.java 2008-09-24 21:49:27 UTC (rev 540)
@@ -39,8 +39,6 @@
import javax.security.auth.login.LoginContext;
import javax.security.auth.login.LoginException;
import net.jcip.annotations.Immutable;
-import org.jboss.dna.common.component.ClassLoaderFactory;
-import org.jboss.dna.common.component.StandardClassLoaderFactory;
import org.jboss.dna.common.text.NoOpEncoder;
import org.jboss.dna.common.util.CheckArg;
import org.jboss.dna.connector.inmemory.InMemoryRepositorySource;
@@ -86,7 +84,6 @@
DNA;
}
- private ClassLoaderFactory classLoaderFactory;
private RepositoryLibrary sources;
private ExecutionContextFactory contextFactory;
private RepositoryService repositoryService;
@@ -131,9 +128,6 @@
public void startRepositories() throws IOException, NamingException {
if (repositoryService != null) return; // already started
- // Create the class loader factory, which for this example will simply use this class' class loader...
- classLoaderFactory = new StandardClassLoaderFactory();
-
// Create the factory for execution contexts.
contextFactory = new BasicExecutionContextFactory();
@@ -157,7 +151,7 @@
importer.importXml(location + "/configRepository.xml").into(configSource.getName());
// Now instantiate the Repository Service ...
- repositoryService = new RepositoryService(sources, configSource.getName(), context, classLoaderFactory);
+ repositoryService = new RepositoryService(sources, configSource.getName(), context);
repositoryService.getAdministrator().start();
// Now import the conten for two of the other in-memory repositories ...
Modified: trunk/docs/gettingstarted/src/main/docbook/en-US/content/custom_sequencers.xml
===================================================================
--- trunk/docs/gettingstarted/src/main/docbook/en-US/content/custom_sequencers.xml 2008-09-22 22:58:15 UTC (rev 539)
+++ trunk/docs/gettingstarted/src/main/docbook/en-US/content/custom_sequencers.xml 2008-09-24 21:49:27 UTC (rev 540)
@@ -25,8 +25,7 @@
<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
<chapter id="custom_sequencers">
<title>Creating custom sequencers</title>
- <para>The current release of JBoss DNA comes with two sequencers: one that extracts metadata from a variety of image file formats,
- and another that extracts some of the ID3 metadata from MP3 audio files. However, it's very easy to create your own
+ <para>The current release of JBoss DNA comes with six sequencers. However, it's very easy to create your own
sequencers and to then configure JBoss DNA to use them in your own application.
</para>
<para>
Modified: trunk/docs/gettingstarted/src/main/docbook/en-US/content/future.xml
===================================================================
--- trunk/docs/gettingstarted/src/main/docbook/en-US/content/future.xml 2008-09-22 22:58:15 UTC (rev 539)
+++ trunk/docs/gettingstarted/src/main/docbook/en-US/content/future.xml 2008-09-24 21:49:27 UTC (rev 540)
@@ -31,11 +31,6 @@
<ulink url="http://jira.jboss.org/jira/browse/DNA?report=com.atlassian.jira.plugin.sy...">roadmap</ulink>.
Or, check out <ulink url="http://jira.jboss.org/jira/secure/IssueNavigator.jspa?reset=true&mode...">JIRA</ulink>
for the list of sequencers we've thought of. If you think of one that's not there, please add it to JIRA! </para>
- <para>The next release will focus on creating the <link linkend="federation">federation engine</link> and connectors
- for several popular and ubiquitous systems. The 0.2 release will likely only federate information in a read-only manner,
- but updates will soon follow. Also, during the early part of the next release, the JBoss DNA project will switch to use JDK 6.
- Java 5 is being end-of-lifed, so we want to move to a supported JDK. However, a number of JBoss projects and products continue to
- require Java 5, so our next release will most likely use JDK 6 with Java 5 compatibility.</para>
<para>Other components on our roadmap include a web user interface, a REST-ful server, and a view system that allows domain-specific
views of information in the repository. These components are farther out on our roadmap, and at this time have not been
targeted to a particular release. If any of these are of interest to you, please <link linkend="preface">get involved</link>
Modified: trunk/docs/gettingstarted/src/main/docbook/en-US/content/understanding_dna.xml
===================================================================
--- trunk/docs/gettingstarted/src/main/docbook/en-US/content/understanding_dna.xml 2008-09-22 22:58:15 UTC (rev 539)
+++ trunk/docs/gettingstarted/src/main/docbook/en-US/content/understanding_dna.xml 2008-09-24 21:49:27 UTC (rev 540)
@@ -332,95 +332,111 @@
registries, file systems, services, etc. The purpose of the federation engine is to allow applications to use the JCR API
to access that information as if it were all stored in a single JCR repository, but to really leave the information where
it is.</para>
- <para>Why not just move the information into a JCR repository? Most likely there are existing applications that rely upon
- that information being where it is. If we were to move it, then all those applications would break. Or they'd have to be
- changed to use JCR. If the information is being used, the most practical thing is to leave it where it is.</para>
- <para>
- Then why not just copy the information into a JCR repository? Actually, there are times when it's perfectly reasonable to
- make a copy of the data. Perhaps the system managing the existing information cannot handle the additional load of more
- clients. Or, perhaps the information doesn't change, or it does change and we want snapshots that don't change. But more
- likely, the data
- <emphasis>does</emphasis>
- change. So if applications are to use the most current information and we make copies of the data, we have to keep the
- copies synchronized with the master. That's generally a lot of work.
- </para>
- <para>The JBoss DNA federation engine lets us leave the information where it is, yet lets client applications use the JCR
- API to access all the information without caring where the information really exists. If the underlying information
- changes, client applications using JCR observation will be notified of the changes. If a JBoss DNA federated repository is
+ <para>Why not just copy or move the information into a JCR repository? Moving it is probably pretty difficult, since most
+ likely there are existing applications that rely upon that information being where it is. All of those applications
+ would break or have to change. And copying the information means that we'd have to continually synchronize the changes.
+ This not only is a lot of work, but it often creates issues with knowing which information is accurate.
+ </para>
+ <para>The JBoss DNA allows lets us leave the information where it is, yet provide access to that information through
+ the JCR API. The first benefit is that any existing applications that already use that information can keep using it.
+ Plus, if the underlying information changes, all the client applications see the correct information. JCR clients
+ even get the benefit of using JCR observation to be notified of the changes. And if a JBoss DNA repository is
configured to allow updates, client applications can change the information in the repository and JBoss DNA will propagate
those changes down to the original source.</para>
<sect2 id="federation_connectors">
<title>Connecting to information sources</title>
<para>
- The JBoss DNA federation engine will use connectors to interact with different information sources to get at the content
- in those systems. Some ideas for connectors include:
- <itemizedlist>
- <listitem>
- <para>
- <emphasis role="strong">JCR Repository Connector</emphasis>
- - Connect to and interact with other JCR repositories.
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis role="strong">File System Connector</emphasis>
- - Expose the files and directories on a file system through JCR.
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis role="strong">Maven 2 Repository Connector</emphasis>
- - Access and expose the contents of a Maven 2 repository (either on the local file system or via HTTP) through
- JCR.
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis role="strong">JDBC Metadata Connector</emphasis>
- - Connect to relational databases via JDBC and expose their schema as content in a repository.
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis role="strong">UDDI Connector</emphasis>
- - Interact with UDDI registries to integrate their content into a repository.
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis role="strong">SVN Connector</emphasis>
- - Interact with Subversion software configuration management (SCM) repositories to expose the managed resources
- through JCR. Consider using the
- <ulink url="http://svnkit.com/">SVNkit</ulink>
- (dual license) library for an API into Subversion.
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis role="strong">CVS Connector</emphasis>
- - Interact with CVS software configuration management (SCM) repositories to expose the managed resources through
- JCR.
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis role="strong">JDBC Storage Connector</emphasis>
- - Store and access information in a relational database. Also useful for persisting information in the federated
- repository not stored elsewhere.
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis role="strong">Distributed Database Connector</emphasis>
- - Store and access information in a
- <ulink url="http://www.hypertable.org/">Hypertable</ulink>
- or
- <ulink url="http://hadoop.apache.org/hbase/">HBase</ulink>
- distributed databases. Also useful for persisting information in the federated repository not stored elsewhere.
- </para>
- </listitem>
- </itemizedlist>
- </para>
+ JBoss DNA uses connectors to interact with different information sources to get at the content
+ in those systems. Some ideas for connectors include:</para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ <emphasis role="strong">In-Memory Connector</emphasis>
+ - Creates a transient, in-memory repository.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <emphasis role="strong">JBoss Cache Connector</emphasis>
+ - Uses a JBoss Cache instance as a repository. JBoss Cache is a powerful cache capable of persisting the information
+ and being clustered for concurrent use by multiple processes.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <emphasis role="strong">Federation Connector</emphasis>
+ - Creates a single repository by accessing and federating the information in multiple other repository sources.
+ This is a powerful connector that is discussed in more detail in the <link linkend="federated_repositories">next section</link>.
+ </para>
+ </listitem>
+ </itemizedlist>
+ <para>There are also a number of connectors that are planned:</para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ <emphasis role="strong">JCR Repository Connector</emphasis>
+ - Connect to and interact with other JCR repositories.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <emphasis role="strong">File System Connector</emphasis>
+ - Expose the files and directories on a file system through JCR.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <emphasis role="strong">Maven 2 Repository Connector</emphasis>
+ - Access and expose the contents of a Maven 2 repository (either on the local file system or via HTTP) through
+ JCR.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <emphasis role="strong">JDBC Metadata Connector</emphasis>
+ - Connect to relational databases via JDBC and expose their schema as content in a repository.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <emphasis role="strong">UDDI Connector</emphasis>
+ - Interact with UDDI registries to integrate their content into a repository.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <emphasis role="strong">SVN Connector</emphasis>
+ - Interact with Subversion software configuration management (SCM) repositories to expose the managed resources
+ through JCR. Consider using the
+ <ulink url="http://svnkit.com/">SVNkit</ulink>
+ (dual license) library for an API into Subversion.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <emphasis role="strong">CVS Connector</emphasis>
+ - Interact with CVS software configuration management (SCM) repositories to expose the managed resources through
+ JCR.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <emphasis role="strong">JDBC Storage Connector</emphasis>
+ - Store and access information in a relational database. Also useful for persisting information in the federated
+ repository not stored elsewhere.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <emphasis role="strong">Distributed Database Connector</emphasis>
+ - Store and access information in a
+ <ulink url="http://www.hypertable.org/">Hypertable</ulink>
+ or
+ <ulink url="http://hadoop.apache.org/hbase/">HBase</ulink>
+ distributed databases. Also useful for persisting information in the federated repository not stored elsewhere.
+ </para>
+ </listitem>
+ </itemizedlist>
<para>
If the connectors allow the information they contribute to be updated, they must provide an
<code>XAResource</code>
@@ -436,9 +452,9 @@
And of course, sources can be added or removed without having to stop and restart the federated repository.
</para>
</sect2>
- <sect2 id="federation_graph">
- <title>Building the unified graph</title>
- <para> The federation engine works by effectively building up a single graph by querying each source and merging or
+ <sect2 id="federated_repositories">
+ <title>Federated repositories</title>
+ <para> The federation connector works by effectively building up a single graph by querying each source and merging or
unifying the responses. This information is cached, which improves performance, reduces the number of (potentially
expensive) remote calls, reduces the load on the sources, and helps mitigate problems with source availability. As
clients interact with the repository, this cache is consulted first. When the requested portion of the graph (or
Modified: trunk/docs/gettingstarted/src/main/docbook/en-US/content/using_dna_for_sequencing.xml
===================================================================
--- trunk/docs/gettingstarted/src/main/docbook/en-US/content/using_dna_for_sequencing.xml 2008-09-22 22:58:15 UTC (rev 539)
+++ trunk/docs/gettingstarted/src/main/docbook/en-US/content/using_dna_for_sequencing.xml 2008-09-24 21:49:27 UTC (rev 540)
@@ -51,11 +51,6 @@
and is how JBoss DNA knows about your JCR repositories and how to connect to them. More on this a bit later.</para>
</listitem>
<listitem>
- <para>An optional <emphasis>factory for class loaders</emphasis> used to load sequencers. If no factory is supplied,
- the service uses the current thread's context class loader (or if that is null, the class loader that loaded the
- sequencing service class).</para>
- </listitem>
- <listitem>
<para>An <code>java.util.concurrent.ExecutorService</code> used to execute the sequencing activites. If none
is supplied, a new single-threaded executor is created by calling <code>Executors.newSingleThreadExecutor()</code>.
(This can easily be changed by subclassing and overriding the <code>SequencerService.createDefaultExecutorService()</code> method.)</para>
@@ -84,14 +79,14 @@
<para>Here's an example of how to instantiate and configure the SequencingService:</para>
<programlisting role="JAVA"><![CDATA[
SimpleSessionFactory sessionFactory = new SimpleSessionFactory();
-sessionFactory.registerRepository("Main Repository", this.repository);
+sessionFactory.registerRepository("Repository", this.repository);
Credentials credentials = new SimpleCredentials("jsmith", "secret".toCharArray());
-sessionFactory.registerCredentials("Main Repository/Workspace1", credentials);
-ExecutionContext executionContext = new SimpleExecutionContext(sessionFactory);
+sessionFactory.registerCredentials("Repository/Workspace1", credentials);
+JcrExecutionContext context = new BasicJcrExecutionContext(sessionFactory,"Repository/Workspace1");
// Create the sequencing service, passing in the execution context ...
SequencingService sequencingService = new SequencingService();
-sequencingService.setExecutionContext(executionContext);
+sequencingService.setExecutionContext(context);
]]></programlisting>
<para>After the sequencing service is created and configured, it must be started. The SequencingService
has an <emphasis>administration object</emphasis> (that is an instance of <code>ServiceAdministrator</code>)
@@ -117,8 +112,8 @@
classpath, pathExpressions);
sequencingService.addSequencer(imageSequencerConfig);
-name = "Mp3 Sequencer";
-desc = "Sequences mp3 files to extract the id3 tags of the audio file";
+name = "MP3 Sequencer";
+desc = "Sequences MP3 files to extract the ID3 tags from the audio file";
classname = "org.jboss.dna.sequencer.mp3.Mp3MetadataSequencer";
pathExpressions = {"//(*.mp3[*])/jcr:content[@jcr:data] => /mp3s/$1"};
SequencerConfig mp3SequencerConfig = new SequencerConfig(name, desc, classname,
@@ -134,7 +129,7 @@
this.sequencingService.addSequencer(javaSequencerConfig);
]]></programlisting>
<para>Each configuration defines several things, including the name, description, and sequencer implementation class.
- The configuration also defines the classpath information, which can be passed to the class loader factory to get
+ The configuration also defines the classpath information, which can be passed to the <code>ExecutionContext</code> to get
a Java classloader with which the sequencer class can be loaded. (If no classpath information is provided, as is done
in the code above, the application class loader is used.) The configuration also specifies the path expressions that
identify the nodes that should be sequenced with the sequencer and where to store the output generated by the sequencer.
Modified: trunk/docs/gettingstarted/src/main/docbook/en-US/content/using_dna_repositories.xml
===================================================================
--- trunk/docs/gettingstarted/src/main/docbook/en-US/content/using_dna_repositories.xml 2008-09-22 22:58:15 UTC (rev 539)
+++ trunk/docs/gettingstarted/src/main/docbook/en-US/content/using_dna_repositories.xml 2008-09-24 21:49:27 UTC (rev 540)
@@ -64,7 +64,7 @@
<sect1 id="repository_service">
<title>Configuring the Repository Service</title>
<para>The JBoss DNA <emphasis>repository service</emphasis> is the component that manages the <emphasis>repositories</emphasis>
- and connections to them. The service reads it's configuration from a <code>RepositorySource</code> instance (i.e., the
+ and connections to them. The service reads its configuration from a <code>RepositorySource</code> instance (i.e., the
"configuration repository") and automatically sets up the repositories given the <code>RepositorySource</code> instances
found in the configuration repository.</para>
<note>
@@ -77,15 +77,10 @@
<para>To set up the repository service, we need to first set up a few other objects:
<itemizedlist>
<listitem>
- <para>A <emphasis>factory for class loaders</emphasis> used to load the classes that make up the connectors.
- If no factory is supplied, the service uses the current thread's context class loader (or if that is null,
- the class loader that loaded the <code>RepositoryService</code> class).</para>
- </listitem>
- <listitem>
<para>A <emphasis>factory for execution contexts</emphasis>. Execution contexts define the context (or environment)
in which the service runs and in which operations against repositories are performed. <code>ExecutionContext</code>
instances can be created using JAAS application contexts, meaning that they contain the information about the subject
- that the software represents. Execution contexts also provides access to the all of the factories and utilities
+ that the software represents. Execution contexts also provide access to the all of the factories and utilities
used throughout the services and components, and it is through this mechanism that you can inject your own behavior.
For example, if your application already had a notion of namespaces, you could override the execution context's
<code>NamespaceRegistry</code> to use the namespaces defined in your application.</para>
@@ -104,15 +99,12 @@
</itemizedlist>
With these components in place, we can then instantiate the <code>RepositoryService</code> and start it (using its
<code>ServiceAdministrator</code>). During startup, the service reads the configuration repository and loads any
- defined <code>RepositorySource</code> instances into the repository library, using the class loader factory to obtain
- class loaders that it can use to load the actual <code>RepositorySource</code> implementation classes.
+ defined <code>RepositorySource</code> instances into the repository library, using the class loader factory
+ (available in the <code>ExecutionContext</code>) to obtain.
</para>
<para>Here's sample code that shows how to set up and start the repository service. You can see something similar
in the example application in the <code>startRepositories()</code> method of the <code>org.jboss.example.dna.repository.RepositoryClient</code> class.</para>
<programlisting role="JAVA"><![CDATA[
- // Create the class loader factory, which for this example will simply use this class' class loader...
- ClassLoaderFactory classLoaderFactory = new StandardClassLoaderFactory();
-
// Create the factory for execution contexts.
ExecutionContextFactory contextFactory = new BasicExecutionContextFactory();
@@ -130,9 +122,8 @@
sources.addSource(configSource);
// Now instantiate the Repository Service ...
- RepositoryService repositoryService = new RepositoryService(sources, configSource.getName(),
- context, classLoaderFactory);
- repositoryService.getAdministrator().start();
+ RepositoryService service = new RepositoryService(sources, configSource.getName(), context);
+ service.getAdministrator().start();
]]></programlisting>
<para>After startup completes, the repositories are ready to be used. The client application obtains the list of repositories
and presents them to the user. When the user selects one, the client application starts navigating that repository
Modified: trunk/docs/reference/src/main/docbook/en-US/content/author_group.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/author_group.xml 2008-09-22 22:58:15 UTC (rev 539)
+++ trunk/docs/reference/src/main/docbook/en-US/content/author_group.xml 2008-09-24 21:49:27 UTC (rev 540)
@@ -22,7 +22,10 @@
~ 51 Franklin Street, Fifth Floor
~ Boston, MA 02110-1301 USA
-->
-<!DOCTYPE authorgroup PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
+<!DOCTYPE authorgroup PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
+<!ENTITY % CustomDTD SYSTEM "../custom.dtd">
+%CustomDTD;
+]>
<authorgroup>
<corpauthor>Randall M. Hauch</corpauthor>
</authorgroup>
\ No newline at end of file
Modified: trunk/docs/reference/src/main/docbook/en-US/content/classloaders.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/classloaders.xml 2008-09-22 22:58:15 UTC (rev 539)
+++ trunk/docs/reference/src/main/docbook/en-US/content/classloaders.xml 2008-09-24 21:49:27 UTC (rev 540)
@@ -22,12 +22,89 @@
~ 51 Franklin Street, Fifth Floor
~ Boston, MA 02110-1301 USA
-->
-<!DOCTYPE preface PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
+<!DOCTYPE preface PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
+<!ENTITY % CustomDTD SYSTEM "../custom.dtd">
+%CustomDTD;
+]>
<chapter id="classloaders">
<title>Class loaders</title>
- <para></para>
+ <para>
+ JBoss DNA is designed around extensions: sequencers, connectors, MIME type detectors, and class loader factories.
+ The core part of JBoss DNA is relatively small and has few dependencies, while all of the "interesting" components
+ are extensions that plug into and are used by different parts of the core. The core doesn't really care what
+ the extensions do or what external libraries they require, as long as the extension fulfills its end of the
+ extension contract.
+ </para>
+ <para>
+ This means that you only need the core modules of JBoss DNA on the application classpath, while the extensions
+ do not have to be on the application classpath. And because the core modules of JBoss DNA have few dependencies,
+ the risk of JBoss DNA libraries conflicting with the application's are lower. Extensions, on the other hand,
+ will likely have a lot of unique dependencies. By separating the core of JBoss DNA from the class loaders used
+ to load the extensions, your application is isolated from the extensions and their dependencies. Of course,
+ you can put all the JARs on the application classpath, too. (This is what the examples in the &GettingStarted; document do.)
+ </para>
+ <para>
+ This design also allows you to select only those extensions that are interesting and useful for your application.
+ Not every application needs all of the JBoss DNA functionality.
+ Some applications may only need JBoss DNA sequencing, and specifically just a few types of sequencers.
+ Other applications may not need sequencing but do want to use JBoss DNA federation capabilities.
+ </para>
+ <para>
+ Finally, the use of these formal extensions also makes it easier for you to write your own customized extensions.
+ You may have proprietary file formats that you want to sequence. Or, you may have a non-JCR repository system that you
+ want to access via JCR and maybe even federate with information from other sources. Since extensions do
+ only one thing (e.g., be a sequencer, or a connector, etc.), its easier to develop those customizations.
+ </para>
+ <sect1 id="dna-classloader-factory">
+ <title>Class loader factory</title>
+ <para>
+ JBoss DNA loads all of the extension classes using class loaders returned by a <emphasis>class loader factory</emphasis>.
+ Each time JBoss DNA wants to load a class, it needs the name of the class and an optional "class loader name".
+ The meaning of the names is dependent upon the implementation of the class loader factory. For example, the
+ <link linkend="dna-maven-classloader">Maven class loader factory</link> expects the names to be
+ <ulink url="http://maven.apache.org/pom.html#Maven_Coordinates">Maven coordinates</ulink>. Either way,
+ the class loader factory implementation uses the name to create and return a &ClassLoader;
+ instance that can be used to load the class. Of course, if no name is provided, then a JBoss DNA service
+ just uses its class loader to load the class. (This is why putting all the extension jars on the classpath works.)
+ </para>
+ <para>
+ The class loader factory interface is pretty simple:
+ </para>
+ <programlisting>
+public interface &ClassLoaderFactory; {
+
+ /**
+ * Get a class loader given the supplied classpath. The meaning of the classpath is implementation-dependent.
+ * @param classpath the classpath to use
+ * @return the class loader; may not be null
+ */
+ &ClassLoader; getClassLoader( String... classpath );
+}
+</programlisting>
+ <para>In the <link linkend="environment">next chapter</link> we'll describe an &ExecutionContext; interface that is
+ supplied to each of the JBoss DNA core services. This context interface actually extends the &ClassLoaderFactory;
+ interface, so setting up an &ExecutionContext; implicitly sets up the class loader factory.</para>
+ </sect1>
+ <sect1 id="dna-standard-classloader">
+ <title>Standard class loader factory</title>
+ <para>JBoss DNA includes and uses as a default a standard class loader factory that just loads the classes using the Thread's current context
+ class loader (if there is one), or a delegate class loader that defaults to the class loader that loaded
+ the &StandardClassLoaderFactory; class. The class ignores any class loader names that are supplied.
+ </para>
+ </sect1>
<sect1 id="dna-maven-classloader">
- <title>Maven Repository class loader</title>
- <para></para>
+ <title>Maven Repository class loader factory</title>
+ <para>
+ The <code>dna-classloader-maven</code> project has a class loader factory implementation that parses the names into
+ <ulink url="http://maven.apache.org/pom.html#Maven_Coordinates">Maven coordinates</ulink>, then uses those coordinates
+ to look up artifacts in a Maven 2 repository. The artifact's POM file is used to determine the dependencies,
+ which is done transitively to obtain the complete dependency graph. The resulting class loader has access
+ to these artifacts in dependency order.
+ </para>
+ <para>
+ This class loader is also able to use a JCR repository that contains the equivalent contents of a Maven repository.
+ However, JBoss DNA doesn't currently have any tooling to help populate that repository, so this component may be
+ of limited use right now.
+ </para>
</sect1>
</chapter>
Modified: trunk/docs/reference/src/main/docbook/en-US/content/configuration.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/configuration.xml 2008-09-22 22:58:15 UTC (rev 539)
+++ trunk/docs/reference/src/main/docbook/en-US/content/configuration.xml 2008-09-24 21:49:27 UTC (rev 540)
@@ -22,13 +22,17 @@
~ 51 Franklin Street, Fifth Floor
~ Boston, MA 02110-1301 USA
-->
-<!DOCTYPE preface PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
+<!DOCTYPE preface PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
+<!ENTITY % CustomDTD SYSTEM "../custom.dtd">
+%CustomDTD;
+]>
<chapter id="configuration">
<title>Configuration</title>
- <para>
- Discuss how to configure JBoss DNA and how configuration repositories are used to bootstrap the various services and
- components. Describe how the next release will focus on making this easier and will detail configuration using the
- <ulink url="http://www.jboss.org/jbossmc/">JBoss Microcontainer</ulink>
- .
- </para>
+ <para>
+ Configuring JBoss DNA services is a bit more manual than is ideal. JBoss DNA currently consists of classes that uses dependency
+ injection to allow a great deal of flexibility in how it can be configured and customized. But this flexibility
+ makes it more difficult for you to configure. We understand this, and will soon provide a much easier way to set up
+ and manage JBoss DNA. Current plans are to use the <ulink url="http://www.jboss.org/jbossmc">JBoss Microcontainer</ulink>
+ along with a configuration repository.
+ </para>
</chapter>
Deleted: trunk/docs/reference/src/main/docbook/en-US/content/development_environment.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/development_environment.xml 2008-09-22 22:58:15 UTC (rev 539)
+++ trunk/docs/reference/src/main/docbook/en-US/content/development_environment.xml 2008-09-24 21:49:27 UTC (rev 540)
@@ -1,294 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- ~ JBoss, Home of Professional Open Source.
- ~
- ~ Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
- ~ indicated by the @author tags or express copyright attribution
- ~ statements applied by the authors. All third-party contributions are
- ~ distributed under license by Red Hat Middleware LLC.
- ~
- ~ This copyrighted material is made available to anyone wishing to use, modify,
- ~ copy, or redistribute it subject to the terms and conditions of the GNU
- ~ Lesser General Public License, as published by the Free Software Foundation.
- ~
- ~ This program is distributed in the hope that it will be useful,
- ~ but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- ~ or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
- ~ for more details.
- ~
- ~ You should have received a copy of the GNU Lesser General Public License
- ~ along with this distribution; if not, write to:
- ~ Free Software Foundation, Inc.
- ~ 51 Franklin Street, Fifth Floor
- ~ Boston, MA 02110-1301 USA
- -->
-<!DOCTYPE preface PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
-<chapter id="development-environment">
- <title>Developer environment and tooling</title>
- <para>
- The JBoss DNA project uses <link linkend="maven">Maven</link> as its primary build tool, <link linkend="svn">Subversion</link>
- for its source code repository, <link linkend="jira">JIRA</link> for the issue management and bug tracking system,
- and <link linkend="hudson">Hudson</link> for the continuous integration system. We do not stipulate a specific integrated
- development environment (IDE), although most of us use <link linkend="eclipse">Eclipse</link> and rely upon the code formatting
- and compile preferences to ensure no warnings or errors.
- </para>
- <para>
- The rest of this chapter talks in more detail about these different tools and how to set them up.
- </para>
- <sect1 id="jdk">
- <title>JDK</title>
- <para>
- Currently, JBoss DNA is developed and built using <ulink url="http://java.sun.com/javase/downloads/index_jdk5.jsp">JDK 5</ulink>,
- so if you're a contributor, you should have that installed and should use it before committing any changes. Note that you
- should be able to use the <ulink url="http://java.sun.com/javase/downloads/index.jsp">latest JDK</ulink> (which is currently
- JDK 6).
- </para>
- <para>
- Why do we build using JDK 5 and not 6? The main reason is that if we were to use JDK 6, then JBoss DNA couldn't really be used in any
- applications or projects that still used JDK 5. Plus, anybody using JDK 6 can still use JBoss DNA.
- However, considering that the end-of-life for Java 5 is
- <ulink url="http://java.sun.com/products/archive/eol.policy.html">October 2009</ulink>, we may be switching to
- Java 6 in the coming months.
- </para>
- <para>
- When installing, simply follow the procedure for your particular platform. On most platforms, this should set the
- <code>JAVA_HOME</code> environment variable. But if you run into any problems, first check that this environment
- variable was set to the correct location, and then check that you're running the version you expect by running
- the following command:
- </para>
- <programlisting role="XML"><![CDATA[ java -version ]]></programlisting>
- <para>
- If you don't see the correct version, double-check your installation.
- </para>
- </sect1>
- <sect1 id="svn">
- <title>Subversion</title>
- <para>JBoss DNA uses Subversion as its source code management system, and specifically the instance at
- <ulink url="http://www.jboss.org">JBoss.org</ulink>. Although you can view the
- <ulink url="http://anonsvn.jboss.org/repos/dna/trunk/">trunk</ulink> of the Subversion repository
- (or using <ulink url="http://fisheye.jboss.org/browse/DNA/trunk">FishEye</ulink>) through your browser,
- it order to get more than just a few files of the latest version of the source code, you probably want
- to have an SVN client installed. Several IDE's have SVN support included (or available as plugins),
- but having the command-line SVN client is recommended. See
- <ulink url="http://subversion.tigris.org/">http://subversion.tigris.org/</ulink> for downloads and instructions for your
- particular platform.
- </para>
- <para>
- Here are some useful URLs for the JBoss DNA Subversion:
- </para>
- <table frame='all'>
- <title>SVN URLs for JBoss DNA</title>
- <tgroup cols='2' align='left' colsep='1' rowsep='1'>
- <colspec colname='c1' colwidth="1*"/>
- <colspec colname='c2' colwidth="1*"/>
- <thead>
- <row>
- <entry>Repository</entry>
- <entry>URL</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>Anonymous Access URL</entry>
- <entry><ulink url="http://anonsvn.jboss.org/repos/dna/trunk">http://anonsvn.jboss.org/repos/dna/trunk</ulink></entry>
- </row>
- <row>
- <entry>Secure Developer Access URL</entry>
- <entry><ulink url="https://svn.jboss.org/repos/dna/trunk/">https://svn.jboss.org/repos/dna/trunk/</ulink></entry>
- </row>
- <row>
- <entry>FishEye Code Browser</entry>
- <entry><ulink url="http://fisheye.jboss.org/browse/DNA/trunk">http://fisheye.jboss.org/browse/DNA/trunk</ulink></entry>
- </row>
- </tbody>
- </tgroup>
- </table>
- </sect1>
- <sect1 id="maven">
- <title>Maven</title>
- <para>JBoss DNA uses Maven 2 for its build system, as is this example. Using Maven 2 has several advantages, including
- the ability to manage dependencies. If a library is needed, Maven automatically finds and downloads that library, plus
- everything that library needs. This means that it's very easy to build the examples - or even create a maven project that
- depends on the JBoss DNA JARs.</para>
- <para>
- To use Maven with JBoss DNA, you'll need to have <link linkend="jdk">JDK 5 or 6</link> and Maven 2.0.9 (or higher).</para>
- <para>
- Maven can be downloaded from <ulink url="http://maven.apache.org/">http://maven.apache.org/</ulink>, and is installed by unzipping the
- <code>maven-2.0.7-bin.zip</code> file to a convenient location on your local disk. Simply add <code>$MAVEN_HOME/bin</code>
- to your path and add the following profile to your <code>~/.m2/settings.xml</code> file:
- </para>
- <programlisting role="XML"><![CDATA[
-<settings>
- <profiles>
- <profile>
- <id>jboss.repository</id>
- <activation>
- <property>
- <name>!jboss.repository.off</name>
- </property>
- </activation>
- <repositories>
- <repository>
- <id>snapshots.jboss.org</id>
- <url>http://snapshots.jboss.org/maven2</url>
- <snapshots>
- <enabled>true</enabled>
- </snapshots>
- </repository>
- <repository>
- <id>repository.jboss.org</id>
- <url>http://repository.jboss.org/maven2</url>
- <snapshots>
- <enabled>false</enabled>
- </snapshots>
- </repository>
- </repositories>
- <pluginRepositories>
- <pluginRepository>
- <id>repository.jboss.org</id>
- <url>http://repository.jboss.org/maven2</url>
- <snapshots>
- <enabled>false</enabled>
- </snapshots>
- </pluginRepository>
- <pluginRepository>
- <id>snapshots.jboss.org</id>
- <url>http://snapshots.jboss.org/maven2</url>
- <snapshots>
- <enabled>true</enabled>
- </snapshots>
- </pluginRepository>
- </pluginRepositories>
- </profile>
- </profiles>
-</settings>
-]]></programlisting>
- <para>This profile informs Maven of the two JBoss repositories (<ulink url="http://repository.jboss.org/maven2">snapshots</ulink>
- and <ulink url="http://snapshots.jboss.org/maven2">releases</ulink>) that contain all of the JARs for JBoss DNA and all dependent libraries.
- </para>
- <note>
- <para>
- It is a policy of the project that the <emphasis>source code and JARs</emphasis> for <emphasis>all</emphasis> dependencies
- <emphasis>must</emphasis> be loaded into the JBoss repository. This is so that the project can always be built
- and that all source code is always available.
- </para>
- <para>
- For more information about the JBoss Maven repository, see the <ulink url="http://wiki.jboss.org/wiki/Maven">JBoss.org Wiki</ulink>.
- </para>
- </note>
- <para>
- There are just a few commands that are useful for building JBoss DNA (and it's <link linkend="modules">subprojects</link>).
- Usually, these are issued while at the top level of the code (usually just below <code>trunk/</code>), although issuing
- them inside a subproject just applies to that subproject.
- </para>
- <table frame='all'>
- <title>Useful Maven commands</title>
- <tgroup cols='2' align='left' colsep='1' rowsep='1'>
- <colspec colname='c1' colwidth="1*"/>
- <colspec colname='c2' colwidth="1*"/>
- <thead>
- <row>
- <entry>Command</entry>
- <entry>Description</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry><code>mvn clean</code></entry>
- <entry>Clean up all built artifacts (e.g., the <code>target/</code> directory in each project)</entry>
- </row>
- <row>
- <entry><code>mvn clean install</code></entry>
- <entry>Clean up all built artifacts, then compile, run the unit tests, and install the resulting JAR artifact(s)
- into your local Maven repository (e.g, usually <code>~/.m2/repository</code>).
- </entry>
- </row>
- </tbody>
- </tgroup>
- </table>
- </sect1>
- <sect1 id="hudson">
- <title>Continuous integration with Hudson</title>
- <para>JBoss DNA's continuous integration is done with several Hudson jobs on <ulink url="http://www.jboss.org">JBoss.org</ulink>.
- These jobs run periodically and basically run the Maven build process. Any build failures or test failures are reported,
- as are basic statistics and history for each job.
- </para>
- <table frame='all'>
- <title>Continuous integration jobs</title>
- <tgroup cols='2' align='left' colsep='1' rowsep='1'>
- <colspec colname='c1' colwidth="1*"/>
- <colspec colname='c2' colwidth="1*"/>
- <thead>
- <row>
- <entry>Job</entry>
- <entry>Description</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry><ulink url="http://hudson.jboss.org/hudson/job/DNA%20continuous%20on%20JDK1.5/">Continuous on JDK 5</ulink></entry>
- <entry>Continuous build that runs after changes are committed to SVN. SVN is polled every 15 minutes.</entry>
- </row>
- <row>
- <entry><ulink url="http://hudson.jboss.org/hudson/job/DNA%20nightly%20integration%20on%20JDK...">Nightly on JDK 5</ulink></entry>
- <entry>Build that runs every night (about 2 a.m. EDT), regardless of whether changes have been committed to SVN
- since the previous night.</entry>
- </row>
- </tbody>
- </tgroup>
- </table>
- </sect1>
- <sect1 id="eclipse">
- <title>Eclipse IDE</title>
- <para>Many of the JBoss DNA committers use the Eclipse IDE, and all project files required by Eclipse are committed in SVN, making
- it pretty easy to get an Eclipse workspace running with all of the JBoss DNA projects.
- Many of the JBoss DNA committers use the Eclipse IDE, and all project files required by Eclipse are committed in SVN, making
- it pretty easy to get an Eclipse workspace running with all of the JBoss DNA projects.
- </para>
- <para>We're using the latest released version of Eclipse (3.4, called "Ganymede"),
- available from <ulink url="http://www.eclipse.org/">Eclipse.org</ulink>. Simply follow the instructions for your platform.
- </para>
- <para>
- After Eclipse is installed, create a new workspace. Before importing the JBoss DNA projects, import (via "File->Import->Preferences")
- the subset of the Eclipse preferences by importing the <code>eclipse-preferences.epf</code> file (located under <code>trunk</code>).
- Then, open the Eclipse preferences and open the "Java->Code Style-> Formatter" preference page, and press the "Import" button and
- choose the <code>eclipse-code-formatter-profile.xml</code> file (located under <code>trunk</code>). This will load the code
- formatting preferences for the JBoss DNA project.
- </para>
- <para>
- Then install Eclipse plugins for SVN and Maven. (Remember, you will have to restart Eclipse after installing them.)
- We use the following plugins:
- </para>
- <table frame='all'>
- <title>Continuous integration jobs</title>
- <tgroup cols='2' align='left' colsep='1' rowsep='1'>
- <colspec colname='c1' colwidth="1*"/>
- <colspec colname='c2' colwidth="1*"/>
- <thead>
- <row>
- <entry>Eclipse Plugin Site</entry>
- <entry>Update Site URL</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>Subversive SVN Client</entry>
- <entry>
- <ulink url="http://www.polarion.org/projects/subversive/download/eclipse/2.0/update-s...">http://www.polarion.org/projects/subversive/download/eclipse/2.0/update-s...</ulink>
- <ulink url="http://www.polarion.org/projects/subversive/download/integrations/update-...">http://www.polarion.org/projects/subversive/download/integrations/update-...</ulink>
- </entry>
- </row>
- <row>
- <entry>Maven Integration for Eclipse</entry>
- <entry><ulink url="http://m2eclipse.sonatype.org/update/">http://m2eclipse.sonatype.org/update/</ulink></entry>
- </row>
- </tbody>
- </tgroup>
- </table>
- <para>
- After you check out the JBoss DNA codebase, you can import the JBoss DNA Maven projects into Eclipse as Eclipse projects.
- To do this, go to "File->Import->Existing Projects", navigate to the <code>trunk/</code> folder in the import wizard,
- and then check each of the <link linkend="modules">subprojects</link> that you want to have in your workspace.
- </para>
- </sect1>
-</chapter>
Copied: trunk/docs/reference/src/main/docbook/en-US/content/development_tools.xml (from rev 539, trunk/docs/reference/src/main/docbook/en-US/content/development_environment.xml)
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/development_tools.xml (rev 0)
+++ trunk/docs/reference/src/main/docbook/en-US/content/development_tools.xml 2008-09-24 21:49:27 UTC (rev 540)
@@ -0,0 +1,297 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ JBoss, Home of Professional Open Source.
+ ~
+ ~ Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ ~ indicated by the @author tags or express copyright attribution
+ ~ statements applied by the authors. All third-party contributions are
+ ~ distributed under license by Red Hat Middleware LLC.
+ ~
+ ~ This copyrighted material is made available to anyone wishing to use, modify,
+ ~ copy, or redistribute it subject to the terms and conditions of the GNU
+ ~ Lesser General Public License, as published by the Free Software Foundation.
+ ~
+ ~ This program is distributed in the hope that it will be useful,
+ ~ but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ ~ or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ ~ for more details.
+ ~
+ ~ You should have received a copy of the GNU Lesser General Public License
+ ~ along with this distribution; if not, write to:
+ ~ Free Software Foundation, Inc.
+ ~ 51 Franklin Street, Fifth Floor
+ ~ Boston, MA 02110-1301 USA
+ -->
+<!DOCTYPE preface PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
+<!ENTITY % CustomDTD SYSTEM "../custom.dtd">
+%CustomDTD;
+]>
+<chapter id="development-tools">
+ <title>Developer tools</title>
+ <para>
+ The JBoss DNA project uses <link linkend="maven">Maven</link> as its primary build tool, <link linkend="svn">Subversion</link>
+ for its source code repository, <link linkend="jira">JIRA</link> for the issue management and bug tracking system,
+ and <link linkend="hudson">Hudson</link> for the continuous integration system. We do not stipulate a specific integrated
+ development environment (IDE), although most of us use <link linkend="eclipse">Eclipse</link> and rely upon the code formatting
+ and compile preferences to ensure no warnings or errors.
+ </para>
+ <para>
+ The rest of this chapter talks in more detail about these different tools and how to set them up.
+ </para>
+ <sect1 id="jdk">
+ <title>JDK</title>
+ <para>
+ Currently, JBoss DNA is developed and built using <ulink url="http://java.sun.com/javase/downloads/index_jdk5.jsp">JDK 5</ulink>,
+ so if you're a contributor, you should have that installed and should use it before committing any changes. Note that you
+ should be able to use the <ulink url="http://java.sun.com/javase/downloads/index.jsp">latest JDK</ulink> (which is currently
+ JDK 6).
+ </para>
+ <para>
+ Why do we build using JDK 5 and not 6? The main reason is that if we were to use JDK 6, then JBoss DNA couldn't really be used in any
+ applications or projects that still used JDK 5. Plus, anybody using JDK 6 can still use JBoss DNA.
+ However, considering that the end-of-life for Java 5 is
+ <ulink url="http://java.sun.com/products/archive/eol.policy.html">October 2009</ulink>, we may be switching to
+ Java 6 in the coming months.
+ </para>
+ <para>
+ When installing, simply follow the procedure for your particular platform. On most platforms, this should set the
+ <code>JAVA_HOME</code> environment variable. But if you run into any problems, first check that this environment
+ variable was set to the correct location, and then check that you're running the version you expect by running
+ the following command:
+ </para>
+ <programlisting role="XML"><![CDATA[ java -version ]]></programlisting>
+ <para>
+ If you don't see the correct version, double-check your installation.
+ </para>
+ </sect1>
+ <sect1 id="svn">
+ <title>Subversion</title>
+ <para>JBoss DNA uses Subversion as its source code management system, and specifically the instance at
+ <ulink url="http://www.jboss.org">JBoss.org</ulink>. Although you can view the
+ <ulink url="&Subversion;trunk/">trunk</ulink> of the Subversion repository
+ (or using <ulink url="&Fisheye;trunk">FishEye</ulink>) through your browser,
+ it order to get more than just a few files of the latest version of the source code, you probably want
+ to have an SVN client installed. Several IDE's have SVN support included (or available as plugins),
+ but having the command-line SVN client is recommended. See
+ <ulink url="http://subversion.tigris.org/">http://subversion.tigris.org/</ulink> for downloads and instructions for your
+ particular platform.
+ </para>
+ <para>
+ Here are some useful URLs for the JBoss DNA Subversion:
+ </para>
+ <table frame='all'>
+ <title>SVN URLs for JBoss DNA</title>
+ <tgroup cols='2' align='left' colsep='1' rowsep='1'>
+ <colspec colname='c1' colwidth="1*"/>
+ <colspec colname='c2' colwidth="1*"/>
+ <thead>
+ <row>
+ <entry>Repository</entry>
+ <entry>URL</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>Anonymous Access URL</entry>
+ <entry><ulink url="&Subversion;trunk/">&Subversion;trunk/</ulink></entry>
+ </row>
+ <row>
+ <entry>Secure Developer Access URL</entry>
+ <entry><ulink url="&Fisheye;trunk/">&Fisheye;trunk/</ulink></entry>
+ </row>
+ <row>
+ <entry>FishEye Code Browser</entry>
+ <entry><ulink url="&SecureSubversion;trunk/">&SecureSubversion;trunk/</ulink></entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+ </sect1>
+ <sect1 id="maven">
+ <title>Maven</title>
+ <para>JBoss DNA uses Maven 2 for its build system, as is this example. Using Maven 2 has several advantages, including
+ the ability to manage dependencies. If a library is needed, Maven automatically finds and downloads that library, plus
+ everything that library needs. This means that it's very easy to build the examples - or even create a maven project that
+ depends on the JBoss DNA JARs.</para>
+ <para>
+ To use Maven with JBoss DNA, you'll need to have <link linkend="jdk">JDK 5 or 6</link> and Maven 2.0.9 (or higher).</para>
+ <para>
+ Maven can be downloaded from <ulink url="http://maven.apache.org/">http://maven.apache.org/</ulink>, and is installed by unzipping the
+ <code>maven-2.0.7-bin.zip</code> file to a convenient location on your local disk. Simply add <code>$MAVEN_HOME/bin</code>
+ to your path and add the following profile to your <code>~/.m2/settings.xml</code> file:
+ </para>
+ <programlisting role="XML"><![CDATA[
+<settings>
+ <profiles>
+ <profile>
+ <id>jboss.repository</id>
+ <activation>
+ <property>
+ <name>!jboss.repository.off</name>
+ </property>
+ </activation>
+ <repositories>
+ <repository>
+ <id>snapshots.jboss.org</id>
+ <url>http://snapshots.jboss.org/maven2</url>
+ <snapshots>
+ <enabled>true</enabled>
+ </snapshots>
+ </repository>
+ <repository>
+ <id>repository.jboss.org</id>
+ <url>http://repository.jboss.org/maven2</url>
+ <snapshots>
+ <enabled>false</enabled>
+ </snapshots>
+ </repository>
+ </repositories>
+ <pluginRepositories>
+ <pluginRepository>
+ <id>repository.jboss.org</id>
+ <url>http://repository.jboss.org/maven2</url>
+ <snapshots>
+ <enabled>false</enabled>
+ </snapshots>
+ </pluginRepository>
+ <pluginRepository>
+ <id>snapshots.jboss.org</id>
+ <url>http://snapshots.jboss.org/maven2</url>
+ <snapshots>
+ <enabled>true</enabled>
+ </snapshots>
+ </pluginRepository>
+ </pluginRepositories>
+ </profile>
+ </profiles>
+</settings>
+]]></programlisting>
+ <para>This profile informs Maven of the two JBoss repositories (<ulink url="http://repository.jboss.org/maven2">snapshots</ulink>
+ and <ulink url="http://snapshots.jboss.org/maven2">releases</ulink>) that contain all of the JARs for JBoss DNA and all dependent libraries.
+ </para>
+ <note>
+ <para>
+ It is a policy of the project that the <emphasis>source code and JARs</emphasis> for <emphasis>all</emphasis> dependencies
+ <emphasis>must</emphasis> be loaded into the JBoss repository. This is so that the project can always be built
+ and that all source code is always available.
+ </para>
+ <para>
+ For more information about the JBoss Maven repository, see the <ulink url="http://wiki.jboss.org/wiki/Maven">JBoss.org Wiki</ulink>.
+ </para>
+ </note>
+ <para>
+ There are just a few commands that are useful for building JBoss DNA (and it's <link linkend="modules">subprojects</link>).
+ Usually, these are issued while at the top level of the code (usually just below <code>trunk/</code>), although issuing
+ them inside a subproject just applies to that subproject.
+ </para>
+ <table frame='all'>
+ <title>Useful Maven commands</title>
+ <tgroup cols='2' align='left' colsep='1' rowsep='1'>
+ <colspec colname='c1' colwidth="1*"/>
+ <colspec colname='c2' colwidth="1*"/>
+ <thead>
+ <row>
+ <entry>Command</entry>
+ <entry>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry><code>mvn clean</code></entry>
+ <entry>Clean up all built artifacts (e.g., the <code>target/</code> directory in each project)</entry>
+ </row>
+ <row>
+ <entry><code>mvn clean install</code></entry>
+ <entry>Clean up all built artifacts, then compile, run the unit tests, and install the resulting JAR artifact(s)
+ into your local Maven repository (e.g, usually <code>~/.m2/repository</code>).
+ </entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+ </sect1>
+ <sect1 id="hudson">
+ <title>Continuous integration with Hudson</title>
+ <para>JBoss DNA's continuous integration is done with several Hudson jobs on <ulink url="http://www.jboss.org">JBoss.org</ulink>.
+ These jobs run periodically and basically run the Maven build process. Any build failures or test failures are reported,
+ as are basic statistics and history for each job.
+ </para>
+ <table frame='all'>
+ <title>Continuous integration jobs</title>
+ <tgroup cols='2' align='left' colsep='1' rowsep='1'>
+ <colspec colname='c1' colwidth="1*"/>
+ <colspec colname='c2' colwidth="1*"/>
+ <thead>
+ <row>
+ <entry>Job</entry>
+ <entry>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry><ulink url="http://hudson.jboss.org/hudson/job/DNA%20continuous%20on%20JDK1.5/">Continuous on JDK 5</ulink></entry>
+ <entry>Continuous build that runs after changes are committed to SVN. SVN is polled every 15 minutes.</entry>
+ </row>
+ <row>
+ <entry><ulink url="http://hudson.jboss.org/hudson/job/DNA%20nightly%20integration%20on%20JDK...">Nightly on JDK 5</ulink></entry>
+ <entry>Build that runs every night (about 2 a.m. EDT), regardless of whether changes have been committed to SVN
+ since the previous night.</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+ </sect1>
+ <sect1 id="eclipse">
+ <title>Eclipse IDE</title>
+ <para>Many of the JBoss DNA committers use the Eclipse IDE, and all project files required by Eclipse are committed in SVN, making
+ it pretty easy to get an Eclipse workspace running with all of the JBoss DNA projects.
+ Many of the JBoss DNA committers use the Eclipse IDE, and all project files required by Eclipse are committed in SVN, making
+ it pretty easy to get an Eclipse workspace running with all of the JBoss DNA projects.
+ </para>
+ <para>We're using the latest released version of Eclipse (3.4, called "Ganymede"),
+ available from <ulink url="http://www.eclipse.org/">Eclipse.org</ulink>. Simply follow the instructions for your platform.
+ </para>
+ <para>
+ After Eclipse is installed, create a new workspace. Before importing the JBoss DNA projects, import (via "File->Import->Preferences")
+ the subset of the Eclipse preferences by importing the <code>eclipse-preferences.epf</code> file (located under <code>trunk</code>).
+ Then, open the Eclipse preferences and open the "Java->Code Style-> Formatter" preference page, and press the "Import" button and
+ choose the <code>eclipse-code-formatter-profile.xml</code> file (located under <code>trunk</code>). This will load the code
+ formatting preferences for the JBoss DNA project.
+ </para>
+ <para>
+ Then install Eclipse plugins for SVN and Maven. (Remember, you will have to restart Eclipse after installing them.)
+ We use the following plugins:
+ </para>
+ <table frame='all'>
+ <title>Continuous integration jobs</title>
+ <tgroup cols='2' align='left' colsep='1' rowsep='1'>
+ <colspec colname='c1' colwidth="1*"/>
+ <colspec colname='c2' colwidth="1*"/>
+ <thead>
+ <row>
+ <entry>Eclipse Plugins</entry>
+ <entry>Update Site URLs</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>Subversive SVN Client</entry>
+ <entry>
+ <ulink url="http://www.polarion.org/projects/subversive/download/eclipse/2.0/update-s...">http://www.polarion.org/projects/subversive/download/eclipse/2.0/update-s...</ulink>
+ <ulink url="http://www.polarion.org/projects/subversive/download/integrations/update-...">http://www.polarion.org/projects/subversive/download/integrations/update-...</ulink>
+ </entry>
+ </row>
+ <row>
+ <entry>Maven Integration for Eclipse</entry>
+ <entry><ulink url="http://m2eclipse.sonatype.org/update/">http://m2eclipse.sonatype.org/update/</ulink></entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+ <para>
+ After you check out the JBoss DNA codebase, you can import the JBoss DNA Maven projects into Eclipse as Eclipse projects.
+ To do this, go to "File->Import->Existing Projects", navigate to the <code>trunk/</code> folder in the import wizard,
+ and then check each of the <link linkend="modules">subprojects</link> that you want to have in your workspace.
+ </para>
+ </sect1>
+</chapter>
Added: trunk/docs/reference/src/main/docbook/en-US/content/environment.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/environment.xml (rev 0)
+++ trunk/docs/reference/src/main/docbook/en-US/content/environment.xml 2008-09-24 21:49:27 UTC (rev 540)
@@ -0,0 +1,233 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ JBoss, Home of Professional Open Source.
+ ~
+ ~ Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ ~ indicated by the @author tags or express copyright attribution
+ ~ statements applied by the authors. All third-party contributions are
+ ~ distributed under license by Red Hat Middleware LLC.
+ ~
+ ~ This copyrighted material is made available to anyone wishing to use, modify,
+ ~ copy, or redistribute it subject to the terms and conditions of the GNU
+ ~ Lesser General Public License, as published by the Free Software Foundation.
+ ~
+ ~ This program is distributed in the hope that it will be useful,
+ ~ but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ ~ or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ ~ for more details.
+ ~
+ ~ You should have received a copy of the GNU Lesser General Public License
+ ~ along with this distribution; if not, write to:
+ ~ Free Software Foundation, Inc.
+ ~ 51 Franklin Street, Fifth Floor
+ ~ Boston, MA 02110-1301 USA
+ -->
+<!DOCTYPE preface PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
+<!ENTITY % CustomDTD SYSTEM "../custom.dtd">
+%CustomDTD;
+]>
+<chapter id="environment">
+ <title>Environment</title>
+ <para>
+ The various components of JBoss DNA are designed as plain old Java objects, or POJOs. And rather than making assumptions
+ about their environment, each component instead requires that any external dependencies necessary for it to operate
+ must be supplied to it. This pattern is known as Dependency Injection, and it allows the components to be simpler
+ and allows for a great deal of flexibility and customization in how the components are configured.
+ And, JBoss DNA will soon provide a higher-level component that leverages the
+ <ulink url="http://www.jboss.org/jbossmc">JBoss Microcontainer</ulink> to automatically assemble and wire together
+ all the lower-level components.
+ </para>
+ <sect1 id="security">
+ <title>Security</title>
+ <para>
+ JBoss DNA uses the
+ <ulink url="http://java.sun.com/javase/technologies/security/">Java Authentication and Authorization Service (JAAS)</ulink>
+ for its security mechanism. Not only is this the standard approach for authenticating and authorizing in Java, but
+ it also enables JBoss DNA to integrate existing security systems.
+ </para>
+ <para>
+ There are quite a few JAAS providers available, but one of the best and most powerful providers is
+ <ulink url="http://www.jboss.org/jbosssecurity/">JBoss Security</ulink>, which is the open source
+ security framework used by JBoss. JBoss Security offers a number of JAAS login modules, including:
+ <itemizedlist>
+ <listitem>
+ <para>
+ <emphasis role="strong">User-Roles Login Module</emphasis>
+ is a simple
+ <code>javax.security.auth.login.LoginContext</code>
+ implementation that uses usernames and passwords stored in a properties file.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <emphasis role="strong">Client Login Module</emphasis>
+ prompts the user for their username and password.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <emphasis role="strong">Database Server Login Module</emphasis>
+ uses a JDBC database to authenticate principals and associate them with roles.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <emphasis role="strong">LDAP Login Module</emphasis>
+ uses an LDAP directory to authenticate principals. Two implementations are available.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <emphasis role="strong">Certificate Login Module</emphasis>
+ authenticates using X509 certificates, obtaining roles from either property files or a JDBC database.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <emphasis role="strong">Operating System Login Module</emphasis>
+ authenticates using the operating system's mechanism.
+ </para>
+ </listitem>
+ </itemizedlist>
+ and many others. Plus, JBoss Security also provides other capabilities, such as using XACML policies or using federated single sign-on.
+ For more detail, see the <ulink url="http://www.jboss.org/jbosssecurity/">JBoss Security</ulink> project.
+ </para>
+ <sect2 id="authentication">
+ <title>Authenticating with JAAS</title>
+ <para>
+ JBoss DNA defers to JAAS to authenticate clients creating repository connections (known as JCR Sessions if using the JCR API),
+ and generally expects the client application to obtain the JAAS &LoginContext; or &AppControlContext;.
+ These are then passed to JBoss DNA, which merely verifies that authentication has been done.
+ </para>
+ <para>
+ As we'll see in the <link linkend="execution-context">next section</link>, JBoss DNA has the notion of an &ExecutionContext;
+ that can be created using JAAS login or access control contexts. These execution contexts therefore contain information
+ about the subject.
+ </para>
+ <para>
+ We'll also see in the <link linkend="jcr">chapter on JCR</link> how JAAS can be used for authentication when
+ JCR Sessions are created.
+ </para>
+ </sect2>
+ <sect2 id="authorization">
+ <title>Authorization with JAAS</title>
+ <para>
+ JBoss DNA does not currently use any of the authorization features of JAAS. However, in future releases where authorization
+ is supported, JBoss DNA will rely upon JAAS authorization just as it currently does for authentication.
+ </para>
+ </sect2>
+ </sect1>
+ <sect1 id="execution-context">
+ <title>Execution contexts</title>
+ <para>
+ One of the objects that must be supplied to many JBoss DNA components is an &ExecutionContext;. Some components
+ require this context to be passed into individual methods, allowing the context to vary with each method invocation.
+ Other components require the context to be provided before it's used, and will use that context for all its operations
+ (until it is given a different one).
+ </para>
+ <para>
+ What does an &ExecutionContext; represent? Quite simply, it's the set of objects that define the environment
+ or context in which the method or component is currently operating. It includes a way for recording and reporting
+ errors and problems. It includes the ability to <link linkend="classloaders">create class loaders</link>
+ given a classpath of class loader names. It also includes information about the current <link linkend="security">user</link>.
+ It includes access to factories that can be used to create and convert property values. And it includes factories
+ for working with namespaces and fully-qualified names. In fact, as JBoss DNA evolves, more things may need to be
+ added. Here is what the &ExecutionContext; interface looks like:
+ </para>
+ <programlisting>
+public interface &ExecutionContext; extends &ClassLoaderFactory; {
+
+ /**
+ * Get the factories that should be used to create values for {@link Property properties}.
+ * @return the property value factory; never null
+ */
+ &ValueFactories; getValueFactories();
+
+ /**
+ * Get the namespace registry for this context.
+ * @return the namespace registry; never null
+ */
+ &NamespaceRegistry; getNamespaceRegistry();
+
+ /**
+ * Get the factory for creating {@link Property} objects.
+ * @return the property factory; never null
+ */
+ &PropertyFactory; getPropertyFactory();
+
+ /**
+ * Get the current JAAS access control context.
+ * @return the access control context; may be <code>null</code>
+ */
+ &AccessControlContext; getAccessControlContext();
+
+ /**
+ * Get the current JAAS login context.
+ * @return the login context; may be <code>null</code>
+ */
+ &LoginContext; getLoginContext();
+
+ /**
+ * Get the JAAS subject for which this context was created.
+ * @return the subject; never null
+ */
+ &Subject; getSubject();
+
+ /**
+ * Return a logger associated with this context. This logger records only those activities within the
+ * context and provide a way to capture the context-specific activities. All log messages are also
+ * sent to the system logger, so classes that log via this mechanism should <i>not</i> also
+ * {@link Logger#getLogger(Class) obtain a system logger}.
+ * @param clazz the class that is doing the logging
+ * @return the logger, named after <code>clazz</code>; never null
+ */
+ &Logger; getLogger( Class<?> clazz );
+
+ /**
+ * Return a logger associated with this context. This logger records only those activities within the
+ * context and provide a way to capture the context-specific activities. All log messages are also
+ * sent to the system logger, so classes that log via this mechanism should <i>not</i> also
+ * {@link Logger#getLogger(Class) obtain a system logger}.
+ * @param name the name for the logger
+ * @return the logger, named after <code>clazz</code>; never null
+ */
+ &Logger; getLogger( String name );
+}
+</programlisting>
+ <para>
+ Notice that &ExecutionContext; extends the &ClassLoaderFactory; interface described in the
+ <link linkend="classloaders">previous chapter</link>.
+ </para>
+ <para>
+ The fact that so many of the JBoss DNA components take &ExecutionContext; instances gives us some interesting possibilities.
+ For example, one execution context instance can be used as the highest-level (or "application-level") context for all of the services
+ (e.g., &RepositoryService;, &SequencingService;, etc.).
+ Then, an execution context could be created for each user that will be performing operations, and that user's context can
+ be passed around to not only provide security information about the user but also to allow the activities being performed
+ to be recorded for user feedback, monitoring and/or auditing purposes.
+ </para>
+ <para>
+ While execution contexts may sound complicated, they're actually very simple to use. In fact, JBoss DNA provides an factory interface
+ for creating &ExecutionContext; instances. Not surprisingly it's called &ExecutionContextFactory;
+ and it has methods for creating contexts using <link linkend="security">JAAS</link> login or access control contexts.
+ JBoss DNA even provides a &BasicExecutionContextFactory; implementation that can be created using its no-arg
+ constructor.
+ </para>
+ <para>
+ The following code fragment shows how easy it is to create various execution contexts:
+ </para>
+ <programlisting>
+&ExecutionContextFactory; factory = new &BasicExecutionContextFactory;();
+&ExecutionContext; context1 = factory.create();
+
+// Create a context for a user, authenticating using JAAS ...
+&CallbackHandler; callbackHandler = ...
+&LoginContext; loginContext = new LoginContext("username",callbackHandler);
+&ExecutionContext; context2 = factory.create(loginContext);
+</programlisting>
+ <para>
+ These contexts (or the context factory) can then be passed to the various components as needed.
+ </para>
+ </sect1>
+</chapter>
+
Modified: trunk/docs/reference/src/main/docbook/en-US/content/future.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/future.xml 2008-09-22 22:58:15 UTC (rev 539)
+++ trunk/docs/reference/src/main/docbook/en-US/content/future.xml 2008-09-24 21:49:27 UTC (rev 540)
@@ -22,20 +22,18 @@
~ 51 Franklin Street, Fifth Floor
~ Boston, MA 02110-1301 USA
-->
-<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
+<!DOCTYPE preface PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
+<!ENTITY % CustomDTD SYSTEM "../custom.dtd">
+%CustomDTD;
+]>
<chapter id="future">
<title>Looking to the future</title>
<para>What's next for JBoss DNA? Well, the sequencing system is just the beginning. With this release, the sequencing system
is stable enough so that more <link linkend="sequencers">sequencers</link> can be developed and used within your own applications.
If you're interested in getting involved with the JBoss DNA project, consider picking up one of the sequencers on our
- <ulink url="http://jira.jboss.org/jira/browse/DNA?report=com.atlassian.jira.plugin.sy...">roadmap</ulink>.
+ <ulink url="&JIRA;?report=com.atlassian.jira.plugin.system.project:roadmap-panel">roadmap</ulink>.
Or, check out <ulink url="http://jira.jboss.org/jira/secure/IssueNavigator.jspa?reset=true&mode...">JIRA</ulink>
for the list of sequencers we've thought of. If you think of one that's not there, please add it to JIRA! </para>
- <para>The next release will focus on creating the <link linkend="federation">federation engine</link> and connectors
- for several popular and ubiquitous systems. The 0.2 release will likely only federate information in a read-only manner,
- but updates will soon follow. Also, during the early part of the next release, the JBoss DNA project will switch to use JDK 6.
- Java 5 is being end-of-lifed, so we want to move to a supported JDK. However, a number of JBoss projects and products continue to
- require Java 5, so our next release will most likely use JDK 6 with Java 5 compatibility.</para>
<para>Other components on our roadmap include a web user interface, a REST-ful server, and a view system that allows domain-specific
views of information in the repository. These components are farther out on our roadmap, and at this time have not been
targeted to a particular release. If any of these are of interest to you, please <link linkend="preface">get involved</link>
Modified: trunk/docs/reference/src/main/docbook/en-US/content/introduction.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/introduction.xml 2008-09-22 22:58:15 UTC (rev 539)
+++ trunk/docs/reference/src/main/docbook/en-US/content/introduction.xml 2008-09-24 21:49:27 UTC (rev 540)
@@ -22,7 +22,10 @@
~ 51 Franklin Street, Fifth Floor
~ Boston, MA 02110-1301 USA
-->
-<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
+<!DOCTYPE preface PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
+<!ENTITY % CustomDTD SYSTEM "../custom.dtd">
+%CustomDTD;
+]>
<chapter id="introduction">
<title>Introduction to JBoss DNA</title>
<para>
@@ -31,7 +34,7 @@
regular JCR repository that they search, navigate, version, and listen for changes. But under the covers, JBoss DNA
gets its content by federating multiple back-end systems (like databases, services, other repositories, etc.),
allowing those systems to continue "owning" the information but ensuring the unified repository stays up-to-date
- and in sync.
+ and in sync. JBoss DNA also analyzes the content you put into the repository and turns it into information you can use more effectively.
</para>
<para>
This document goes into detail about JBoss DNA and its capabilities, features, architecture, components, extension points,
@@ -151,12 +154,12 @@
transactions, and observation. Because of this, content repositories are used by content management systems (CMS), document
management systems (DMS), and other applications that manage electronic files (e.g., documents, images, multi-media, web
content, etc.) and metadata associated with them (e.g., author, date, status, security information, etc.). The
- <ulink url="http://www.jcp.org/en/jsr/detail?id=170">Content Repository for Java technology API</ulink>
+ <ulink url="&JSR170;">Content Repository for Java technology API</ulink>
provides a standard Java API for working with content repositories. Abbreviated "JCR", this API was developed as part of the
Java Community Process under
- <ulink url="http://www.jcp.org/en/jsr/detail?id=170">JSR-170</ulink>
+ <ulink url="&JSR170;">JSR-170</ulink>
and is being revised under
- <ulink url="http://www.jcp.org/en/jsr/detail?id=283">JSR-283</ulink>
+ <ulink url="&JSR283;">JSR-283</ulink>
.
</para>
<para>
@@ -179,17 +182,17 @@
<title>Project roadmap</title>
<para>
The roadmap for JBoss DNA is managed in the project's
- <ulink url="https://jira.jboss.org/jira/browse/DNA">JIRA instance</ulink>
+ <ulink url="&JIRA;">JIRA instance</ulink>
. The roadmap shows the different tasks, requirements, issues and other activities that have been targeted to each of the
upcoming releases. (The
- <ulink url="https://jira.jboss.org/jira/browse/DNA?report=com.atlassian.jira.plugin.s...">roadmap report</ulink>
+ <ulink url="&JIRA;?report=com.atlassian.jira.plugin.system.project:roadmap-panel">roadmap report</ulink>
always shows the next three releases.)
</para>
<para>
By convention, JIRA issues not immediately targeted to a release will be reviewed periodically to determine the
appropriate release where they can be targeted. Any issue that is reviewed and that does not fit in a known release will
be targeted to the
- <ulink url="https://jira.jboss.org/jira/browse/DNA?report=com.atlassian.jira.plugin.s...">Future Releases</ulink>
+ <ulink url="&JIRA;?report=com.atlassian.jira.plugin.system.project:roadmap-panel">Future Releases</ulink>
bucket.
</para>
<para>
@@ -209,7 +212,7 @@
<itemizedlist>
<listitem>
<para>
- <emphasis role="strong"><ulink url="http://en.wikipedia.org/wiki/Agile_software_development">Agile software development</ulink></emphasis>
+ <emphasis role="strong"><ulink url="&Wikipedia;Agile_software_development">Agile software development</ulink></emphasis>
includes those software methodologies (e.g., Scrum) that promote development iterations and open collaboration. While the
JBoss DNA project doesn't follow these closely, we do emphasize the importance of always having running software
and using running software as a measure of progress. The JBoss DNA project also wants to move to more frequent
@@ -218,7 +221,7 @@
</listitem>
<listitem>
<para>
- <emphasis role="strong"><ulink url="http://en.wikipedia.org/wiki/Test-driven_development">Test-driven development (TDD)</ulink></emphasis>
+ <emphasis role="strong"><ulink url="&Wikipedia;Test-driven_development">Test-driven development (TDD)</ulink></emphasis>
techniques encourage first writing test cases for new features and functionality, then changing the code to add the
new features and functionality, and finally the code is refactored to clean-up and address any duplication or inconsistencies.
</para>
@@ -239,8 +242,8 @@
</listitem>
<listitem>
<para>
- <emphasis role="strong"><ulink url="http://en.wikipedia.org/wiki/Lean_software_development">Lean software development</ulink></emphasis>
- is an adaptation of <ulink url="http://en.wikipedia.org/wiki/Lean_manufacturing">lean manufacturing techniques</ulink>,
+ <emphasis role="strong"><ulink url="&Wikipedia;Lean_software_development">Lean software development</ulink></emphasis>
+ is an adaptation of <ulink url="&Wikipedia;Lean_manufacturing">lean manufacturing techniques</ulink>,
where emphasis is placed on eliminating waste (e.g., defects, unnecessary complexity, unnecessary code/functionality/features),
delivering as fast as passible, deferring irrevocable decisions as much as possible,
continuous learning (continuously adapting and improving the process), empowering the team (or community, in our case),
@@ -427,7 +430,7 @@
Each of these modules is a Maven project with a group ID of
<code>org.jboss.dna</code>
. All of these projects correspond to artifacts in the
- <ulink url="http://repository.jboss.com/maven2/">JBoss Maven 2 Repository</ulink>
+ <ulink url="&JBossMaven;">JBoss Maven 2 Repository</ulink>
.
</para>
</sect1>
Modified: trunk/docs/reference/src/main/docbook/en-US/content/jcr.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/jcr.xml 2008-09-22 22:58:15 UTC (rev 539)
+++ trunk/docs/reference/src/main/docbook/en-US/content/jcr.xml 2008-09-24 21:49:27 UTC (rev 540)
@@ -22,7 +22,10 @@
~ 51 Franklin Street, Fifth Floor
~ Boston, MA 02110-1301 USA
-->
-<!DOCTYPE preface PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
+<!DOCTYPE preface PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
+<!ENTITY % CustomDTD SYSTEM "../custom.dtd">
+%CustomDTD;
+]>
<chapter id="jcr">
<title>Content Repositories for Java (JCR)</title>
<para></para>
@@ -34,5 +37,44 @@
<title>Creating JCR sessions</title>
<para>Discuss how to obtain JCR sessions and how the credentials work. Also discuss that sessions should be created,
used, and closed.</para>
+ <para>But how does JAAS authentication work with the JCR API and the JBoss DNA JCR implementation?
+ In JCR, a &Session; represents our connection. So after we create a &JcrRepository; instance,
+ we just have to call one of the <code>login(...)</code> methods:
+ </para>
+ <programlisting role="JAVA"><![CDATA[
+JcrRepository jcrRepository = new JcrRepository(contextFactory, sources);
+Session session = jcrRepository.login(sourceName);
+ ]]></programlisting>
+ <para>Now, this code doesn't do any authentication; it essentially trusts the caller has the appropriate privileges.
+ Normally, your application will need to authenticate the user, so let's look at how that's done.
+ </para>
+ <para>The JCR API defines a &Credentials; marker interface, an instance of which can be passed to the
+ <code>&Session;.login(...)</code> method. Rather than provide a concrete implementation of this interface, JBoss DNA
+ allows you to pass any implementation of &Credentials; that also has one of the following methods:
+ <itemizedlist>
+ <listitem>
+ <para><code>getLoginContext()</code> that returns a &LoginContext; instance.</para>
+ </listitem>
+ <listitem>
+ <para><code>getAccessControlContext()</code> that returns a &AccessControlContext; instance.</para>
+ </listitem>
+ </itemizedlist>
+ This way, your application can obtain the JAAS &LoginContext; or &AccessControlContext; however it wants,
+ and then merely passes that into DNA through the JCR &Credentials;. No interfaces or classes specific to JBoss DNA are required.
+ </para>
+ <para>
+ The following code shows how this is done, using an anonymous inner class for the &Credentials; implementation.
+ </para>
+ <programlisting>
+&CallbackHandler; callbackHandler = // as needed by your app, according to JAAS
+final &LoginContext; loginContext = new &LoginContext;("MyAppContextName",callbackHandler);
+
+// Now pass to JBoss DNA to create a JCR Session ...
+&Credentials; credentials = new &Credentials;() {
+public &LoginContext; getLoginContext() { return loginContext; }
+};
+&JcrRepository; jcrRepository = new &JcrRepository;(contextFactory, sources);
+&Session; session = jcrRepository.login(credentials, sourceName);
+</programlisting>
</sect1>
</chapter>
Modified: trunk/docs/reference/src/main/docbook/en-US/content/legal_notice.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/legal_notice.xml 2008-09-22 22:58:15 UTC (rev 539)
+++ trunk/docs/reference/src/main/docbook/en-US/content/legal_notice.xml 2008-09-24 21:49:27 UTC (rev 540)
@@ -22,7 +22,10 @@
~ 51 Franklin Street, Fifth Floor
~ Boston, MA 02110-1301 USA
-->
-<!DOCTYPE legalnotice PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
+<!DOCTYPE preface PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
+<!ENTITY % CustomDTD SYSTEM "../custom.dtd">
+%CustomDTD;
+]>
<legalnotice id="Legal_Notice">
<title>Legal Notice</title>
<para>
Modified: trunk/docs/reference/src/main/docbook/en-US/content/mimetypes.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/mimetypes.xml 2008-09-22 22:58:15 UTC (rev 539)
+++ trunk/docs/reference/src/main/docbook/en-US/content/mimetypes.xml 2008-09-24 21:49:27 UTC (rev 540)
@@ -22,7 +22,10 @@
~ 51 Franklin Street, Fifth Floor
~ Boston, MA 02110-1301 USA
-->
-<!DOCTYPE preface PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
+<!DOCTYPE preface PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
+<!ENTITY % CustomDTD SYSTEM "../custom.dtd">
+%CustomDTD;
+]>
<chapter id="mimetypes">
<title>MIME types</title>
<para></para>
Modified: trunk/docs/reference/src/main/docbook/en-US/content/preface.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/preface.xml 2008-09-22 22:58:15 UTC (rev 539)
+++ trunk/docs/reference/src/main/docbook/en-US/content/preface.xml 2008-09-24 21:49:27 UTC (rev 540)
@@ -22,22 +22,23 @@
~ 51 Franklin Street, Fifth Floor
~ Boston, MA 02110-1301 USA
-->
-<!DOCTYPE preface PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
+<!DOCTYPE preface PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
+<!ENTITY % CustomDTD SYSTEM "../custom.dtd">
+%CustomDTD;
+]>
<preface id="preface">
<title>Target audience</title>
<para>
This guide is for the developers of JBoss DNA and those users that want to have a better understanding of how JBoss DNA
- works or how to extend the functionality. For a higher-level introduction to JBoss DNA, see the
- <ulink url="http://www.jboss.org/file-access/default/members/dna/freezone/docs/0.2/ma...">Getting Started</ulink>
- document.
+ works or how to extend the functionality. For a higher-level introduction to JBoss DNA, see the &GettingStarted; document.
</para>
<para>
If you have any questions or comments, please feel free to contact JBoss DNA's
- <ulink url="mailto:dna-users@jboss.org">user mailing list</ulink> or use the
- <ulink url="http://www.jboss.com/index.html?module=bb&op=viewforum&f=272">user forums</ulink>.
- If you'd like to get involved on the project, join the <ulink url="http://www.jboss.org/dna/lists.html">mailing lists</ulink>,
- <ulink url="http://www.jboss.org/dna/subversion.html">download the code</ulink> and get it building, and visit our
- <ulink url="http://jira.jboss.org/jira/browse/DNA">JIRA issue management system</ulink>.
+ <ulink url="&MailTo;">user mailing list</ulink> or use the
+ <ulink url="&Forums;">user forums</ulink>.
+ If you'd like to get involved on the project, join the <ulink url="&Home;lists.html">mailing lists</ulink>,
+ <ulink url="&Home;subversion.html">download the code</ulink> and get it building, and visit our
+ <ulink url="&JIRA;">JIRA issue management system</ulink>.
If there's something in particular you're interested in, talk with the community - there may be others interested in the
same thing.
</para>
Modified: trunk/docs/reference/src/main/docbook/en-US/content/repositories.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/repositories.xml 2008-09-22 22:58:15 UTC (rev 539)
+++ trunk/docs/reference/src/main/docbook/en-US/content/repositories.xml 2008-09-24 21:49:27 UTC (rev 540)
@@ -22,15 +22,200 @@
~ 51 Franklin Street, Fifth Floor
~ Boston, MA 02110-1301 USA
-->
-<!DOCTYPE preface PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
+<!DOCTYPE preface PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
+<!ENTITY % CustomDTD SYSTEM "../custom.dtd">
+%CustomDTD;
+]>
<chapter id="repositories">
<title>Repositories</title>
<para></para>
+ <para>There is a lot of information stored in many of different places: databases, repositories, SCM systems,
+ registries, file systems, services, etc. The purpose of the federation engine is to allow applications to use the JCR API
+ to access that information as if it were all stored in a single JCR repository, but to really leave the information where
+ it is.</para>
+ <para>Why not just copy or move the information into a JCR repository? Moving it is probably pretty difficult, since most
+ likely there are existing applications that rely upon that information being where it is. All of those applications
+ would break or have to change. And copying the information means that we'd have to continually synchronize the changes.
+ This not only is a lot of work, but it often creates issues with knowing which information is accurate.
+ </para>
+ <para>The JBoss DNA allows lets us leave information where it is, yet provide access to it through the JCR API.
+ The first benefit is that any existing applications that already use that information can keep using it.
+ Plus, if the underlying information changes, all the client applications see the correct information. JCR clients
+ even get the benefit of using JCR observation to be notified of the changes. And if a JBoss DNA repository is
+ configured to allow updates, client applications can change the information in the repository and JBoss DNA will propagate
+ those changes down to the original source.</para>
+ <sect1 id="connectors">
+ <title>Repository connectors</title>
+ <para>As we've mentioned above, one of the capabilities of JBoss DNA is to provide access through
+ <ulink url="&JSR170;">JCR</ulink> to different kinds of repositories and storage systems.
+ Your applications work with the JCR API, but through JBoss DNA are able to accesses the content from where the information
+ exists - not just a single purpose-built repository. This is fundamentally what makes JBoss DNA different.</para>
+ <para>How does JBoss DNA do this? At the heart of JBoss DNA and it's JCR implementation is a simple graph-based connector
+ system. Essentially, the JBoss DNA JCR implementation makes use of a single repository source, from which all the
+ content is accessed.
+ <figure id="dnajcr-and-connector">
+ <title>JBoss DNA's JCR implementation delegates to a repository source</title>
+ <graphic align="center" scale="100" fileref="dnajcr-and-connector.png"/>
+ </figure>
+ That single repository source could be an in-memory repository, a JBoss Cache instance, or a federated repository.
+ <figure id="dna-connectors-0.2">
+ <title>JBoss DNA can put JCR on top of multiple kinds of systems</title>
+ <graphic align="center" scale="100" fileref="dna-connectors-0.2.png"/>
+ </figure>
+ And the JBoss DNA project has plans to create other connectors, too. For instance, we're going to build a connector
+ to other JCR repositories. And another to a file system, so that the files and directories on an area of the file system
+ can be accessed through JCR. Of course, if we don't have a connector to suit your needs, you can write your own.
+ <figure id="dna-connectors-future">
+ <title>Future JBoss DNA connectors</title>
+ <graphic align="center" scale="100" fileref="dna-connectors-future.png"/>
+ </figure>
+ </para>
+ <para>Before we go further, let's define some terminology regarding connectors.</para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ A <emphasis role="strong">connector</emphasis> is the runnable code packaged in one or more JAR files that
+ contains implementations of several interfaces (described below). A Java developer <emphasis>writes</emphasis>
+ a connector to a type of source, such as a particular database management system, LDAP directory, source code
+ management system, etc. It is then packaged into one or more JAR files (including dependent JARs) and deployed
+ for use in applications that use JBoss DNA repositories.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ The description of a particular source system is called a <emphasis role="strong">repository source</emphasis>.
+ A connector contains a JavaBean class that implements the &RepositorySource; interface, with JavaBean properties for
+ all of the connector-specific properties required to fully describe a system. Applications that use JBoss DNA
+ create an instance that describes each external source that a repository is to access.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ A repository source instance is then used to establish <emphasis role="strong">connections</emphasis> to
+ that source. A connector provides an implementation of the &RepositoryConnection; interface, which
+ defines methods for interacting with the external system. In particular, the <code>execute(...)</code> method
+ takes an <code>ExecutionContext</code> instance and one or more <code>GraphCommand</code> objects describing the
+ operations that are to be executed against the graph of information the connector is exposing.
+ Examples of commands include getting a node, moving a node, creating a node, changing a node, and deleting a node.
+ And, if the repository source is able to participate in JTA/JTS distributed transactions, then the
+ &RepositoryConnection; must implement the <code>getXaResource()</code> method by returning
+ a valid <code>javax.transaction.xa.XAResource</code> object that can be used by the transaction monitor.
+ </para>
+ </listitem>
+ </itemizedlist>
+ <para>As an example, consider that we want JBoss DNA to give us access through JCR to the schema information contained in a
+ relational databases. We first have to develop a connector that allows us to interact with relational databases using JDBC.
+ That connector would contain a <code>JdbcRepositorySource</code> Java class that implements &RepositorySource;,
+ and that has all of the various JavaBean properties for setting the name of the driver class, URL, username, password,
+ and other properties. (Or we might have a JavaBean property that defines the JNDI name where we can find a JDBC
+ <code>DataSource</code> instance pointing to our JDBC database.)
+ </para>
+ <para>
+ That connector would also have a <code>JdbcRepositoryConnection</code> Java class that implements the
+ &RepositoryConnection; interface. This class would probably wrap a JDBC database connection,
+ and would implement the <code>execute(...)</code> method such that the nodes exposed by the connector
+ describe the database schema of the database. For example, the connector might represent each database table
+ as a node wit the table's name, with properties that describe the table (e.g., the description, whether it's a
+ temporary table), and with child nodes that represent each of the columns, keys and constraints.
+ </para>
+ <para>
+ To use the connector, we need to create an instance of the <classname>JdbcRepositorySource</classname> for each database instance
+ that we want to access. If we have 3 MySQL databases, 9 Oracle databases, and 4 PostgreSQL databases, then we'd need
+ to create a total of 16 <classname>JdbcRepositorySource</classname> instances, each with the properties describing a single database instance.
+ Those sources are then available for use by the JBoss DNA components, including <link linkend="jcr">JCR</link>.
+ </para>
+ <para>
+ So, we've so far learned what a repository connector is and how they're used to create &RepositorySource; instances.
+ In the <link linkend="repository-service">next section</link>, we'll show how these source instances can be configured,
+ managed, and their connections pooled.
+ </para>
+ </sect1>
<sect1 id="repository-service">
<title>Repository Service</title>
- <para></para>
+ <para>The JBoss DNA &RepositoryService; is the component that manages the <emphasis>repository sources</emphasis>
+ and the connections to them. &RepositorySource; instances can be programmatically added to the service, but
+ the service can actually read its configuration from a configuration repository (which is represented by a
+ &RepositorySource; instance that's usually added programmatically to the service). The service connects to
+ the configuration repository and automatically sets up the repositories given the &RepositorySource; instances
+ found in the configuration repository. It also transparently maintains for each source a pool of reusable connections.
+ </para>
+ <para>
+ To use a repository, then, involves simply asking the &RepositoryService; for a &RepositoryConnection;
+ to the repository given the repository's name. If a source exists with that name, the service checks out a connection from
+ the pool and returns it. The resulting connection is actually a wrapper around the underlying pooled connection - when
+ the returned connection is closed, it returns the underlying connection to the pool.
+ </para>
+ <para>To instantiate the &RepositoryService;, we need to first have a few other objects:
+ <itemizedlist>
+ <listitem>
+ <para>
+ A &ExecutionContextFactory; instance, as discussed <link linkend="execution-context">earlier</link>.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ A &RepositoryLibrary; instance that manages the list of &RepositorySource; instances,
+ properly injects the execution contexts into each repository source, and provides a configurable pool of connections
+ for each source.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ A <emphasis>configuration repository</emphasis> that contains descriptions of all of the repository sources
+ as well as any information those sources need. Because this is a regular repository, this could be a simple
+ repository with content loaded from an XML file (as in this example). Or it could be a shared
+ central repository with information about all of the JBoss DNA processes across your company.
+ </para>
+ </listitem>
+ </itemizedlist>
+ With these components in place, we can then instantiate the &RepositoryService; and start it (using its
+ &ServiceAdministrator;). During startup, the service reads the configuration repository and loads any
+ defined &RepositorySource; instances into the repository library, using the class loader factory
+ (available in the &ExecutionContext;) to obtain.
+ </para>
+ <para>
+ Here's sample code that shows how to set up and start the repository service. You can see something similar
+ in the example application in the <code>startRepositories()</code> method of the
+ <code>org.jboss.example.dna.repository.RepositoryClient</code> class.
+ </para>
+ <programlisting>
+ // Create the factory for execution contexts, and create one ...
+ &ExecutionContextFactory; contextFactory = new &BasicExecutionContextFactory;();
+ &ExecutionContext; context = contextFactory.create();
+
+ // Create the library for the RepositorySource instances ...
+ &RepositoryLibrary; sources = new &RepositoryLibrary;(contextFactory);
+
+ // Load into the source manager the repository source for the configuration repository ...
+ &InMemoryRepositorySource; configSource = new &InMemoryRepositorySource;();
+ configSource.setName("Configuration");
+ sources.addSource(configSource);
+
+ // Now instantiate the Repository Service ...
+ &RepositoryService; service = new &RepositoryService;(sources, configSource.getName(), context);
+ service.getAdministrator().start();
+ </programlisting>
+
+ <para>After startup completes, the repositories are ready to be used. The client application obtains the list of repositories
+ and presents them to the user. When the user selects one, the client application starts navigating that repository
+ starting at its root node (e.g., the "/" path). As you type a command to list the contents of the current node or to
+ "change directories" to a different node, the client application obtains the information for the node using a simple
+ procedure:
+ <orderedlist>
+ <listitem>
+ <para>Get a connection to the repository.</para>
+ </listitem>
+ <listitem>
+ <para>Using the connection, find the current node and read its properties and children, putting the information
+ into a simple Java plain old Java object (POJO).</para>
+ </listitem>
+ <listitem>
+ <para>Close the connection to the repository (in a finally block to ensure it always happens).</para>
+ </listitem>
+ </orderedlist>
+ </para>
</sect1>
- <sect1 id="connectors">
+ <sect1 id="connector-library">
<title>Repository connectors and sources</title>
<para></para>
<sect2 id="dna-connector-inmemory">
Deleted: trunk/docs/reference/src/main/docbook/en-US/content/security.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/security.xml 2008-09-22 22:58:15 UTC (rev 539)
+++ trunk/docs/reference/src/main/docbook/en-US/content/security.xml 2008-09-24 21:49:27 UTC (rev 540)
@@ -1,91 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- ~ JBoss, Home of Professional Open Source.
- ~
- ~ Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
- ~ indicated by the @author tags or express copyright attribution
- ~ statements applied by the authors. All third-party contributions are
- ~ distributed under license by Red Hat Middleware LLC.
- ~
- ~ This copyrighted material is made available to anyone wishing to use, modify,
- ~ copy, or redistribute it subject to the terms and conditions of the GNU
- ~ Lesser General Public License, as published by the Free Software Foundation.
- ~
- ~ This program is distributed in the hope that it will be useful,
- ~ but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- ~ or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
- ~ for more details.
- ~
- ~ You should have received a copy of the GNU Lesser General Public License
- ~ along with this distribution; if not, write to:
- ~ Free Software Foundation, Inc.
- ~ 51 Franklin Street, Fifth Floor
- ~ Boston, MA 02110-1301 USA
- -->
-<!DOCTYPE preface PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
-<chapter id="security">
- <title>Security</title>
- <para>
- JBoss DNA uses the
- <ulink url="http://java.sun.com/javase/technologies/security/">Java Authentication and Authorization Service (JAAS)</ulink>
- for its security mechanism. This offers the greatest flexibility and power for integrating JBoss DNA into other
- applications.
- </para>
- <sect1 id="jboss-security">
- <title>JBoss Security</title>
- <para>
- The
- <ulink url="http://www.jboss.org/jbosssecurity/">JBoss Security</ulink>
- provides one of the best and most powerful implementations of the JAAS specification - plus it's open source. JBoss
- Security offers a number of login modules, including:
- <itemizedlist>
- <listitem>
- <para>
- <emphasis role="strong">User-Roles Login Module</emphasis>
- is a simple
- <code>javax.security.auth.login.LoginContext</code>
- implementation that uses usernames and passwords stored in a properties file.
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis role="strong">Client Login Module</emphasis>
- prompts the user for their username and password.
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis role="strong">Database Server Login Module</emphasis>
- uses a JDBC database to authenticate principals and associate them with roles.
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis role="strong">LDAP Login Module</emphasis>
- uses an LDAP directory to authenticate principals. Two implementations are available.
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis role="strong">Certificate Login Module</emphasis>
- authenticates using X509 certificates, obtaining roles from either property files or a JDBC database.
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis role="strong">Operating System Login Module</emphasis>
- authenticates using the operating system's mechanism.
- </para>
- </listitem>
- </itemizedlist>
- and many others.
- </para>
- <para>
- JBoss Security also provides other capabilities, such as using XACML policies or using federated single sign-on. For more
- detail, see the
- <ulink url="http://www.jboss.org/jbosssecurity/">JBoss Security</ulink>
- project.
- </para>
- </sect1>
-</chapter>
-
Modified: trunk/docs/reference/src/main/docbook/en-US/content/sequencing.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/sequencing.xml 2008-09-22 22:58:15 UTC (rev 539)
+++ trunk/docs/reference/src/main/docbook/en-US/content/sequencing.xml 2008-09-24 21:49:27 UTC (rev 540)
@@ -22,49 +22,800 @@
~ 51 Franklin Street, Fifth Floor
~ Boston, MA 02110-1301 USA
-->
-<!DOCTYPE preface PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
+<!DOCTYPE preface PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
+<!ENTITY % CustomDTD SYSTEM "../custom.dtd">
+%CustomDTD;
+]>
<chapter id="sequencing">
<title>Sequencing content</title>
- <para></para>
+ <para>As we've mentioned before, JBoss DNA is able to work with existing JCR repositories. Your client applications
+ make changes to the information in those repositories, and JBoss DNA automatically uses its sequencers to extract
+ additional information from the uploaded files.</para>
+ <para>
+ This chapter discusses the sequencing features of JBoss DNA and the components that are involved.
+ </para>
<sect1 id="sequencing-service">
<title>Sequencing Service</title>
- <para></para>
+ <para>The JBoss DNA <emphasis>sequencing service</emphasis> is the component that manages the <emphasis>sequencers</emphasis>,
+ reacting to changes in JCR repositories and then running the appropriate sequencers.
+ This involves processing the changes on a node, determining which (if any) sequencers should be run on that node,
+ and for each sequencer constructing the execution environment, calling the sequencer, and saving the information
+ generated by the sequencer.</para>
+ <note>
+ <para>Configuring JBoss DNA services is a bit more manual than is ideal. As you'll see, JBoss DNA uses dependency
+ injection to allow a great deal of flexibility in how it can be configured and customized. But this flexibility
+ makes it more difficult for you to use. We understand this, and will soon provide a much easier way to set up
+ and manage JBoss DNA. Current plans are to use the <ulink url="http://www.jboss.org/jbossmc">JBoss Microcontainer</ulink>
+ along with a configuration repository.</para>
+ </note>
+ <para>To set up the sequencing service, an instance is created, and dependent components are injected into
+ the object. This includes among other things:
+ <itemizedlist>
+ <listitem>
+ <para>An <emphasis>execution context</emphasis> that defines the context in which the service runs, including
+ a factory for JCR sessions given names of the repository and workspace. This factory must be configured,
+ and is how JBoss DNA knows about your JCR repositories and how to connect to them. More on this a bit later.</para>
+ </listitem>
+ <listitem>
+ <para>An optional <emphasis>factory for class loaders</emphasis> used to load sequencers. If no factory is supplied,
+ the service uses the current thread's context class loader (or if that is null, the class loader that loaded the
+ sequencing service class).</para>
+ </listitem>
+ <listitem>
+ <para>An &ExecutorService; used to execute the sequencing activites. If none
+ is supplied, a new single-threaded executor is created by calling <code>Executors.newSingleThreadExecutor()</code>.
+ (This can easily be changed by subclassing and overriding the <code>SequencerService.createDefaultExecutorService()</code> method.)</para>
+ </listitem>
+ <listitem>
+ <para>Filters for sequencers and events. By default, all sequencers are considered for "node added", "property added"
+ and "property changed" events.</para>
+ </listitem>
+ </itemizedlist>
+ </para>
+ <para>As mentioned above, the &ExecutionContext; provides access to a &SessionFactory; that is used
+ by JBoss DNA to establish sessions to your JCR repositories. Two implementations are available:
+ <itemizedlist>
+ <listitem>
+ <para>The &JndiSessionFactory;> looks up JCR &Repository; instances in JNDI using
+ names that are supplied when creating sessions. This implementation also has methods to set the
+ JCR &Credentials; for a given workspace name.</para>
+ </listitem>
+ <listitem>
+ <para>The &SimpleSessionFactory; has methods to register the JCR &Repository; instances
+ with names, as well as methods to set the JCR &Credentials; for a given workspace name.</para>
+ </listitem>
+ </itemizedlist>
+ You can use the &BasicJcrExecutionContext; implementation of &JcrExecutionContext; and supply
+ a &SessionFactory; instance, or you can provide your own implementation.</para>
+ <para>Here's an example of how to instantiate and configure the &SequencingService;:</para>
+ <programlisting>
+&SimpleSessionFactory; sessionFactory = new &SimpleSessionFactory;();
+sessionFactory.registerRepository("Main Repository", this.repository);
+&Credentials; credentials = new &SimpleCredentials;("jsmith", "secret".toCharArray());
+sessionFactory.registerCredentials("Main Repository/Workspace1", credentials);
+ExecutionContext executionContext = new &BasicJcrExecutionContext;(sessionFactory);
+
+// Create the sequencing service, passing in the execution context ...
+&SequencingService; sequencingService = new &SequencingService;();
+sequencingService.setExecutionContext(executionContext);
+</programlisting>
+ <para>After the sequencing service is created and configured, it must be started. The &SequencingService;
+ has an <emphasis>administration object</emphasis> (that is an instance of &ServiceAdministrator;)
+ with <code>start()</code>, <code>pause()</code>, and <code>shutdown()</code> methods. The latter method will
+ close the queue for sequencing, but will allow sequencing operations already running to complete normally.
+ To wait until all sequencing operations have completed, simply call the <code>awaitTermination</code> method
+ and pass it the maximum amount of time you want to wait.</para>
+ <programlisting>
+sequencingService.getAdministrator().start();
+</programlisting>
+ <para>The JBoss DNA services are utilizing resources and threads that must be released before your application is ready to shut down.
+ The safe way to do this is to simply obtain the &ServiceAdministrator; for each service (via the <code>getServiceAdministrator()</code> method)
+ and call <code>shutdown()</code>. As previously mentioned, the shutdown method will simply prevent new work from being processed
+ and will not wait for existing work to be completed. If you want to wait until the service completes all its work, you must wait
+ until the service terminates. Here's an example that shows how this is done:</para>
+ <programlisting>
+// Shut down the service and wait until it's all shut down ...
+sequencingService.getAdministrator().shutdown();
+sequencingService.getAdministrator().awaitTermination(5, TimeUnit.SECONDS);
+
+// Shut down the observation service ...
+observationService.getAdministrator().shutdown();
+observationService.getAdministrator().awaitTermination(5, TimeUnit.SECONDS);
+</programlisting>
</sect1>
+ <sect1 id="sequencer-configuration">
+ <title>Sequencer Configurations</title>
+ <para>The sequencing service must also be configured with the sequencers that it will use. This is done using the
+ <code>addSequencer(SequencerConfig)</code> method and passing a &SequencerConfig; instance that
+ you create. Here's the code that defines 3 sequencer configurations: 1 that places image metadata into
+ "<code><![CDATA[/images/<filename>]]></code>", another that places MP3 metadata into "<code><![CDATA[/mp3s/<filename>]]></code>",
+ and a third that places a structure that represents the classes, methods, and attributes found within Java source into
+ "<code><![CDATA[/java/<filename>]]></code>".</para>
+ <programlisting>
+String name = "Image Sequencer";
+String desc = "Sequences image files to extract the characteristics of the image";
+String classname = "org.jboss.dna.sequencer.images.ImageMetadataSequencer";
+String[] classpath = null; // Use the current classpath
+String[] pathExpressions = {"//(*.(jpg|jpeg|gif|bmp|pcx|png)[*])/jcr:content[@jcr:data] => /images/$1"};
+&SequencerConfig; imageSequencerConfig = new &SequencerConfig;(name, desc, classname,
+ classpath, pathExpressions);
+sequencingService.addSequencer(imageSequencerConfig);
+
+name = "MP3 Sequencer";
+desc = "Sequences MP3 files to extract the ID3 tags from the audio file";
+classname = "org.jboss.dna.sequencer.mp3.Mp3MetadataSequencer";
+pathExpressions = {"//(*.mp3[*])/jcr:content[@jcr:data] => /mp3s/$1"};
+&SequencerConfig; mp3SequencerConfig = new &SequencerConfig;(name, desc, classname,
+ classpath, pathExpressions);
+sequencingService.addSequencer(mp3SequencerConfig);
+
+name = "Java Sequencer";
+desc = "Sequences java files to extract the characteristics of the Java source";
+classname = "org.jboss.dna.sequencer.java.JavaMetadataSequencer";
+pathExpressions = {"//(*.java[*])/jcr:content[@jcr:data] => /java/$1"};
+&SequencerConfig; javaSequencerConfig = new &SequencerConfig;(name, desc, classname,
+ classpath, pathExpressions);
+this.sequencingService.addSequencer(javaSequencerConfig);
+</programlisting>
+ <para>Each configuration defines several things, including the name, description, and sequencer implementation class.
+ The configuration also defines the classpath information, which can be passed to the &ClassLoaderFactory; to get
+ a Java &ClassLoader; with which the sequencer class can be loaded. (If no classpath information is provided, as is done
+ in the code above, the application class loader is used.) The configuration also specifies the path expressions that
+ identify the nodes that should be sequenced with the sequencer and where to store the output generated by the sequencer.
+ Path expressions are pretty straightforward but are quite powerful, so before we go any further with the example,
+ let's dive into path expressions in more detail.</para>
+ <sect2 id="path_expressions">
+ <title>Path Expressions</title>
+ <para>Path expressions consist of two parts: a selection criteria (or an input path) and an output path:</para>
+ <programlisting><![CDATA[ inputPath => outputPath ]]></programlisting>
+ <para>The <emphasis>inputPath</emphasis> part defines an expression for the path of a node that is to be sequenced.
+ Input paths consist of '<code>/</code>' separated segments, where each segment represents a pattern for a single node's
+ name (including the same-name-sibling indexes) and '<code>@</code>' signifies a property name.</para>
+ <para>Let's first look at some simple examples:</para>
+ <table frame='all'>
+ <title>Simple Input Path Examples</title>
+ <tgroup cols='2' align='left' colsep='1' rowsep='1'>
+ <colspec colname='c1' colwidth="1*"/>
+ <colspec colname='c2' colwidth="1*"/>
+ <thead>
+ <row>
+ <entry>Input Path</entry>
+ <entry>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row><entry>/a/b</entry><entry>Match node "<code>b</code>" that is a child of the top level node "<code>a</code>". Neither node
+ may have any same-name-sibilings.</entry></row>
+ <row><entry>/a/*</entry><entry>Match any child node of the top level node "<code>a</code>".</entry></row>
+ <row><entry>/a/*.txt</entry><entry>Match any child node of the top level node "<code>a</code>" that also has a name ending in "<code>.txt</code>".</entry></row>
+ <row><entry>/a/*.txt</entry><entry>Match any child node of the top level node "<code>a</code>" that also has a name ending in "<code>.txt</code>".</entry></row>
+ <row><entry>/a/b@c</entry><entry>Match the property "<code>c</code>" of node "<code>/a/b</code>".</entry></row>
+ <row><entry>/a/b[2]</entry><entry>The second child named "<code>b</code>" below the top level node "<code>a</code>".</entry></row>
+ <row><entry>/a/b[2,3,4]</entry><entry>The second, third or fourth child named "<code>b</code>" below the top level node "<code>a</code>".</entry></row>
+ <row><entry>/a/b[*]</entry><entry>Any (and every) child named "<code>b</code>" below the top level node "<code>a</code>".</entry></row>
+ <row><entry>//a/b</entry><entry>Any node named "<code>b</code>" that exists below a node named "<code>a</code>", regardless
+ of where node "<code>a</code>" occurs. Again, neither node may have any same-name-sibilings.</entry></row>
+ </tbody>
+ </tgroup>
+ </table>
+ <para>With these simple examples, you can probably discern the most important rules. First, the '<code>*</code>' is a wildcard character
+ that matches any character or sequence of characters in a node's name (or index if appearing in between square brackets), and
+ can be used in conjunction with other characters (e.g., "<code>*.txt</code>").</para>
+ <para>Second, square brackets (i.e., '<code>[</code>' and '<code>]</code>') are used to match a node's same-name-sibiling index.
+ You can put a single non-negative number or a comma-separated list of non-negative numbers. Use '0' to match a node that has no
+ same-name-sibilings, or any positive number to match the specific same-name-sibling.</para>
+ <para>Third, combining two delimiters (e.g., "<code>//</code>") matches any sequence of nodes, regardless of what their names are
+ or how many nodes. Often used with other patterns to identify nodes at any level matching other patterns.
+ Three or more sequential slash characters are treated as two.</para>
+ <para>Many input paths can be created using just these simple rules. However, input paths can be more complicated. Here are some
+ more examples:</para>
+ <table frame='all'>
+ <title>More Complex Input Path Examples</title>
+ <tgroup cols='2' align='left' colsep='1' rowsep='1'>
+ <colspec colname='c1' colwidth="1*"/>
+ <colspec colname='c2' colwidth="1*"/>
+ <thead>
+ <row>
+ <entry>Input Path</entry>
+ <entry>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row><entry>/a/(b|c|d)</entry><entry>Match children of the top level node "<code>a</code>" that are named "<code>a</code>",
+ "<code>b</code>" or "<code>c</code>". None of the nodes may have same-name-sibling indexes.</entry></row>
+ <row><entry>/a/b[c/d]</entry><entry>Match node "<code>b</code>" child of the top level node "<code>a</code>", when node
+ "<code>b</code>" has a child named "<code>c</code>", and "<code>c</code>" has a child named "<code>d</code>".
+ Node "<code>b</code>" is the selected node, while nodes "<code>b</code>" and "<code>b</code>" are used as criteria but are not
+ selected.</entry></row>
+ <row><entry>/a(/(b|c|d|)/e)[f/g/@something]</entry><entry>Match node "<code>/a/b/e</code>", "<code>/a/c/e</code>", "<code>/a/d/e</code>",
+ or "<code>/a/e</code>" when they also have a child "<code>f</code>" that itself has a child "<code>g</code>" with property
+ "<code>something</code>". None of the nodes may have same-name-sibling indexes.</entry></row>
+ </tbody>
+ </tgroup>
+ </table>
+ <para>These examples show a few more advanced rules. Parentheses (i.e., '<code>(</code>' and '<code>)</code>') can be used
+ to define a set of options for names, as shown in the first and third rules. Whatever part of the selected node's path
+ appears between the parentheses is captured for use within the output path. Thus, the first input path in the previous table
+ would match node "<code>/a/b</code>", and "b" would be captured and could be used within the output path using "<code>$1</code>",
+ where the number used in the output path identifies the parentheses.</para>
+ <para>Square brackets can also be used to specify criteria on a node's properties or children. Whatever appears in between the square
+ brackets does not appear in the selected node.</para>
+ <para>Let's go back to the previous code fragment and look at the first path expression:</para>
+ <programlisting><![CDATA[ //(*.(jpg|jpeg|gif|bmp|pcx|png)[*])/jcr:content[@jcr:data] => /images/$1 ]]></programlisting>
+ <para>This matches a node named "<code>jcr:content</code>" with property "<code>jcr:data</code>" but no siblings with the same name,
+ and that is a child of a node whose name ends with "<code>.jpg</code>", "<code>.jpeg</code>", "<code>.gif</code>", "<code>.bmp</code>", "<code>.pcx</code>",
+ or "<code>.png</code>" that may have any same-name-sibling index. These nodes can appear at any level in the repository.
+ Note how the input path capture the filename (the segment containing the file extension), including any same-name-sibling index.
+ This filename is then used in the output path, which is where the sequenced content is placed.</para>
+ </sect2>
+ </sect1>
<sect1 id="sequencers">
<title>JBoss DNA Sequencers</title>
- <para></para>
+ <para>
+ JBoss DNA includes a number of sequencers "out of the box". These sequencers can be used within your application to sequence
+ a variety of common file formats. To use them, the only thing you have to do is define the appropriate sequencer configurations
+ and include the appropriate JAR files.
+ </para>
<sect2 id="dna-sequencer-images">
<title>Image sequencer</title>
- <para></para>
+ <para>
+ A sequencer that extracts metadata from JPEG, GIF, BMP, PCX, PNG, IFF, RAS, PBM, PGM, PPM and PSD image files.
+ This sequencer extracts the file format, image resolution, number of bits per pixel and optionally number of images, comments
+ and physical resolution, and then writes this information into the repository using the following structure:
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ <emphasis role="strong">image:metadata</emphasis> node of type <code>image:metadata</code>
+ </para>
+ </listitem>
+ <listitem>
+ <itemizedlist>
+ <listitem>
+ <para><emphasis role="strong">jcr:mimeType</emphasis> - optional string property for the mime type of the image</para>
+ </listitem>
+ <listitem>
+ <para><emphasis role="strong">jcr:encoding</emphasis> - optional string property for the encoding of the image</para>
+ </listitem>
+ <listitem>
+ <para><emphasis role="strong">image:formatName</emphasis> - string property for the name of the format</para>
+ </listitem>
+ <listitem>
+ <para><emphasis role="strong">image:width</emphasis> - optional integer property for the image's width in pixels</para>
+ </listitem>
+ <listitem>
+ <para><emphasis role="strong">image:height</emphasis> - optional integer property for the image's height in pixles</para>
+ </listitem>
+ <listitem>
+ <para><emphasis role="strong">image:bitsPerPixel</emphasis> - optional integer property for the number of bits per pixel</para>
+ </listitem>
+ <listitem>
+ <para><emphasis role="strong">image:progressive</emphasis> - optional boolean property specifying whether the image is stored in a progressive
+ (i.e., interlaced) form</para>
+ </listitem>
+ <listitem>
+ <para><emphasis role="strong">image:numberOfImages</emphasis> - optional integer property for the number of images stored in the file; defaults
+ to 1</para>
+ </listitem>
+ <listitem>
+ <para><emphasis role="strong">image:physicalWidthDpi</emphasis> - optional integer property for the physical width of the image in dots per inch</para>
+ </listitem>
+ <listitem>
+ <para><emphasis role="strong">image:physicalHeightDpi</emphasis> - optional integer property for the physical height of the image in dots per
+ inch</para>
+ </listitem>
+ <listitem>
+ <para><emphasis role="strong">image:physicalWidthInches</emphasis> - optional double property for the physical width of the image in inches</para>
+ </listitem>
+ <listitem>
+ <para><emphasis role="strong">image:physicalHeightInches</emphasis> - optional double property for the physical height of the image in inches</para>
+ </listitem>
+ </itemizedlist>
+ </listitem>
+ </itemizedlist>
+ <para>
+ This structure could be extended in the future to add EXIF and IPTC metadata as child nodes. For example, EXIF metadata is
+ structured as tags in directories, where the directories form something like namespaces, and which are used by different camera
+ vendors to store custom metadata. This structure could be mapped with each directory (e.g. "EXIF" or "Nikon Makernote" or
+ "IPTC") as the name of a child node, with the EXIF tags values stored as either properties or child nodes.
+ </para>
+ <para>
+ To use this sequencer, simply include the <code>dna-sequencer-images</code> JAR
+ in your application and configure the Sequencing Service to use this sequencer using something similar to:
+ </para>
+ <programlisting>
+String name = "Image Sequencer";
+String desc = "Sequences image files to extract the characteristics of the image";
+String classname = "org.jboss.dna.sequencer.images.ImageMetadataSequencer";
+String[] classpath = null; // Use the current classpath
+String[] pathExpressions = {"//(*.(jpg|jpeg|gif|bmp|pcx|png|iff|ras|pbm|pgm|ppm|psd)[*])/jcr:content[@jcr:data] => /images/$1"};
+&SequencerConfig; sequencerConfig = new &SequencerConfig;(name, desc, classname,
+ classpath, pathExpressions);
+sequencingService.addSequencer(sequencerConfig);
+</programlisting>
</sect2>
<sect2 id="dna-sequencer-msoffice">
<title>Microsoft Office document sequencer</title>
- <para></para>
+ <para>
+ This sequencer is included in JBoss DNA and processes Microsoft Office documents, including Excel spreadsheets
+ and PowerPoint presentations. With presentations, the sequencer extracts the slides, titles, text and slide thumbnails.
+ With spreadsheets, the sequencer extracts the names of the sheets. And, the sequencer extracts for all the files the
+ general file information, including the name of the author, title, keywords, subject, comments, and various dates.
+ </para>
+ <note>
+ <para>
+ Currently, Word documents are not supported. For more information and the latest status, see
+ <ulink url="&JIRA;-153">DNA-153</ulink>.
+ </para>
+ </note>
+ <para>
+ To use this sequencer, simply include the <code>dna-sequencer-msoffice</code> JAR and all of the
+ <ulink url="http://poi.apache.org/">POI</ulink> JARs
+ in your application and configure the Sequencing Service to use this sequencer using something similar to:
+ </para>
+ <programlisting>
+String name = "Microsoft Office Document Sequencer";
+String desc = "Sequences MS Office documents, including spreadsheets and presentations";
+String classname = "org.jboss.dna.sequencer.msoffice.MSOfficeMetadataSequencer";
+String[] classpath = null; // Use the current classpath
+String[] pathExpressions = {"//(*.(doc|docx|ppt|pps|xls)[*])/jcr:content[@jcr:data] => /msoffice/$1"};
+&SequencerConfig; sequencerConfig = new &SequencerConfig;(name, desc, classname,
+ classpath, pathExpressions);
+sequencingService.addSequencer(sequencerConfig);
+</programlisting>
</sect2>
<sect2 id="dna-sequencer-zip">
<title>ZIP archive sequencer</title>
- <para></para>
+ <para>
+ The ZIP file sequencer is included in JBoss DNA and extracts the files and folders contained in the ZIP archive file,
+ extracting the files and folders into the repository using JCR's <code>nt:file</code> and <code>nt:folder</code> node types.
+ </para>
+ <para>
+ To use this sequencer, simply include the <code>dna-sequencer-zip</code> JAR
+ in your application and configure the Sequencing Service to use this sequencer using something similar to:
+ </para>
+ <programlisting>
+String name = "ZIP Sequencer";
+String desc = "Sequences ZIP archives to extract the files and folders";
+String classname = "org.jboss.dna.sequencer.zip.ZipSequencer";
+String[] pathExpressions = {"//(*.zip[*])/jcr:content[@jcr:data] => /zips/$1"};
+&SequencerConfig; sequencerConfig = new &SequencerConfig;(name, desc, classname,
+ classpath, pathExpressions);
+this.sequencingService.addSequencer(sequencerConfig);
+</programlisting>
</sect2>
<sect2 id="dna-sequencer-java">
<title>Java source sequencer</title>
- <para>The JBoss DNA makes somes extensions available to clients and one of these extensions is the <emphasis role="strong">dna-sequence-java</emphasis>,
- the sequencer tool for java source.
- The Java source sequencer sequences any kind of java source with "*.java" extension and extras meaningful informations from this
- file. The tool may have the ability to sequence any type of java compilation units (class declaration, interface declaration,
- and enum declaration), that are stored in a content repository.
+ <para>
+ One of the sequencers that included in JBoss DNA is the <emphasis role="strong">dna-sequencer-java</emphasis> subproject.
+ This sequencer parses Java source code added to the repository and extracts the basic structure of the classes and enumerations
+ defined in the code.
+ This structure includes: the package structures, class declarations, class and member attribute declarations,
+ class and member method declarations with signature (but not implementation logic), enumerations with each enumeration literal value,
+ annotations, and JavaDoc information for all of the above.
+ After extracting this information from the source code, the sequencer then writes this structure into the repository,
+ where it can be further processed, analyzed, searched, navigated, or referenced.
+ </para>
+ <para>
+ To use this sequencer, simply include the <code>dna-sequencer-java</code> JAR (plus all of the JARs that it is dependent upon)
+ in your application and configure the Sequencing Service to use this sequencer using something similar to:
</para>
+ <programlisting>
+String name = "MP3 Sequencer";
+String desc = "Sequences MP3 files to extract the ID3 tags of the audio file";
+String classname = "org.jboss.dna.sequencer.mp3.Mp3MetadataSequencer";
+String[] pathExpressions = {"//(*.mp3[*])/jcr:content[@jcr:data] => /mp3s/$1"};
+&SequencerConfig; sequencerConfig = new &SequencerConfig;(name, desc, classname,
+ classpath, pathExpressions);
+this.sequencingService.addSequencer(sequencerConfig);
+</programlisting>
</sect2>
<sect2 id="dna-sequencer-mp3">
<title>MP3 audio file sequencer</title>
- <para></para>
+ <para>
+ Another sequencer that is included in JBoss DNA is the <emphasis role="strong">dna-sequencer-mp3</emphasis> sequencer project.
+ This sequencer processes MP3 audio files added to a repository and extracts the <ulink url="http://www.id3.org/">ID3</ulink>
+ metadata for the file, including the track's title, author, album name, year, and comment.
+ After extracting this information from the audio files, the sequencer then writes this structure into the repository,
+ where it can be further processed, analyzed, searched, navigated, or referenced.
+ </para>
+ <para>
+ To use this sequencer, simply include the <code>dna-sequencer-mp3</code> JAR and the <ulink url="http://www.jthink.net/jaudiotagger/">JAudioTagger</ulink>
+ library in your application and configure the Sequencing Service to use this sequencer using something similar to:
+ </para>
+ <programlisting>
+String name = "Java Sequencer";
+String desc = "Sequences java files to extract the characteristics of the Java source";
+String classname = "org.jboss.dna.sequencer.java.JavaMetadataSequencer";
+String[] classpath = null; // Use the current classpath
+String[] pathExpressions = {"//(*.java[*])/jcr:content[@jcr:data] => /java/$1"};
+&SequencerConfig; sequencerConfig = new &SequencerConfig;(name, desc, classname,
+ classpath, pathExpressions);
+this.sequencingService.addSequencer(sequencerConfig);
+</programlisting>
</sect2>
<sect2 id="dna-sequencer-cnd">
<title>JCR Compact Node Definition (CND) file sequencer</title>
- <para></para>
+ <para>
+ This sequencer is incomplete and is not currently usable. The purpose is to sequence JCR Compact Node Definition (CND) files
+ to extract the node definitions with their property definitions, and inserting these into the repository using JCR standard notation.
+ </para>
</sect2>
</sect1>
<sect1 id="custom-sequencers">
- <title>Writing custom sequencers</title>
- <para></para>
+ <title>Creating custom sequencers</title>
+ <para>The current release of JBoss DNA comes with six sequencers. However, it's very easy to create your own
+ sequencers and to then configure JBoss DNA to use them in your own application.
+ </para>
+ <para>
+ Creating a custom sequencer involves the following steps:
+ <itemizedlist>
+ <listitem>
+ <para>Create a Maven 2 project for your sequencer;</para>
+ </listitem>
+ <listitem>
+ <para>Implement the &StreamSequencer; interface with your own implementation, and create unit tests to verify
+ the functionality and expected behavior;</para>
+ </listitem>
+ <listitem>
+ <para>Add the sequencer configuration to the JBoss DNA &SequencingService; in your application
+ as described in the <link linkend="using_dna">previous chapter</link>; and</para>
+ </listitem>
+ <listitem>
+ <para>Deploy the JAR file with your implementation (as well as any dependencies), and make them available to JBoss DNA
+ in your application.</para>
+ </listitem>
+ </itemizedlist>
+ It's that simple.
+ </para>
+ <sect2 id="custom_sequencer_project">
+ <title>Creating the Maven 2 project</title>
+ <para>The first step is to create the Maven 2 project that you can use to compile your code and build the JARs.
+ Maven 2 automates a lot of the work, and since you're already <link linkend="maven">set up to use Maven</link>,
+ using Maven for your project will save you a lot of time and effort. Of course, you don't have to use Maven 2, but then you'll
+ have to get the required libraries and manage the compiling and building process yourself.</para>
+ <note>
+ <para>JBoss DNA may provide in the future a Maven archetype for creating sequencer projects. If you'd find this useful
+ and would like to help create it, please <link linkend="preface">join the community</link>.</para>
+ </note>
+ <note>
+ <para>The <emphasis role="strong">dna-sequencer-images</emphasis> project is a small, self-contained sequencer implementation that
+ has only the minimal dependencies. Starting with this project's source and modifying it to suit your needs may be the easiest way to get started.
+ See the subversion repository: <ulink url="&Subversion;trunk/extensions/dna-sequencer-images/">&Subversion;trunk/sequencers/dna-sequencer-images/</ulink>
+ </para>
+ </note>
+ <para>You can create your Maven project any way you'd like. For examples, see the <ulink url="http://maven.apache.org/guides/getting-started/index.html#How_do_I_make_m...">Maven 2 documentation</ulink>.
+ Once you've done that, just add the dependencies in your project's <code>pom.xml</code> dependencies section:</para>
+ <programlisting role="XML"><![CDATA[
+<dependency>
+ <groupId>org.jboss.dna</groupId>
+ <artifactId>dna-common</artifactId>
+ <version>0.1</version>
+</dependency>
+<dependency>
+ <groupId>org.jboss.dna</groupId>
+ <artifactId>dna-graph</artifactId>
+ <version>0.1</version>
+</dependency>
+<dependency>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-api</artifactId>
+</dependency>
+ ]]></programlisting>
+ <para>These are minimum dependencies required for compiling a sequencer. Of course, you'll have to add
+ other dependencies that your sequencer needs.</para>
+ <para>As for testing, you probably will want to add more dependencies, such as those listed here:</para>
+ <programlisting role="XML"><![CDATA[
+<dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>4.4</version>
+ <scope>test</scope>
+</dependency>
+<dependency>
+ <groupId>org.hamcrest</groupId>
+ <artifactId>hamcrest-library</artifactId>
+ <version>1.1</version>
+ <scope>test</scope>
+</dependency>
+<!-- Logging with Log4J -->
+<dependency>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-log4j12</artifactId>
+ <version>1.4.3</version>
+ <scope>test</scope>
+</dependency>
+<dependency>
+ <groupId>log4j</groupId>
+ <artifactId>log4j</artifactId>
+ <version>1.2.14</version>
+ <scope>test</scope>
+</dependency>
+ ]]></programlisting>
+ <para>Testing JBoss DNA sequencers does not require a JCR repository or the JBoss DNA services. (For more detail,
+ see the <link linkend="testing_custom_sequencers">testing section</link>.) However, if you want to do
+ integration testing with a JCR repository and the JBoss DNA services, you'll need additional dependencies for these libraries.</para>
+ <programlisting role="XML"><![CDATA[
+<dependency>
+ <groupId>org.jboss.dna</groupId>
+ <artifactId>dna-repository</artifactId>
+ <version>0.1</version>
+ <scope>test</scope>
+</dependency>
+<!-- Java Content Repository API -->
+<dependency>
+ <groupId>javax.jcr</groupId>
+ <artifactId>jcr</artifactId>
+ <version>1.0.1</version>
+ <scope>test</scope>
+</dependency>
+<!-- Apache Jackrabbit (JCR Implementation) -->
+<dependency>
+ <groupId>org.apache.jackrabbit</groupId>
+ <artifactId>jackrabbit-api</artifactId>
+ <version>1.3.3</version>
+ <scope>test</scope>
+ <!-- Exclude these since they are included in JDK 1.5 -->
+ <exclusions>
+ <exclusion>
+ <groupId>xml-apis</groupId>
+ <artifactId>xml-apis</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>xerces</groupId>
+ <artifactId>xercesImpl</artifactId>
+ </exclusion>
+ </exclusions>
+</dependency>
+<dependency>
+ <groupId>org.apache.jackrabbit</groupId>
+ <artifactId>jackrabbit-core</artifactId>
+ <version>1.3.3</version>
+ <scope>test</scope>
+ <!-- Exclude these since they are included in JDK 1.5 -->
+ <exclusions>
+ <exclusion>
+ <groupId>xml-apis</groupId>
+ <artifactId>xml-apis</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>xerces</groupId>
+ <artifactId>xercesImpl</artifactId>
+ </exclusion>
+ </exclusions>
+</dependency>
+ ]]></programlisting>
+ <para>At this point, your project should be set up correctly, and you're ready to move on to
+ <link linkend="custom_sequencer_implementation">writing the Java implementation</link> for your sequencer.</para>
+ </sect2>
+ <sect2 id="custom_sequencer_implementation">
+ <title>Implementing the StreamSequencer interface</title>
+ <para>After creating the project and setting up the dependencies, the next step is to create a Java class that implements
+ the &StreamSequencer; interface. This interface is very straightforward and involves a single method:</para>
+ <programlisting>
+public interface &StreamSequencer; {
+
+ /**
+ * Sequence the data found in the supplied stream, placing the output
+ * information into the supplied map.
+ *
+ * @param stream the stream with the data to be sequenced; never null
+ * @param output the output from the sequencing operation; never null
+ * @param progressMonitor the progress monitor that should be kept
+ * updated with the sequencer's progress and that should be
+ * frequently consulted as to whether this operation has been cancelled.
+ */
+ void sequence( &InputStream; stream, &SequencerOutput; output, &ProgressMonitor; progressMonitor );
+</programlisting>
+ <para>The job of a stream sequencer is to process the data in the supplied stream, and place into the &SequencerOutput;
+ any information that is to go into the JCR repository. JBoss DNA figures out when your sequencer should be called
+ (of course, using the sequencing configuration you'll add in a bit), and then makes sure the generated information
+ is saved in the correct place in the repository.
+ </para>
+ <para>The &SequencerOutput; class is fairly easy to use. There are basically two methods you need to call.
+ One method sets the property values, while the other sets references to other nodes in the repository. Use these
+ methods to describe the properties of the nodes you want to create, using relative paths for the nodes and
+ valid JCR property names for properties and references. JBoss DNA will ensure that nodes are created or updated
+ whenever they're needed.</para>
+ <programlisting>
+public interface &SequencerOutput; {
+
+ /**
+ * Set the supplied property on the supplied node. The allowable
+ * values are any of the following:
+ * - primitives (which will be autoboxed)
+ * - String instances
+ * - String arrays
+ * - byte arrays
+ * - InputStream instances
+ * - Calendar instances
+ *
+ * @param nodePath the path to the node containing the property;
+ * may not be null
+ * @param property the name of the property to be set
+ * @param values the value(s) for the property; may be empty if
+ * any existing property is to be removed
+ */
+ void setProperty( String nodePath, String property, Object... values );
+
+ /**
+ * Set the supplied reference on the supplied node.
+ *
+ * @param nodePath the path to the node containing the property;
+ * may not be null
+ * @param property the name of the property to be set
+ * @param paths the paths to the referenced property, which may be
+ * absolute paths or relative to the sequencer output node;
+ * may be empty if any existing property is to be removed
+ */
+ void setReference( String nodePath, String property, String... paths );
+}
+</programlisting>
+ <para>JBoss DNA will create nodes of type <code>nt:unstructured</code> unless you specify the value for the
+ <code>jcr:primaryType</code> property. You can also specify the values for the <code>jcr:mixinTypes</code> property
+ if you want to add mixins to any node.</para>
+ <para>For a complete example of a sequencer, let's look at the &ImageMetadataSequencer;
+ implementation:</para>
+ <programlisting>
+public class &ImageMetadataSequencer; implements &StreamSequencer; {
+
+ public static final String METADATA_NODE = "image:metadata";
+ public static final String IMAGE_PRIMARY_TYPE = "jcr:primaryType";
+ public static final String IMAGE_MIXINS = "jcr:mixinTypes";
+ public static final String IMAGE_MIME_TYPE = "jcr:mimeType";
+ public static final String IMAGE_ENCODING = "jcr:encoding";
+ public static final String IMAGE_FORMAT_NAME = "image:formatName";
+ public static final String IMAGE_WIDTH = "image:width";
+ public static final String IMAGE_HEIGHT = "image:height";
+ public static final String IMAGE_BITS_PER_PIXEL = "image:bitsPerPixel";
+ public static final String IMAGE_PROGRESSIVE = "image:progressive";
+ public static final String IMAGE_NUMBER_OF_IMAGES = "image:numberOfImages";
+ public static final String IMAGE_PHYSICAL_WIDTH_DPI = "image:physicalWidthDpi";
+ public static final String IMAGE_PHYSICAL_HEIGHT_DPI = "image:physicalHeightDpi";
+ public static final String IMAGE_PHYSICAL_WIDTH_INCHES = "image:physicalWidthInches";
+ public static final String IMAGE_PHYSICAL_HEIGHT_INCHES = "image:physicalHeightInches";
+
+ /**
+ * {@inheritDoc}
+ */
+ public void sequence( &InputStream; stream, &SequencerOutput; output,
+ &ProgressMonitor; progressMonitor ) {
+ progressMonitor.beginTask(10, &ImageSequencerI18n;.sequencerTaskName);
+
+ &ImageMetadata; metadata = new &ImageMetadata;();
+ metadata.setInput(stream);
+ metadata.setDetermineImageNumber(true);
+ metadata.setCollectComments(true);
+
+ // Process the image stream and extract the metadata ...
+ if (!metadata.check()) {
+ metadata = null;
+ }
+ progressMonitor.worked(5);
+ if (progressMonitor.isCancelled()) return;
+
+ // Generate the output graph if we found useful metadata ...
+ if (metadata != null) {
+ // Place the image metadata into the output map ...
+ output.setProperty(METADATA_NODE, IMAGE_PRIMARY_TYPE, "image:metadata");
+ // output.psetProperty(METADATA_NODE, IMAGE_MIXINS, "");
+ output.setProperty(METADATA_NODE, IMAGE_MIME_TYPE, metadata.getMimeType());
+ // output.setProperty(METADATA_NODE, IMAGE_ENCODING, "");
+ output.setProperty(METADATA_NODE, IMAGE_FORMAT_NAME, metadata.getFormatName());
+ output.setProperty(METADATA_NODE, IMAGE_WIDTH, metadata.getWidth());
+ output.setProperty(METADATA_NODE, IMAGE_HEIGHT, metadata.getHeight());
+ output.setProperty(METADATA_NODE, IMAGE_BITS_PER_PIXEL, metadata.getBitsPerPixel());
+ output.setProperty(METADATA_NODE, IMAGE_PROGRESSIVE, metadata.isProgressive());
+ output.setProperty(METADATA_NODE, IMAGE_NUMBER_OF_IMAGES, metadata.getNumberOfImages());
+ output.setProperty(METADATA_NODE, IMAGE_PHYSICAL_WIDTH_DPI, metadata.getPhysicalWidthDpi());
+ output.setProperty(METADATA_NODE, IMAGE_PHYSICAL_HEIGHT_DPI, metadata.getPhysicalHeightDpi());
+ output.setProperty(METADATA_NODE, IMAGE_PHYSICAL_WIDTH_INCHES, metadata.getPhysicalWidthInch());
+ output.setProperty(METADATA_NODE, IMAGE_PHYSICAL_HEIGHT_INCHES, metadata.getPhysicalHeightInch());
+ }
+
+ progressMonitor.done();
+ }
+}
+</programlisting>
+ <para>
+ Notice how the image metadata is extracted and the output graph is generated. A single node is created with the name <code>image:metadata</code>
+ and with the <code>image:metadata</code> node type. No mixins are defined for the node, but several properties are set on the node
+ using the values obtained from the image metadata. After this method returns, the constructed graph will be saved to the repository
+ in all of the places defined by its configuration. (This is why only relative paths are used in the sequencer.)
+ </para>
+ <para>Also note how the progress monitor is used. Reporting progress through the supplied &ProgressMonitor;> is very easy, and it ensures that JBoss DNA
+ can accurately monitor and report the status of sequencing activities to the users. At the beginning of the operation, call
+ <code>beginTask(...)</code> with a meaningful message describing
+ the operation and a total for the amount of work that will be done by this sequencer. Then perform the sequencing work,
+ periodically reporting work by specifying the incremental amount of work with the <code>worked(double)</code> method, or
+ by creating a subtask with the <code>createSubtask(double)</code> method and reporting work against that subtask
+ monitor.
+ </para>
+ <para>Your method should periodically use the &ProgressMonitor;'s <code>isCancelled()</code> method to check whether the operation has been
+ cancelled.. If this method returns true, the implementation should abort all work as
+ soon as possible and close any resources that were acquired or opened.
+ </para>
+ <para>
+ Finally, when your sequencing operation is completed, it should call <code>done()</code> on the progress monitor.
+ </para>
+ </sect2>
+ <sect2 id="testing_custom_sequencers">
+ <title>Testing custom sequencers</title>
+ <para>The sequencing framework was designed to make testing sequencers much easier. In particular, the
+ &StreamSequencer; interface does not make use of the JCR API. So instead of requiring a fully-configured
+ JCR repository and JBoss DNA system, unit tests for a sequencer can focus on testing that the content is
+ processed correctly and the desired output graph is generated.</para>
+ <note>
+ <para>For a complete example of a sequencer unit test, see the <code>ImageMetadataSequencerTest</code> unit test
+ in the <code>org.jboss.dna.sequencer.images</code> package of the <code>dna-sequencers-image</code> project.
+ </para>
+ </note>
+ <para>The following code fragment shows one way of testing a sequencer, using JUnit 4.4 assertions and
+ some of the classes made available by JBoss DNA. Of course,
+ this example code does not do any error handling and does not make all the assertions a real test would.</para>
+ <programlisting>
+&StreamSequencer; sequencer = new &ImageMetadataSequencer;();
+MockSequencerOutput output = new MockSequencerOutput();
+&ProgressMonitor; progress = new &SimpleProgressMonitor;("Test activity");
+&InputStream; stream = null;
+try {
+ stream = this.getClass().getClassLoader().getResource("caution.gif").openStream();
+ sequencer.sequence(stream,output,progress); // writes to 'output'
+ assertThat(output.getPropertyValues("image:metadata", "jcr:primaryType"),
+ is(new Object[] {"image:metadata"}));
+ assertThat(output.getPropertyValues("image:metadata", "jcr:mimeType"),
+ is(new Object[] {"image/gif"}));
+ // ... make more assertions here
+ assertThat(output.hasReferences(), is(false));
+} finally {
+ stream.close();
+}
+</programlisting>
+ <para>It's also useful to test that a sequencer produces no output for something it should not understand:</para>
+ <programlisting>
+&Sequencer; sequencer = new &ImageMetadataSequencer;();
+MockSequencerOutput output = new MockSequencerOutput();
+&ProgressMonitor; progress = new &SimpleProgressMonitor;("Test activity");
+&InputStream; stream = null;
+try {
+ stream = this.getClass().getClassLoader().getResource("caution.pict").openStream();
+ sequencer.sequence(stream,output,progress); // writes to 'output'
+ assertThat(output.hasProperties(), is(false));
+ assertThat(output.hasReferences(), is(false));
+} finally {
+ stream.close();
+}
+</programlisting>
+ <para>These are just two simple tests that show ways of testing a sequencer. Some tests may get quite involved,
+ especially if a lot of output data is produced.
+ </para>
+ <para>It may also be useful to create some integration tests
+ that <link linkend="using_dna">configure JBoss DNA</link> to use a custom sequencer, and to then upload
+ content using the JCR API, verifying that the custom sequencer did run. However, remember that JBoss DNA
+ runs sequencers asynchronously in the background, and you must synchronize your tests to ensure that the
+ sequencers have a chance to run before checking the results. (One way of doing this (although, granted, not always reliable) is to wait for a second
+ after uploading your content, shutdown the &SequencingService; and await its termination,
+ and then check that the sequencer output has been saved to the JCR repository. For an example of this technique,
+ see the <code>SequencingClientTest</code> unit test in the example application.)
+ </para>
+ </sect2>
+ <sect2 id="deploying_custom_sequencers">
+ <title>Deploying custom sequencers</title>
+ <para>The first step of deploying a sequencer consists of adding/changing the sequencer configuration (e.g., &SequencerConfig;)
+ in the &SequencingService;. This was covered in the <link linkend="sequencing_service">previous chapter</link>.
+ </para>
+ <para>
+ The second step is to make the sequencer implementation available to JBoss DNA. At this time, the JAR containing
+ your new sequencer, as well as any JARs that your sequencer depends on, should be placed on your application classpath.</para>
+ <note>
+ <para>A future goal of JBoss DNA is to allow sequencers, connectors, and other extensions to be easily deployed into
+ a runtime repository. This process will not only be much simpler, but it will also provide JBoss DNA
+ with the information necessary to update configurations and create the appropriate class loaders for each extension.
+ Having separate class loaders for each extension helps prevent the pollution of the common classpath,
+ facilitates an isolated runtime environment to eliminate any dependency conflicts, and may potentially
+ enable hot redeployment of newer extension versions.
+ </para>
+ </note>
+ </sect2>
</sect1>
</chapter>
Modified: trunk/docs/reference/src/main/docbook/en-US/content/testing.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/testing.xml 2008-09-22 22:58:15 UTC (rev 539)
+++ trunk/docs/reference/src/main/docbook/en-US/content/testing.xml 2008-09-24 21:49:27 UTC (rev 540)
@@ -22,7 +22,10 @@
~ 51 Franklin Street, Fifth Floor
~ Boston, MA 02110-1301 USA
-->
-<!DOCTYPE preface PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
+<!DOCTYPE preface PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
+<!ENTITY % CustomDTD SYSTEM "../custom.dtd">
+%CustomDTD;
+]>
<chapter id="testing">
<title>Testing</title>
<para></para>
Added: trunk/docs/reference/src/main/docbook/en-US/custom.dtd
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/custom.dtd (rev 0)
+++ trunk/docs/reference/src/main/docbook/en-US/custom.dtd 2008-09-24 21:49:27 UTC (rev 540)
@@ -0,0 +1,90 @@
+<!ENTITY versionNumber "0.3">
+<!ENTITY copyrightYear "2008">
+<!ENTITY copyrightHolder "Red Hat Middleware, LLC.">
+
+<!-- Frequently used URLs -->
+
+<!ENTITY Home "http://www.jboss.org/dna/">
+<!ENTITY Downloads "&Home;downloads.html">
+<!ENTITY Community "&Home;community.html">
+<!ENTITY DocHome "http://www.jboss.org/file-access/default/members/dna/freezone/">
+<!ENTITY API "&DocHome;api/&versionNumber;/org/jboss/dna/">
+<!ENTITY JIRA "http://jira.jboss.org/jira/browse/DNA">
+<!ENTITY Subversion "http://anonsvn.jboss.org/repos/dna/">
+<!ENTITY Fisheye "http://fisheye.jboss.org/browse/DNA/">
+<!ENTITY SecureSubversion "https://svn.jboss.org/repos/dna/">
+<!ENTITY Forums "http://www.jboss.com/index.html?module=bb&op=viewforum&f=272">
+<!ENTITY JSR170 "http://www.jcp.org/en/jsr/detail?id=170">
+<!ENTITY JSR283 "http://www.jcp.org/en/jsr/detail?id=283">
+<!ENTITY MailTo "mailto:dna-users@jboss.org">
+<!ENTITY Wikipedia "http://en.wikipedia.org/wiki/">
+<!ENTITY JBossMaven "http://repository.jboss.com/maven2/">
+
+<!ENTITY Java "http://java.sun.com/j2se/1.5.0/docs/api/">
+
+<!ENTITY GettingStarted "<ulink url='&DocHome;docs/&versionNumber;/manuals/gettingstarted/html/index.html'>Getting Started</ulink>">
+
+<!-- Types in JRE -->
+
+<!ENTITY InputStream "<ulink url='&Java;java/io/InputStream.html'><interface>InputStream</interface></ulink>">
+<!ENTITY ClassLoader "<ulink url='&Java;java/lang/ClassLoader.html'><interface>ClassLoader</interface></ulink>">
+<!ENTITY AccessControlContext "<ulink url='&Java;java/security/AccessController.html'><classname>AccessControlContext</classname></ulink>">
+<!ENTITY LoginContext "<ulink url='&Java;javax/security/auth/login/LoginContext.html'><classname>LoginContext</classname></ulink>">
+<!ENTITY Subject "<ulink url='&Java;javax/security/auth/Subject.html'><classname>Subject</classname></ulink>">
+<!ENTITY CallbackHandler "<ulink url='&Java;javax/security/auth/callback/CallbackHandler.html'><interface>CallbackHandler</interface></ulink>">
+<!ENTITY ExecutorService "<ulink url='&Java;java/util/concurrent/ExecutorService.html'><interface>ExecutorService</interface></ulink>">
+
+<!-- Types in JCR API -->
+
+<!ENTITY Repository "<interface>Repository</interface>">
+<!ENTITY Session "<interface>Session</interface>">
+<!ENTITY Credentials "<interface>Credentials</interface>">
+
+<!-- Types in dna-common -->
+
+<!ENTITY Logger "<ulink url='&API;common/util/Logger.html'><interface>Logger</interface></ulink>">
+<!ENTITY ProgressMonitor "<ulink url='&API;common/monitor/ProgressMonitor.html'><interface>ProgressMonitor</interface></ulink>">
+<!ENTITY SimpleProgressMonitor "<ulink url='&API;common/monitor/SimpleProgressMonitor.html'><classname>SimpleProgressMonitor</classname></ulink>">
+<!ENTITY ClassLoaderFactory "<ulink url='&API;common/component/ClassLoaderFactory.html'><interface>ClassLoaderFactory</interface></ulink>">
+<!ENTITY StandardClassLoaderFactory "<ulink url='&API;common/component/ClassLoaderFactory.html'><classname>StandardClassLoaderFactory</classname></ulink>">
+
+<!-- Types in dna-graph -->
+
+<!ENTITY ExecutionContext "<ulink url='&API;graph/ExecutionContext.html'><interface>ExecutionContext</interface></ulink>">
+<!ENTITY ExecutionContextFactory "<ulink url='&API;graph/ExecutionContextFactory.html'><interface>ExecutionContextFactory</interface></ulink>">
+<!ENTITY BasicExecutionContext "<ulink url='&API;graph/BasicExecutionContext.html'><classname>BasicExecutionContext</classname></ulink>">
+<!ENTITY BasicExecutionContextFactory "<ulink url='&API;graph/BasicExecutionContextFactory.html'><classname>BasicExecutionContextFactory</classname></ulink>">
+<!ENTITY ValueFactories "<ulink url='&API;graph/properties/ValueFactories.html'><interface>ValueFactories</interface></ulink>">
+<!ENTITY NamespaceRegistry "<ulink url='&API;graph/properties/NamespaceRegistry.html'><interface>NamespaceRegistry</interface></ulink>">
+<!ENTITY PropertyFactory "<ulink url='&API;graph/properties/PropertyFactory.html'><interface>PropertyFactory</interface></ulink>">
+<!ENTITY RepositorySource "<ulink url='&API;graph/connectors/RepositorySource.html'><interface>RepositorySource</interface></ulink>">
+<!ENTITY RepositoryConnection "<ulink url='&API;graph/connectors/RepositoryConnection.html'><interface>RepositoryConnection</interface></ulink>">
+<!ENTITY StreamSequencer "<ulink url='&API;graph/sequencers/StreamSequencer.html'><interface>StreamSequencer</interface></ulink>">
+<!ENTITY SequencerOutput "<ulink url='&API;graph/sequencers/SequencerOutput.html'><interface>SequencerOutput</interface></ulink>">
+
+<!-- Types in dna-repository -->
+
+<!ENTITY RepositoryLibrary "<ulink url='&API;repository/RepositoryLibrary.html'><classname>RepositoryLibrary</classname></ulink>">
+<!ENTITY RepositoryService "<ulink url='&API;repository/RepositoryService.html'><classname>RepositoryService</classname></ulink>">
+<!ENTITY SequencingService "<ulink url='&API;repository/sequencers/SequencingService.html'><classname>SequencingService</classname></ulink>">
+<!ENTITY ServiceAdministrator "<ulink url='&API;repository/services/ServiceAdministrator.html'><interface>ServiceAdministrator</interface></ulink>">
+<!ENTITY SequencerConfig "<ulink url='&API;repository/sequencers/SequencerConfig.html'><classname>SequencerConfig</classname></ulink>">
+<!ENTITY SessionFactory "<ulink url='&API;repository/util/SessionFactory.html'><interface>SessionFactory</interface></ulink>">
+<!ENTITY JndiSessionFactory "<ulink url='&API;repository/util/JndiSessionFactory.html'><classname>JndiSessionFactory</classname></ulink>">
+<!ENTITY SimpleSessionFactory "<ulink url='&API;repository/util/SimpleSessionFactory.html'><classname>SimpleSessionFactory</classname></ulink>">
+<!ENTITY JcrExecutionContext "<ulink url='&API;repository/util/JcrExecutionContext.html'><interface>JcrExecutionContext</interface></ulink>">
+<!ENTITY BasicJcrExecutionContext "<ulink url='&API;repository/util/BasicJcrExecutionContext.html'><classname>BasicJcrExecutionContext</classname></ulink>">
+
+<!-- Types in dna-jcr -->
+
+<!ENTITY JcrRepository "<ulink url='&API;jcr/JcrRepository.html'><classname>JcrRepository</classname></ulink>">
+<!ENTITY JcrSession "<ulink url='&API;jcr/JcrSession.html'><classname>JcrSession</classname></ulink>">
+
+<!-- Types in extensions/ -->
+
+<!ENTITY InMemoryRepositorySource "<ulink url='&API;connector/inmemory/InMemoryRepositorySource.html'><classname>InMemoryRepositorySource</classname></ulink>">
+<!ENTITY FederatedRepositorySource "<ulink url='&API;connector/federated/FederatedRepositorySource.html'><classname>FederatedRepositorySource</classname></ulink>">
+<!ENTITY ImageMetadataSequencer "<ulink url='&API;sequencer/image/ImageMetadataSequencer.html'><classname>ImageMetadataSequencer</classname></ulink>">
+<!ENTITY ImageMetadata "<ulink url='&API;sequencer/image/ImageMetadata.html'><classname>ImageMetadata</classname></ulink>">
+<!ENTITY ImageSequencerI18n "<ulink url='&API;sequencer/image/ImageSequencerI18n.html'><classname>ImageSequencerI18n</classname></ulink>">
+
Added: trunk/docs/reference/src/main/docbook/en-US/images/dna-connectors-0.2.png
===================================================================
(Binary files differ)
Property changes on: trunk/docs/reference/src/main/docbook/en-US/images/dna-connectors-0.2.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: trunk/docs/reference/src/main/docbook/en-US/images/dna-connectors-future.png
===================================================================
(Binary files differ)
Property changes on: trunk/docs/reference/src/main/docbook/en-US/images/dna-connectors-future.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: trunk/docs/reference/src/main/docbook/en-US/images/dnajcr-and-connector.png
===================================================================
(Binary files differ)
Property changes on: trunk/docs/reference/src/main/docbook/en-US/images/dnajcr-and-connector.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Modified: trunk/docs/reference/src/main/docbook/en-US/master.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/master.xml 2008-09-22 22:58:15 UTC (rev 539)
+++ trunk/docs/reference/src/main/docbook/en-US/master.xml 2008-09-24 21:49:27 UTC (rev 540)
@@ -23,9 +23,8 @@
~ Boston, MA 02110-1301 USA
-->
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
-<!ENTITY versionNumber "0.3">
-<!ENTITY copyrightYear "2008">
-<!ENTITY copyrightHolder "Red Hat Middleware, LLC.">
+<!ENTITY % CustomDTD SYSTEM "custom.dtd">
+%CustomDTD;
]>
<book lang="en">
<bookinfo>
@@ -51,14 +50,14 @@
</bookinfo>
<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/preface.xml"/>
<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/introduction.xml"/>
- <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/development_environment.xml"/>
+ <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/development_tools.xml"/>
<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/classloaders.xml"/>
- <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/security.xml"/>
- <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/repositories.xml"/>
- <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/jcr.xml"/>
- <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/sequencing.xml"/>
- <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/mimetypes.xml"/>
- <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/configuration.xml"/>
- <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/testing.xml"/>
+ <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/environment.xml"/>
+ <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/repositories.xml"/>
+ <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/jcr.xml"/>
+ <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/sequencing.xml"/>
+ <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/mimetypes.xml"/>
+ <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/configuration.xml"/>
+ <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/testing.xml"/>
<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="content/future.xml"/>
</book>
Added: trunk/docs/reference/src/main/docbook/xslt/eclipse.xslt
===================================================================
--- trunk/docs/reference/src/main/docbook/xslt/eclipse.xslt (rev 0)
+++ trunk/docs/reference/src/main/docbook/xslt/eclipse.xslt 2008-09-24 21:49:27 UTC (rev 540)
@@ -0,0 +1,10 @@
+<?xml version="1.0"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
+ <xsl:import href="classpath:/xslt/org/jboss/eclipse.xsl" />
+
+ <xsl:param name="siteHref" select="'http://www.jboss.org/dna/'"/>
+ <xsl:param name="docHref" select="'http://www.jboss.org/dna/documentation.html'"/>
+ <xsl:param name="siteLinkText" select="'JBoss DNA - Unified Metadata Repository Framework and Tools'"/>
+
+ <xsl:param name="callout.defaultcolumn">1</xsl:param>
+</xsl:stylesheet>
Added: trunk/docs/reference/src/main/docbook/xslt/pdf.xslt
===================================================================
--- trunk/docs/reference/src/main/docbook/xslt/pdf.xslt (rev 0)
+++ trunk/docs/reference/src/main/docbook/xslt/pdf.xslt 2008-09-24 21:49:27 UTC (rev 540)
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ version="1.0">
+
+ <xsl:import href="http://docbook.sourceforge.net/release/xsl/1.72.0/fo/docbook.xsl" />
+ <xsl:import href="classpath:/xslt/org/jboss/pdf.xsl" />
+
+ <!-- Override the default font settings -->
+ <xsl:param name="body.font.family" select="'Times New Roman, serif'" />
+ <xsl:param name="monospace.font.family" select="'DejaVu Sans Mono, monospace'" />
+ <xsl:param name="sans.font.family" select="'Arial, sans-serif'" />
+ <xsl:param name="title.font.family" select="$body.font.family" />
+
+ <xsl:param name="programlisting.font" select="$monospace.font.family" />
+ <xsl:param name="programlisting.font.size" select="'75%'" />
+
+ <!-- Remove the blank pages between the chapters -->
+ <xsl:param name="double.sided" select="0" />
+
+ <!-- Use SVG for callout images instead of PNG -->
+ <xsl:param name="callout.graphics" select="1" />
+ <xsl:param name="callout.graphics.extension" select="'.svg'" />
+
+ <!-- Hide URL -->
+ <xsl:param name="ulink.show" select="0"/>
+
+ <!-- Don't use italic font for links -->
+ <xsl:attribute-set name="xref.properties">
+ <xsl:attribute name="font-style">normal</xsl:attribute>
+ </xsl:attribute-set>
+
+ <!-- Decrease the link font size in the program listing -->
+
+ <xsl:attribute-set name="monospace.properties">
+ <xsl:attribute name="font-size">1em</xsl:attribute>
+ <xsl:attribute name="font-family">
+ <xsl:value-of select="$monospace.font.family"/>
+ </xsl:attribute>
+ </xsl:attribute-set>
+
+ <!-- Add some spacing between callout listing items -->
+ <xsl:template match="callout">
+
+ <xsl:variable name="id"><xsl:call-template name="object.id"/></xsl:variable>
+ <fo:list-item id="{$id}" space-before="1em">
+ <fo:list-item-label end-indent="label-end()">
+ <fo:block>
+ <xsl:call-template name="callout.arearefs">
+ <xsl:with-param name="arearefs" select="@arearefs"/>
+ </xsl:call-template>
+ </fo:block>
+ </fo:list-item-label>
+
+ <fo:list-item-body start-indent="body-start()">
+ <fo:block padding-top="0.2em">
+ <xsl:apply-templates/>
+ </fo:block>
+ </fo:list-item-body>
+ </fo:list-item>
+ </xsl:template>
+
+ <!-- Slight baseline-shift for callouts in the program listing -->
+ <xsl:template name="callout-bug">
+
+ <xsl:param name="conum" select='1'/>
+ <xsl:choose>
+ <xsl:when test="$conum <= $callout.graphics.number.limit">
+ <xsl:variable name="filename"
+ select="concat($callout.graphics.path, $conum,
+ $callout.graphics.extension)"/>
+
+ <fo:external-graphic content-width="{$callout.icon.size}"
+ width="{$callout.icon.size}"
+ padding="0.0em" margin="0.0em"
+ baseline-shift="-0.375em">
+ <xsl:attribute name="src">
+ <xsl:choose>
+ <xsl:when test="$passivetex.extensions != 0
+ or $fop.extensions != 0
+ or $arbortext.extensions != 0">
+
+ <xsl:value-of select="$filename"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>url(</xsl:text>
+ <xsl:value-of select="$filename"/>
+ <xsl:text>)</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ </xsl:attribute>
+ </fo:external-graphic>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:template>
+</xsl:stylesheet>
+
Added: trunk/docs/reference/src/main/docbook/xslt/xhtml-single.xslt
===================================================================
--- trunk/docs/reference/src/main/docbook/xslt/xhtml-single.xslt (rev 0)
+++ trunk/docs/reference/src/main/docbook/xslt/xhtml-single.xslt 2008-09-24 21:49:27 UTC (rev 540)
@@ -0,0 +1,10 @@
+<?xml version="1.0"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
+ <xsl:import href="classpath:/xslt/org/jboss/xhtml-single.xsl" />
+
+ <xsl:param name="siteHref" select="'http://www.jboss.org/dna/'"/>
+ <xsl:param name="docHref" select="'http://www.jboss.org/dna/documentation.html'"/>
+ <xsl:param name="siteLinkText" select="'JBoss DNA - Unified Metadata Repository Framework and Tools'"/>
+
+ <xsl:param name="callout.defaultcolumn">1</xsl:param>
+</xsl:stylesheet>
Added: trunk/docs/reference/src/main/docbook/xslt/xhtml.xslt
===================================================================
--- trunk/docs/reference/src/main/docbook/xslt/xhtml.xslt (rev 0)
+++ trunk/docs/reference/src/main/docbook/xslt/xhtml.xslt 2008-09-24 21:49:27 UTC (rev 540)
@@ -0,0 +1,10 @@
+<?xml version="1.0"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
+ <xsl:import href="classpath:/xslt/org/jboss/xhtml.xsl" />
+
+ <xsl:param name="siteHref" select="'http://www.jboss.org/dna/'"/>
+ <xsl:param name="docHref" select="'http://www.jboss.org/dna/documentation.html'"/>
+ <xsl:param name="siteLinkText" select="'JBoss DNA - Unified Metadata Repository Framework and Tools'"/>
+
+ <xsl:param name="callout.defaultcolumn">1</xsl:param>
+</xsl:stylesheet>
15 years, 7 months
DNA SVN: r539 - trunk/docs/reference/src/main/docbook/en-US/content.
by dna-commits@lists.jboss.org
Author: rhauch
Date: 2008-09-22 18:58:15 -0400 (Mon, 22 Sep 2008)
New Revision: 539
Modified:
trunk/docs/reference/src/main/docbook/en-US/content/development_environment.xml
trunk/docs/reference/src/main/docbook/en-US/content/introduction.xml
Log:
DNA-71 Document development tools and environment
https://jira.jboss.org/jira/browse/DNA-71
Refactored the introduction and added chapter on the development environment to the Reference Guide.
Modified: trunk/docs/reference/src/main/docbook/en-US/content/development_environment.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/development_environment.xml 2008-09-19 20:26:37 UTC (rev 538)
+++ trunk/docs/reference/src/main/docbook/en-US/content/development_environment.xml 2008-09-22 22:58:15 UTC (rev 539)
@@ -26,6 +26,269 @@
<chapter id="development-environment">
<title>Developer environment and tooling</title>
<para>
- Discuss our use of Maven, Eclipse, coding styles/preferences, SVN, Hudson, etc.
+ The JBoss DNA project uses <link linkend="maven">Maven</link> as its primary build tool, <link linkend="svn">Subversion</link>
+ for its source code repository, <link linkend="jira">JIRA</link> for the issue management and bug tracking system,
+ and <link linkend="hudson">Hudson</link> for the continuous integration system. We do not stipulate a specific integrated
+ development environment (IDE), although most of us use <link linkend="eclipse">Eclipse</link> and rely upon the code formatting
+ and compile preferences to ensure no warnings or errors.
</para>
+ <para>
+ The rest of this chapter talks in more detail about these different tools and how to set them up.
+ </para>
+ <sect1 id="jdk">
+ <title>JDK</title>
+ <para>
+ Currently, JBoss DNA is developed and built using <ulink url="http://java.sun.com/javase/downloads/index_jdk5.jsp">JDK 5</ulink>,
+ so if you're a contributor, you should have that installed and should use it before committing any changes. Note that you
+ should be able to use the <ulink url="http://java.sun.com/javase/downloads/index.jsp">latest JDK</ulink> (which is currently
+ JDK 6).
+ </para>
+ <para>
+ Why do we build using JDK 5 and not 6? The main reason is that if we were to use JDK 6, then JBoss DNA couldn't really be used in any
+ applications or projects that still used JDK 5. Plus, anybody using JDK 6 can still use JBoss DNA.
+ However, considering that the end-of-life for Java 5 is
+ <ulink url="http://java.sun.com/products/archive/eol.policy.html">October 2009</ulink>, we may be switching to
+ Java 6 in the coming months.
+ </para>
+ <para>
+ When installing, simply follow the procedure for your particular platform. On most platforms, this should set the
+ <code>JAVA_HOME</code> environment variable. But if you run into any problems, first check that this environment
+ variable was set to the correct location, and then check that you're running the version you expect by running
+ the following command:
+ </para>
+ <programlisting role="XML"><![CDATA[ java -version ]]></programlisting>
+ <para>
+ If you don't see the correct version, double-check your installation.
+ </para>
+ </sect1>
+ <sect1 id="svn">
+ <title>Subversion</title>
+ <para>JBoss DNA uses Subversion as its source code management system, and specifically the instance at
+ <ulink url="http://www.jboss.org">JBoss.org</ulink>. Although you can view the
+ <ulink url="http://anonsvn.jboss.org/repos/dna/trunk/">trunk</ulink> of the Subversion repository
+ (or using <ulink url="http://fisheye.jboss.org/browse/DNA/trunk">FishEye</ulink>) through your browser,
+ it order to get more than just a few files of the latest version of the source code, you probably want
+ to have an SVN client installed. Several IDE's have SVN support included (or available as plugins),
+ but having the command-line SVN client is recommended. See
+ <ulink url="http://subversion.tigris.org/">http://subversion.tigris.org/</ulink> for downloads and instructions for your
+ particular platform.
+ </para>
+ <para>
+ Here are some useful URLs for the JBoss DNA Subversion:
+ </para>
+ <table frame='all'>
+ <title>SVN URLs for JBoss DNA</title>
+ <tgroup cols='2' align='left' colsep='1' rowsep='1'>
+ <colspec colname='c1' colwidth="1*"/>
+ <colspec colname='c2' colwidth="1*"/>
+ <thead>
+ <row>
+ <entry>Repository</entry>
+ <entry>URL</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>Anonymous Access URL</entry>
+ <entry><ulink url="http://anonsvn.jboss.org/repos/dna/trunk">http://anonsvn.jboss.org/repos/dna/trunk</ulink></entry>
+ </row>
+ <row>
+ <entry>Secure Developer Access URL</entry>
+ <entry><ulink url="https://svn.jboss.org/repos/dna/trunk/">https://svn.jboss.org/repos/dna/trunk/</ulink></entry>
+ </row>
+ <row>
+ <entry>FishEye Code Browser</entry>
+ <entry><ulink url="http://fisheye.jboss.org/browse/DNA/trunk">http://fisheye.jboss.org/browse/DNA/trunk</ulink></entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+ </sect1>
+ <sect1 id="maven">
+ <title>Maven</title>
+ <para>JBoss DNA uses Maven 2 for its build system, as is this example. Using Maven 2 has several advantages, including
+ the ability to manage dependencies. If a library is needed, Maven automatically finds and downloads that library, plus
+ everything that library needs. This means that it's very easy to build the examples - or even create a maven project that
+ depends on the JBoss DNA JARs.</para>
+ <para>
+ To use Maven with JBoss DNA, you'll need to have <link linkend="jdk">JDK 5 or 6</link> and Maven 2.0.9 (or higher).</para>
+ <para>
+ Maven can be downloaded from <ulink url="http://maven.apache.org/">http://maven.apache.org/</ulink>, and is installed by unzipping the
+ <code>maven-2.0.7-bin.zip</code> file to a convenient location on your local disk. Simply add <code>$MAVEN_HOME/bin</code>
+ to your path and add the following profile to your <code>~/.m2/settings.xml</code> file:
+ </para>
+ <programlisting role="XML"><![CDATA[
+<settings>
+ <profiles>
+ <profile>
+ <id>jboss.repository</id>
+ <activation>
+ <property>
+ <name>!jboss.repository.off</name>
+ </property>
+ </activation>
+ <repositories>
+ <repository>
+ <id>snapshots.jboss.org</id>
+ <url>http://snapshots.jboss.org/maven2</url>
+ <snapshots>
+ <enabled>true</enabled>
+ </snapshots>
+ </repository>
+ <repository>
+ <id>repository.jboss.org</id>
+ <url>http://repository.jboss.org/maven2</url>
+ <snapshots>
+ <enabled>false</enabled>
+ </snapshots>
+ </repository>
+ </repositories>
+ <pluginRepositories>
+ <pluginRepository>
+ <id>repository.jboss.org</id>
+ <url>http://repository.jboss.org/maven2</url>
+ <snapshots>
+ <enabled>false</enabled>
+ </snapshots>
+ </pluginRepository>
+ <pluginRepository>
+ <id>snapshots.jboss.org</id>
+ <url>http://snapshots.jboss.org/maven2</url>
+ <snapshots>
+ <enabled>true</enabled>
+ </snapshots>
+ </pluginRepository>
+ </pluginRepositories>
+ </profile>
+ </profiles>
+</settings>
+]]></programlisting>
+ <para>This profile informs Maven of the two JBoss repositories (<ulink url="http://repository.jboss.org/maven2">snapshots</ulink>
+ and <ulink url="http://snapshots.jboss.org/maven2">releases</ulink>) that contain all of the JARs for JBoss DNA and all dependent libraries.
+ </para>
+ <note>
+ <para>
+ It is a policy of the project that the <emphasis>source code and JARs</emphasis> for <emphasis>all</emphasis> dependencies
+ <emphasis>must</emphasis> be loaded into the JBoss repository. This is so that the project can always be built
+ and that all source code is always available.
+ </para>
+ <para>
+ For more information about the JBoss Maven repository, see the <ulink url="http://wiki.jboss.org/wiki/Maven">JBoss.org Wiki</ulink>.
+ </para>
+ </note>
+ <para>
+ There are just a few commands that are useful for building JBoss DNA (and it's <link linkend="modules">subprojects</link>).
+ Usually, these are issued while at the top level of the code (usually just below <code>trunk/</code>), although issuing
+ them inside a subproject just applies to that subproject.
+ </para>
+ <table frame='all'>
+ <title>Useful Maven commands</title>
+ <tgroup cols='2' align='left' colsep='1' rowsep='1'>
+ <colspec colname='c1' colwidth="1*"/>
+ <colspec colname='c2' colwidth="1*"/>
+ <thead>
+ <row>
+ <entry>Command</entry>
+ <entry>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry><code>mvn clean</code></entry>
+ <entry>Clean up all built artifacts (e.g., the <code>target/</code> directory in each project)</entry>
+ </row>
+ <row>
+ <entry><code>mvn clean install</code></entry>
+ <entry>Clean up all built artifacts, then compile, run the unit tests, and install the resulting JAR artifact(s)
+ into your local Maven repository (e.g, usually <code>~/.m2/repository</code>).
+ </entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+ </sect1>
+ <sect1 id="hudson">
+ <title>Continuous integration with Hudson</title>
+ <para>JBoss DNA's continuous integration is done with several Hudson jobs on <ulink url="http://www.jboss.org">JBoss.org</ulink>.
+ These jobs run periodically and basically run the Maven build process. Any build failures or test failures are reported,
+ as are basic statistics and history for each job.
+ </para>
+ <table frame='all'>
+ <title>Continuous integration jobs</title>
+ <tgroup cols='2' align='left' colsep='1' rowsep='1'>
+ <colspec colname='c1' colwidth="1*"/>
+ <colspec colname='c2' colwidth="1*"/>
+ <thead>
+ <row>
+ <entry>Job</entry>
+ <entry>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry><ulink url="http://hudson.jboss.org/hudson/job/DNA%20continuous%20on%20JDK1.5/">Continuous on JDK 5</ulink></entry>
+ <entry>Continuous build that runs after changes are committed to SVN. SVN is polled every 15 minutes.</entry>
+ </row>
+ <row>
+ <entry><ulink url="http://hudson.jboss.org/hudson/job/DNA%20nightly%20integration%20on%20JDK...">Nightly on JDK 5</ulink></entry>
+ <entry>Build that runs every night (about 2 a.m. EDT), regardless of whether changes have been committed to SVN
+ since the previous night.</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+ </sect1>
+ <sect1 id="eclipse">
+ <title>Eclipse IDE</title>
+ <para>Many of the JBoss DNA committers use the Eclipse IDE, and all project files required by Eclipse are committed in SVN, making
+ it pretty easy to get an Eclipse workspace running with all of the JBoss DNA projects.
+ Many of the JBoss DNA committers use the Eclipse IDE, and all project files required by Eclipse are committed in SVN, making
+ it pretty easy to get an Eclipse workspace running with all of the JBoss DNA projects.
+ </para>
+ <para>We're using the latest released version of Eclipse (3.4, called "Ganymede"),
+ available from <ulink url="http://www.eclipse.org/">Eclipse.org</ulink>. Simply follow the instructions for your platform.
+ </para>
+ <para>
+ After Eclipse is installed, create a new workspace. Before importing the JBoss DNA projects, import (via "File->Import->Preferences")
+ the subset of the Eclipse preferences by importing the <code>eclipse-preferences.epf</code> file (located under <code>trunk</code>).
+ Then, open the Eclipse preferences and open the "Java->Code Style-> Formatter" preference page, and press the "Import" button and
+ choose the <code>eclipse-code-formatter-profile.xml</code> file (located under <code>trunk</code>). This will load the code
+ formatting preferences for the JBoss DNA project.
+ </para>
+ <para>
+ Then install Eclipse plugins for SVN and Maven. (Remember, you will have to restart Eclipse after installing them.)
+ We use the following plugins:
+ </para>
+ <table frame='all'>
+ <title>Continuous integration jobs</title>
+ <tgroup cols='2' align='left' colsep='1' rowsep='1'>
+ <colspec colname='c1' colwidth="1*"/>
+ <colspec colname='c2' colwidth="1*"/>
+ <thead>
+ <row>
+ <entry>Eclipse Plugin Site</entry>
+ <entry>Update Site URL</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>Subversive SVN Client</entry>
+ <entry>
+ <ulink url="http://www.polarion.org/projects/subversive/download/eclipse/2.0/update-s...">http://www.polarion.org/projects/subversive/download/eclipse/2.0/update-s...</ulink>
+ <ulink url="http://www.polarion.org/projects/subversive/download/integrations/update-...">http://www.polarion.org/projects/subversive/download/integrations/update-...</ulink>
+ </entry>
+ </row>
+ <row>
+ <entry>Maven Integration for Eclipse</entry>
+ <entry><ulink url="http://m2eclipse.sonatype.org/update/">http://m2eclipse.sonatype.org/update/</ulink></entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+ <para>
+ After you check out the JBoss DNA codebase, you can import the JBoss DNA Maven projects into Eclipse as Eclipse projects.
+ To do this, go to "File->Import->Existing Projects", navigate to the <code>trunk/</code> folder in the import wizard,
+ and then check each of the <link linkend="modules">subprojects</link> that you want to have in your workspace.
+ </para>
+ </sect1>
</chapter>
Modified: trunk/docs/reference/src/main/docbook/en-US/content/introduction.xml
===================================================================
--- trunk/docs/reference/src/main/docbook/en-US/content/introduction.xml 2008-09-19 20:26:37 UTC (rev 538)
+++ trunk/docs/reference/src/main/docbook/en-US/content/introduction.xml 2008-09-22 22:58:15 UTC (rev 539)
@@ -25,83 +25,156 @@
<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
<chapter id="introduction">
<title>Introduction to JBoss DNA</title>
- <para>There are a lot of choices for how applications can store information persistently so that it can be accessed at a
- later time and by other processes. The challenge developers face is how to use an approach that most closely matches the
- needs of their application. This choice becomes more important as developers choose to focus their efforts on
- application-specific logic, delegating much of the responsibilities for persistence to libraries and frameworks.</para>
- <para>
- Perhaps one of the easiest techniques is to simply store information in
- <emphasis>files</emphasis>
- . The Java language makes working with files relatively easy, but Java really doesn't provide many bells and whistles. So
- using files is an easy choice when the information is either not complicated (for example property files), or when users may
- need to read or change the information outside of the application (for example log files or configuration files). But using
- files to persist information becomes more difficult as the information becomes more complex, as the volume of it increases,
- or if it needs to be accessed by multiple processes. For these situations, other techniques often offer better choices.
- </para>
- <para>
- Another technique built into the Java language is
- <emphasis>Java serialization</emphasis>
- , which is capable of persisting the state of an object graph so that it can be read back in at a later time. However, Java
- serialization can quickly become tricky if the classes are changed, and so it's beneficial usually when the information is
- persisted for a very short period of time. For example, serialization is sometimes used to send an object graph from one
- process to another.
- </para>
- <para>
- One of the more popular persistence technologies is the
- <emphasis>relational database</emphasis>
- . Relational database management systems have been around for decades and are very capable. The Java Database Connectivity
- (JDBC) API provides a standard interface for connecting to and interacting with relational databases. However, it is a
- low-level API that requires a lot of code to use correctly, and it still doesn't abstract away the DBMS-specific SQL
- grammar. Also, working with relational data in an object-oriented language can feel somewhat unnatural, so many developers
- map this data to classes that fit much more cleanly into their application. The problem is that manually creating this
- mapping layer requires a lot of repetitive and non-trivial JDBC code.
- </para>
- <para>
- <emphasis>Object-relational mapping</emphasis>
- libraries automate the creation of this mapping layer and result in far less code that is much more maintainable with
- performance that is often as good as (if not better than) handwritten JDBC code. The new
- <ulink url="http://java.sun.com/developer/technicalArticles/J2EE/jpa/">Java Persistence API (JPA)</ulink>
- provide a standard mechanism for defining the mappings (through annotations) and working with these entity objects. Several
- commercial and open-source libraries implement JPA, and some even offer additional capabilities and features that go beyond
- JPA. For example,
- <ulink url="http://www.hibernate.org">Hibernate</ulink>
- is one of the most feature-rich JPA implementations and offers object caching, statement caching, extra association
- mappings, and other features that help to improve performance and usefulness.
- </para>
- <para>
- While relational databases and JPA are solutions that work for many applications, they become more limited in cases when the
- information structure is highly flexible, is not known
- <emphasis>a priori</emphasis>
- , or is subject to frequent change and customization. In these situations,
- <emphasis>content repositories</emphasis>
- may offer a better choice for persistence. Content repositories are almost a hybrid between relational databases and file
- systems, and typically provide other capabilities as well, including versioning, indexing, search, access control,
- transactions, and observation. Because of this, content repositories are used by content management systems (CMS), document
- management systems (DMS), and other applications that manage electronic files (e.g., documents, images, multi-media, web
- content, etc.) and metadata associated with them (e.g., author, date, status, security information, etc.). The
- <ulink url="http://www.jcp.org/en/jsr/detail?id=170">Content Repository for Java technology API</ulink>
- provides a standard Java API for working with content repositories. Abbreviated "JCR", this API was developed as part of the
- Java Community Process under
- <ulink url="http://www.jcp.org/en/jsr/detail?id=170">JSR-170</ulink>
- and is being revised under
- <ulink url="http://www.jcp.org/en/jsr/detail?id=283">JSR-283</ulink>
- .
- </para>
- <para>
- The
- <emphasis>JBoss DNA project</emphasis>
- is building the tools and services that surround content repositories. Nearly all of these capabilities are to be hidden
- below the JCR API and involve automated processing of the information in the repository. Thus, JBoss DNA can add value to
- existing repository implementations. For example, JCR repositories offer the ability to upload files into the repository and
- have the file content indexed for search purposes. JBoss DNA also defines a library for "sequencing" content - to extract
- meaningful information from that content and store it in the repository, where it can then be searched, accessed, and
- analyzed using the JCR API.
- </para>
- <para> JBoss DNA is building other features as well. One goal of JBoss DNA is to create federated repositories that
- dynamically merge the information from multiple databases, services, applications, and other JCR repositories. Another is to
- create customized views based upon the type of data and the role of the user that is accessing the data. And yet another is
- to create a REST-ful API to allow the JCR content to be accessed easily by other applications written in other languages.
- </para>
+ <para>
+ The JBoss DNA project is building a unified metadata repository system that is <link linkend="jcr_intro">JCR-compliant</link>
+ and capable of federating information from a variety of back-end systems. To client applications, JBoss DNA looks and behaves like a
+ regular JCR repository that they search, navigate, version, and listen for changes. But under the covers, JBoss DNA
+ gets its content by federating multiple back-end systems (like databases, services, other repositories, etc.),
+ allowing those systems to continue "owning" the information but ensuring the unified repository stays up-to-date
+ and in sync.
+ </para>
+ <para>
+ This document goes into detail about JBoss DNA and its capabilities, features, architecture, components, extension points,
+ security, configuration, and testing. So whether your a developer on the project or trying to learn the intricate details of
+ how JBoss DNA works, this document hopefully serves a good reference for developers on the project.
+ </para>
+ <sect1 id="use_cases">
+ <title>Use cases for JBoss DNA</title>
+ <para>
+ JBoss DNA repositories can be used in a variety of applications. One of the most obvious ones
+ is in provisioning and management, where it's critical to understand and keep track of the metadata for models, database, services,
+ components, applications, clusters, machines, and other systems used in an enterprise. Governance takes that a step
+ farther, by tracking with those entities the policies dictating expectations and against which performance can be verified.
+ But, a JBoss DNA repository doesn't have to be large and complex - it could just manage configuration information
+ for an application. Or, provide a JCR interface on top of a couple of non-JCR systems. In truth, there
+ are a lot of ways that you could use JBoss DNA.
+ </para>
+ </sect1>
+ <sect1 id="what_is_metadata">
+ <title>What is metadata?</title>
+ <para>
+ Before we dive into more detail about JBoss DNA and metadata repositories, it's probably useful to explain what we
+ mean by the term "metadata." Simply put, <emphasis>metadata</emphasis> is the information you need to manage something.
+ It's the information needed to configure an operating system, or the description of the information in an LDAP tree,
+ or the topology of your network. It's the configuration of an application server or enterprise service bus.
+ It's the steps involved in validating an application before it can go into production. It's the description of your
+ database schemas, or of your services, or of the messages going in and coming out of a service. JBoss DNA is
+ designed to be a repository for all this (and more).
+ </para>
+ <para>
+ There are a couple of important things to understand about this metadata. First, the majority of this metadata is
+ managed by other systems: databases, applications, file systems, source code management systems, services, and
+ content management systems, and even other repositories. We can't pull the information out and duplicate it, because
+ we then risk having multiple copies that are out-of-sync. But we do want to access it through a homogenous API,
+ since that will make our lives significantly easier. The answer to this apparent dichotomy is
+ <emphasis><link linkend="dna-connector-federation">federation</link></emphasis>.
+ We can connect to these back-end systems to dynamically access the content and project it into a single, unified
+ repository. We can also cache it for faster access, as long as the cache can be invalidated based upon time or event.
+ But we also need to maintain a clear picture of where all the bits come from, so users can be sure they're looking
+ at the right information. And we need to make it as easy as possible to write new connectors, since there are
+ a lot of systems out there that have information we want to federate.
+ </para>
+ <para>
+ The second important characteristic of the metadata is that a lot of it is represented as files, and there are
+ a lot of different file formats. These include source code, configuration files, web pages, database schemas,
+ XML schemas, service definitions, policies, documents, spreadsheets, presentations, images, audio files, workflow
+ definitions, business rules, and on and on. And so even though information is added to the repository through files
+ like these, the repository should be able to automatically extract the most useful content from these files.
+ This process of extracting content and storing it in the repository is what JBoss DNA calls
+ <emphasis><link linkend="sequencing">sequencing</link></emphasis>,
+ and it's an important part of a metadata repository since more information is now available for searching,
+ navigating, relating, and analyzing.
+ </para>
+ <para>
+ The third important characteristic of metadata is that it rarely stays the same. Different consumers of the
+ information need to see different views of it. Metadata about two similar systems is not always the same.
+ The metadata often needs to be tagged or annotated with additional information. And the things being
+ described often change over time, meaning the metadata has to change, too. As a result, the way in which
+ we store and manage the metadata has to be flexible and able to adapt, and the object model
+ we use to interact with the repository must accommodate these needs. The graph-based nature of the JCR API provides this
+ flexibility while also giving us the ability to constrain information when it needs to be constrained.
+ </para>
+ </sect1>
+ <sect1 id="jcr_intro">
+ <title>What is JCR?</title>
+ <para>There are a lot of choices for how applications can store information persistently so that it can be accessed at a
+ later time and by other processes. The challenge developers face is how to use an approach that most closely matches the
+ needs of their application. This choice becomes more important as developers choose to focus their efforts on
+ application-specific logic, delegating much of the responsibilities for persistence to libraries and frameworks.</para>
+ <para>
+ Perhaps one of the easiest techniques is to simply store information in
+ <emphasis>files</emphasis>
+ . The Java language makes working with files relatively easy, but Java really doesn't provide many bells and whistles. So
+ using files is an easy choice when the information is either not complicated (for example property files), or when users may
+ need to read or change the information outside of the application (for example log files or configuration files). But using
+ files to persist information becomes more difficult as the information becomes more complex, as the volume of it increases,
+ or if it needs to be accessed by multiple processes. For these situations, other techniques often offer better choices.
+ </para>
+ <para>
+ Another technique built into the Java language is
+ <emphasis>Java serialization</emphasis>
+ , which is capable of persisting the state of an object graph so that it can be read back in at a later time. However, Java
+ serialization can quickly become tricky if the classes are changed, and so it's beneficial usually when the information is
+ persisted for a very short period of time. For example, serialization is sometimes used to send an object graph from one
+ process to another.
+ </para>
+ <para>
+ One of the more popular persistence technologies is the
+ <emphasis>relational database</emphasis>
+ . Relational database management systems have been around for decades and are very capable. The Java Database Connectivity
+ (JDBC) API provides a standard interface for connecting to and interacting with relational databases. However, it is a
+ low-level API that requires a lot of code to use correctly, and it still doesn't abstract away the DBMS-specific SQL
+ grammar. Also, working with relational data in an object-oriented language can feel somewhat unnatural, so many developers
+ map this data to classes that fit much more cleanly into their application. The problem is that manually creating this
+ mapping layer requires a lot of repetitive and non-trivial JDBC code.
+ </para>
+ <para>
+ <emphasis>Object-relational mapping</emphasis>
+ libraries automate the creation of this mapping layer and result in far less code that is much more maintainable with
+ performance that is often as good as (if not better than) handwritten JDBC code. The new
+ <ulink url="http://java.sun.com/developer/technicalArticles/J2EE/jpa/">Java Persistence API (JPA)</ulink>
+ provide a standard mechanism for defining the mappings (through annotations) and working with these entity objects. Several
+ commercial and open-source libraries implement JPA, and some even offer additional capabilities and features that go beyond
+ JPA. For example,
+ <ulink url="http://www.hibernate.org">Hibernate</ulink>
+ is one of the most feature-rich JPA implementations and offers object caching, statement caching, extra association
+ mappings, and other features that help to improve performance and usefulness.
+ </para>
+ <para>
+ While relational databases and JPA are solutions that work for many applications, they become more limited in cases when the
+ information structure is highly flexible, is not known
+ <emphasis>a priori</emphasis>
+ , or is subject to frequent change and customization. In these situations,
+ <emphasis>content repositories</emphasis>
+ may offer a better choice for persistence. Content repositories are almost a hybrid between relational databases and file
+ systems, and typically provide other capabilities as well, including versioning, indexing, search, access control,
+ transactions, and observation. Because of this, content repositories are used by content management systems (CMS), document
+ management systems (DMS), and other applications that manage electronic files (e.g., documents, images, multi-media, web
+ content, etc.) and metadata associated with them (e.g., author, date, status, security information, etc.). The
+ <ulink url="http://www.jcp.org/en/jsr/detail?id=170">Content Repository for Java technology API</ulink>
+ provides a standard Java API for working with content repositories. Abbreviated "JCR", this API was developed as part of the
+ Java Community Process under
+ <ulink url="http://www.jcp.org/en/jsr/detail?id=170">JSR-170</ulink>
+ and is being revised under
+ <ulink url="http://www.jcp.org/en/jsr/detail?id=283">JSR-283</ulink>
+ .
+ </para>
+ <para>
+ The
+ <emphasis>JBoss DNA project</emphasis>
+ is building unified metadata repository system that is compliant with JCR. Nearly all of these capabilities are to be hidden
+ below the JCR API and involve automated processing of the information in the repository. Thus, JBoss DNA can add value to
+ existing repository implementations. For example, JCR repositories offer the ability to upload files into the repository and
+ have the file content indexed for search purposes. JBoss DNA also defines a library for "sequencing" content - to extract
+ meaningful information from that content and store it in the repository, where it can then be searched, accessed, and
+ analyzed using the JCR API.
+ </para>
+ <para> JBoss DNA has other features as well. You can create federated repositories that dynamically merge the information
+ from multiple databases, services, applications, and other JCR repositories. JBoss DNA also will allow you to
+ create customized views based upon the type of data and the role of the user that is accessing the data. And yet another is
+ to create a REST-ful API to allow the JCR content to be accessed easily by other applications written in other languages.
+ </para>
+ </sect1>
<sect1 id="roadmap">
<title>Project roadmap</title>
<para>
@@ -117,10 +190,69 @@
appropriate release where they can be targeted. Any issue that is reviewed and that does not fit in a known release will
be targeted to the
<ulink url="https://jira.jboss.org/jira/browse/DNA?report=com.atlassian.jira.plugin.s...">Future Releases</ulink>
- bucket. This should be reviewed periodically and at least at the beginning of each release cycle, with the goal of
- targeting most of the issues to specific releases.
+ bucket.
+ </para>
+ <para>
+ At the start of a release, the project team reviews the roadmap, identifies the goals for the release, and targets (or retargets)
+ the issues appropriately.
</para>
</sect1>
+ <sect1 id="methodology">
+ <title>Development methodology</title>
+ <para>
+ The JBoss DNA project doesn't use a formal methodology, but instead incorporates techniques, activities, and processes from
+ several methodologies. In fact, the committers are given a lot of freedom for how they develop the components and features
+ they work on.
+ </para>
+ <para>
+ Nevertheless, we encourage familiarity with several major techniques, including:
+ <itemizedlist>
+ <listitem>
+ <para>
+ <emphasis role="strong"><ulink url="http://en.wikipedia.org/wiki/Agile_software_development">Agile software development</ulink></emphasis>
+ includes those software methodologies (e.g., Scrum) that promote development iterations and open collaboration. While the
+ JBoss DNA project doesn't follow these closely, we do emphasize the importance of always having running software
+ and using running software as a measure of progress. The JBoss DNA project also wants to move to more frequent
+ releases (on the order of 4-6 weeks)
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <emphasis role="strong"><ulink url="http://en.wikipedia.org/wiki/Test-driven_development">Test-driven development (TDD)</ulink></emphasis>
+ techniques encourage first writing test cases for new features and functionality, then changing the code to add the
+ new features and functionality, and finally the code is refactored to clean-up and address any duplication or inconsistencies.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <emphasis role="strong"><ulink url="http://behaviour-driven.org/">Behavior-driven development (BDD)</ulink></emphasis>
+ is an evolution of TDD, where developers specify the desired behaviors first (rather than writing "tests").
+ In reality, this BDD adopts the language of the user so that tests are written using words that are meaningful
+ to users. With recent test frameworks (like JUnit 4.4), we're able to write our unit tests to express
+ the desired behavior. For example, a test class for sequencer implementation might have a test method
+ <code>shouldNotThrowAnErrorWhenStreamIsNull()</code>, which is very easy to understand the intent.
+ The result appears to be a larger number of finer-grained test methods, but which are more easily understood
+ and easier to write. In fact, many advocates of BDD argue that one of the biggest challenges of TDD is knowing what
+ tests to write in the beginning, whereas with BDD the shift in focus and terminology make it easier for more
+ developers to enumerate the tests they need.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <emphasis role="strong"><ulink url="http://en.wikipedia.org/wiki/Lean_software_development">Lean software development</ulink></emphasis>
+ is an adaptation of <ulink url="http://en.wikipedia.org/wiki/Lean_manufacturing">lean manufacturing techniques</ulink>,
+ where emphasis is placed on eliminating waste (e.g., defects, unnecessary complexity, unnecessary code/functionality/features),
+ delivering as fast as passible, deferring irrevocable decisions as much as possible,
+ continuous learning (continuously adapting and improving the process), empowering the team (or community, in our case),
+ and several other guidelines. Lean software development can be thought of as an evolution of agile techniques
+ in the same way that behavior-driven development is an evolution of test-driven development. Lean techniques
+ help the developer to recognize and understand how and why features, bugs, and even their processes impact the development
+ of software - and JBoss DNA.
+ </para>
+ </listitem>
+ </itemizedlist>
+ </para>
+ </sect1>
<sect1 id="modules">
<title>JBoss DNA modules</title>
<para>
@@ -168,7 +300,7 @@
</itemizedlist>
The following modules are optional extensions that may be used selectively and as needed (and are located in the source
under the
- <code>extensions</code>
+ <code>extensions/</code>
directory):
<itemizedlist>
<listitem>
@@ -256,7 +388,7 @@
</listitem>
</itemizedlist>
There are also documentation modules (located in the source under the
- <code>docs</code>
+ <code>docs/</code>
directory):
<itemizedlist>
<listitem>
15 years, 7 months
DNA SVN: r538 - in trunk/docs: examples/gettingstarted/sequencers/src/main/java/org/jboss/example/dna/sequencers and 9 other directories.
by dna-commits@lists.jboss.org
Author: rhauch
Date: 2008-09-19 16:26:37 -0400 (Fri, 19 Sep 2008)
New Revision: 538
Added:
trunk/docs/gettingstarted/src/main/docbook/en-US/images/dna-connectors-0.2.graffle
trunk/docs/gettingstarted/src/main/docbook/en-US/images/dna-connectors-0.2.png
trunk/docs/gettingstarted/src/main/docbook/en-US/images/dna-connectors-future.graffle/
trunk/docs/gettingstarted/src/main/docbook/en-US/images/dna-connectors-future.graffle/QuickLook/
trunk/docs/gettingstarted/src/main/docbook/en-US/images/dna-connectors-future.graffle/QuickLook/Preview.pdf
trunk/docs/gettingstarted/src/main/docbook/en-US/images/dna-connectors-future.graffle/QuickLook/Thumbnail.tiff
trunk/docs/gettingstarted/src/main/docbook/en-US/images/dna-connectors-future.graffle/data.plist
trunk/docs/gettingstarted/src/main/docbook/en-US/images/dna-connectors-future.graffle/image1.jpg
trunk/docs/gettingstarted/src/main/docbook/en-US/images/dna-connectors-future.png
trunk/docs/gettingstarted/src/main/docbook/en-US/images/dnajcr-and-connector.graffle
trunk/docs/gettingstarted/src/main/docbook/en-US/images/dnajcr-and-connector.png
trunk/docs/gettingstarted/src/main/docbook/en-US/images/example-federated-repository.graffle/
trunk/docs/gettingstarted/src/main/docbook/en-US/images/example-federated-repository.graffle/QuickLook/
trunk/docs/gettingstarted/src/main/docbook/en-US/images/example-federated-repository.graffle/QuickLook/Preview.pdf
trunk/docs/gettingstarted/src/main/docbook/en-US/images/example-federated-repository.graffle/QuickLook/Thumbnail.tiff
trunk/docs/gettingstarted/src/main/docbook/en-US/images/example-federated-repository.graffle/data.plist
trunk/docs/gettingstarted/src/main/docbook/en-US/images/example-federated-repository.graffle/image1.jpg
trunk/docs/gettingstarted/src/main/docbook/en-US/images/example-federated-repository.png
trunk/docs/gettingstarted/src/main/docbook/en-US/images/example-repositories-client.png
trunk/docs/gettingstarted/src/main/docbook/en-US/images/example-repositories-navigating.png
trunk/docs/gettingstarted/src/main/docbook/en-US/images/example-repositories.graffle/
trunk/docs/gettingstarted/src/main/docbook/en-US/images/example-repositories.graffle/QuickLook/
trunk/docs/gettingstarted/src/main/docbook/en-US/images/example-repositories.graffle/QuickLook/Preview.pdf
trunk/docs/gettingstarted/src/main/docbook/en-US/images/example-repositories.graffle/QuickLook/Thumbnail.tiff
trunk/docs/gettingstarted/src/main/docbook/en-US/images/example-repositories.graffle/data.plist
trunk/docs/gettingstarted/src/main/docbook/en-US/images/example-repositories.graffle/image1.jpg
trunk/docs/gettingstarted/src/main/docbook/en-US/images/example-repositories.png
Removed:
trunk/docs/reference/en/
Modified:
trunk/docs/examples/gettingstarted/repositories/src/main/java/org/jboss/example/dna/repository/RepositoryClient.java
trunk/docs/examples/gettingstarted/sequencers/src/main/java/org/jboss/example/dna/sequencers/SequencingClient.java
trunk/docs/gettingstarted/src/main/docbook/en-US/content/downloading_and_running.xml
trunk/docs/gettingstarted/src/main/docbook/en-US/content/using_dna_for_sequencing.xml
trunk/docs/gettingstarted/src/main/docbook/en-US/content/using_dna_repositories.xml
Log:
DNA-214 Update documentation to describe the repository, federation, JCR and other 0.2 features
https://jira.jboss.org/jira/browse/DNA-214
Updated the Getting Started document to include the new 'repositories' example.
Modified: trunk/docs/examples/gettingstarted/repositories/src/main/java/org/jboss/example/dna/repository/RepositoryClient.java
===================================================================
--- trunk/docs/examples/gettingstarted/repositories/src/main/java/org/jboss/example/dna/repository/RepositoryClient.java 2008-09-19 15:18:11 UTC (rev 537)
+++ trunk/docs/examples/gettingstarted/repositories/src/main/java/org/jboss/example/dna/repository/RepositoryClient.java 2008-09-19 20:26:37 UTC (rev 538)
@@ -138,7 +138,7 @@
contextFactory = new BasicExecutionContextFactory();
// Create the execution context that we'll use for the services. If we'd want to use JAAS, we'd create the context
- // by supply LoginContext, AccessControlContext, or even Subject with CallbackHandlers. But no JAAS in this example.
+ // by supplying LoginContext, AccessControlContext, or even Subject with CallbackHandlers. But no JAAS in this example.
context = contextFactory.create();
// Create the library for the RepositorySource instances ...
Modified: trunk/docs/examples/gettingstarted/sequencers/src/main/java/org/jboss/example/dna/sequencers/SequencingClient.java
===================================================================
--- trunk/docs/examples/gettingstarted/sequencers/src/main/java/org/jboss/example/dna/sequencers/SequencingClient.java 2008-09-19 15:18:11 UTC (rev 537)
+++ trunk/docs/examples/gettingstarted/sequencers/src/main/java/org/jboss/example/dna/sequencers/SequencingClient.java 2008-09-19 20:26:37 UTC (rev 538)
@@ -259,7 +259,7 @@
name = "Java Sequencer";
desc = "Sequences java files to extract the characteristics of the java sources";
classname = "org.jboss.dna.sequencer.java.JavaMetadataSequencer";
- String[] javaPathExpressions = {"//(*.java[*])/jcr:content[@jcr:data] => /compilationUnits/$1"};
+ String[] javaPathExpressions = {"//(*.java[*])/jcr:content[@jcr:data] => /java/$1"};
SequencerConfig javaSequencerConfig = new SequencerConfig(name, desc, classname, classpath, javaPathExpressions);
this.sequencingService.addSequencer(javaSequencerConfig);
@@ -369,12 +369,12 @@
}
}
- } else if (root.hasNode("compilationUnits")) {
+ } else if (root.hasNode("java")) {
Map<String, List<Properties>> tree = new TreeMap<String, List<Properties>>();
// Find the compilation unit node ...
List<Properties> javaElements;
- if (root.hasNode("compilationUnits")) {
- Node javaSourcesNode = root.getNode("compilationUnits");
+ if (root.hasNode("java")) {
+ Node javaSourcesNode = root.getNode("java");
for (NodeIterator i = javaSourcesNode.getNodes(); i.hasNext();) {
Node javaSourceNode = i.nextNode();
Modified: trunk/docs/gettingstarted/src/main/docbook/en-US/content/downloading_and_running.xml
===================================================================
--- trunk/docs/gettingstarted/src/main/docbook/en-US/content/downloading_and_running.xml 2008-09-19 15:18:11 UTC (rev 537)
+++ trunk/docs/gettingstarted/src/main/docbook/en-US/content/downloading_and_running.xml 2008-09-19 20:26:37 UTC (rev 538)
@@ -176,6 +176,11 @@
</para>
</listitem>
<listitem>
+ <para><emphasis role="strong"><code>project1</code></emphasis> subdirectory contains some Java source that can be loaded
+ into the repository.
+ </para>
+ </listitem>
+ <listitem>
<para><emphasis role="strong"><code>lib</code></emphasis> subdirectory contains the JARs for all of the JBoss DNA artifacts
as well as those for other libraries required by JBoss DNA and the sequencer example.
</para>
@@ -197,11 +202,25 @@
<para><emphasis role="strong"><code>run.sh</code></emphasis> is the *nix shell script that will run the repository example application.</para>
</listitem>
<listitem>
- <para><emphasis role="strong"><code>log4j.properties</code></emphasis>
- is the Log4J configuration file.
- </para>
+ <para><emphasis role="strong"><code>log4j.properties</code></emphasis> is the Log4J configuration file.</para>
</listitem>
<listitem>
+ <para><emphasis role="strong"><code>aircraft.xml</code></emphasis> is an XML file containing the information that the
+ example application imports into its "Aircraft" repository.
+ </para>
+ </listitem>
+ <listitem>
+ <para><emphasis role="strong"><code>cars.xml</code></emphasis> is an XML file containing the information that the
+ example application imports into its "Cars" repository.
+ </para>
+ </listitem>
+ <listitem>
+ <para><emphasis role="strong"><code>configRepository.xml</code></emphasis> is an XML file containing the information that the
+ example application imports into its "Configuration" repository and which defines how the application sets up access
+ to the other example repositories.
+ </para>
+ </listitem>
+ <listitem>
<para><emphasis role="strong"><code>lib</code></emphasis> subdirectory contains the JARs for all of the JBoss DNA artifacts
as well as those for other libraries required by JBoss DNA and the repository example.
</para>
@@ -236,7 +255,7 @@
<graphic align="center" scale="100" fileref="example-sequencer-upload.png"/>
</figure>
You can specify any fully-qualified or relative path. The application will notify you if it cannot find the file you
- specified. The example client configures JBoss DNA to sequence and MP3 audio files and image files with one of
+ specified. The example client configures JBoss DNA to sequence MP3 audio files, Java source files, or image files with one of
the following extensions (technically, nodes that have names ending in the following):
<code>jpg</code>, <code>jpeg</code>, <code>gif</code>, <code>bmp</code>, <code>pcx</code>, <code>png</code>,
<code>iff</code>, <code>ras</code>, <code>pbm</code>, <code>pgm</code>, <code>ppm</code>, and <code>psd</code>.
@@ -266,8 +285,9 @@
any of them are interested in the new or updated content, and if so runs those sequencers. The image sequencer processes image
files for metadata, and any metadata found is stored under the <code>/images</code> branch of the repository. The MP3 sequencer
processes MP3 audio files for metadata, and any metadata found is stored under the <code>/mp3s</code>
- branch of the repository. All of this happens asynchronously, so any DNA activity doesn't impede or slow down the client
- activities.</para>
+ branch of the repository. And metadata about Java classes are stored under the <code>/java</code> area of the repository.
+ All of this happens asynchronously, so any DNA activity doesn't impede or slow down the client activities.
+ </para>
<para>So, after the file is uploaded, you can search the repository for the image metadata using the "s" menu option:
<figure id="example-sequencer-search">
<title>Searching for media using the example client</title>
@@ -295,14 +315,29 @@
</sect1>
<sect1 id="running_repository_example">
<title>Running the repository example</title>
- <para>The repository example consists of a client application that sets up several DNA repositories, including one that
- is a federation of several of the others, and then allows you to navigate those repositories.</para>
+ <para>The repository example consists of a client application that sets up three DNA repositories (named "Cars", "Airplanes", and
+ "Configuration") as well as a federated repository ("Vehicles") that dynamically federates the information from the three other
+ repositories and a cache repository (named "Cache") in which the federated content is stored.
+ The client application allows you to interactively navigate each of these repositories just as you would navigate the
+ directory structure on a file system.</para>
+ <para>This collection of repositories is shown in the following figure:
+ <figure id="example-repositories">
+ <title>Repositories used in the example client</title>
+ <graphic align="center" scale="100" fileref="example-repositories.png"/>
+ </figure>
+ Most of the repositories are in-memory repositories (using the In-Memory repository connector), but the federated "Vehicles" repository
+ content is federated from the other repositories and cached into the "Cache" repository. This is shown in the following figure:
+ <figure id="example-federated-repository">
+ <title>Vehicles repository content is federated from the Cars, Airplanes and Configuration repositories</title>
+ <graphic align="center" scale="100" fileref="example-federated-repository.png"/>
+ </figure>
+ </para>
<para>
- To run the client application, go to the <code>examples/repository/target/dna-example-repository-basic.dir/</code>
+ To run the client application, go to the <code>examples/repository/target/dna-example-repositories-basic.dir/</code>
directory and type <code>./run.sh</code>. You should see the command-line client and its menus in your terminal:
- <figure id="example-repository-client">
+ <figure id="example-repositories-client">
<title>Example Client</title>
- <graphic align="center" scale="100" fileref="example-repository-client.png"/>
+ <graphic align="center" scale="100" fileref="example-repositories-client.png"/>
</figure>
From this menu, you can see the list of repositories, select one, and navigate through that repository in a manner similar
to a *nix command-line shell (although the client itself uses the JCR API to interact with the repositories).
@@ -328,18 +363,31 @@
</tbody>
</tgroup>
</table>
+ <para>If you were to select the "Cars" repository and use some of the commands, you should see something similar to:
+ <figure id="example-repositories-navigating">
+ <title>Navigating the Cars repository</title>
+ <graphic align="center" scale="100" fileref="example-repositories-navigating.png"/>
+ </figure>
+ </para>
+ <para>You can also choose to navigate the "Vehicles" repository, which projects the "Cars" repository content under the
+ <code>/Vehicles/Cars</code> node, the "Airplanes" content under the <code>/Vehicles/Airplanes</code> branch,
+ and the "Configuration" content under <code>/dna:system</code>.
+ </para>
<para>Try using the client to walk the different repositories. And while this is a contrived application, it does demonstrate
the use of JBoss DNA to federate repositories and provide access through JCR.</para>
</sect1>
<sect1 id="downloading_and_running_review">
<title>Summarizing what we just did</title>
- <para>In this chapter you downloaded, installed, and built the example applications. With the sequencer client, you could upload files into a
+ <para>In this chapter you downloaded, installed, and built the two example applicationss. With the sequencer client, you could upload files into a
JCR repository, while JBoss DNA automatically sequenced the image, MP3, or Java source files you uploaded, extracted the metadata from the
files, and stored that metadata inside the repository. The repository client allowed you to walk through multiple repositories,
including one whose content was federated from multiple other repositories.</para>
<para>These example applications were very simplistic. In fact, running through the examples probably only took you a few minutes.
So while these applications won't win any awards, they hopefully showed you the basics of what JBoss DNA can do.</para>
- <para>In the <link linkend="using_dna">next chapter</link> we'll venture into the code to get an understanding
- of how JBoss DNA actually works and how you can use it in your own applications.</para>
+ <para>In the next two chapters, we'll venture into the code to get an understanding of how JBoss DNA actually works.
+ The <link linkend="using_dna_for_sequencing">next chapter</link> reviews the sequencer application and talks about
+ how you can use DNA sequencers in your own applications. Then in the <link linkend="using_dna_repositories">following chapter</link>
+ we'll venture into the repositories example code to show how you can use DNA repositories, including federated repositories,
+ in your own applications.</para>
</sect1>
</chapter>
Modified: trunk/docs/gettingstarted/src/main/docbook/en-US/content/using_dna_for_sequencing.xml
===================================================================
--- trunk/docs/gettingstarted/src/main/docbook/en-US/content/using_dna_for_sequencing.xml 2008-09-19 15:18:11 UTC (rev 537)
+++ trunk/docs/gettingstarted/src/main/docbook/en-US/content/using_dna_for_sequencing.xml 2008-09-19 20:26:37 UTC (rev 538)
@@ -29,10 +29,11 @@
make changes to the information in those repositories, and JBoss DNA automatically uses its sequencers to extract
additional information from the uploaded files.</para>
<note>
- <para>Configuring JBoss DNA sequencers is a bit more manual than is ideal. As you'll see, JBoss DNA uses dependency
- injection to allow a great deal of flexibility in how it can be configured and customized. However, the next release will
- provide a much easier mechanism for configuring the services using DNA repositories and configuration files. Current
- plans are to use the <a href="http://www.jboss.org/jbossmc">JBoss Microcontainer</a>.</para>
+ <para>Configuring JBoss DNA services is a bit more manual than is ideal. As you'll see, JBoss DNA uses dependency
+ injection to allow a great deal of flexibility in how it can be configured and customized. But this flexibility
+ makes it more difficult for you to use. We understand this, and will soon provide a much easier way to set up
+ and manage JBoss DNA. Current plans are to use the <ulink url="http://www.jboss.org/jbossmc">JBoss Microcontainer</ulink>
+ along with a configuration repository.</para>
</note>
<sect1 id="sequencing_service">
<title>Configuring the Sequencing Service</title>
@@ -334,16 +335,21 @@
metadata (e.g., image format, physical size, pixel density, etc.) and store that in the repository. Or, if the client uploads
MP3 audio files, the title, author, album, year, and comment are extracted from the audio file and stored in the repository.</para>
<para>
- The example is comprised of 3 classes and 1 interface, located in the <code>src/main/java</code> directory:</para>
+ The example is comprised of 5 classes and 1 interface, located in the <code>src/main/java</code> directory:</para>
<programlisting><![CDATA[
org/jboss/example/dna/sequencers/ConsoleInput.java
+ /ContentInfo.java
+ /JavaInfo.java
/MediaInfo.java
/SequencingClient.java
/UserInterface.java
]]></programlisting>
- <para><code>SequencingClient</code> is the class that contains the main application. <code>MediaInfo</code> is a simple Java object
- that encapsulates metadata about a media file (as generated by the sequencer), and used by the client to
- pass information to the <code>UserInterface</code>, which is an interface with methods that will be called at runtime to
+ <para><code>SequencingClient</code> is the class that contains the main application. <code>ContentInfo</code> is a simple class
+ that encapsulate metadata generated by the sequencers and accessed by this example application, and there are two subclasses:
+ <code>MediaInfo</code> encapsulates metadata about media (image and MP3) files, while <code>JavaInfo</code> is a subclass
+ encapsulating information about a Java class. The client accesses the content from the repository and represent the
+ information using instances of <code>ContentInfo</code> (and its subclasses) and then passing them to the <code>UserInterface</code>.
+ <code>UserInterface</code> is an interface with methods that will be called at runtime to
request data from the user. <code>ConsoleInput</code> is an implementation of this that creates a text user interface,
allowing the user to operate the client from the command-line. We can easily create a graphical implementation of
<code>UserInterface</code> at a later date. We can also create a mock implementation for testing purposes that simulates
@@ -355,7 +361,8 @@
]]></programlisting>
<para>If we look at the <code>SequencingClient</code> code, there are a handful of methods that encapsulate the various activities.</para>
<note>
- <para>To keep the code shown in this book as readable as possible, some of the comments and error handling have been removed.</para>
+ <para>Some of the code samples included in this book have had some of the error handling and comments removed so that
+ the samples are more readable and concise.</para>
</note>
<para>The <code>startRepository()</code> method starts up an in-memory Jackrabbit JCR repository. The bulk of this method is simply
gathering and passing the information required by Jackrabbit. Because Jackrabbit's <code>TransientRepository</code>
@@ -545,7 +552,8 @@
</sect1>
<sect1 id="using_dna_review">
<title>Summarizing what we just did</title>
- <para>In this chapter we covered the different JBoss DNA components and how they can be used in your application.
+ <para>In this chapter we covered the different JBoss DNA components used for automatically sequencing a variety of
+ types of information, and how those components can be used in your application.
Specifically, we described how the <code>SequencingService</code> and <code>ObservationService</code> can
be configured and used. And we ended the chapter by reviewing the example application, which not only uses
JBoss DNA, but also the repository via the JCR API.</para>
Modified: trunk/docs/gettingstarted/src/main/docbook/en-US/content/using_dna_repositories.xml
===================================================================
--- trunk/docs/gettingstarted/src/main/docbook/en-US/content/using_dna_repositories.xml 2008-09-19 15:18:11 UTC (rev 537)
+++ trunk/docs/gettingstarted/src/main/docbook/en-US/content/using_dna_repositories.xml 2008-09-19 20:26:37 UTC (rev 538)
@@ -25,8 +25,252 @@
<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
<chapter id="using_dna_repositories">
<title>Using JBoss DNA Repositories</title>
- <para>As we've mentioned before, one of the capabilities of JBoss DNA is to provide access through JCR to different kinds
- of repositories. You're applications work with the JCR API, but JBoss DNA accesses the content from the underlying systems,
- including able to work with existing JCR repositories.</para>
+ <para>As we've mentioned before, one of the capabilities of JBoss DNA is to provide access through
+ <ulink url="http://www.jcp.org/en/jsr/detail?id=170">JCR</ulink> to different kinds of repositories and storage systems.
+ Your applications work with the JCR API, but through JBoss DNA are able to accesses the content from where the information
+ exists - not just a single purpose-built repository. This is fundamentally what makes JBoss DNA different.</para>
+ <para>How does JBoss DNA do this? At the heart of JBoss DNA and it's JCR implementation is a simple graph-based connector
+ system. Essentially, the JBoss DNA JCR implementation makes use of a single repository source, from which all the
+ content is accessed.
+ <figure id="dnajcr-and-connector">
+ <title>JBoss DNA's JCR implementation delegates to a repository source</title>
+ <graphic align="center" scale="100" fileref="dnajcr-and-connector.png"/>
+ </figure>
+ That single repository source could be an in-memory repository, a JBoss Cache instance, or a federated repository.
+ <figure id="dna-connectors-0.2">
+ <title>JBoss DNA can put JCR on top of multiple kinds of systems</title>
+ <graphic align="center" scale="100" fileref="dna-connectors-0.2.png"/>
+ </figure>
+ And the JBoss DNA project has plans to create other connectors, too. For instance, we're going to build a connector
+ to other JCR repositories. And another to a file system, so that the files and directories on an area of the file system
+ can be accessed through JCR. Of course, if we don't have a connector to suit your needs, you can write your own.
+ <figure id="dna-connectors-future">
+ <title>Future JBoss DNA connectors</title>
+ <graphic align="center" scale="100" fileref="dna-connectors-future.png"/>
+ </figure>
+ </para>
+ <note>
+ <para>You might be thinking that these connectors are interesting, but what do they really provide? Is it really useful
+ to use JCR to access a relational database rather than JDBC? Or, why access the files on a file system when there
+ are already mechanisms to do that?</para>
+ <para>While putting JCR on top of a single system (like a JDBC database) probably isn't that interesting, what
+ <emphasis>is</emphasis> interesting is accessing the information in multiple systems <emphasis>as if all that information were
+ in a single JCR repository</emphasis>. That's what the federated repository source is all about.</para>
+ <para>Think of it this way: use JCR to get to the schemas of multiple relational databases <emphasis>and</emphasis> the schemas
+ defined by DDL files in your SVN repository <emphasis>and</emphasis> the schemas defined by logical models stored on your file system.
+ </para>
+ </note>
+ <para>So with this very high-level summary, let's dive a little deeper and look at how to configure and use JBoss DNA and JCR.</para>
+ <sect1 id="repository_service">
+ <title>Configuring the Repository Service</title>
+ <para>The JBoss DNA <emphasis>repository service</emphasis> is the component that manages the <emphasis>repositories</emphasis>
+ and connections to them. The service reads it's configuration from a <code>RepositorySource</code> instance (i.e., the
+ "configuration repository") and automatically sets up the repositories given the <code>RepositorySource</code> instances
+ found in the configuration repository.</para>
+ <note>
+ <para>Configuring JBoss DNA services is a bit more manual than is ideal. As you'll see, JBoss DNA uses dependency
+ injection to allow a great deal of flexibility in how it can be configured and customized. But this flexibility
+ makes it more difficult for you to use. We understand this, and will soon provide a much easier way to set up
+ and manage JBoss DNA. Current plans are to use the <ulink url="http://www.jboss.org/jbossmc">JBoss Microcontainer</ulink>
+ along with a configuration repository.</para>
+ </note>
+ <para>To set up the repository service, we need to first set up a few other objects:
+ <itemizedlist>
+ <listitem>
+ <para>A <emphasis>factory for class loaders</emphasis> used to load the classes that make up the connectors.
+ If no factory is supplied, the service uses the current thread's context class loader (or if that is null,
+ the class loader that loaded the <code>RepositoryService</code> class).</para>
+ </listitem>
+ <listitem>
+ <para>A <emphasis>factory for execution contexts</emphasis>. Execution contexts define the context (or environment)
+ in which the service runs and in which operations against repositories are performed. <code>ExecutionContext</code>
+ instances can be created using JAAS application contexts, meaning that they contain the information about the subject
+ that the software represents. Execution contexts also provides access to the all of the factories and utilities
+ used throughout the services and components, and it is through this mechanism that you can inject your own behavior.
+ For example, if your application already had a notion of namespaces, you could override the execution context's
+ <code>NamespaceRegistry</code> to use the namespaces defined in your application.</para>
+ </listitem>
+ <listitem>
+ <para>A <emphasis>repository library</emphasis> that manages the list of <code>RepositorySource</code> instances.
+ The library makes sure to inject the environments into each repository source, and it provides for each source
+ a configurable pool of connections.</para>
+ </listitem>
+ <listitem>
+ <para>A <emphasis>configuration repository</emphasis> that contains descriptions of all of the repository sources
+ as well as any information those sources need. Because this is a regular repository, this could be a simple
+ repository with content loaded from an XML file (as in this example). Or it could be a shared
+ central repository with information about all of the JBoss DNA processes across your company.</para>
+ </listitem>
+ </itemizedlist>
+ With these components in place, we can then instantiate the <code>RepositoryService</code> and start it (using its
+ <code>ServiceAdministrator</code>). During startup, the service reads the configuration repository and loads any
+ defined <code>RepositorySource</code> instances into the repository library, using the class loader factory to obtain
+ class loaders that it can use to load the actual <code>RepositorySource</code> implementation classes.
+ </para>
+ <para>Here's sample code that shows how to set up and start the repository service. You can see something similar
+ in the example application in the <code>startRepositories()</code> method of the <code>org.jboss.example.dna.repository.RepositoryClient</code> class.</para>
+ <programlisting role="JAVA"><![CDATA[
+ // Create the class loader factory, which for this example will simply use this class' class loader...
+ ClassLoaderFactory classLoaderFactory = new StandardClassLoaderFactory();
+
+ // Create the factory for execution contexts.
+ ExecutionContextFactory contextFactory = new BasicExecutionContextFactory();
+
+ // Create the execution context that we'll use for the services. If we'd want to use JAAS, we'd
+ // create the context by supplying LoginContext, AccessControlContext, or even Subject with
+ // CallbackHandlers. But this example doesn't use JAAS in this example.
+ ExecutionContext context = contextFactory.create();
+
+ // Create the library for the RepositorySource instances ...
+ RepositoryLibrary sources = new RepositoryLibrary(contextFactory);
+
+ // Load into the source manager the repository source for the configuration repository ...
+ InMemoryRepositorySource configSource = new InMemoryRepositorySource();
+ configSource.setName("Configuration");
+ sources.addSource(configSource);
+
+ // Now instantiate the Repository Service ...
+ RepositoryService repositoryService = new RepositoryService(sources, configSource.getName(),
+ context, classLoaderFactory);
+ repositoryService.getAdministrator().start();
+ ]]></programlisting>
+ <para>After startup completes, the repositories are ready to be used. The client application obtains the list of repositories
+ and presents them to the user. When the user selects one, the client application starts navigating that repository
+ starting at its root node (e.g., the "/" path). As you type a command to list the contents of the current node or to
+ "change directories" to a different node, the client application obtains the information for the node using a simple
+ procedure:
+ <orderedlist>
+ <listitem>
+ <para>Get a connection to the repository.</para>
+ </listitem>
+ <listitem>
+ <para>Using the connection, find the current node and read its properties and children, putting the information
+ into a simple Java plain old Java object (POJO).</para>
+ </listitem>
+ <listitem>
+ <para>Close the connection to the repository (in a finally block to ensure it always happens).</para>
+ </listitem>
+ </orderedlist>
+ </para>
+ <sect2 id="using_jcr_with_dna">
+ <title>Using JCR to read repository</title>
+ <para>If we want to perform these steps using JCR, a JCR <code>Session</code> represents our connection.
+ So after we create a <code>JcrRepository</code> instance pointing to our repository library, we can
+ then login to obtain a JCR session:</para>
+ <programlisting role="JAVA"><![CDATA[
+ JcrRepository jcrRepository = new JcrRepository(contextFactory, sources);
+ Session session = jcrRepository.login(sourceName);
+ ]]></programlisting>
+ <para>Now, the above code doesn't do any authentication; it essentially trusts the caller has the appropriate privileges.
+ Normally, your application will need to authenticate the user, so let's look at how that's done.</para>
+ <para>JBoss DNA uses the <ulink url="http://java.sun.com/j2se/1.5.0/docs/guide/security/jaas/tutorials/General...">Java
+ Authentication and Authorization Service (JAAS)</ulink>, making it possible to use any existing JAAS security provider.</para>
+ <note>
+ <para>There are numerous JAAS providers, but one of the best open-source implementations is
+ <ulink url="http://www.jboss.org/jbosssecurity/">JBoss Security</ulink>, which can authenticate using LDAP, certificates,
+ the operating system, and federated SSO (among others).</para>
+ </note>
+ <para>The JCR API defines a <code>Credentials</code> marker interface, an instance of which can be passed to the
+ <code>Session.login(...)</code> method. Rather than provide a concrete implementation of this interface, JBoss DNA
+ allows you to pass any implementation of <code>Credentials</code> that also has one of the following methods:
+ <itemizedlist>
+ <listitem>
+ <para><code>getLoginContext()</code> that returns a <code>javax.security.auth.login.LoginContext</code> instance.</para>
+ </listitem>
+ <listitem>
+ <para><code>getAccessControlContext()</code> that returns a <code>java.security.AccessControlContext</code> instance.</para>
+ </listitem>
+ </itemizedlist>
+ This way, your application can obtain the JAAS <code>LoginContext</code> or <code>AccessControlContext</code> however it wants,
+ and then merely passes that into DNA through the JCR <code>Credentials</code>. No interfaces or classes specific to JBoss DNA are required.
+ </para>
+ <para>The following code shows how this is done, using an anonymous inner class for the <code>Credentials</code> implementation.</para>
+ <programlisting role="JAVA"><![CDATA[
+ CallbackHandler callbackHandler = // as needed by your app, according to JAAS
+ final LoginContext loginContext = new LoginContext("MyAppContextName",callbackHandler);
+ Credentials credentials = new Credentials() {
+ public LoginContext getLoginContext() { return loginContext; }
+ };
+ JcrRepository jcrRepository = new JcrRepository(contextFactory, sources);
+ Session session = jcrRepository.login(credentials, sourceName);
+ ]]></programlisting>
+ <para>Once you have a JCR session, you can then use it to find the node of interest and access the necessary information. All of this
+ code will use only the JCR API - there's nothing specific to JBoss DNA's implementation. And remember, when you're finished with
+ the session, be sure to logout (usually in a <code>finally</code> block):</para>
+ <programlisting role="JAVA"><![CDATA[
+ if (session != null) session.logout();
+ ]]></programlisting>
+ <para>Like many people recommend with JCR, you can create either long-lived or short-lived JCR <code>Session</code>s. The
+ JBoss DNA implementation of JCR was designed to efficiently do either.</para>
+ </sect2>
+ <sect2 id="using_dna_repositories_with_dna_api">
+ <title>Using JBoss DNA's API to read repository</title>
+ <para>Although we recommend using JCR, JBoss DNA has an internal command-based API that completely side-steps JCR and provides
+ very simple graph-based operations. For more information, see the <code>RepositoryClient</code> class in the example.</para>
+ <note>
+ <para>This API is likely to undergo changes in the next few releases, and using it at this time is not suggested.</para>
+ </note>
+ </sect2>
+ </sect1>
+ <sect1 id="shutting_down_repository_service">
+ <title>Shutting down the Repository Service</title>
+ <para>In the first part of this chapter, we saw how to instantiate, configure, and start the <code>RepositoryService</code>.
+ We then saw how to use JCR to access the repository service by creating JCR <code>Session</code>s, and how to log out of those
+ sessions when no longer needed.</para>
+ <para>In this short section we'll see how to shut down the <code>RepositoryService</code> and <code>RepositoryLibrary</code>
+ when you're finished with all of the repositories. It's a simple but important step, since this closes all outstanding
+ connections that may be sitting unused in the library's connection pools.</para>
+ <para>Shutting down these components is very straightforward: get the <code>ServiceAdministrator</code> on each, and call <code>shutdown()</code>.</para>
+ <programlisting role="JAVA"><![CDATA[
+ // Shut down the repository service ...
+ repositoryService.getAdministrator().shutdown();
+
+ // Shut down the manager of the RepositorySource instances, waiting until all connections are closed
+ sources.getAdministrator().shutdown();
+ sources.getAdministrator().awaitTermination(1, TimeUnit.SECONDS);
+ ]]></programlisting>
+ <para>The <code>shutdown()</code> method attempts to close all open and unused resources (such as open and unused connections in the pool).
+ No more connections can be created, and any connections that are currently in use are not closed but allowed to be used and closed normally.
+ When the last connection is used, the service then transitions to a <emphasis>terminated</emphasis> state, which you can wait for using
+ the <code>awaitTermination(int,TimeUnit)</code> method.</para>
+ <para>If you want to shutdown the services immediately, then you could call <code>shutdownNow()</code>, which blocks while it attempts to immediately
+ close all connections - <emphasis>even those currently in use</emphasis>. So, while you generally want to use <code>shutdown()</code>,
+ it is good to be aware that this <code>shutdownNow()</code> method does exist.</para>
+ </sect1>
+ <sect1 id="example_repository_application_review">
+ <title>Reviewing the example repository application</title>
+ <para>Recall that the example repository application consists of a client application that sets up a repository service and the
+ repositories defined in a configuration repository, allowing the user to pick a repository and interactively navigate
+ the selected repository. Several repositories are set up, including several in-memory repositories and one federated repository
+ that dynamically federates the content from the other repositories.</para>
+ <para>
+ The example is comprised of 2 classes and 1 interface, located in the <code>src/main/java</code> directory:</para>
+ <programlisting><![CDATA[
+ org/jboss/example/dna/repositories/ConsoleInput.java
+ /RepositoryClient.java
+ /UserInterface.java
+ ]]></programlisting>
+ <para><code>RepositoryClient</code> is the class that contains the main application. It uses an instance of the
+ <code>UserInterface</code> interface to methods that will be called at runtime to obtain information about the
+ files that are imported into the in-memory repositories and the JAAS <code>CallbackHandler</code> implementation
+ that will be used by JAAS to prompt the user for authentication information. Finally, the <code>ConsoleInput</code>
+ is an implementation of this that creates a text user interface, allowing the user to operate the client from the command-line.
+ We can easily create a graphical implementation of <code>UserInterface</code> at a later date, or we can also create a mock
+ implementation for testing purposes that simulates a user entering data. This allows us to check the behavior of the client
+ automatically using conventional JUnit test cases, as demonstrated by the code in the <code>src/test/java</code> directory:</para>
+ <programlisting><![CDATA[
+ org/jboss/example/dna/sequencers/RepositoryClientTest.java
+ /RepositoryClientUsingJcrTest.java
+ ]]></programlisting>
+ <para>The code we presented earlier in this chapter represent the bulk of the JBoss DNA and JCR-specific code used in the
+ <code>RepositoryClient</code>, so we won't cover it in more detail here. If you want to see that detail, please refer
+ to the sample client code.</para>
+ </sect1>
+ <sect1 id="using_dna_repositories_review">
+ <title>Summarizing what we just did</title>
+ <para>In this chapter we covered the different JBoss DNA components used for accessing repositories through JCR, including
+ repositories that federate their content from the content of other repositories. Specifically, we described how the
+ <code>RepositoryService</code> and <code>JcrRepository</code> can be configured and used.</para>
+ </sect1>
</chapter>
Added: trunk/docs/gettingstarted/src/main/docbook/en-US/images/dna-connectors-0.2.graffle
===================================================================
--- trunk/docs/gettingstarted/src/main/docbook/en-US/images/dna-connectors-0.2.graffle (rev 0)
+++ trunk/docs/gettingstarted/src/main/docbook/en-US/images/dna-connectors-0.2.graffle 2008-09-19 20:26:37 UTC (rev 538)
@@ -0,0 +1,4802 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>ActiveLayerIndex</key>
+ <integer>0</integer>
+ <key>ApplicationVersion</key>
+ <array>
+ <string>com.omnigroup.OmniGraffle</string>
+ <string>136.19.0.104178</string>
+ </array>
+ <key>AutoAdjust</key>
+ <true/>
+ <key>BackgroundGraphic</key>
+ <dict>
+ <key>Bounds</key>
+ <string>{{0, 0}, {576, 733}}</string>
+ <key>Class</key>
+ <string>SolidGraphic</string>
+ <key>ID</key>
+ <integer>2</integer>
+ <key>Style</key>
+ <dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ </dict>
+ <key>CanvasOrigin</key>
+ <string>{0, 0}</string>
+ <key>ColumnAlign</key>
+ <integer>1</integer>
+ <key>ColumnSpacing</key>
+ <real>36</real>
+ <key>CreationDate</key>
+ <string>2008-09-19 10:35:27 -0500</string>
+ <key>Creator</key>
+ <string>Randall Hauch</string>
+ <key>DisplayScale</key>
+ <string>1 0/72 in = 1 0/72 in</string>
+ <key>GraphDocumentVersion</key>
+ <integer>6</integer>
+ <key>GraphicsList</key>
+ <array>
+ <dict>
+ <key>Bounds</key>
+ <string>{{478.568, 405}, {55, 23}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>Helvetica</string>
+ <key>NSKern</key>
+ <real>0.0</real>
+ <key>Size</key>
+ <real>9</real>
+ </dict>
+ <key>ID</key>
+ <integer>233</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0, -0.5}</string>
+ <string>{-0.5, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Bezier</string>
+ <key>ShapeData</key>
+ <dict>
+ <key>UnitPoints</key>
+ <array>
+ <string>{-0.5, -0.5}</string>
+ <string>{-0.5, -0.5}</string>
+ <string>{0.5, -0.5}</string>
+ <string>{0.5, -0.5}</string>
+ <string>{0.5, -0.5}</string>
+ <string>{0.5, 0.499996}</string>
+ <string>{0.5, 0.499996}</string>
+ <string>{0.166667, 0.499996}</string>
+ <string>{-0.333334, 0.500008}</string>
+ <string>{-0.5, 0.499996}</string>
+ <string>{-0.499999, 0.499996}</string>
+ <string>{-0.5, -0.5}</string>
+ </array>
+ </dict>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.939516</string>
+ <key>g</key>
+ <string>0.939516</string>
+ <key>r</key>
+ <string>0.939516</string>
+ </dict>
+ <key>FillType</key>
+ <integer>3</integer>
+ <key>GradientColor</key>
+ <dict>
+ <key>w</key>
+ <string>0.657258</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ <key>Fuzziness</key>
+ <real>5.7921171188354492</real>
+ <key>ShadowVector</key>
+ <string>{3, 4}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>archive</key>
+ <data>
+ YnBsaXN0MDDUAQIDBAUGCQpYJHZl
+ cnNpb25UJHRvcFkkYXJjaGl2ZXJY
+ JG9iamVjdHMSAAGGoNEHCFRyb290
+ gAFfEA9OU0tleWVkQXJjaGl2ZXKl
+ CwwVGR5VJG51bGzUDQ4PEBESExRW
+ JGNsYXNzXE5TQ29sb3JTcGFjZV8Q
+ Ek5TQ3VzdG9tQ29sb3JTcGFjZVdO
+ U1doaXRlgAQQA4ACRDAuNQDSDRYX
+ GFROU0lEgAMQAtIaGxwOWCRjbGFz
+ c2VzWiRjbGFzc25hbWWiDh1YTlNP
+ YmplY3TSGhsfIKIgHVdOU0NvbG9y
+ CBEaHykyNzo/QVNZX2hvfJGZm52f
+ pKmusLK3wMvO19zfAAAAAAAAAQEA
+ AAAAAAAAIQAAAAAAAAAAAAAAAAAA
+ AOc=
+ </data>
+ <key>b</key>
+ <string>0.500023</string>
+ <key>g</key>
+ <string>0.500023</string>
+ <key>r</key>
+ <string>0.500023</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>9</real>
+ <key>Width</key>
+ <real>2</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs18 \cf0 Repository Source}</string>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{389.068, 405}, {55, 23}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>Helvetica</string>
+ <key>NSKern</key>
+ <real>0.0</real>
+ <key>Size</key>
+ <real>9</real>
+ </dict>
+ <key>ID</key>
+ <integer>222</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0, -0.5}</string>
+ <string>{-0.5, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Bezier</string>
+ <key>ShapeData</key>
+ <dict>
+ <key>UnitPoints</key>
+ <array>
+ <string>{-0.5, -0.5}</string>
+ <string>{-0.5, -0.5}</string>
+ <string>{0.5, -0.5}</string>
+ <string>{0.5, -0.5}</string>
+ <string>{0.5, -0.5}</string>
+ <string>{0.5, 0.499996}</string>
+ <string>{0.5, 0.499996}</string>
+ <string>{0.166667, 0.499996}</string>
+ <string>{-0.333334, 0.500008}</string>
+ <string>{-0.5, 0.499996}</string>
+ <string>{-0.499999, 0.499996}</string>
+ <string>{-0.5, -0.5}</string>
+ </array>
+ </dict>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.939516</string>
+ <key>g</key>
+ <string>0.939516</string>
+ <key>r</key>
+ <string>0.939516</string>
+ </dict>
+ <key>FillType</key>
+ <integer>3</integer>
+ <key>GradientColor</key>
+ <dict>
+ <key>w</key>
+ <string>0.657258</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ <key>Fuzziness</key>
+ <real>5.7921171188354492</real>
+ <key>ShadowVector</key>
+ <string>{3, 4}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>archive</key>
+ <data>
+ YnBsaXN0MDDUAQIDBAUGCQpYJHZl
+ cnNpb25UJHRvcFkkYXJjaGl2ZXJY
+ JG9iamVjdHMSAAGGoNEHCFRyb290
+ gAFfEA9OU0tleWVkQXJjaGl2ZXKl
+ CwwVGR5VJG51bGzUDQ4PEBESExRW
+ JGNsYXNzXE5TQ29sb3JTcGFjZV8Q
+ Ek5TQ3VzdG9tQ29sb3JTcGFjZVdO
+ U1doaXRlgAQQA4ACRDAuNQDSDRYX
+ GFROU0lEgAMQAtIaGxwOWCRjbGFz
+ c2VzWiRjbGFzc25hbWWiDh1YTlNP
+ YmplY3TSGhsfIKIgHVdOU0NvbG9y
+ CBEaHykyNzo/QVNZX2hvfJGZm52f
+ pKmusLK3wMvO19zfAAAAAAAAAQEA
+ AAAAAAAAIQAAAAAAAAAAAAAAAAAA
+ AOc=
+ </data>
+ <key>b</key>
+ <string>0.500023</string>
+ <key>g</key>
+ <string>0.500023</string>
+ <key>r</key>
+ <string>0.500023</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>9</real>
+ <key>Width</key>
+ <real>2</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs18 \cf0 Repository Source}</string>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{322.318, 405}, {55, 23}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>Helvetica</string>
+ <key>NSKern</key>
+ <real>0.0</real>
+ <key>Size</key>
+ <real>9</real>
+ </dict>
+ <key>ID</key>
+ <integer>232</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0, -0.5}</string>
+ <string>{-0.5, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Bezier</string>
+ <key>ShapeData</key>
+ <dict>
+ <key>UnitPoints</key>
+ <array>
+ <string>{-0.5, -0.5}</string>
+ <string>{-0.5, -0.5}</string>
+ <string>{0.5, -0.5}</string>
+ <string>{0.5, -0.5}</string>
+ <string>{0.5, -0.5}</string>
+ <string>{0.5, 0.499996}</string>
+ <string>{0.5, 0.499996}</string>
+ <string>{0.166667, 0.499996}</string>
+ <string>{-0.333334, 0.500008}</string>
+ <string>{-0.5, 0.499996}</string>
+ <string>{-0.499999, 0.499996}</string>
+ <string>{-0.5, -0.5}</string>
+ </array>
+ </dict>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.939516</string>
+ <key>g</key>
+ <string>0.939516</string>
+ <key>r</key>
+ <string>0.939516</string>
+ </dict>
+ <key>FillType</key>
+ <integer>3</integer>
+ <key>GradientColor</key>
+ <dict>
+ <key>w</key>
+ <string>0.657258</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ <key>Fuzziness</key>
+ <real>5.7921171188354492</real>
+ <key>ShadowVector</key>
+ <string>{3, 4}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>archive</key>
+ <data>
+ YnBsaXN0MDDUAQIDBAUGCQpYJHZl
+ cnNpb25UJHRvcFkkYXJjaGl2ZXJY
+ JG9iamVjdHMSAAGGoNEHCFRyb290
+ gAFfEA9OU0tleWVkQXJjaGl2ZXKl
+ CwwVGR5VJG51bGzUDQ4PEBESExRW
+ JGNsYXNzXE5TQ29sb3JTcGFjZV8Q
+ Ek5TQ3VzdG9tQ29sb3JTcGFjZVdO
+ U1doaXRlgAQQA4ACRDAuNQDSDRYX
+ GFROU0lEgAMQAtIaGxwOWCRjbGFz
+ c2VzWiRjbGFzc25hbWWiDh1YTlNP
+ YmplY3TSGhsfIKIgHVdOU0NvbG9y
+ CBEaHykyNzo/QVNZX2hvfJGZm52f
+ pKmusLK3wMvO19zfAAAAAAAAAQEA
+ AAAAAAAAIQAAAAAAAAAAAAAAAAAA
+ AOc=
+ </data>
+ <key>b</key>
+ <string>0.500023</string>
+ <key>g</key>
+ <string>0.500023</string>
+ <key>r</key>
+ <string>0.500023</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>9</real>
+ <key>Width</key>
+ <real>2</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs18 \cf0 Repository Source}</string>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{255.568, 405}, {55, 23}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>Helvetica</string>
+ <key>NSKern</key>
+ <real>0.0</real>
+ <key>Size</key>
+ <real>9</real>
+ </dict>
+ <key>ID</key>
+ <integer>231</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0, -0.5}</string>
+ <string>{-0.5, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Bezier</string>
+ <key>ShapeData</key>
+ <dict>
+ <key>UnitPoints</key>
+ <array>
+ <string>{-0.5, -0.5}</string>
+ <string>{-0.5, -0.5}</string>
+ <string>{0.5, -0.5}</string>
+ <string>{0.5, -0.5}</string>
+ <string>{0.5, -0.5}</string>
+ <string>{0.5, 0.499996}</string>
+ <string>{0.5, 0.499996}</string>
+ <string>{0.166667, 0.499996}</string>
+ <string>{-0.333334, 0.500008}</string>
+ <string>{-0.5, 0.499996}</string>
+ <string>{-0.499999, 0.499996}</string>
+ <string>{-0.5, -0.5}</string>
+ </array>
+ </dict>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.939516</string>
+ <key>g</key>
+ <string>0.939516</string>
+ <key>r</key>
+ <string>0.939516</string>
+ </dict>
+ <key>FillType</key>
+ <integer>3</integer>
+ <key>GradientColor</key>
+ <dict>
+ <key>w</key>
+ <string>0.657258</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ <key>Fuzziness</key>
+ <real>5.7921171188354492</real>
+ <key>ShadowVector</key>
+ <string>{3, 4}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>archive</key>
+ <data>
+ YnBsaXN0MDDUAQIDBAUGCQpYJHZl
+ cnNpb25UJHRvcFkkYXJjaGl2ZXJY
+ JG9iamVjdHMSAAGGoNEHCFRyb290
+ gAFfEA9OU0tleWVkQXJjaGl2ZXKl
+ CwwVGR5VJG51bGzUDQ4PEBESExRW
+ JGNsYXNzXE5TQ29sb3JTcGFjZV8Q
+ Ek5TQ3VzdG9tQ29sb3JTcGFjZVdO
+ U1doaXRlgAQQA4ACRDAuNQDSDRYX
+ GFROU0lEgAMQAtIaGxwOWCRjbGFz
+ c2VzWiRjbGFzc25hbWWiDh1YTlNP
+ YmplY3TSGhsfIKIgHVdOU0NvbG9y
+ CBEaHykyNzo/QVNZX2hvfJGZm52f
+ pKmusLK3wMvO19zfAAAAAAAAAQEA
+ AAAAAAAAIQAAAAAAAAAAAAAAAAAA
+ AOc=
+ </data>
+ <key>b</key>
+ <string>0.500023</string>
+ <key>g</key>
+ <string>0.500023</string>
+ <key>r</key>
+ <string>0.500023</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>9</real>
+ <key>Width</key>
+ <real>2</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs18 \cf0 Repository Source}</string>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>199</integer>
+ </dict>
+ <key>ID</key>
+ <integer>230</integer>
+ <key>Points</key>
+ <array>
+ <string>{436.068, 312}</string>
+ <string>{478.568, 312.5}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>197</integer>
+ <key>Info</key>
+ <integer>1</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{455.818, 409.5}, {11, 14}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>YES</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>Helvetica</string>
+ <key>Size</key>
+ <real>12</real>
+ </dict>
+ <key>ID</key>
+ <integer>229</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Pad</key>
+ <integer>0</integer>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\b\fs24 \cf0 ...}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ <key>Wrap</key>
+ <string>NO</string>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>222</integer>
+ <key>Info</key>
+ <integer>1</integer>
+ </dict>
+ <key>ID</key>
+ <integer>223</integer>
+ <key>Points</key>
+ <array>
+ <string>{398.235, 335}</string>
+ <string>{416.568, 405}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>197</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>232</integer>
+ </dict>
+ <key>ID</key>
+ <integer>228</integer>
+ <key>Points</key>
+ <array>
+ <string>{387.11, 335}</string>
+ <string>{349.818, 405}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>197</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>231</integer>
+ <key>Info</key>
+ <integer>1</integer>
+ </dict>
+ <key>ID</key>
+ <integer>227</integer>
+ <key>Points</key>
+ <array>
+ <string>{375.985, 335}</string>
+ <string>{283.068, 405}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>197</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{463.204, 328}, {89.7277, 12}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>Vertical</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>Helvetica-Oblique</string>
+ <key>Size</key>
+ <real>10</real>
+ </dict>
+ <key>ID</key>
+ <integer>200</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Pad</key>
+ <integer>0</integer>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\i\fs20 \cf0 federated cache}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{478.568, 301}, {59, 23}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>Helvetica</string>
+ <key>NSKern</key>
+ <real>0.0</real>
+ <key>Size</key>
+ <real>9</real>
+ </dict>
+ <key>ID</key>
+ <integer>199</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0, -0.5}</string>
+ <string>{-0.5, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Bezier</string>
+ <key>ShapeData</key>
+ <dict>
+ <key>UnitPoints</key>
+ <array>
+ <string>{-0.5, -0.5}</string>
+ <string>{-0.5, -0.5}</string>
+ <string>{0.5, -0.5}</string>
+ <string>{0.5, -0.5}</string>
+ <string>{0.5, -0.5}</string>
+ <string>{0.5, 0.499996}</string>
+ <string>{0.5, 0.499996}</string>
+ <string>{0.166667, 0.499996}</string>
+ <string>{-0.333334, 0.500008}</string>
+ <string>{-0.5, 0.499996}</string>
+ <string>{-0.499999, 0.499996}</string>
+ <string>{-0.5, -0.5}</string>
+ </array>
+ </dict>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.939516</string>
+ <key>g</key>
+ <string>0.939516</string>
+ <key>r</key>
+ <string>0.939516</string>
+ </dict>
+ <key>FillType</key>
+ <integer>3</integer>
+ <key>GradientColor</key>
+ <dict>
+ <key>w</key>
+ <string>0.657258</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ <key>Fuzziness</key>
+ <real>5.7921171188354492</real>
+ <key>ShadowVector</key>
+ <string>{3, 4}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>archive</key>
+ <data>
+ YnBsaXN0MDDUAQIDBAUGCQpYJHZl
+ cnNpb25UJHRvcFkkYXJjaGl2ZXJY
+ JG9iamVjdHMSAAGGoNEHCFRyb290
+ gAFfEA9OU0tleWVkQXJjaGl2ZXKl
+ CwwVGR5VJG51bGzUDQ4PEBESExRW
+ JGNsYXNzXE5TQ29sb3JTcGFjZV8Q
+ Ek5TQ3VzdG9tQ29sb3JTcGFjZVdO
+ U1doaXRlgAQQA4ACRDAuNQDSDRYX
+ GFROU0lEgAMQAtIaGxwOWCRjbGFz
+ c2VzWiRjbGFzc25hbWWiDh1YTlNP
+ YmplY3TSGhsfIKIgHVdOU0NvbG9y
+ CBEaHykyNzo/QVNZX2hvfJGZm52f
+ pKmusLK3wMvO19zfAAAAAAAAAQEA
+ AAAAAAAAIQAAAAAAAAAAAAAAAAAA
+ AOc=
+ </data>
+ <key>b</key>
+ <string>0.500023</string>
+ <key>g</key>
+ <string>0.500023</string>
+ <key>r</key>
+ <string>0.500023</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>9</real>
+ <key>Width</key>
+ <real>2</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs18 \cf0 Repository Source}</string>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{353.068, 269}, {83, 29.0002}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>Helvetica</string>
+ <key>NSKern</key>
+ <real>0.0</real>
+ <key>Size</key>
+ <real>12</real>
+ </dict>
+ <key>ID</key>
+ <integer>198</integer>
+ <key>Shape</key>
+ <string>Bezier</string>
+ <key>ShapeData</key>
+ <dict>
+ <key>UnitPoints</key>
+ <array>
+ <string>{-0.5, -0.5}</string>
+ <string>{-0.5, -0.5}</string>
+ <string>{0.5, -0.5}</string>
+ <string>{0.5, -0.5}</string>
+ <string>{0.5, -0.5}</string>
+ <string>{0.5, 0.499996}</string>
+ <string>{0.5, 0.499996}</string>
+ <string>{0.166667, 0.499996}</string>
+ <string>{-0.333334, 0.500008}</string>
+ <string>{-0.5, 0.499996}</string>
+ <string>{-0.499999, 0.499996}</string>
+ <string>{-0.5, -0.5}</string>
+ </array>
+ </dict>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.284764</string>
+ <key>g</key>
+ <string>0.341238</string>
+ <key>r</key>
+ <string>0.527916</string>
+ </dict>
+ <key>GradientColor</key>
+ <dict>
+ <key>w</key>
+ <string>0.666667</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Fuzziness</key>
+ <real>5.7921171188354492</real>
+ <key>ShadowVector</key>
+ <string>{3, 4}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>CornerRadius</key>
+ <real>9</real>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 Repository Source}</string>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{353.068, 298}, {83, 37}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>197</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0.5, -0.121622}</string>
+ <string>{0, 0.121622}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.441947</string>
+ <key>g</key>
+ <string>0.595697</string>
+ <key>r</key>
+ <string>0.630182</string>
+ </dict>
+ <key>GradientCenter</key>
+ <string>{-0.0761905, -0.114286}</string>
+ <key>MiddleFraction</key>
+ <real>0.4841269850730896</real>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Fuzziness</key>
+ <real>5.7921171188354492</real>
+ <key>ShadowVector</key>
+ <string>{3, 4}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 Federation}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>233</integer>
+ <key>Info</key>
+ <integer>1</integer>
+ </dict>
+ <key>ID</key>
+ <integer>226</integer>
+ <key>Points</key>
+ <array>
+ <string>{394.568, 321}</string>
+ <string>{506.068, 405}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>197</integer>
+ <key>Info</key>
+ <integer>2</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>ID</key>
+ <integer>221</integer>
+ <key>Points</key>
+ <array>
+ <string>{179.068, 342.06}</string>
+ <string>{179.068, 364.323}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>archive</key>
+ <data>
+ YnBsaXN0MDDUAQIDBAUGCQpYJHZl
+ cnNpb25UJHRvcFkkYXJjaGl2ZXJY
+ JG9iamVjdHMSAAGGoNEHCFRyb290
+ gAFfEA9OU0tleWVkQXJjaGl2ZXKl
+ CwwVGR5VJG51bGzUDQ4PEBESExRW
+ JGNsYXNzXE5TQ29sb3JTcGFjZV8Q
+ Ek5TQ3VzdG9tQ29sb3JTcGFjZVdO
+ U1doaXRlgAQQA4ACRDAuNQDSDRYX
+ GFROU0lEgAMQAtIaGxwOWCRjbGFz
+ c2VzWiRjbGFzc25hbWWiDh1YTlNP
+ YmplY3TSGhsfIKIgHVdOU0NvbG9y
+ CBEaHykyNzo/QVNZX2hvfJGZm52f
+ pKmusLK3wMvO19zfAAAAAAAAAQEA
+ AAAAAAAAIQAAAAAAAAAAAAAAAAAA
+ AOc=
+ </data>
+ <key>b</key>
+ <string>0.500023</string>
+ <key>g</key>
+ <string>0.500023</string>
+ <key>r</key>
+ <string>0.500023</string>
+ </dict>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>ID</key>
+ <integer>220</integer>
+ <key>Points</key>
+ <array>
+ <string>{64.0682, 341.62}</string>
+ <string>{64.0682, 363.883}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>archive</key>
+ <data>
+ YnBsaXN0MDDUAQIDBAUGCQpYJHZl
+ cnNpb25UJHRvcFkkYXJjaGl2ZXJY
+ JG9iamVjdHMSAAGGoNEHCFRyb290
+ gAFfEA9OU0tleWVkQXJjaGl2ZXKl
+ CwwVGR5VJG51bGzUDQ4PEBESExRW
+ JGNsYXNzXE5TQ29sb3JTcGFjZV8Q
+ Ek5TQ3VzdG9tQ29sb3JTcGFjZVdO
+ U1doaXRlgAQQA4ACRDAuNQDSDRYX
+ GFROU0lEgAMQAtIaGxwOWCRjbGFz
+ c2VzWiRjbGFzc25hbWWiDh1YTlNP
+ YmplY3TSGhsfIKIgHVdOU0NvbG9y
+ CBEaHykyNzo/QVNZX2hvfJGZm52f
+ pKmusLK3wMvO19zfAAAAAAAAAQEA
+ AAAAAAAAIQAAAAAAAAAAAAAAAAAA
+ AOc=
+ </data>
+ <key>b</key>
+ <string>0.500023</string>
+ <key>g</key>
+ <string>0.500023</string>
+ <key>r</key>
+ <string>0.500023</string>
+ </dict>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{37.0682, 418.363}, {55, 28}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>Vertical</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>ID</key>
+ <integer>219</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Pad</key>
+ <integer>0</integer>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 Java Objects}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>Group</string>
+ <key>Graphics</key>
+ <array>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>212</integer>
+ </dict>
+ <key>ID</key>
+ <integer>206</integer>
+ <key>Points</key>
+ <array>
+ <string>{50.2662, 393.481}</string>
+ <string>{50.2662, 397.299}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>archive</key>
+ <data>
+ YnBsaXN0MDDU
+ AQIDBAUGCQpY
+ JHZlcnNpb25U
+ JHRvcFkkYXJj
+ aGl2ZXJYJG9i
+ amVjdHMSAAGG
+ oNEHCFRyb290
+ gAFfEA9OU0tl
+ eWVkQXJjaGl2
+ ZXKlCwwVGR5V
+ JG51bGzUDQ4P
+ EBESExRWJGNs
+ YXNzXE5TQ29s
+ b3JTcGFjZV8Q
+ Ek5TQ3VzdG9t
+ Q29sb3JTcGFj
+ ZVdOU1doaXRl
+ gAQQA4ACRDAu
+ NQDSDRYXGFRO
+ U0lEgAMQAtIa
+ GxwOWCRjbGFz
+ c2VzWiRjbGFz
+ c25hbWWiDh1Y
+ TlNPYmplY3TS
+ GhsfIKIgHVdO
+ U0NvbG9yCBEa
+ HykyNzo/QVNZ
+ X2hvfJGZm52f
+ pKmusLK3wMvO
+ 19zfAAAAAAAA
+ AQEAAAAAAAAA
+ IQAAAAAAAAAA
+ AAAAAAAAAOc=
+ </data>
+ <key>b</key>
+ <string>0.500023</string>
+ <key>g</key>
+ <string>0.500023</string>
+ <key>r</key>
+ <string>0.500023</string>
+ </dict>
+ <key>HeadArrow</key>
+ <string>0</string>
+ <key>TailArrow</key>
+ <string>0</string>
+ <key>Width</key>
+ <real>2</real>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>217</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>213</integer>
+ </dict>
+ <key>ID</key>
+ <integer>207</integer>
+ <key>Points</key>
+ <array>
+ <string>{75.1351, 393.075}</string>
+ <string>{76.8942, 397.704}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>archive</key>
+ <data>
+ YnBsaXN0MDDU
+ AQIDBAUGCQpY
+ JHZlcnNpb25U
+ JHRvcFkkYXJj
+ aGl2ZXJYJG9i
+ amVjdHMSAAGG
+ oNEHCFRyb290
+ gAFfEA9OU0tl
+ eWVkQXJjaGl2
+ ZXKlCwwVGR5V
+ JG51bGzUDQ4P
+ EBESExRWJGNs
+ YXNzXE5TQ29s
+ b3JTcGFjZV8Q
+ Ek5TQ3VzdG9t
+ Q29sb3JTcGFj
+ ZVdOU1doaXRl
+ gAQQA4ACRDAu
+ NQDSDRYXGFRO
+ U0lEgAMQAtIa
+ GxwOWCRjbGFz
+ c2VzWiRjbGFz
+ c25hbWWiDh1Y
+ TlNPYmplY3TS
+ GhsfIKIgHVdO
+ U0NvbG9yCBEa
+ HykyNzo/QVNZ
+ X2hvfJGZm52f
+ pKmusLK3wMvO
+ 19zfAAAAAAAA
+ AQEAAAAAAAAA
+ IQAAAAAAAAAA
+ AAAAAAAAAOc=
+ </data>
+ <key>b</key>
+ <string>0.500023</string>
+ <key>g</key>
+ <string>0.500023</string>
+ <key>r</key>
+ <string>0.500023</string>
+ </dict>
+ <key>HeadArrow</key>
+ <string>0</string>
+ <key>TailArrow</key>
+ <string>0</string>
+ <key>Width</key>
+ <real>2</real>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>215</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>214</integer>
+ </dict>
+ <key>ID</key>
+ <integer>208</integer>
+ <key>Points</key>
+ <array>
+ <string>{71.1849, 393.075}</string>
+ <string>{69.4254, 397.704}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>archive</key>
+ <data>
+ YnBsaXN0MDDU
+ AQIDBAUGCQpY
+ JHZlcnNpb25U
+ JHRvcFkkYXJj
+ aGl2ZXJYJG9i
+ amVjdHMSAAGG
+ oNEHCFRyb290
+ gAFfEA9OU0tl
+ eWVkQXJjaGl2
+ ZXKlCwwVGR5V
+ JG51bGzUDQ4P
+ EBESExRWJGNs
+ YXNzXE5TQ29s
+ b3JTcGFjZV8Q
+ Ek5TQ3VzdG9t
+ Q29sb3JTcGFj
+ ZVdOU1doaXRl
+ gAQQA4ACRDAu
+ NQDSDRYXGFRO
+ U0lEgAMQAtIa
+ GxwOWCRjbGFz
+ c2VzWiRjbGFz
+ c25hbWWiDh1Y
+ TlNPYmplY3TS
+ GhsfIKIgHVdO
+ U0NvbG9yCBEa
+ HykyNzo/QVNZ
+ X2hvfJGZm52f
+ pKmusLK3wMvO
+ 19zfAAAAAAAA
+ AQEAAAAAAAAA
+ IQAAAAAAAAAA
+ AAAAAAAAAOc=
+ </data>
+ <key>b</key>
+ <string>0.500023</string>
+ <key>g</key>
+ <string>0.500023</string>
+ <key>r</key>
+ <string>0.500023</string>
+ </dict>
+ <key>HeadArrow</key>
+ <string>0</string>
+ <key>TailArrow</key>
+ <string>0</string>
+ <key>Width</key>
+ <real>2</real>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>215</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>215</integer>
+ </dict>
+ <key>ID</key>
+ <integer>209</integer>
+ <key>Points</key>
+ <array>
+ <string>{64.9909, 376.781}</string>
+ <string>{69.9094, 383.462}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>archive</key>
+ <data>
+ YnBsaXN0MDDU
+ AQIDBAUGCQpY
+ JHZlcnNpb25U
+ JHRvcFkkYXJj
+ aGl2ZXJYJG9i
+ amVjdHMSAAGG
+ oNEHCFRyb290
+ gAFfEA9OU0tl
+ eWVkQXJjaGl2
+ ZXKlCwwVGR5V
+ JG51bGzUDQ4P
+ EBESExRWJGNs
+ YXNzXE5TQ29s
+ b3JTcGFjZV8Q
+ Ek5TQ3VzdG9t
+ Q29sb3JTcGFj
+ ZVdOU1doaXRl
+ gAQQA4ACRDAu
+ NQDSDRYXGFRO
+ U0lEgAMQAtIa
+ GxwOWCRjbGFz
+ c2VzWiRjbGFz
+ c25hbWWiDh1Y
+ TlNPYmplY3TS
+ GhsfIKIgHVdO
+ U0NvbG9yCBEa
+ HykyNzo/QVNZ
+ X2hvfJGZm52f
+ pKmusLK3wMvO
+ 19zfAAAAAAAA
+ AQEAAAAAAAAA
+ IQAAAAAAAAAA
+ AAAAAAAAAOc=
+ </data>
+ <key>b</key>
+ <string>0.500023</string>
+ <key>g</key>
+ <string>0.500023</string>
+ <key>r</key>
+ <string>0.500023</string>
+ </dict>
+ <key>HeadArrow</key>
+ <string>0</string>
+ <key>TailArrow</key>
+ <string>0</string>
+ <key>Width</key>
+ <real>2</real>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>218</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>216</integer>
+ </dict>
+ <key>ID</key>
+ <integer>210</integer>
+ <key>Points</key>
+ <array>
+ <string>{61.7402, 377.968}</string>
+ <string>{61.7402, 382.276}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>archive</key>
+ <data>
+ YnBsaXN0MDDU
+ AQIDBAUGCQpY
+ JHZlcnNpb25U
+ JHRvcFkkYXJj
+ aGl2ZXJYJG9i
+ amVjdHMSAAGG
+ oNEHCFRyb290
+ gAFfEA9OU0tl
+ eWVkQXJjaGl2
+ ZXKlCwwVGR5V
+ JG51bGzUDQ4P
+ EBESExRWJGNs
+ YXNzXE5TQ29s
+ b3JTcGFjZV8Q
+ Ek5TQ3VzdG9t
+ Q29sb3JTcGFj
+ ZVdOU1doaXRl
+ gAQQA4ACRDAu
+ NQDSDRYXGFRO
+ U0lEgAMQAtIa
+ GxwOWCRjbGFz
+ c2VzWiRjbGFz
+ c25hbWWiDh1Y
+ TlNPYmplY3TS
+ GhsfIKIgHVdO
+ U0NvbG9yCBEa
+ HykyNzo/QVNZ
+ X2hvfJGZm52f
+ pKmusLK3wMvO
+ 19zfAAAAAAAA
+ AQEAAAAAAAAA
+ IQAAAAAAAAAA
+ AAAAAAAAAOc=
+ </data>
+ <key>b</key>
+ <string>0.500023</string>
+ <key>g</key>
+ <string>0.500023</string>
+ <key>r</key>
+ <string>0.500023</string>
+ </dict>
+ <key>HeadArrow</key>
+ <string>0</string>
+ <key>TailArrow</key>
+ <string>0</string>
+ <key>Width</key>
+ <real>2</real>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>218</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>217</integer>
+ </dict>
+ <key>ID</key>
+ <integer>211</integer>
+ <key>Points</key>
+ <array>
+ <string>{58.4799, 376.773}</string>
+ <string>{53.5264, 383.47}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>archive</key>
+ <data>
+ YnBsaXN0MDDU
+ AQIDBAUGCQpY
+ JHZlcnNpb25U
+ JHRvcFkkYXJj
+ aGl2ZXJYJG9i
+ amVjdHMSAAGG
+ oNEHCFRyb290
+ gAFfEA9OU0tl
+ eWVkQXJjaGl2
+ ZXKlCwwVGR5V
+ JG51bGzUDQ4P
+ EBESExRWJGNs
+ YXNzXE5TQ29s
+ b3JTcGFjZV8Q
+ Ek5TQ3VzdG9t
+ Q29sb3JTcGFj
+ ZVdOU1doaXRl
+ gAQQA4ACRDAu
+ NQDSDRYXGFRO
+ U0lEgAMQAtIa
+ GxwOWCRjbGFz
+ c2VzWiRjbGFz
+ c25hbWWiDh1Y
+ TlNPYmplY3TS
+ GhsfIKIgHVdO
+ U0NvbG9yCBEa
+ HykyNzo/QVNZ
+ X2hvfJGZm52f
+ pKmusLK3wMvO
+ 19zfAAAAAAAA
+ AQEAAAAAAAAA
+ IQAAAAAAAAAA
+ AAAAAAAAAOc=
+ </data>
+ <key>b</key>
+ <string>0.500023</string>
+ <key>g</key>
+ <string>0.500023</string>
+ <key>r</key>
+ <string>0.500023</string>
+ </dict>
+ <key>HeadArrow</key>
+ <string>0</string>
+ <key>TailArrow</key>
+ <string>0</string>
+ <key>Width</key>
+ <real>2</real>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>218</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{45.9812, 398.299}, {8.57001, 9.20474}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>212</integer>
+ <key>Shape</key>
+ <string>Circle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>FillType</key>
+ <integer>3</integer>
+ <key>GradientCenter</key>
+ <string>{-0.0761905, -0.114286}</string>
+ <key>GradientColor</key>
+ <dict>
+ <key>w</key>
+ <string>0.666667</string>
+ </dict>
+ <key>MiddleFraction</key>
+ <real>0.48412701487541199</real>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ <key>Fuzziness</key>
+ <real>5.7921171188354492</real>
+ <key>ShadowVector</key>
+ <string>{3, 4}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>archive</key>
+ <data>
+ YnBsaXN0MDDU
+ AQIDBAUGCQpY
+ JHZlcnNpb25U
+ JHRvcFkkYXJj
+ aGl2ZXJYJG9i
+ amVjdHMSAAGG
+ oNEHCFRyb290
+ gAFfEA9OU0tl
+ eWVkQXJjaGl2
+ ZXKlCwwVGR5V
+ JG51bGzUDQ4P
+ EBESExRWJGNs
+ YXNzXE5TQ29s
+ b3JTcGFjZV8Q
+ Ek5TQ3VzdG9t
+ Q29sb3JTcGFj
+ ZVdOU1doaXRl
+ gAQQA4ACRDAu
+ NQDSDRYXGFRO
+ U0lEgAMQAtIa
+ GxwOWCRjbGFz
+ c2VzWiRjbGFz
+ c25hbWWiDh1Y
+ TlNPYmplY3TS
+ GhsfIKIgHVdO
+ U0NvbG9yCBEa
+ HykyNzo/QVNZ
+ X2hvfJGZm52f
+ pKmusLK3wMvO
+ 19zfAAAAAAAA
+ AQEAAAAAAAAA
+ IQAAAAAAAAAA
+ AAAAAAAAAOc=
+ </data>
+ <key>b</key>
+ <string>0.500023</string>
+ <key>g</key>
+ <string>0.500023</string>
+ <key>r</key>
+ <string>0.500023</string>
+ </dict>
+ <key>Width</key>
+ <real>2</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{74.5842, 398.299}, {8.57001, 9.20474}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>213</integer>
+ <key>Shape</key>
+ <string>Circle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>FillType</key>
+ <integer>3</integer>
+ <key>GradientCenter</key>
+ <string>{-0.0761905, -0.114286}</string>
+ <key>GradientColor</key>
+ <dict>
+ <key>w</key>
+ <string>0.666667</string>
+ </dict>
+ <key>MiddleFraction</key>
+ <real>0.48412701487541199</real>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ <key>Fuzziness</key>
+ <real>5.7921171188354492</real>
+ <key>ShadowVector</key>
+ <string>{3, 4}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>archive</key>
+ <data>
+ YnBsaXN0MDDU
+ AQIDBAUGCQpY
+ JHZlcnNpb25U
+ JHRvcFkkYXJj
+ aGl2ZXJYJG9i
+ amVjdHMSAAGG
+ oNEHCFRyb290
+ gAFfEA9OU0tl
+ eWVkQXJjaGl2
+ ZXKlCwwVGR5V
+ JG51bGzUDQ4P
+ EBESExRWJGNs
+ YXNzXE5TQ29s
+ b3JTcGFjZV8Q
+ Ek5TQ3VzdG9t
+ Q29sb3JTcGFj
+ ZVdOU1doaXRl
+ gAQQA4ACRDAu
+ NQDSDRYXGFRO
+ U0lEgAMQAtIa
+ GxwOWCRjbGFz
+ c2VzWiRjbGFz
+ c25hbWWiDh1Y
+ TlNPYmplY3TS
+ GhsfIKIgHVdO
+ U0NvbG9yCBEa
+ HykyNzo/QVNZ
+ X2hvfJGZm52f
+ pKmusLK3wMvO
+ 19zfAAAAAAAA
+ AQEAAAAAAAAA
+ IQAAAAAAAAAA
+ AAAAAAAAAOc=
+ </data>
+ <key>b</key>
+ <string>0.500023</string>
+ <key>g</key>
+ <string>0.500023</string>
+ <key>r</key>
+ <string>0.500023</string>
+ </dict>
+ <key>Width</key>
+ <real>2</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{63.1652, 398.299}, {8.57001, 9.20474}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>214</integer>
+ <key>Shape</key>
+ <string>Circle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>FillType</key>
+ <integer>3</integer>
+ <key>GradientCenter</key>
+ <string>{-0.0761905, -0.114286}</string>
+ <key>GradientColor</key>
+ <dict>
+ <key>w</key>
+ <string>0.666667</string>
+ </dict>
+ <key>MiddleFraction</key>
+ <real>0.48412701487541199</real>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ <key>Fuzziness</key>
+ <real>5.7921171188354492</real>
+ <key>ShadowVector</key>
+ <string>{3, 4}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>archive</key>
+ <data>
+ YnBsaXN0MDDU
+ AQIDBAUGCQpY
+ JHZlcnNpb25U
+ JHRvcFkkYXJj
+ aGl2ZXJYJG9i
+ amVjdHMSAAGG
+ oNEHCFRyb290
+ gAFfEA9OU0tl
+ eWVkQXJjaGl2
+ ZXKlCwwVGR5V
+ JG51bGzUDQ4P
+ EBESExRWJGNs
+ YXNzXE5TQ29s
+ b3JTcGFjZV8Q
+ Ek5TQ3VzdG9t
+ Q29sb3JTcGFj
+ ZVdOU1doaXRl
+ gAQQA4ACRDAu
+ NQDSDRYXGFRO
+ U0lEgAMQAtIa
+ GxwOWCRjbGFz
+ c2VzWiRjbGFz
+ c25hbWWiDh1Y
+ TlNPYmplY3TS
+ GhsfIKIgHVdO
+ U0NvbG9yCBEa
+ HykyNzo/QVNZ
+ X2hvfJGZm52f
+ pKmusLK3wMvO
+ 19zfAAAAAAAA
+ AQEAAAAAAAAA
+ IQAAAAAAAAAA
+ AAAAAAAAAOc=
+ </data>
+ <key>b</key>
+ <string>0.500023</string>
+ <key>g</key>
+ <string>0.500023</string>
+ <key>r</key>
+ <string>0.500023</string>
+ </dict>
+ <key>Width</key>
+ <real>2</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{68.8752, 383.276}, {8.57001, 9.20474}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>215</integer>
+ <key>Shape</key>
+ <string>Circle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>FillType</key>
+ <integer>3</integer>
+ <key>GradientCenter</key>
+ <string>{-0.0761905, -0.114286}</string>
+ <key>GradientColor</key>
+ <dict>
+ <key>w</key>
+ <string>0.666667</string>
+ </dict>
+ <key>MiddleFraction</key>
+ <real>0.48412701487541199</real>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ <key>Fuzziness</key>
+ <real>5.7921171188354492</real>
+ <key>ShadowVector</key>
+ <string>{3, 4}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>archive</key>
+ <data>
+ YnBsaXN0MDDU
+ AQIDBAUGCQpY
+ JHZlcnNpb25U
+ JHRvcFkkYXJj
+ aGl2ZXJYJG9i
+ amVjdHMSAAGG
+ oNEHCFRyb290
+ gAFfEA9OU0tl
+ eWVkQXJjaGl2
+ ZXKlCwwVGR5V
+ JG51bGzUDQ4P
+ EBESExRWJGNs
+ YXNzXE5TQ29s
+ b3JTcGFjZV8Q
+ Ek5TQ3VzdG9t
+ Q29sb3JTcGFj
+ ZVdOU1doaXRl
+ gAQQA4ACRDAu
+ NQDSDRYXGFRO
+ U0lEgAMQAtIa
+ GxwOWCRjbGFz
+ c2VzWiRjbGFz
+ c25hbWWiDh1Y
+ TlNPYmplY3TS
+ GhsfIKIgHVdO
+ U0NvbG9yCBEa
+ HykyNzo/QVNZ
+ X2hvfJGZm52f
+ pKmusLK3wMvO
+ 19zfAAAAAAAA
+ AQEAAAAAAAAA
+ IQAAAAAAAAAA
+ AAAAAAAAAOc=
+ </data>
+ <key>b</key>
+ <string>0.500023</string>
+ <key>g</key>
+ <string>0.500023</string>
+ <key>r</key>
+ <string>0.500023</string>
+ </dict>
+ <key>Width</key>
+ <real>2</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{57.4552, 383.276}, {8.57001, 9.20474}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>216</integer>
+ <key>Shape</key>
+ <string>Circle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>FillType</key>
+ <integer>3</integer>
+ <key>GradientCenter</key>
+ <string>{-0.0761905, -0.114286}</string>
+ <key>GradientColor</key>
+ <dict>
+ <key>w</key>
+ <string>0.666667</string>
+ </dict>
+ <key>MiddleFraction</key>
+ <real>0.48412701487541199</real>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ <key>Fuzziness</key>
+ <real>5.7921171188354492</real>
+ <key>ShadowVector</key>
+ <string>{3, 4}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>archive</key>
+ <data>
+ YnBsaXN0MDDU
+ AQIDBAUGCQpY
+ JHZlcnNpb25U
+ JHRvcFkkYXJj
+ aGl2ZXJYJG9i
+ amVjdHMSAAGG
+ oNEHCFRyb290
+ gAFfEA9OU0tl
+ eWVkQXJjaGl2
+ ZXKlCwwVGR5V
+ JG51bGzUDQ4P
+ EBESExRWJGNs
+ YXNzXE5TQ29s
+ b3JTcGFjZV8Q
+ Ek5TQ3VzdG9t
+ Q29sb3JTcGFj
+ ZVdOU1doaXRl
+ gAQQA4ACRDAu
+ NQDSDRYXGFRO
+ U0lEgAMQAtIa
+ GxwOWCRjbGFz
+ c2VzWiRjbGFz
+ c25hbWWiDh1Y
+ TlNPYmplY3TS
+ GhsfIKIgHVdO
+ U0NvbG9yCBEa
+ HykyNzo/QVNZ
+ X2hvfJGZm52f
+ pKmusLK3wMvO
+ 19zfAAAAAAAA
+ AQEAAAAAAAAA
+ IQAAAAAAAAAA
+ AAAAAAAAAOc=
+ </data>
+ <key>b</key>
+ <string>0.500023</string>
+ <key>g</key>
+ <string>0.500023</string>
+ <key>r</key>
+ <string>0.500023</string>
+ </dict>
+ <key>Width</key>
+ <real>2</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{45.9812, 383.276}, {8.57001, 9.20474}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>217</integer>
+ <key>Shape</key>
+ <string>Circle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>FillType</key>
+ <integer>3</integer>
+ <key>GradientCenter</key>
+ <string>{-0.0761905, -0.114286}</string>
+ <key>GradientColor</key>
+ <dict>
+ <key>w</key>
+ <string>0.666667</string>
+ </dict>
+ <key>MiddleFraction</key>
+ <real>0.48412701487541199</real>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ <key>Fuzziness</key>
+ <real>5.7921171188354492</real>
+ <key>ShadowVector</key>
+ <string>{3, 4}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>archive</key>
+ <data>
+ YnBsaXN0MDDU
+ AQIDBAUGCQpY
+ JHZlcnNpb25U
+ JHRvcFkkYXJj
+ aGl2ZXJYJG9i
+ amVjdHMSAAGG
+ oNEHCFRyb290
+ gAFfEA9OU0tl
+ eWVkQXJjaGl2
+ ZXKlCwwVGR5V
+ JG51bGzUDQ4P
+ EBESExRWJGNs
+ YXNzXE5TQ29s
+ b3JTcGFjZV8Q
+ Ek5TQ3VzdG9t
+ Q29sb3JTcGFj
+ ZVdOU1doaXRl
+ gAQQA4ACRDAu
+ NQDSDRYXGFRO
+ U0lEgAMQAtIa
+ GxwOWCRjbGFz
+ c2VzWiRjbGFz
+ c25hbWWiDh1Y
+ TlNPYmplY3TS
+ GhsfIKIgHVdO
+ U0NvbG9yCBEa
+ HykyNzo/QVNZ
+ X2hvfJGZm52f
+ pKmusLK3wMvO
+ 19zfAAAAAAAA
+ AQEAAAAAAAAA
+ IQAAAAAAAAAA
+ AAAAAAAAAOc=
+ </data>
+ <key>b</key>
+ <string>0.500023</string>
+ <key>g</key>
+ <string>0.500023</string>
+ <key>r</key>
+ <string>0.500023</string>
+ </dict>
+ <key>Width</key>
+ <real>2</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{57.4552, 367.763}, {8.57002, 9.20475}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>218</integer>
+ <key>Shape</key>
+ <string>Circle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>FillType</key>
+ <integer>3</integer>
+ <key>GradientCenter</key>
+ <string>{-0.0761905, -0.114286}</string>
+ <key>GradientColor</key>
+ <dict>
+ <key>w</key>
+ <string>0.666667</string>
+ </dict>
+ <key>MiddleFraction</key>
+ <real>0.48412701487541199</real>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ <key>Fuzziness</key>
+ <real>5.7921171188354492</real>
+ <key>ShadowVector</key>
+ <string>{3, 4}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>archive</key>
+ <data>
+ YnBsaXN0MDDU
+ AQIDBAUGCQpY
+ JHZlcnNpb25U
+ JHRvcFkkYXJj
+ aGl2ZXJYJG9i
+ amVjdHMSAAGG
+ oNEHCFRyb290
+ gAFfEA9OU0tl
+ eWVkQXJjaGl2
+ ZXKlCwwVGR5V
+ JG51bGzUDQ4P
+ EBESExRWJGNs
+ YXNzXE5TQ29s
+ b3JTcGFjZV8Q
+ Ek5TQ3VzdG9t
+ Q29sb3JTcGFj
+ ZVdOU1doaXRl
+ gAQQA4ACRDAu
+ NQDSDRYXGFRO
+ U0lEgAMQAtIa
+ GxwOWCRjbGFz
+ c2VzWiRjbGFz
+ c25hbWWiDh1Y
+ TlNPYmplY3TS
+ GhsfIKIgHVdO
+ U0NvbG9yCBEa
+ HykyNzo/QVNZ
+ X2hvfJGZm52f
+ pKmusLK3wMvO
+ 19zfAAAAAAAA
+ AQEAAAAAAAAA
+ IQAAAAAAAAAA
+ AAAAAAAAAOc=
+ </data>
+ <key>b</key>
+ <string>0.500023</string>
+ <key>g</key>
+ <string>0.500023</string>
+ <key>r</key>
+ <string>0.500023</string>
+ </dict>
+ <key>Width</key>
+ <real>2</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ </array>
+ <key>ID</key>
+ <integer>205</integer>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{152.068, 419.242}, {55, 28}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>Vertical</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>ID</key>
+ <integer>158</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Pad</key>
+ <integer>0</integer>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 JBoss Cache}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{145.068, 368.643}, {69, 39.7404}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>Helvetica-Bold</string>
+ <key>NSKern</key>
+ <real>0.0</real>
+ <key>Size</key>
+ <real>12</real>
+ </dict>
+ <key>ID</key>
+ <integer>191</integer>
+ <key>Shape</key>
+ <string>RoundRect</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>FillType</key>
+ <integer>3</integer>
+ <key>GradientCenter</key>
+ <string>{-0.0761905, -0.114286}</string>
+ <key>GradientColor</key>
+ <dict>
+ <key>w</key>
+ <string>0.666667</string>
+ </dict>
+ <key>MiddleFraction</key>
+ <real>0.48412701487541199</real>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ <key>Fuzziness</key>
+ <real>5.7921171188354492</real>
+ <key>ShadowVector</key>
+ <string>{3, 4}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>archive</key>
+ <data>
+ YnBsaXN0MDDUAQIDBAUGCQpYJHZl
+ cnNpb25UJHRvcFkkYXJjaGl2ZXJY
+ JG9iamVjdHMSAAGGoNEHCFRyb290
+ gAFfEA9OU0tleWVkQXJjaGl2ZXKl
+ CwwVGR5VJG51bGzUDQ4PEBESExRW
+ JGNsYXNzXE5TQ29sb3JTcGFjZV8Q
+ Ek5TQ3VzdG9tQ29sb3JTcGFjZVdO
+ U1doaXRlgAQQA4ACRDAuNQDSDRYX
+ GFROU0lEgAMQAtIaGxwOWCRjbGFz
+ c2VzWiRjbGFzc25hbWWiDh1YTlNP
+ YmplY3TSGhsfIKIgHVdOU0NvbG9y
+ CBEaHykyNzo/QVNZX2hvfJGZm52f
+ pKmusLK3wMvO19zfAAAAAAAAAQEA
+ AAAAAAAAIQAAAAAAAAAAAAAAAAAA
+ AOc=
+ </data>
+ <key>b</key>
+ <string>0.500023</string>
+ <key>g</key>
+ <string>0.500023</string>
+ <key>r</key>
+ <string>0.500023</string>
+ </dict>
+ <key>Width</key>
+ <real>2</real>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{138.068, 269}, {83, 29.0002}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>Helvetica</string>
+ <key>NSKern</key>
+ <real>0.0</real>
+ <key>Size</key>
+ <real>12</real>
+ </dict>
+ <key>ID</key>
+ <integer>47</integer>
+ <key>Shape</key>
+ <string>Bezier</string>
+ <key>ShapeData</key>
+ <dict>
+ <key>UnitPoints</key>
+ <array>
+ <string>{-0.5, -0.5}</string>
+ <string>{-0.5, -0.5}</string>
+ <string>{0.5, -0.5}</string>
+ <string>{0.5, -0.5}</string>
+ <string>{0.5, -0.5}</string>
+ <string>{0.5, 0.499996}</string>
+ <string>{0.5, 0.499996}</string>
+ <string>{0.166667, 0.499996}</string>
+ <string>{-0.333334, 0.500008}</string>
+ <string>{-0.5, 0.499996}</string>
+ <string>{-0.499999, 0.499996}</string>
+ <string>{-0.5, -0.5}</string>
+ </array>
+ </dict>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.284764</string>
+ <key>g</key>
+ <string>0.341238</string>
+ <key>r</key>
+ <string>0.527916</string>
+ </dict>
+ <key>GradientColor</key>
+ <dict>
+ <key>w</key>
+ <string>0.666667</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Fuzziness</key>
+ <real>5.7921171188354492</real>
+ <key>ShadowVector</key>
+ <string>{3, 4}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>CornerRadius</key>
+ <real>9</real>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 Repository Source}</string>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{138.068, 298}, {83, 37}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>46</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.441947</string>
+ <key>g</key>
+ <string>0.595697</string>
+ <key>r</key>
+ <string>0.630182</string>
+ </dict>
+ <key>GradientCenter</key>
+ <string>{-0.0761905, -0.114286}</string>
+ <key>MiddleFraction</key>
+ <real>0.4841269850730896</real>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Fuzziness</key>
+ <real>5.7921171188354492</real>
+ <key>ShadowVector</key>
+ <string>{3, 4}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 JBoss Cache}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{23.0682, 269}, {83, 29.0002}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>Helvetica</string>
+ <key>NSKern</key>
+ <real>0.0</real>
+ <key>Size</key>
+ <real>12</real>
+ </dict>
+ <key>ID</key>
+ <integer>45</integer>
+ <key>Shape</key>
+ <string>Bezier</string>
+ <key>ShapeData</key>
+ <dict>
+ <key>UnitPoints</key>
+ <array>
+ <string>{-0.5, -0.5}</string>
+ <string>{-0.5, -0.5}</string>
+ <string>{0.5, -0.5}</string>
+ <string>{0.5, -0.5}</string>
+ <string>{0.5, -0.5}</string>
+ <string>{0.5, 0.499996}</string>
+ <string>{0.5, 0.499996}</string>
+ <string>{0.166667, 0.499996}</string>
+ <string>{-0.333334, 0.500008}</string>
+ <string>{-0.5, 0.499996}</string>
+ <string>{-0.499999, 0.499996}</string>
+ <string>{-0.5, -0.5}</string>
+ </array>
+ </dict>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.284764</string>
+ <key>g</key>
+ <string>0.341238</string>
+ <key>r</key>
+ <string>0.527916</string>
+ </dict>
+ <key>GradientColor</key>
+ <dict>
+ <key>w</key>
+ <string>0.666667</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Fuzziness</key>
+ <real>5.7921171188354492</real>
+ <key>ShadowVector</key>
+ <string>{3, 4}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>CornerRadius</key>
+ <real>9</real>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 Repository Source}</string>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{23.0682, 298}, {83, 37}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>43</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.441947</string>
+ <key>g</key>
+ <string>0.595697</string>
+ <key>r</key>
+ <string>0.630182</string>
+ </dict>
+ <key>GradientCenter</key>
+ <string>{-0.0761905, -0.114286}</string>
+ <key>MiddleFraction</key>
+ <real>0.4841269850730896</real>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Fuzziness</key>
+ <real>5.7921171188354492</real>
+ <key>ShadowVector</key>
+ <string>{3, 4}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 In-Memory}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ </array>
+ <key>GridInfo</key>
+ <dict/>
+ <key>GuidesLocked</key>
+ <string>NO</string>
+ <key>GuidesVisible</key>
+ <string>YES</string>
+ <key>HPages</key>
+ <integer>1</integer>
+ <key>ImageCounter</key>
+ <integer>1</integer>
+ <key>KeepToScale</key>
+ <false/>
+ <key>Layers</key>
+ <array>
+ <dict>
+ <key>Lock</key>
+ <string>NO</string>
+ <key>Name</key>
+ <string>Layer 1</string>
+ <key>Print</key>
+ <string>YES</string>
+ <key>View</key>
+ <string>YES</string>
+ </dict>
+ </array>
+ <key>LayoutInfo</key>
+ <dict>
+ <key>Animate</key>
+ <string>NO</string>
+ <key>circoMinDist</key>
+ <real>18</real>
+ <key>circoSeparation</key>
+ <real>0.0</real>
+ <key>layoutEngine</key>
+ <string>dot</string>
+ <key>neatoSeparation</key>
+ <real>0.0</real>
+ <key>twopiSeparation</key>
+ <real>0.0</real>
+ </dict>
+ <key>LinksVisible</key>
+ <string>NO</string>
+ <key>MagnetsVisible</key>
+ <string>NO</string>
+ <key>MasterSheets</key>
+ <array/>
+ <key>ModificationDate</key>
+ <string>2008-09-19 10:35:32 -0500</string>
+ <key>Modifier</key>
+ <string>Randall Hauch</string>
+ <key>NotesVisible</key>
+ <string>NO</string>
+ <key>Orientation</key>
+ <integer>2</integer>
+ <key>OriginVisible</key>
+ <string>NO</string>
+ <key>PageBreaks</key>
+ <string>YES</string>
+ <key>PrintInfo</key>
+ <dict>
+ <key>NSBottomMargin</key>
+ <array>
+ <string>float</string>
+ <string>41</string>
+ </array>
+ <key>NSLeftMargin</key>
+ <array>
+ <string>float</string>
+ <string>18</string>
+ </array>
+ <key>NSPaperSize</key>
+ <array>
+ <string>size</string>
+ <string>{612, 792}</string>
+ </array>
+ <key>NSRightMargin</key>
+ <array>
+ <string>float</string>
+ <string>18</string>
+ </array>
+ <key>NSTopMargin</key>
+ <array>
+ <string>float</string>
+ <string>18</string>
+ </array>
+ </dict>
+ <key>PrintOnePage</key>
+ <false/>
+ <key>QuickLookPreview</key>
+ <data>
+ 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
+ cpAf5ksOWmgTVMDwSUOBg0JpEwlMS8+oQFBR7JTiQf6puURaEsu5iqOXwH3OqYo79xuk
+ vXRqSZRzgrUkdG5tSZQcdNrFuSVRtiUeZG2iX5SDaFQ37+496EUPQX99DrLt1BykRmk5
+ SI1SkGk6NxQ7pXiQf3oVp0ZxrzKjmAeZUToPclrxIP/UHKRGKUs77eJklLqteznorPrf
+ MgfdkewedDcH/T/Usx0cCmVuZHN0cmVhbQplbmRvYmoKNSAwIG9iago0NDI1CmVuZG9i
+ agoyIDAgb2JqCjw8IC9UeXBlIC9QYWdlIC9QYXJlbnQgMyAwIFIgL1Jlc291cmNlcyA2
+ IDAgUiAvQ29udGVudHMgNCAwIFIgL01lZGlhQm94IFswIDAgNTc2IDczM10KPj4KZW5k
+ b2JqCjYgMCBvYmoKPDwgL1Byb2NTZXQgWyAvUERGIC9UZXh0IC9JbWFnZUIgL0ltYWdl
+ QyAvSW1hZ2VJIF0gL0NvbG9yU3BhY2UgPDwgL0NzMSA3IDAgUgovQ3MyIDIwIDAgUiA+
+ PiAvRm9udCA8PCAvRjMuMCAzMiAwIFIgL0YxLjAgMjEgMCBSIC9GMi4wIDMxIDAgUiA+
+ PiAvWE9iamVjdAo8PCAvSW01IDE2IDAgUiAvSW0yIDEwIDAgUiAvSW0zIDEyIDAgUiAv
+ SW0xIDggMCBSIC9JbTQgMTQgMCBSIC9JbTYgMTggMCBSCj4+IC9TaGFkaW5nIDw8IC9T
+ aDggMjkgMCBSIC9TaDEyIDM1IDAgUiAvU2g0IDI1IDAgUiAvU2g5IDMwIDAgUiAvU2gx
+ MSAzNCAwIFIKL1NoMyAyNCAwIFIgL1NoMiAyMyAwIFIgL1NoNSAyNiAwIFIgL1NoNiAy
+ NyAwIFIgL1NoMTMgMzYgMCBSIC9TaDcgMjggMCBSIC9TaDEwCjMzIDAgUiAvU2gxIDIy
+ IDAgUiA+PiA+PgplbmRvYmoKMjkgMCBvYmoKPDwgL0NvbG9yU3BhY2UgNyAwIFIgL1No
+ YWRpbmdUeXBlIDMgL0Nvb3JkcyBbIC0wLjcyOTE0MzkgLTEuMTY2MjU5IDAgLTAuNzI5
+ MTQzOQotMS4xNjYyNTkgOC4zNDg3NDQgXSAvRG9tYWluIFsgMCAxIF0gL0V4dGVuZCBb
+ IGZhbHNlIGZhbHNlIF0gL0Z1bmN0aW9uIDM3IDAgUgo+PgplbmRvYmoKMzUgMCBvYmoK
+ PDwgL0NvbG9yU3BhY2UgNyAwIFIgL1NoYWRpbmdUeXBlIDMgL0Nvb3JkcyBbIDAgMCAw
+ IDAgMCAzMC40NjMwOSBdIC9Eb21haW4KWyAwIDEgXSAvRXh0ZW5kIFsgZmFsc2UgZmFs
+ c2UgXSAvRnVuY3Rpb24gMzggMCBSID4+CmVuZG9iagoyNSAwIG9iago8PCAvQ29sb3JT
+ cGFjZSA3IDAgUiAvU2hhZGluZ1R5cGUgMyAvQ29vcmRzIFsgLTAuNzI5MTQzOSAtMS4x
+ NjYyNTkgMCAtMC43MjkxNDM5Ci0xLjE2NjI1OSA4LjM0ODc0NCBdIC9Eb21haW4gWyAw
+ IDEgXSAvRXh0ZW5kIFsgZmFsc2UgZmFsc2UgXSAvRnVuY3Rpb24gMzkgMCBSCj4+CmVu
+ ZG9iagozMCAwIG9iago8PCAvQ29sb3JTcGFjZSA3IDAgUiAvU2hhZGluZ1R5cGUgMyAv
+ Q29vcmRzIFsgMCAwIDAgMCAwIDMyLjMxMDk5IF0gL0RvbWFpbgpbIDAgMSBdIC9FeHRl
+ bmQgWyBmYWxzZSBmYWxzZSBdIC9GdW5jdGlvbiA0MCAwIFIgPj4KZW5kb2JqCjM0IDAg
+ b2JqCjw8IC9Db2xvclNwYWNlIDcgMCBSIC9TaGFkaW5nVHlwZSAzIC9Db29yZHMgWyAw
+ IDAgMCAwIDAgMzAuNDYzMDkgXSAvRG9tYWluClsgMCAxIF0gL0V4dGVuZCBbIGZhbHNl
+ IGZhbHNlIF0gL0Z1bmN0aW9uIDQxIDAgUiA+PgplbmRvYmoKMjQgMCBvYmoKPDwgL0Nv
+ bG9yU3BhY2UgNyAwIFIgL1NoYWRpbmdUeXBlIDMgL0Nvb3JkcyBbIC0wLjcyOTE0Mzkg
+ LTEuMTY2MjU5IDAgLTAuNzI5MTQzOQotMS4xNjYyNTkgOC4zNDg3NDQgXSAvRG9tYWlu
+ IFsgMCAxIF0gL0V4dGVuZCBbIGZhbHNlIGZhbHNlIF0gL0Z1bmN0aW9uIDQyIDAgUgo+
+ PgplbmRvYmoKMjMgMCBvYmoKPDwgL0NvbG9yU3BhY2UgNyAwIFIgL1NoYWRpbmdUeXBl
+ IDMgL0Nvb3JkcyBbIC0wLjcyOTE0NDYgLTEuMTY2MjYgMCAtMC43MjkxNDQ2Ci0xLjE2
+ NjI2IDguMzQ4NzUzIF0gL0RvbWFpbiBbIDAgMSBdIC9FeHRlbmQgWyBmYWxzZSBmYWxz
+ ZSBdIC9GdW5jdGlvbiA0MyAwIFIKPj4KZW5kb2JqCjI2IDAgb2JqCjw8IC9Db2xvclNw
+ YWNlIDcgMCBSIC9TaGFkaW5nVHlwZSAzIC9Db29yZHMgWyAtMC43MjkxNDM5IC0xLjE2
+ NjI1OSAwIC0wLjcyOTE0MzkKLTEuMTY2MjU5IDguMzQ4NzQ0IF0gL0RvbWFpbiBbIDAg
+ MSBdIC9FeHRlbmQgWyBmYWxzZSBmYWxzZSBdIC9GdW5jdGlvbiA0NCAwIFIKPj4KZW5k
+ b2JqCjI3IDAgb2JqCjw8IC9Db2xvclNwYWNlIDcgMCBSIC9TaGFkaW5nVHlwZSAzIC9D
+ b29yZHMgWyAtMC43MjkxNDM5IC0xLjE2NjI1OSAwIC0wLjcyOTE0MzkKLTEuMTY2MjU5
+ IDguMzQ4NzQ0IF0gL0RvbWFpbiBbIDAgMSBdIC9FeHRlbmQgWyBmYWxzZSBmYWxzZSBd
+ IC9GdW5jdGlvbiA0NSAwIFIKPj4KZW5kb2JqCjM2IDAgb2JqCjw8IC9Db2xvclNwYWNl
+ IDcgMCBSIC9TaGFkaW5nVHlwZSAzIC9Db29yZHMgWyAwIDAgMCAwIDAgMzAuNDYzMDkg
+ XSAvRG9tYWluClsgMCAxIF0gL0V4dGVuZCBbIGZhbHNlIGZhbHNlIF0gL0Z1bmN0aW9u
+ IDQ2IDAgUiA+PgplbmRvYmoKMjggMCBvYmoKPDwgL0NvbG9yU3BhY2UgNyAwIFIgL1No
+ YWRpbmdUeXBlIDMgL0Nvb3JkcyBbIC0wLjcyOTE0MzkgLTEuMTY2MjU5IDAgLTAuNzI5
+ MTQzOQotMS4xNjYyNTkgOC4zNDg3NDQgXSAvRG9tYWluIFsgMCAxIF0gL0V4dGVuZCBb
+ IGZhbHNlIGZhbHNlIF0gL0Z1bmN0aW9uIDQ3IDAgUgo+PgplbmRvYmoKMzMgMCBvYmoK
+ PDwgL0NvbG9yU3BhY2UgNyAwIFIgL1NoYWRpbmdUeXBlIDMgL0Nvb3JkcyBbIDAgMCAw
+ IDAgMCAzMC40NjMwOSBdIC9Eb21haW4KWyAwIDEgXSAvRXh0ZW5kIFsgZmFsc2UgZmFs
+ c2UgXSAvRnVuY3Rpb24gNDggMCBSID4+CmVuZG9iagoyMiAwIG9iago8PCAvQ29sb3JT
+ cGFjZSA3IDAgUiAvU2hhZGluZ1R5cGUgMyAvQ29vcmRzIFsgLTUuMzMzMzM1IC00LjY1
+ NjA1NyAwIC01LjMzMzMzNQotNC42NTYwNTcgNDcuNDY2NzQgXSAvRG9tYWluIFsgMCAx
+ IF0gL0V4dGVuZCBbIGZhbHNlIGZhbHNlIF0gL0Z1bmN0aW9uIDQ5IDAgUgo+PgplbmRv
+ YmoKMTYgMCBvYmoKPDwgL0xlbmd0aCAxNyAwIFIgL1R5cGUgL1hPYmplY3QgL1N1YnR5
+ cGUgL0ltYWdlIC9XaWR0aCAxOTQgL0hlaWdodCAxMDIgL0NvbG9yU3BhY2UKNTAgMCBS
+ IC9TTWFzayA1MSAwIFIgL0JpdHNQZXJDb21wb25lbnQgOCAvRmlsdGVyIC9GbGF0ZURl
+ Y29kZSA+PgpzdHJlYW0KeAHt0IEAAAAAw6D5U1/gCIVQYcCAAQMGDBgwYMCAAQMGDBgw
+ YMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMG
+ DBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCA
+ AQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgw
+ YMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMG
+ DBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMG/sAA5+QAAQplbmRzdHJl
+ YW0KZW5kb2JqCjE3IDAgb2JqCjI4MwplbmRvYmoKMTAgMCBvYmoKPDwgL0xlbmd0aCAx
+ MSAwIFIgL1R5cGUgL1hPYmplY3QgL1N1YnR5cGUgL0ltYWdlIC9XaWR0aCAxOTQgL0hl
+ aWdodCA4NiAvQ29sb3JTcGFjZQo1MyAwIFIgL1NNYXNrIDU0IDAgUiAvQml0c1BlckNv
+ bXBvbmVudCA4IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4Ae3QgQAAAADD
+ oPlTH+SFUGHAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+ MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+ BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+ gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+ MGDAgAEDBgwYMGDAgAEDBgwYMPA+MMOEAAEKZW5kc3RyZWFtCmVuZG9iagoxMSAwIG9i
+ agoyNDAKZW5kb2JqCjEyIDAgb2JqCjw8IC9MZW5ndGggMTMgMCBSIC9UeXBlIC9YT2Jq
+ ZWN0IC9TdWJ0eXBlIC9JbWFnZSAvV2lkdGggMTk0IC9IZWlnaHQgMTAyIC9Db2xvclNw
+ YWNlCjUwIDAgUiAvU01hc2sgNTYgMCBSIC9CaXRzUGVyQ29tcG9uZW50IDggL0ZpbHRl
+ ciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCngB7dCBAAAAAMOg+VNf4AiFUGHAgAEDBgwY
+ MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+ BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+ gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+ MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+ BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBv7AAOfk
+ AAEKZW5kc3RyZWFtCmVuZG9iagoxMyAwIG9iagoyODMKZW5kb2JqCjggMCBvYmoKPDwg
+ L0xlbmd0aCA5IDAgUiAvVHlwZSAvWE9iamVjdCAvU3VidHlwZSAvSW1hZ2UgL1dpZHRo
+ IDE5NCAvSGVpZ2h0IDEwMiAvQ29sb3JTcGFjZQo1MCAwIFIgL1NNYXNrIDU4IDAgUiAv
+ Qml0c1BlckNvbXBvbmVudCA4IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4
+ Ae3QgQAAAADDoPlTX+AIhVBhwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM
+ GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB
+ AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg
+ wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM
+ GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB
+ AwYMGDBgwIABAwYMGDBgwIABAwb+wADn5AABCmVuZHN0cmVhbQplbmRvYmoKOSAwIG9i
+ agoyODMKZW5kb2JqCjE0IDAgb2JqCjw8IC9MZW5ndGggMTUgMCBSIC9UeXBlIC9YT2Jq
+ ZWN0IC9TdWJ0eXBlIC9JbWFnZSAvV2lkdGggMTk0IC9IZWlnaHQgODYgL0NvbG9yU3Bh
+ Y2UKNTMgMCBSIC9TTWFzayA2MCAwIFIgL0JpdHNQZXJDb21wb25lbnQgOCAvRmlsdGVy
+ IC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeAHt0IEAAAAAw6D5Ux/khVBhwIABAwYMGDBg
+ wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM
+ GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB
+ AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg
+ wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM
+ GDDwPjDDhAABCmVuZHN0cmVhbQplbmRvYmoKMTUgMCBvYmoKMjQwCmVuZG9iagoxOCAw
+ IG9iago8PCAvTGVuZ3RoIDE5IDAgUiAvVHlwZSAvWE9iamVjdCAvU3VidHlwZSAvSW1h
+ Z2UgL1dpZHRoIDE5NCAvSGVpZ2h0IDg2IC9Db2xvclNwYWNlCjUzIDAgUiAvU01hc2sg
+ NjIgMCBSIC9CaXRzUGVyQ29tcG9uZW50IDggL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4K
+ c3RyZWFtCngB7dCBAAAAAMOg+VMf5IVQYcCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgw
+ YMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMG
+ DBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCA
+ AQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgw
+ YMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgw8D4ww4QAAQplbmRzdHJl
+ YW0KZW5kb2JqCjE5IDAgb2JqCjI0MAplbmRvYmoKNjAgMCBvYmoKPDwgL0xlbmd0aCA2
+ MSAwIFIgL1R5cGUgL1hPYmplY3QgL1N1YnR5cGUgL0ltYWdlIC9XaWR0aCAxOTQgL0hl
+ aWdodCA4NiAvQ29sb3JTcGFjZQovRGV2aWNlR3JheSAvQml0c1BlckNvbXBvbmVudCA4
+ IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4Ae1b+TtbWxc2JiEDiQxk0JAI
+ aUOkRVDa9Aal1SKk9LpVRA39tAhaqg3xGK7g6kVarZqqqHlqQ9Dn/mvf2idCdLxftT3n
+ +R7vL/xyzl7vXsPZ2Wu9bm4nIPYOuBMA37lD7u4eCJ6enl64AgzADHF3/1+IYNZ7enl7
+ e5PIZDIFX5DJJDDEC/H4tyzQ5oP1JArFx5dKpdHodDoDJ8DSNBqV6utDoZAdLP6FJ8B+
+ 2H0yxYdKozP8mEwWK4CNIwICWEymP4NBo/ogEuCJb3CA+MHsp9IY/swANpcXGMTnCwRC
+ nCAQ8Pn8QB6Pw2b5IxLf5gAOQPtPpfsx2dxAvihYLA6VSCRSaRgukEqlEkloiDhYxA/i
+ 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
+ MbOAesmEwubG6uLs5MjTrpbaUqyR9tG9Kdy+hypiNVm3/vPAbBl8OTWzsLSySiisLC9A
+ X3+4r72p+nY2dECgf+B6d73fjL2QebPc+Liz3zo6MT0795ZQmJt7MzlqHeg21VcVXtM4
+ 27GH/QMqk3cqQoUa4tUPWrv7h0ZGxyenCIXJ8Vcjw3/9aW66b8i/knxWjvpohz0c6KOh
+ lr4yPiXnVnlNU2sXjBZZn48QCs+fDcGQkbm5rrJIBw0QWfCRpj70MhkwXKSI0Vy9UVxZ
+ +/BJe1dPbz/B0Gfpbjc11VWVFFy7FKeQCjl+LoMVaDAEJtQiohNTswqKK+7VN7WYzO0E
+ g9nU0lR/v7L4Zk5akkoewmejKztnHkBPH42oSRUxF9Kz8m8ZKqtrjA2NDwiFxkZjTXWl
+ oaggJ0MTFxkGQeQ6noNm1GA6RyxTwqBmpi6/8HZpWXkFwVBeVnq7sEB3LU0Trwx3Dgs6
+ O+KOOUGY9g1Xxp7XpGZcy87V3yggGPL1uTnXr6RdSopTRoTA5O+RWUEYs4NZTSYXG1iO
+ TUzWaFPT0jMIhvTLqVpNcmKcKjI8RMhjMWBU8KAh7uYGugmY2mcBhTCY2T8bq05IPJ9E
+ MJxPTFDHnouOlMPsNY/lB0IE17FfDw9vkg8SHvBFIVKZ/IwiShmtIhiilcrIM/JwaUgw
+ n8vyc8gQnGng5uaQHgAFNo8vDAblijRMRjxIJaHiUyI+j83E5CxHdRQu+hsOL5AvEIoI
+ CKEA5Dhc0OOAluUTPQ7ScIEEx4eKFFyYfotDOICmDKRd/gw6CLtInwqKHDI0UNEhER1u
+ CrpvCffoSF5HQfZ/Tpjm4OBNImEyRh8CAqkrMY0jZr/zQHGYzZDPQAKkpCAkBSEkIQGm
+ YULTrwk0MTEvECEoMPNcd/3k/5MdONkBxw78F/a3ckwKZW5kc3RyZWFtCmVuZG9iago2
+ MSAwIG9iagoyNzAzCmVuZG9iago1MSAwIG9iago8PCAvTGVuZ3RoIDUyIDAgUiAvVHlw
+ ZSAvWE9iamVjdCAvU3VidHlwZSAvSW1hZ2UgL1dpZHRoIDE5NCAvSGVpZ2h0IDEwMiAv
+ Q29sb3JTcGFjZQovRGV2aWNlR3JheSAvQml0c1BlckNvbXBvbmVudCA4IC9GaWx0ZXIg
+ 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
+ criCSEBZma7RgoC1wZhrggy5RmOOLjtTk34GxJMThJGQ+FHCmki58wgKuFSmOANC7poM
+ LXyIxtxlp6bcgQls0DSAoAkiPAkUDcgVSgihkEeqBsSJKAIaH0DTwEGejrCCaHsAFAQI
+ iiVEux6SoAPonwB9D4kYigiiVQnHCUQpEDbwicINCOs2ov0fKFG5wSfuf7Ku4sCGaOkJ
+ UXkigBDEvUDvydfGkFgHom860jwT6Z3hQArQiBOpnjm9eeaABSj/Iepp4ESkmSh6U/ov
+ rQCtwHEF/g8/2JcPCmVuZHN0cmVhbQplbmRvYmoKNTIgMCBvYmoKMTkyNwplbmRvYmoK
+ NjIgMCBvYmoKPDwgL0xlbmd0aCA2MyAwIFIgL1R5cGUgL1hPYmplY3QgL1N1YnR5cGUg
+ L0ltYWdlIC9XaWR0aCAxOTQgL0hlaWdodCA4NiAvQ29sb3JTcGFjZQovRGV2aWNlR3Jh
+ eSAvQml0c1BlckNvbXBvbmVudCA4IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVh
+ bQp4Ae1b+TtbWxc2JiEDiQxk0JAIaUOkRVDa9Aal1SKk9LpVRA39tAhaqg3xGK7g6kVa
+ rZqqqHlqQ9Dn/mvf2idCdLxftT3n+R7vL/xyzl7vXsPZ2Wu9bm4nIPYOuBMA37lD7u4e
+ CJ6enl64AgzADHF3/1+IYNZ7enl7e5PIZDIFX5DJJDDEC/H4tyzQ5oP1JArFx5dKpdHo
+ dDoDJ8DSNBqV6utDoZAdLP6FJ8B+2H0yxYdKozP8mEwWK4CNIwICWEymP4NBo/ogEuCJ
+ b3CA+MHsp9IY/swANpcXGMTnCwRCnCAQ8Pn8QB6Pw2b5IxLf5gAOQPtPpfsx2dxAvihY
+ LA6VSCRSaRgukEqlEkloiDhYxA/iIRKIg9fX3AAOgPD3pfuxOIECkVgSFi4/rVBERkUp
+ cUJUVKRCcVoeLpOEBAsCuQH+dCqFBKH0pUhCBMABDCYnUCiWyOQKpepcbJw6PiEhESck
+ JMSr1bExKmXk6XCJWBTEYTFo4IYvUcAI+ND8AngCsTRCER2jTky+qNFqU1LT8EOqVnvp
+ YnKiOkYVKQ8TC3lsf7rvlyhgBHzpTHaQSBIRqVKf12jTMjKzsnW63Dw9TsjL1emyszKv
+ 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
+ Bw0QWfCRpj70MhkwXKSI0Vy9UVxZ+/BJe1dPbz/B0Gfpbjc11VWVFFy7FKeQCjl+LoMV
+ aDAEJtQiohNTswqKK+7VN7WYzO0Eg9nU0lR/v7L4Zk5akkoewmejKztnHkBPH42oSRUx
+ F9Kz8m8ZKqtrjA2NDwiFxkZjTXWloaggJ0MTFxkGQeQ6noNm1GA6RyxTwqBmpi6/8HZp
+ WXkFwVBeVnq7sEB3LU0Trwx3Dgs6O+KOOUGY9g1Xxp7XpGZcy87V3yggGPL1uTnXr6Rd
+ SopTRoTA5O+RWUEYs4NZTSYXG1iOTUzWaFPT0jMIhvTLqVpNcmKcKjI8RMhjMWBU8KAh
+ 7uYGugmY2mcBhTCY2T8bq05IPJ9EMJxPTFDHnouOlMPsNY/lB0IE17FfDw9vkg8SHvBF
+ IVKZ/IwiShmtIhiilcrIM/JwaUgwn8vyc8gQnGng5uaQHgAFNo8vDAblijRMRjxIJaHi
+ UyI+j83E5CxHdRQu+hsOL5AvEIoICKEA5Dhc0OOAluUTPQ7ScIEEx4eKFFyYfotDOICm
+ DKRd/gw6CLtInwqKHDI0UNEhER1uCrpvCffoSF5HQfZ/Tpjm4OBNImEyRh8CAqkrMY0j
+ Zr/zQHGYzZDPQAKkpCAkBSEkIQGmYULTrwk0MTEvECEoMPNcd/3k/5MdONkBxw78F/a3
+ ckwKZW5kc3RyZWFtCmVuZG9iago2MyAwIG9iagoyNzAzCmVuZG9iago1NCAwIG9iago8
+ PCAvTGVuZ3RoIDU1IDAgUiAvVHlwZSAvWE9iamVjdCAvU3VidHlwZSAvSW1hZ2UgL1dp
+ ZHRoIDE5NCAvSGVpZ2h0IDg2IC9Db2xvclNwYWNlCi9EZXZpY2VHcmF5IC9CaXRzUGVy
+ Q29tcG9uZW50IDggL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCngB7Vv5O1tb
+ FzYmIQOJDGTQkAhpQ6RFUNr0BqXVIqT0ulVEDf20CFqqDfEYruDqRVqtmqqoeWpD0Of+
+ a9/aJ0J0vF+1Pef5Hu8v/HLOXu9ew9nZa71ubicg9g64EwDfuUPu7h4Inp6eXrgCDMAM
+ cXf/X4hg1nt6eXt7k8hkMgVfkMkkMMQL8fi3LNDmg/UkCsXHl0ql0eh0OgMnwNI0GpXq
+ 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
+ 8Ac8fuKDH7CJx3zFiQ+OuYE/4PH/cx+4ff5X5v7VPUH+fPVX5gEDdOOFbh1nlhwNkP0+
+ FiH+oBYIujftbUM3Xp+7L+JLotC9ae0TuLt+Pb+yaYM2JpGwbdtcXZh+NdRjMmL3pp/c
+ Ou630YrvP+oYeD4xs4B6yYTC5sbq4uzkyNOultpSrJH20b0p3L6HKmI1Wbf+88BsGXw5
+ NbOwtLJKKKwsL0Bff7ivvan6djZ0QKB/4Hp3vd+MvZB5s9z4uLPfOjoxPTv3llCYm3sz
+ OWod6DbVVxVe0zjbsYf9AyqTdypChRri1Q9au/uHRkbHJ6cIhcnxVyPDf/1pbrpvyL+S
+ fFaO+miHPRzoo6GWvjI+JedWeU1TaxeMFlmfjxAKz58NwZCRubmuskgHDRBZ8JGmPvQy
+ GTBcpIjRXL1RXFn78El7V09vP8HQZ+luNzXVVZUUXLsUp5AKOX4ugxVoMAQm1CKiE1Oz
+ Coor7tU3tZjM7QSD2dTSVH+/svhmTlqSSh7CZ6MrO2ceQE8fjahJFTEX0rPybxkqq2uM
+ DY0PCIXGRmNNdaWhqCAnQxMXGQZB5Dqeg2bUYDpHLFPCoGamLr/wdmlZeQXBUF5Weruw
+ QHctTROvDHcOCzo74o45QZj2DVfGntekZlzLztXfKCAY8vW5OdevpF1KilNGhMDk75FZ
+ QRizg1lNJhcbWI5NTNZoU9PSMwiG9MupWk1yYpwqMjxEyGMxYFTwoCHu5ga6CZjaZwGF
+ MJjZPxurTkg8n0QwnE9MUMeei46Uw+w1j+UHQgTXsV8PD2+SDxIe8EUhUpn8jCJKGa0i
+ GKKVysgz8nBpSDCfy/JzyBCcaeDm5pAeAAU2jy8MBuWKNExGPEgloeJTIj6PzcTkLEd1
+ FC76Gw4vkC8QiggIoQDkOFzQ44CW5RM9DtJwgQTHh4oUXJh+i0M4gKYMpF3+DDoIu0if
+ CoocMjRQ0SERHW4Kum8J9+hIXkdB9n9OmObg4E0iYTJGHwICqSsxjSNmv/NAcZjNkM9A
+ AqSkICQFISQhAaZhQtOvCTQxMS8QISgw81x3/eT/kx042QHHDvwX9rdyTAplbmRzdHJl
+ YW0KZW5kb2JqCjU1IDAgb2JqCjI3MDMKZW5kb2JqCjU4IDAgb2JqCjw8IC9MZW5ndGgg
+ NTkgMCBSIC9UeXBlIC9YT2JqZWN0IC9TdWJ0eXBlIC9JbWFnZSAvV2lkdGggMTk0IC9I
+ ZWlnaHQgMTAyIC9Db2xvclNwYWNlCi9EZXZpY2VHcmF5IC9CaXRzUGVyQ29tcG9uZW50
+ IDggL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCngB7VzrV1JpH5U7eDhHgaMo
+ l8RA1AFBJgjFy9AoqF28FV6WpaZG1sIhcTAbjcRlOuOlZryPTmilWZY6xYxp1nr/tfc5
+ kBcc1/l41jOzzv7gl+fD79l788Byrd/ecXE0YFOAATtIBGMwmAAsFosNLcDliDsyGKfR
+ IK7PYnM4XC6Px4cUPB6Xy+GwCRb/4EDoD67P4wviEUQoRFEMOqCoUIgg8QI+L0oilgO4
+ P9Cfx0eEGJYoEoklOISQiEWiRAwTIgLAAfgQQ4HBZHG4/HghJpLgydIUmUwuV0AGuVwm
+ S5Um4xIRJoznczlsJvPYY4gSQNBESXKqXJmmOqtWazIgg0ajPqtKU8pTpbgII2xgHTcB
+ vAEuH8FEeKpCpc7IzNbpcwxG2GDQ67KztGqVMjXpgMKRCeAzRBBIkqWpM3UG0zmLNS/f
+ BhvyrBazyajL0qhkyWIM4XPZRyYwmBxePAoIqLS6XLO1oNheUuqEDo6SC8WFeeZcvRZQ
+ AC7wOMcYAAuEibgsTZtjthWXlF2qrK695oIM12prqi6Xl35nMxsyVbIkESrgsg7fMpPN
+ i8ckKWkZOZai0ovVrsYbLW3tHbegQkd7W+uNRlfNJUex1QhcwBMQHvuIAbBAlKxQ68xF
+ zkpXU6v7btc9Xw9k8N3ruutuu15XVf6dRa9RSkVCPuc4A1SckpZptJVW1je7Pd3+BwOB
+ wSBUGAw8/KnX53G3NFQ5C0xZwARMcPQQmBwBhsvO6szFF13Nbq+/f3B4dGx8AiqMj/08
+ HBzo9Xa21l+2W/RqRVJCPJd18LPM5CKJyUqNwVpS1eT23g8Mjz35bWZ2DirMzkw9GXv8
+ qM/rbq515Bu1Z6QihHfIgMVDRNK0TJOtzNXq8QdGJqfmFp+FlqFC6NnS/NTk6KPerva6
+ iqJvs1UpJxmkqLLPFV1qvNXdPzwx/Xvoxeo6ZFh7EVqcmRwZ8HU2XbGbdekysZDPPvgU
+ sfhCcWr6NxZ75fU7/sGxqd+XV1+/3dyCCpvv3qytLE6PB+97mqu/t+rVMgkaw0AiU+ut
+ 31e3eB4MP5kLrW5s/hmGDO+3NtaWF54+7vferC3NM2jkeAwDFJepc/JKa296B0Z/W3zx
+ evPD3x93ocLHnfDWm5dLU78EfO0up82YocCx4x6guFxjyHdca+8OjM08W33759+7n/ah
+ wqe9nffv1kKz44M/uuvKbLla5SkMbE5Xh29wfDa0vhn++OnzF6jweX83vLW+Mj8Z9Lvr
+ ywtiGTDYfAxXZBgBg1s9wYm55fWt8O7+l/9BhS+f9/7afv18YXKo93ZDRaFJq0wifpSj
+ /yHQDCjxivaAEplJh9AekMpDySHtASUykw6hPSCVh5JD2gNKZCYdQntAKg8lh7QHlMhM
+ OoT2gFQeSg5pDyiRmXQI7QGpPJQc0h5QIjPpENoDUnkoOaQ9oERm0iG0B6TyUHJIe0CJ
+ zKRDaA9I5aHkkPaAEplJh9AekMpDySHtASUykw6hPSCVh5JD2gNKZCYdQntAKg8lh7QH
+ lMhMOuQ/7kEcix/Zs/v3bqkdMgCbgj5iU3Dt3fudvf3PUGF/b+fD5itiU9APNgVP7NlF
+ GES3Ndu8D0enll682Qrv7O5Bhd2d8PbGyz+mwbZmx6nbmpGN2ZKa1q6fhp/OL69tbL8P
+ /wUVwh+2375aWfh1pP9e21VHvkFzYt9UKAbL+xZ71Y27vcGxqcXnaxvvtrahwtbmxqvn
+ SzMTQ32eluqSf2wtg913sDluLr7c6PYNPJ6cXVp++Wr9NVRYX19dWZp9OhrouQM2xy26
+ s7Gb41+39wvKXTc9vY9GJ6cXlkIrz6HCSuiPhZknPwf7fmivv/h1e59/mD+IJigyjHml
+ Ndfd3r5HI+NPp2fnF6DC/Nz0rxOjwQfdnc21YO36RIKCyYnHcLlab7ZfqmvtvHf/4dDI
+ L+OTkGFibHQo0Nd952bDlQvn9ZoTKRaQw5GkqrJybY6qhtbbXT19/YHgEGQIBvr7en7o
+ bG2scRaastNPJolAmkuq1OjNxWVV9TfaOz1e34/+Xqjg9/u8ns725oaaCvv5nAwQw0GP
+ p7nYPATDU1Vao7XYebm2vqmlrcN9GzK4O9pamhpqrzjteUYQCiQSdQeL43FxDCLVSMQy
+ M42WAruj4kr1VVddA2Sod12tqbzovFB43piVLk+OTTVGkqWYKBkkS/Umi63IXuJwlldA
+ hvIyR4m9yHbelJOZrpAS4VjO4ZdpXByI6IN0rxhQ0GTrjd9arPm2gkLIUGDLt1rO5eZk
+ a1VyqTghNt0bx2RyuIJIQFmZrtGCgLXBmGuCDLlGY44uO1OTfgbEkxOEkZD4UcKaSLnz
+ CAq4VKY4A0LumgwtfIjG3GWnptyBCWzQNICgCSI8CRQNyBVKCKGQR6oGxIkoAhofQNPA
+ QZ6OsIJoewAUBAiKJUS7HpKgA+ifAH0PiRiKCKJVCccJRCkQNvCJwg0I6zai/R8oUbnB
+ J+5/sq7iwIZo6QlReSKAEMS9QO/J18aQWAeibzrSPBPpneFACtCIE6meOb155oAFKP8h
+ 6mngRKSZKHpT+i+tAK3AcQX+Dz/Ylw8KZW5kc3RyZWFtCmVuZG9iago1OSAwIG9iagox
+ OTI3CmVuZG9iago1NiAwIG9iago8PCAvTGVuZ3RoIDU3IDAgUiAvVHlwZSAvWE9iamVj
+ dCAvU3VidHlwZSAvSW1hZ2UgL1dpZHRoIDE5NCAvSGVpZ2h0IDEwMiAvQ29sb3JTcGFj
+ ZQovRGV2aWNlR3JheSAvQml0c1BlckNvbXBvbmVudCA4IC9GaWx0ZXIgL0ZsYXRlRGVj
+ b2RlID4+CnN0cmVhbQp4Ae1c61dSaR+VO3g4R4GjKJfEQNQBQSYIxcvQKKhdvBVelqWm
+ RtbCIXEwG43EZTrjpWa8j05opVmWOsWMadZ6/7X3OZAXHNf5eNYzs87+4Jfnw+/Ze/PA
+ cq3f3nFxNGBTgAE7SARjMJgALBaLDS3A5Yg7Mhin0SCuz2JzOFwuj8eHFDwel8vhsAkW
+ /+BA6A+uz+ML4hFEKERRDDqgqFCIIPECPi9KIpYDuD/Qn8dHhBiWKBKJJTiEkIhFokQM
+ EyICwAH4EEOBwWRxuPx4ISaS4MnSFJlMLldABrlcJkuVJuMSESaM53M5bCbz2GOIEkDQ
+ RElyqlyZpjqrVmsyIINGoz6rSlPKU6W4CCNsYB03AbwBLh/BRHiqQqXOyMzW6XMMRthg
+ 0Ouys7RqlTI16YDCkQngM0QQSJKlqTN1BtM5izUv3wYb8qwWs8moy9KoZMliDOFz2Ucm
+ MJgcXjwKCKi0ulyztaDYXlLqhA6OkgvFhXnmXL0WUAAu8DjHGAALhIm4LE2bY7YVl5Rd
+ qqyuveaCDNdqa6oul5d+ZzMbMlWyJBEq4LIO3zKTzYvHJClpGTmWotKL1a7GGy1t7R23
+ oEJHe1vrjUZXzSVHsdUIXMATEB77iAGwQJSsUOvMRc5KV1Or+27XPV8PZPDd67rrbrte
+ V1X+nUWvUUpFQj7nOANUnJKWabSVVtY3uz3d/gcDgcEgVBgMPPyp1+dxtzRUOQtMWcAE
+ THD0EJgcAYbLzurMxRddzW6vv39weHRsfAIqjI/9PBwc6PV2ttZftlv0akVSQjyXdfCz
+ zOQiiclKjcFaUtXk9t4PDI89+W1mdg4qzM5MPRl7/KjP626udeQbtWekIoR3yIDFQ0TS
+ tEyTrczV6vEHRian5hafhZahQujZ0vzU5Oij3q72uoqib7NVKScZpKiyzxVdarzV3T88
+ Mf176MXqOmRYexFanJkcGfB1Nl2xm3XpMrGQzz74FLH4QnFq+jcWe+X1O/7Bsanfl1df
+ v93cggqb796srSxOjwfve5qrv7fq1TIJGsNAIlPrrd9Xt3geDD+ZC61ubP4ZhgzvtzbW
+ lheePu733qwtzTNo5HgMAxSXqXPySmtvegdGf1t88Xrzw98fd6HCx53w1puXS1O/BHzt
+ LqfNmKHAseMeoLhcY8h3XGvvDozNPFt9++ffu5/2ocKnvZ3379ZCs+ODP7rrymy5WuUp
+ DGxOV4dvcHw2tL4Z/vjp8xeo8Hl/N7y1vjI/GfS768sLYhkw2HwMV2QYAYNbPcGJueX1
+ rfDu/pf/QYUvn/f+2n79fGFyqPd2Q0WhSatMIn6Uo/8h0Awo8Yr2gBKZSYfQHpDKQ8kh
+ 7QElMpMOoT0glYeSQ9oDSmQmHUJ7QCoPJYe0B5TITDqE9oBUHkoOaQ8okZl0CO0BqTyU
+ HNIeUCIz6RDaA1J5KDmkPaBEZtIhtAek8lBySHtAicykQ2gPSOWh5JD2gBKZSYfQHpDK
+ Q8kh7QElMpMOoT0glYeSQ9oDSmQmHUJ7QCoPJYe0B5TITDrkP+5BHIsf2bP7926pHTIA
+ m4I+YlNw7d37nb39z1Bhf2/nw+YrYlPQDzYFT+zZRRhEtzXbvA9Hp5ZevNkK7+zuQYXd
+ nfD2xss/psG2Zsep25qRjdmSmtaun4afzi+vbWy/D/8FFcIftt++Wln4daT/XttVR75B
+ c2LfVCgGy/sWe9WNu73BsanF52sb77a2ocLW5sar50szE0N9npbqkn9sLYPdd7A5bi6+
+ 3Oj2DTyenF1afvlq/TVUWF9fXVmafToa6LkDNscturOxm+Nft/cLyl03Pb2PRienF5ZC
+ K8+hwkroj4WZJz8H+35or7/4dXuff5g/iCYoMox5pTXX3d6+RyPjT6dn5xegwvzc9K8T
+ o8EH3Z3NtWDt+kSCgsmJx3C5Wm+2X6pr7bx3/+HQyC/jk5BhYmx0KNDXfedmw5UL5/Wa
+ EykWkMORpKqycm2OqobW2109ff2B4BBkCAb6+3p+6GxtrHEWmrLTTyaJQJpLqtTozcVl
+ VfU32js9Xt+P/l6o4Pf7vJ7O9uaGmgr7+ZwMEMNBj6e52DwEw1NVWqO12Hm5tr6ppa3D
+ fRsyuDvaWpoaaq847XlGEAokEnUHi+NxcQwi1UjEMjONlgK7o+JK9VVXXQNkqHddram8
+ 6LxQeN6YlS5Pjk01RpKlmCgZJEv1JoutyF7icJZXQIbyMkeJvch23pSTma6QEuFYzuGX
+ aVwciOiDdK8YUNBk643fWqz5toJCyFBgy7dazuXmZGtVcqk4ITbdG8dkcriCSEBZma7R
+ goC1wZhrggy5RmOOLjtTk34GxJMThJGQ+FHCmki58wgKuFSmOANC7poMLXyIxtxlp6bc
+ gQls0DSAoAkiPAkUDcgVSgihkEeqBsSJKAIaH0DTwEGejrCCaHsAFAQIiiVEux6SoAPo
+ nwB9D4kYigiiVQnHCUQpEDbwicINCOs2ov0fKFG5wSfuf7Ku4sCGaOkJUXkigBDEvUDv
+ ydfGkFgHom860jwT6Z3hQArQiBOpnjm9eeaABSj/Iepp4ESkmSh6U/ovrQCtwHEF/g8/
+ 2JcPCmVuZHN0cmVhbQplbmRvYmoKNTcgMCBvYmoKMTkyNwplbmRvYmoKNjQgMCBvYmoK
+ PDwgL0xlbmd0aCA2NSAwIFIgL04gMyAvQWx0ZXJuYXRlIC9EZXZpY2VSR0IgL0ZpbHRl
+ ciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCngBhZRNSBRhGMf/s40EsQbRlwjF0MEkVCYL
+ UgLT9StTtmXVTAlinX13nRxnp5ndLUUihOiYdYwuVkSHiE7hoUOnOkQEmXWJoKNFEAVe
+ Irb/O5O7Y1S+MDO/eZ7/+3y9wwBVj1KOY0U0YMrOu8nemHZ6dEzb/BpVqEYUXCnDczoS
+ iQGfqZXP9Wv1LRRpWWqUsdb7NnyrdpkQUDQqd2QDPix5PODjki/knTw1ZyQbE6k02SE3
+ uEPJTvIt8tZsiMdDnBaeAVS1U5MzHJdxIjvILUUjK2M+IOt22rTJ76U97RlT1LDfyDc5
+ C9q48v1A2x5g04uKbcwDHtwDdtdVbPU1wM4RYPFQxfY96c9H2fXKyxxq9sMp0Rhr+lAq
+ fa8DNt8Afl4vlX7cLpV+3mEO1vHUMgpu0deyMOUlENQb7Gb85Br9i4OefFULsMA5jmwB
+ +q8ANz8C+x8C2x8DiWpgqBWRy2w3uPLiIucCdOacadfMTuS1Zl0/onXwaIXWZxtNDVrK
+ sjTf5Wmu8IRbFOkmTFkFztlf23iPCnt4kE/2F7kkvO7frMylU12cJZrY1qe06OomN5Dv
+ Z8yePnI9r/cZt2c4YOWAme8bCjhyyrbiPBepidTY4/GTZMZXVCcfk/OQPOcVB2VM334u
+ dSJBrqU9OZnrl5pd3Ns+MzHEM5KsWDMTnfHf/MYtJGXefdTcdSz/m2dtkWcYhQUBEzbv
+ NjQk0YsYGuHARQ4ZekwqTFqlX9BqwsPkX5UWEuVdFhW9WOGeFX/PeRS4W8Y/hVgccw3l
+ CJr+Tv+iL+sL+l3983xtob7imXPPmsara18ZV2aW1ci4QY0yvqwpiG+w2g56LWRpneIV
+ 9OSV9Y3h6jL2fG3Zo8kc4mp8NdSlCGVqxDjjya5l90WyxTfh51vL9q/pUft89klNJdey
+ unhmKfp8NlwNa/+zq2DSsqvw5I2QLjxroe5VD6p9aovaCk09prarbWoX346qA+Udw5yV
+ iQus22X1KfZgY5reyklXZovg38Ivhv+lXmEL1zQ0+Q9NuLmMaQnfEdw2cIeU/8NfswMN
+ 3gplbmRzdHJlYW0KZW5kb2JqCjY1IDAgb2JqCjc5MgplbmRvYmoKNyAwIG9iagpbIC9J
+ Q0NCYXNlZCA2NCAwIFIgXQplbmRvYmoKNjYgMCBvYmoKPDwgL0xlbmd0aCA2NyAwIFIg
+ L04gMyAvQWx0ZXJuYXRlIC9EZXZpY2VSR0IgL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4K
+ c3RyZWFtCngBhZK/TxRREMc/e8SAIVAI0ZhYPBM1mqBZjiso79wCSQ5yEqJiaPb21uPC
+ 3bHZW/FHRcNfoKEg2hEKf9RYWFysLLQyQSI02pmYWKA0eFnn7cuG6mCSl/m82e/MZOYt
+ 9NhuENQzQKMZhTMTN9W9ufuqd4cMw5zmEhddrxUUSqWiSLrYwTaW/vTluq61t9hZj17+
+ PbTaA2+/r/342SUpDQ+E0hAsJYHhquGc5rLhW5ofRUEkmnnN3oJbEQ6ER8LZGUf4hfBg
+ 1fAbzWXD7zUve1Wd+0nYblZqTeF/wuMVv+VBRvd65gWhaDIfhfONxpLU7+kTvqp3IV7s
+ 6TYUXkvu4FHsznN4tQzn9QgqkXF5EYb+wLvNo9j+TrIf62xf68FYNtFZ/Vtwai2O9+9C
+ 7zXofI3jw6047mxK72/QPvAehlLbqK3PcNLdzGn08HsjpW5sdpGobNhow5xcJvOwLufK
+ OTizCyXh2TzWLyc9Zm8ilUGL2dyoPT2lHLdeK4du5MvmjA1RJEuOUWymmULh4FKnRplQ
+ KMInER9TI611so/8x/J+4CwFT8JadSFSBfkTfTXZ9G6MqKxtjx9fw7y51syvwu0VTR8q
+ FxKvObX/LjiQyAplbmRzdHJlYW0KZW5kb2JqCjY3IDAgb2JqCjQ2MgplbmRvYmoKNTAg
+ MCBvYmoKWyAvSUNDQmFzZWQgNjYgMCBSIF0KZW5kb2JqCjY4IDAgb2JqCjw8IC9MZW5n
+ dGggNjkgMCBSIC9OIDMgL0FsdGVybmF0ZSAvRGV2aWNlUkdCIC9GaWx0ZXIgL0ZsYXRl
+ RGVjb2RlID4+CnN0cmVhbQp4AYWSv08UURDHP3vEgCFQCNGYWDwTNZqgWY4rKO/cAkkO
+ chKiYmj29tbjwt2x2VvxR0XDX6ChINoRCn/UWFhcrCy0MkEiNNqZmFigNHhZ5+3Lhupg
+ kpf5vNnvzGTmLfTYbhDUM0CjGYUzEzfVvbn7qneHDMOc5hIXXa8VFEqloki62ME2lv70
+ 5bqutbfYWY9e/j202gNvv6/9+NklKQ0PhNIQLCWB4arhnOay4VuaH0VBJJp5zd6CWxEO
+ hEfC2RlH+IXwYNXwG81lw+81L3tVnftJ2G5Wak3hf8LjFb/lQUb3euYFoWgyH4XzjcaS
+ 1O/pE76qdyFe7Ok2FF5L7uBR7M5zeLUM5/UIKpFxeRGG/sC7zaPY/k6yH+tsX+vBWDbR
+ Wf1bcGotjvfvQu816HyN48OtOO5sSu9v0D7wHoZS26itz3DS3cxp9PB7I6VubHaRqGzY
+ aMOcXCbzsC7nyjk4swsl4dk81i8nPWZvIpVBi9ncqD09pRy3XiuHbuTL5owNUSRLjlFs
+ pplC4eBSp0aZUCjCJxEfUyOtdbKP/MfyfuAsBU/CWnUhUgX5E3012fRujKisbY8fX8O8
+ udbMr8LtFU0fKhcSrzm1/y44kMgKZW5kc3RyZWFtCmVuZG9iago2OSAwIG9iago0NjIK
+ ZW5kb2JqCjUzIDAgb2JqClsgL0lDQ0Jhc2VkIDY4IDAgUiBdCmVuZG9iago3MCAwIG9i
+ ago8PCAvTGVuZ3RoIDcxIDAgUiAvTiAxIC9BbHRlcm5hdGUgL0RldmljZUdyYXkgL0Zp
+ bHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCngBhVJPSBRRHP7NNhKEiEGFeIh3CgmV
+ KaysoNp2dVmVbVuV0qIYZ9+6o7Mz05vZNcWTBF2iPHUPomN07NChm5eiwKxL1yCpIAg8
+ dej7zezqKIRveTvf+/39ft97RG2dpu87KUFUc0OVK6Wnbk5Ni4MfKUUd1E5YphX46WJx
+ jLHruZK/u9fWZ9LYst7HtXb79j21lWVgIeottrcQ+iGRZgAfmZ8oZYCzwB2Wr9g+ATxY
+ Dqwa8COiAw+auTDT0Zx0pbItkVPmoigqr2I7Sa77+bnGvou1iYP+XI9m1o69s+qq0UzU
+ tPdEobwPrkQZz19U9mw1FKcN45xIQxop8q7V3ytMxxGRKxBKBlI1ZLmfak6ddeB1GLtd
+ upPj+PYQpT7JYKiJtemymR2FfQB2KsvsEPAF6PGyYg/ngXth/1tRw5PAJ2E/ZId51q0f
+ 9heuU+B7hD014M4UrsXx2oofXi0BQ/dUI2iMc03E09c5c6SI7zHUGZj3RjmmCzF3lqoT
+ N4A7YR9ZqmYKsV37ruol7nsCd9PjO9GbOQtcoBxJcrEV2RTQPAlYFH2LsEkOPD7OHlXg
+ d6iYwBy5idzNKPce1REbZ6NSgVZ6jVfGT+O58cX4ZWwYz4B+rHbXe3z/6eMVdde2Pjz5
+ jXrcOa69nRtVYVZxZQvd/8cyhI/ZJzmmwdOhWVhr2HbkD5rMTLAMKMR/BT6X+pITVdzV
+ 7u24RRLMUD4sbCW6S1RuKdTqPYNKrBwr2AB2cJLELFocuFNrujl4d9giem35TVey64b+
+ +vZ6+9ryHm3KqCkoE82zRGaUsVuj5N142/1mkRGfODq+572KWsn+SUUQP4U5WiryFFX0
+ VlDWxG9nDn4btn5cP6Xn9UH9PAk9rZ/Rr+ijEb4MdEnPwnNRH6NJ8LBpIeISoIqDM9RO
+ VGONA+Ip8fK0W2SR/Q9AGf1mCmVuZHN0cmVhbQplbmRvYmoKNzEgMCBvYmoKNzA0CmVu
+ ZG9iagoyMCAwIG9iagpbIC9JQ0NCYXNlZCA3MCAwIFIgXQplbmRvYmoKMzcgMCBvYmoK
+ PDwgL0xlbmd0aCA3MiAwIFIgL0Z1bmN0aW9uVHlwZSAwIC9CaXRzUGVyU2FtcGxlIDgg
+ L1NpemUgWyAxMzY1IF0gL0RvbWFpbgpbIDAgMSBdIC9SYW5nZSBbIDAgMSAwIDEgMCAx
+ IF0gL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCngBlcFnQoEBAADQ+1+lohSR
+ piIjKu1ESyHR0KDE5wL68d4LgunGaCT+0FD8oh8xQH30Lb7Qp/hAPfGO3sQrehFd1BHP
+ qI2eRAs1RQM9igdUF/foTtyiG3GNaqgqrlBFXKILcY7OxCk6QcfuyJXRoTtA+66Eim4P
+ FVze5VDW7aKMS6Mdt41Sbsttog23jtbcKkq6FZRwcbeMYi6KltwiirgFNO/CLoTm3Cya
+ +d8EnQU9JgplbmRzdHJlYW0KZW5kb2JqCjcyIDAgb2JqCjE3NwplbmRvYmoKNDEgMCBv
+ YmoKPDwgL0xlbmd0aCA3MyAwIFIgL0Z1bmN0aW9uVHlwZSAwIC9CaXRzUGVyU2FtcGxl
+ IDggL1NpemUgWyAxMzY1IF0gL0RvbWFpbgpbIDAgMSBdIC9SYW5nZSBbIDAgMSAwIDEg
+ MCAxIF0gL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCngBncEHVgEAAADQ+9/E
+ SrZkVBQaskdpGJlRjuA5gv//4XDyr/7UXu3Ur9qqjVqrlVqShfpRczVTUzVR3+pLfaoP
+ NVbv6k2N1FANVF/1VFd1SFu1VFO9qoZ6Uc/qST2quqqpqnpQ96qiyupO3aobVVJFUlB5
+ da1y6kplVUalVUolVULFVUxdqqi6UBEVViEVVIHzHQFawrliCmVuZHN0cmVhbQplbmRv
+ YmoKNzMgMCBvYmoKMTUyCmVuZG9iagozOSAwIG9iago8PCAvTGVuZ3RoIDc0IDAgUiAv
+ RnVuY3Rpb25UeXBlIDAgL0JpdHNQZXJTYW1wbGUgOCAvU2l6ZSBbIDEzNjUgXSAvRG9t
+ YWluClsgMCAxIF0gL1JhbmdlIFsgMCAxIDAgMSAwIDEgXSAvRmlsdGVyIC9GbGF0ZURl
+ Y29kZSA+PgpzdHJlYW0KeAGVwWdCgQEAAND7X6WiFJGmIiMq7URLIdHQoMTnAvrx3guC
+ 6cZoJP7QUPyiHzFAffQtvtCn+EA98Y7exCt6EV3UEc+ojZ5ECzVFAz2KB1QX9+hO3KIb
+ cY1qqCquUEVcogtxjs7EKTpBx+7IldGhO0D7roSKbg8VXN7lUNbtooxLox23jVJuy22i
+ DbeO1twqSroVlHBxt4xiLoqW3CKKuAU078IuhObcLJr53wSdBT0mCmVuZHN0cmVhbQpl
+ bmRvYmoKNzQgMCBvYmoKMTc3CmVuZG9iago0NiAwIG9iago8PCAvTGVuZ3RoIDc1IDAg
+ UiAvRnVuY3Rpb25UeXBlIDAgL0JpdHNQZXJTYW1wbGUgOCAvU2l6ZSBbIDEzNjUgXSAv
+ RG9tYWluClsgMCAxIF0gL1JhbmdlIFsgMCAxIDAgMSAwIDEgXSAvRmlsdGVyIC9GbGF0
+ ZURlY29kZSA+PgpzdHJlYW0KeAGdwQdWAQAAAND738RKtmRUFBqyR2kYmVGO4DmC///h
+ cPKv/tRe7dSv2qqNWquVWpKF+lFzNVNTNVHf6kt9qg81Vu/qTY3UUA1UX/VUV3VIW7VU
+ U72qhnpRz+pJPaq6qqmqelD3qqLK6k7dqhtVUkVSUHl1rXLqSmVVRqVVSiVVQsVVTF2q
+ qLpQERVWIRVUgfMdAVrCuWIKZW5kc3RyZWFtCmVuZG9iago3NSAwIG9iagoxNTIKZW5k
+ b2JqCjQ0IDAgb2JqCjw8IC9MZW5ndGggNzYgMCBSIC9GdW5jdGlvblR5cGUgMCAvQml0
+ c1BlclNhbXBsZSA4IC9TaXplIFsgMTM2NSBdIC9Eb21haW4KWyAwIDEgXSAvUmFuZ2Ug
+ WyAwIDEgMCAxIDAgMSBdIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4AZXB
+ Z0KBAQAA0PtfpaIUkaYiIyrtREsh0dCgxOcC+vHeC4Lpxmgk/tBQ/KIfMUB99C2+0Kf4
+ QD3xjt7EK3oRXdQRz6iNnkQLNUUDPYoHVBf36E7cohtxjWqoKq5QRVyiC3GOzsQpOkHH
+ 7siV0aE7QPuuhIpuDxVc3uVQ1u2ijEujHbeNUm7LbaINt47W3CpKuhWUcHG3jGIuipbc
+ Ioq4BTTvwi6E5twsmvnfBJ0FPSYKZW5kc3RyZWFtCmVuZG9iago3NiAwIG9iagoxNzcK
+ ZW5kb2JqCjQwIDAgb2JqCjw8IC9MZW5ndGggNzcgMCBSIC9GdW5jdGlvblR5cGUgMCAv
+ Qml0c1BlclNhbXBsZSA4IC9TaXplIFsgMTM2NSBdIC9Eb21haW4KWyAwIDEgXSAvUmFu
+ Z2UgWyAwIDEgMCAxIDAgMSBdIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4
+ AZ3BB1YBAAAA0PvfxEq2ZFQUGrJHaRiZUY7gOYL//+Fw8q/+1F7t1K/aqo1aq5VakoX6
+ UXM1U1M1Ud/qS32qDzVW7+pNjdRQDVRf9VRXdUhbtVRTvaqGelHP6kk9qrqqqap6UPeq
+ osrqTt2qG1VSRVJQeXWtcupKZVVGpVVKJVVCxVVMXaqoulARFVYhFVSB8x0BWsK5Ygpl
+ bmRzdHJlYW0KZW5kb2JqCjc3IDAgb2JqCjE1MgplbmRvYmoKNDMgMCBvYmoKPDwgL0xl
+ bmd0aCA3OCAwIFIgL0Z1bmN0aW9uVHlwZSAwIC9CaXRzUGVyU2FtcGxlIDggL1NpemUg
+ WyAxMzY1IF0gL0RvbWFpbgpbIDAgMSBdIC9SYW5nZSBbIDAgMSAwIDEgMCAxIF0gL0Zp
+ bHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCngBlcFnQoEBAADQ+1+lohSRpiIjKu1E
+ SyHR0KDE5wL68d4LgunGaCT+0FD8oh8xQH30Lb7Qp/hAPfGO3sQrehFd1BHPqI2eRAs1
+ RQM9igdUF/foTtyiG3GNaqgqrlBFXKILcY7OxCk6QcfuyJXRoTtA+66Eim4PFVze5VDW
+ 7aKMS6Mdt41Sbsttog23jtbcKkq6FZRwcbeMYi6KltwiirgFNO/CLoTm3Cya+d8EnQU9
+ JgplbmRzdHJlYW0KZW5kb2JqCjc4IDAgb2JqCjE3NwplbmRvYmoKNDggMCBvYmoKPDwg
+ L0xlbmd0aCA3OSAwIFIgL0Z1bmN0aW9uVHlwZSAwIC9CaXRzUGVyU2FtcGxlIDggL1Np
+ emUgWyAxMzY1IF0gL0RvbWFpbgpbIDAgMSBdIC9SYW5nZSBbIDAgMSAwIDEgMCAxIF0g
+ L0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCngBncEHVgEAAADQ+9/ESrZkVBQa
+ skdpGJlRjuA5gv//4XDyr/7UXu3Ur9qqjVqrlVqShfpRczVTUzVR3+pLfaoPNVbv6k2N
+ 1FANVF/1VFd1SFu1VFO9qoZ6Uc/qST2quqqpqnpQ96qiyupO3aobVVJFUlB5da1y6kpl
+ VUalVUolVULFVUxdqqi6UBEVViEVVIHzHQFawrliCmVuZHN0cmVhbQplbmRvYmoKNzkg
+ MCBvYmoKMTUyCmVuZG9iago0MiAwIG9iago8PCAvTGVuZ3RoIDgwIDAgUiAvRnVuY3Rp
+ b25UeXBlIDAgL0JpdHNQZXJTYW1wbGUgOCAvU2l6ZSBbIDEzNjUgXSAvRG9tYWluClsg
+ MCAxIF0gL1JhbmdlIFsgMCAxIDAgMSAwIDEgXSAvRmlsdGVyIC9GbGF0ZURlY29kZSA+
+ PgpzdHJlYW0KeAGVwWdCgQEAAND7X6WiFJGmIiMq7URLIdHQoMTnAvrx3guC6cZoJP7Q
+ UPyiHzFAffQtvtCn+EA98Y7exCt6EV3UEc+ojZ5ECzVFAz2KB1QX9+hO3KIbcY1qqCqu
+ UEVcogtxjs7EKTpBx+7IldGhO0D7roSKbg8VXN7lUNbtooxLox23jVJuy22iDbeO1twq
+ SroVlHBxt4xiLoqW3CKKuAU078IuhObcLJr53wSdBT0mCmVuZHN0cmVhbQplbmRvYmoK
+ ODAgMCBvYmoKMTc3CmVuZG9iago0NyAwIG9iago8PCAvTGVuZ3RoIDgxIDAgUiAvRnVu
+ Y3Rpb25UeXBlIDAgL0JpdHNQZXJTYW1wbGUgOCAvU2l6ZSBbIDEzNjUgXSAvRG9tYWlu
+ ClsgMCAxIF0gL1JhbmdlIFsgMCAxIDAgMSAwIDEgXSAvRmlsdGVyIC9GbGF0ZURlY29k
+ ZSA+PgpzdHJlYW0KeAGVwWdCgQEAAND7X6WiFJGmIiMq7URLIdHQoMTnAvrx3guC6cZo
+ JP7QUPyiHzFAffQtvtCn+EA98Y7exCt6EV3UEc+ojZ5ECzVFAz2KB1QX9+hO3KIbcY1q
+ qCquUEVcogtxjs7EKTpBx+7IldGhO0D7roSKbg8VXN7lUNbtooxLox23jVJuy22iDbeO
+ 1twqSroVlHBxt4xiLoqW3CKKuAU078IuhObcLJr53wSdBT0mCmVuZHN0cmVhbQplbmRv
+ YmoKODEgMCBvYmoKMTc3CmVuZG9iagozOCAwIG9iago8PCAvTGVuZ3RoIDgyIDAgUiAv
+ RnVuY3Rpb25UeXBlIDAgL0JpdHNQZXJTYW1wbGUgOCAvU2l6ZSBbIDEzNjUgXSAvRG9t
+ YWluClsgMCAxIF0gL1JhbmdlIFsgMCAxIDAgMSAwIDEgXSAvRmlsdGVyIC9GbGF0ZURl
+ Y29kZSA+PgpzdHJlYW0KeAGdwQdWAQAAAND738RKtmRUFBqyR2kYmVGO4DmC///hcPKv
+ /tRe7dSv2qqNWquVWpKF+lFzNVNTNVHf6kt9qg81Vu/qTY3UUA1UX/VUV3VIW7VUU72q
+ hnpRz+pJPaq6qqmqelD3qqLK6k7dqhtVUkVSUHl1rXLqSmVVRqVVSiVVQsVVTF2qqLpQ
+ ERVWIRVUgfMdAVrCuWIKZW5kc3RyZWFtCmVuZG9iago4MiAwIG9iagoxNTIKZW5kb2Jq
+ CjQ5IDAgb2JqCjw8IC9MZW5ndGggODMgMCBSIC9GdW5jdGlvblR5cGUgMCAvQml0c1Bl
+ clNhbXBsZSA4IC9TaXplIFsgMTM2NSBdIC9Eb21haW4KWyAwIDEgXSAvUmFuZ2UgWyAw
+ IDEgMCAxIDAgMSBdIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4AZXBZ0KB
+ AQAA0PtfpaIUkaYiIyrtREsh0dCgxOcC+vHeC4Lpxmgk/tBQ/KIfMUB99C2+0Kf4QD3x
+ jt7EK3oRXdQRz6iNnkQLNUUDPYoHVBf36E7cohtxjWqoKq5QRVyiC3GOzsQpOkHH7siV
+ 0aE7QPuuhIpuDxVc3uVQ1u2ijEujHbeNUm7LbaINt47W3CpKuhWUcHG3jGIuipbcIoq4
+ BTTvwi6E5twsmvnfBJ0FPSYKZW5kc3RyZWFtCmVuZG9iago4MyAwIG9iagoxNzcKZW5k
+ b2JqCjQ1IDAgb2JqCjw8IC9MZW5ndGggODQgMCBSIC9GdW5jdGlvblR5cGUgMCAvQml0
+ c1BlclNhbXBsZSA4IC9TaXplIFsgMTM2NSBdIC9Eb21haW4KWyAwIDEgXSAvUmFuZ2Ug
+ WyAwIDEgMCAxIDAgMSBdIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4AZXB
+ Z0KBAQAA0PtfpaIUkaYiIyrtREsh0dCgxOcC+vHeC4Lpxmgk/tBQ/KIfMUB99C2+0Kf4
+ QD3xjt7EK3oRXdQRz6iNnkQLNUUDPYoHVBf36E7cohtxjWqoKq5QRVyiC3GOzsQpOkHH
+ 7siV0aE7QPuuhIpuDxVc3uVQ1u2ijEujHbeNUm7LbaINt47W3CpKuhWUcHG3jGIuipbc
+ Ioq4BTTvwi6E5twsmvnfBJ0FPSYKZW5kc3RyZWFtCmVuZG9iago4NCAwIG9iagoxNzcK
+ ZW5kb2JqCjMgMCBvYmoKPDwgL1R5cGUgL1BhZ2VzIC9NZWRpYUJveCBbMCAwIDU3NiA3
+ MzNdIC9Db3VudCAxIC9LaWRzIFsgMiAwIFIgXSA+PgplbmRvYmoKODUgMCBvYmoKPDwg
+ L1R5cGUgL0NhdGFsb2cgL1BhZ2VzIDMgMCBSIC9WZXJzaW9uIC8xLjQgPj4KZW5kb2Jq
+ Cjg2IDAgb2JqCjw8IC9MZW5ndGggODcgMCBSIC9MZW5ndGgxIDUwODAgL0ZpbHRlciAv
+ RmxhdGVEZWNvZGUgPj4Kc3RyZWFtCngBvVcLcFTVGf7/+9hHCJIQkE3Cene5m4Qku4SX
+ hEBMbsJuWAyJeUDc5aG7SRYDTWDb0ihSMPJQWayDYwWasUUqMzpY9GZBvEh1MkpHW2Xq
+ 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
+ O3mGmlvamAxH1DVyxKuekL2OngZj3iXuJuZukL090ORbEOhpUiLeeIPSwM7zwf11Pj/9
+ XaEiF2ptSdby+36ilo8l87Nadca8S2rVMncdq1XLatWyWnVKnVGrsNC3vLES/gvQRnrL
+ CmVuZHN0cmVhbQplbmRvYmoKODcgMCBvYmoKMjc4MwplbmRvYmoKODggMCBvYmoKPDwg
+ L1R5cGUgL0ZvbnREZXNjcmlwdG9yIC9Bc2NlbnQgNzcwIC9DYXBIZWlnaHQgNzMxIC9E
+ ZXNjZW50IC0yMzAgL0ZsYWdzIDMyCi9Gb250QkJveCBbLTEwMTggLTQ4MSAxNDM2IDEx
+ NTldIC9Gb250TmFtZSAvTEFIRkRBK0hlbHZldGljYS1Cb2xkIC9JdGFsaWNBbmdsZQow
+ IC9TdGVtViAxNDkgL01heFdpZHRoIDE1MDAgL1N0ZW1IIDEyNCAvWEhlaWdodCA1NDAg
+ L0ZvbnRGaWxlMiA4NiAwIFIgPj4KZW5kb2JqCjg5IDAgb2JqClsgMjc4IF0KZW5kb2Jq
+ CjMyIDAgb2JqCjw8IC9UeXBlIC9Gb250IC9TdWJ0eXBlIC9UcnVlVHlwZSAvQmFzZUZv
+ bnQgL0xBSEZEQStIZWx2ZXRpY2EtQm9sZCAvRm9udERlc2NyaXB0b3IKODggMCBSIC9X
+ aWR0aHMgODkgMCBSIC9GaXJzdENoYXIgNDYgL0xhc3RDaGFyIDQ2IC9FbmNvZGluZyAv
+ TWFjUm9tYW5FbmNvZGluZwo+PgplbmRvYmoKOTAgMCBvYmoKPDwgL0xlbmd0aCA5MSAw
+ IFIgL0xlbmd0aDEgMTE3NzYgL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCngB
+ vXp5fJTV1f+5zz5LJjOT2ffJZGYy2ReyDAlkDElYE4GwJEgwYQ1IWkAIQgsvIopEREFZ
+ hGpdWlY1Q0hhALEUQaS1Fa0rtdZWaO2S17d90VZhZn7nPgMR/Nm+/tFP55m73+fec7/3
+ 3HPOvc8FAgBqWAMsRGZ1dSwiEfJjzHkV3U9ndS/1PPjH4U8AkB0A7MK5i+Z16T586acA
+ PAegVM9buGJu/o9+UwGQrgWwdnbO6Zj9ibHiTYDsu/D9cpqhzBTLMR3FdFZn19K7/muy
+ 8kVMYx24a+G3Z3W0wZSTAKFxmB7e1XHXImmt8nNMb8S051sdXXNal9+J8dCzmM5c9O07
+ l7LD2L9i+jymZyxaMmfRC/d8qxggpwjpew3zCD70pwYBsB/wwLRrOXL2VzzmK+l/nmQB
+ R4w/XvYFEOVQQl8hx5SgksOv99SQBhpIB61crAM9ZMgxAxjBBGaMW8AKNrCDQ853Ykcn
+ QcufgGx+Ddi4QnADJN9Dd4GGicnJ3/NnQZvoSv6VrcI3jlLHJGqq4SQ8CLugF0e/F+PZ
+ MAN2wDmyAI6S6dAPbxMXFOBccxCDcfAqSSZfh7nwA6y/FE7BVjiIuGVDF1I1DjYRf3Il
+ piMYnwnrkk9DFlTCfXACwtjqJhhI7ksewtKJMBn2wwF8/2fExxzkMpLPJy+CBBOwzXVY
+ 8npyXLIXR5wHtTAec9fBi8TPXkh24pirkLrvwffhKfgJ/IWsJf3JzmR38nzyt8BgqQOa
+ 8VlF+slv2V7uvuT3kn9KJhCJbMjBXtvhEXgG2+/F5yROez25gywlj5CtTIRZy/Rz9/Lm
+ RBxxCMFIfEbBt+F+ROAonIa/wefkE8bCatml7JlkWfJ/ce7G4ijpSOZANz7r8dmEYzpO
+ BFJERpDxZBV5lGwlv2RymMlMC7OcuYv5PdvETmdXsL/k7uT6+I38DkGV+DR5PHk2+RbO
+ qBNugyWwGkd3Cs7DZfiCsNiWg/hJFaklM/BZQ3YxR8lT5Cgznpwk55n95DfkI/IJucLw
+ jJoxMrnMUuYR5gBzivkFO5/dyj7G/ob9lBvOM/xT/CXBL/4qMTOxIfGLZFXyt8l/4OqV
+ wIszUwtNcDt04GgXwRD4LxzFc/j04qydhjNwTn4+Ig4YgH8gCkD0xEZKSCM+TeRWMpfM
+ J0+QY/i8KNPyGYMTwSgYHWNmHEwzM5PpYtYwbzFrWDubw45hp7G9+LzCvs1eYa9wPJfB
+ GbmR3GjYyHVxO/HZze3l+rjX+DA/nG/ip/Br+A38RnYW/zr/trBa2CT0CZ8I/yNmi+PE
+ b4sbcXbOIc/+RF4B1z2OZCH1JfAtmEXqyEzYhrPxFOmAHuSu2eR+xGsRZCfb2NXsSKYI
+ ueFF+A5y605YBRvY6fBU8l12P7yDnLIQG1wDe7hacPLbcXbWQhFy0bUnEsoJZQcD/ixf
+ ptfjdjkddpvVYjYZDRl6nTZNrVIqJFHgOZYhkFfva2j3RAPtUS7gGzUqn6Z9HZjRcUNG
+ e9SDWQ0314l66HsdWHRTzQjWnPuVmpFUzchgTaL1VEN1fp6n3ueJ/rzO54mRaRNaMP5g
+ na/VEx2Q441y/GE5noZxrxdf8NRbOus8UdLuqY82dHf21LfX5eeRoxGEQ5mfRwVHBFS0
+ 4SiM6FjVacGA1qiP2nx19VGrD+NYxvrrO2ZHx09oqa+ze72tmIdZE1uwj/y8+VGkEx5Q
+ z/bNfiAWgZntNNYxvSXKdrRGmXbali43avbVRc0rL1m+TF6P1W+8oTDK+Bs65vQ0RCPt
+ DyC4NNlOUx0bMTW22YPNMve2tkTJvdeIoDQuQEopuXN89ZSu9gWeqMJX6+vsWdCO4MLE
+ lj5bxFbv66hrjcL4lj5rxCon8vOOWlZXeXH0R/Nvyb+FhlVey+pU+Id7UvlvnKShZfXp
+ DzEcO3EQAEJ78o1GOqOeWXInPiS2knpzKqFnViXihL9WgsOcj/SMiDLIM6w/yvtHd0TX
+ NF8no7MuRVz7gro+hdVGx9Be24r123u0Q3GmsL7W5+n5FHAKfQN/uTmn41qO4Nd+CrSQ
+ TvQgr0RJx/V4twwMjrrT4uuk89stzymmfZb6GzIwTaGhNEcN0ZKx41u8UU8rZsQgN29s
+ DBTjWw4Ssqk1RpL3xqDOeRS1H3v7DCzOo6w2vw77x0R+HmbkeDFWkOdpwFE3UF7x9Hh6
+ Rs/u8TR4OpGZOL8cYsGcntZCRLC5BXGCSdhjpNU+GJ3T2joU2ymk7eArWL2nFVtYcK0F
+ DOWswjhWKsobi7MSGN8yoSW6ps4ejdS14iwg+54c3xI9iZzb2oq1igcpRYpXzbdco7kE
+ aS7OwfLSVCvN2AY20drTQ9tsbvF5oyd7euw9dL2l0jECX82IXMuIAa2CA6+PkTXj8V0M
+ fF47zfB5fV4kq5ViOgRZ+jpHxaDsXyNcPkg3vlmB1JbLCFf+mxAOfxOEh34jhKsGKb0J
+ 4WqkuYoiPOw/h/DwmxCu+dcIRwbpRiJvQWojMsK1/yaER3wThOu+EcL1g5TehHAD0lxP
+ ER75n0N41E0Ij/7XCI8ZpBuJHIvUjpERHvdvQrjxmyDc9I0QvnWQ0psQHo8030oRnvCf
+ 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
+ e1/pq40Wz6R9tdG+2mhfMyMz5b4oBPXzm2vvXIrciVez8GpUdnN09IRpLXgDsbUuRnbT
+ +1rL4P8B2HGwdAplbmRzdHJlYW0KZW5kb2JqCjkxIDAgb2JqCjgwNzAKZW5kb2JqCjky
+ IDAgb2JqCjw8IC9UeXBlIC9Gb250RGVzY3JpcHRvciAvQXNjZW50IDc3MCAvQ2FwSGVp
+ Z2h0IDcyNyAvRGVzY2VudCAtMjMwIC9GbGFncyAzMgovRm9udEJCb3ggWy05NTEgLTQ4
+ MSAxNDQ1IDExMjJdIC9Gb250TmFtZSAvWEtUUEFaK0hlbHZldGljYSAvSXRhbGljQW5n
+ bGUgMAovU3RlbVYgOTggL01heFdpZHRoIDE1MDAgL1N0ZW1IIDg1IC9YSGVpZ2h0IDUz
+ MSAvRm9udEZpbGUyIDkwIDAgUiA+PgplbmRvYmoKOTMgMCBvYmoKWyAyNzggMCAwIDAg
+ MCAwIDAgMCAwIDAgMCAwIDAgMzMzIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAw
+ IDAgMCAwIDAgMAo2NjcgNzIyIDAgMCA2MTEgMCAwIDI3OCA1MDAgMCAwIDgzMyAwIDc3
+ OCAwIDAgNzIyIDY2NyAwIDAgMCAwIDAgMCAwIDAgMCAwCjAgMCAwIDU1NiA1NTYgNTAw
+ IDU1NiA1NTYgMCAwIDU1NiAyMjIgMjIyIDAgMCA4MzMgNTU2IDU1NiA1NTYgMCAzMzMg
+ NTAwIDI3OAo1NTYgNTAwIDAgMCA1MDAgXQplbmRvYmoKMjEgMCBvYmoKPDwgL1R5cGUg
+ L0ZvbnQgL1N1YnR5cGUgL1RydWVUeXBlIC9CYXNlRm9udCAvWEtUUEFaK0hlbHZldGlj
+ YSAvRm9udERlc2NyaXB0b3IKOTIgMCBSIC9XaWR0aHMgOTMgMCBSIC9GaXJzdENoYXIg
+ MzIgL0xhc3RDaGFyIDEyMSAvRW5jb2RpbmcgL01hY1JvbWFuRW5jb2RpbmcKPj4KZW5k
+ b2JqCjk0IDAgb2JqCjw8IC9MZW5ndGggOTUgMCBSIC9MZW5ndGgxIDYzNTYgL0ZpbHRl
+ ciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCngBxVhrVFRXlt7nPqqKh8hLKB7FrfJSvBGB
+ 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
+ /AbaHNVWZC4KnxY2udj1Va8qfeTeO/2rHzOzKLtxNlSOWbw4hkNQLd570833hK9sW1dj
+ qNaZnl5Wsba3raWxTr9WkN21VbhdULa14ZqnvdpqPdnYMnxnklRVXVOvnWt9tUqLXOtS
+ GmWX9WSbvk5T3zdcpw23ya6TVOee5zlZ56h19bQ52tza9UpvtXPl4lG2to7YWun8EltO
+ bbOVmq1qfd0XbC3Whqs1W4s1W4s1W9WOat2W5ry7odK5qhXZiasHHP1TKpXSuQs9uGHz
+ uvzsZe0+YjX9PzsclPwKZW5kc3RyZWFtCmVuZG9iago5NSAwIG9iagozNzEyCmVuZG9i
+ ago5NiAwIG9iago8PCAvVHlwZSAvRm9udERlc2NyaXB0b3IgL0FzY2VudCA3NzAgL0Nh
+ cEhlaWdodCA3MjcgL0Rlc2NlbnQgLTIzMCAvRmxhZ3MgOTYKL0ZvbnRCQm94IFstOTMz
+ IC00ODEgMTU3MSAxMTM4XSAvRm9udE5hbWUgL0hBSUJaTCtIZWx2ZXRpY2EtT2JsaXF1
+ ZSAvSXRhbGljQW5nbGUKLTEyIC9TdGVtViAwIC9NYXhXaWR0aCAxNTAwIC9YSGVpZ2h0
+ IDUzMSAvRm9udEZpbGUyIDk0IDAgUiA+PgplbmRvYmoKOTcgMCBvYmoKWyAyNzggMCAw
+ IDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAg
+ MCAwIDAgMCAwIDAgMAowIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAw
+ IDAgMCAwIDAgMCAwIDAgMCAwIDAgMCA1NTYgMCA1MDAgNTU2CjU1NiAyNzggMCA1NTYg
+ MCAwIDAgMCAwIDAgMCAwIDAgMzMzIDAgMjc4IF0KZW5kb2JqCjMxIDAgb2JqCjw8IC9U
+ eXBlIC9Gb250IC9TdWJ0eXBlIC9UcnVlVHlwZSAvQmFzZUZvbnQgL0hBSUJaTCtIZWx2
+ ZXRpY2EtT2JsaXF1ZSAvRm9udERlc2NyaXB0b3IKOTYgMCBSIC9XaWR0aHMgOTcgMCBS
+ IC9GaXJzdENoYXIgMzIgL0xhc3RDaGFyIDExNiAvRW5jb2RpbmcgL01hY1JvbWFuRW5j
+ b2RpbmcKPj4KZW5kb2JqCjEgMCBvYmoKPDwgL1RpdGxlIChVbnRpdGxlZCkgL0F1dGhv
+ ciAoUmFuZGFsbCBIYXVjaCkgL0NyZWF0b3IgKE9tbmlHcmFmZmxlKSAvUHJvZHVjZXIK
+ KE1hYyBPUyBYIDEwLjUuNSBRdWFydHogUERGQ29udGV4dCkgL0NyZWF0aW9uRGF0ZSAo
+ RDoyMDA4MDkxOTE1MzU0OFowMCcwMCcpCi9Nb2REYXRlIChEOjIwMDgwOTE5MTUzNTQ4
+ WjAwJzAwJykgPj4KZW5kb2JqCnhyZWYKMCA5OAowMDAwMDAwMDAwIDY1NTM1IGYgCjAw
+ MDAwNDk0MzUgMDAwMDAgbiAKMDAwMDAwNDU0MSAwMDAwMCBuIAowMDAwMDMyNjQ3IDAw
+ MDAwIG4gCjAwMDAwMDAwMjIgMDAwMDAgbiAKMDAwMDAwNDUyMSAwMDAwMCBuIAowMDAw
+ MDA0NjQ1IDAwMDAwIG4gCjAwMDAwMjU5NDcgMDAwMDAgbiAKMDAwMDAwODYwOCAwMDAw
+ MCBuIAowMDAwMDA5MDcyIDAwMDAwIG4gCjAwMDAwMDc2ODAgMDAwMDAgbiAKMDAwMDAw
+ ODEwMiAwMDAwMCBuIAowMDAwMDA4MTIyIDAwMDAwIG4gCjAwMDAwMDg1ODggMDAwMDAg
+ biAKMDAwMDAwOTA5MSAwMDAwMCBuIAowMDAwMDA5NTEzIDAwMDAwIG4gCjAwMDAwMDcx
+ OTQgMDAwMDAgbiAKMDAwMDAwNzY2MCAwMDAwMCBuIAowMDAwMDA5NTMzIDAwMDAwIG4g
+ CjAwMDAwMDk5NTUgMDAwMDAgbiAKMDAwMDAyODA1NSAwMDAwMCBuIAowMDAwMDQ0ODEx
+ IDAwMDAwIG4gCjAwMDAwMDcwMTkgMDAwMDAgbiAKMDAwMDAwNjAyNyAwMDAwMCBuIAow
+ MDAwMDA1ODUwIDAwMDAwIG4gCjAwMDAwMDUzODcgMDAwMDAgbiAKMDAwMDAwNjIwMiAw
+ MDAwMCBuIAowMDAwMDA2Mzc5IDAwMDAwIG4gCjAwMDAwMDY2OTkgMDAwMDAgbiAKMDAw
+ MDAwNTA2NyAwMDAwMCBuIAowMDAwMDA1NTY0IDAwMDAwIG4gCjAwMDAwNDkyNTIgMDAw
+ MDAgbiAKMDAwMDAzNTk1NiAwMDAwMCBuIAowMDAwMDA2ODc2IDAwMDAwIG4gCjAwMDAw
+ MDU3MDcgMDAwMDAgbiAKMDAwMDAwNTI0NCAwMDAwMCBuIAowMDAwMDA2NTU2IDAwMDAw
+ IG4gCjAwMDAwMjgwOTIgMDAwMDAgbiAKMDAwMDAzMTU5MiAwMDAwMCBuIAowMDAwMDI4
+ Nzg3IDAwMDAwIG4gCjAwMDAwMjk4NDIgMDAwMDAgbiAKMDAwMDAyODQ1MiAwMDAwMCBu
+ IAowMDAwMDMwODcyIDAwMDAwIG4gCjAwMDAwMzAxNzcgMDAwMDAgbiAKMDAwMDAyOTQ4
+ MiAwMDAwMCBuIAowMDAwMDMyMjg3IDAwMDAwIG4gCjAwMDAwMjkxNDcgMDAwMDAgbiAK
+ MDAwMDAzMTIzMiAwMDAwMCBuIAowMDAwMDMwNTM3IDAwMDAwIG4gCjAwMDAwMzE5Mjcg
+ MDAwMDAgbiAKMDAwMDAyNjU2OCAwMDAwMCBuIAowMDAwMDEyODcyIDAwMDAwIG4gCjAw
+ MDAwMTQ5NzMgMDAwMDAgbiAKMDAwMDAyNzE5MCAwMDAwMCBuIAowMDAwMDE3ODkxIDAw
+ MDAwIG4gCjAwMDAwMjA3NjcgMDAwMDAgbiAKMDAwMDAyMjkxMCAwMDAwMCBuIAowMDAw
+ MDI1MDExIDAwMDAwIG4gCjAwMDAwMjA3ODggMDAwMDAgbiAKMDAwMDAyMjg4OSAwMDAw
+ MCBuIAowMDAwMDA5OTc1IDAwMDAwIG4gCjAwMDAwMTI4NTEgMDAwMDAgbiAKMDAwMDAx
+ NDk5NCAwMDAwMCBuIAowMDAwMDE3ODcwIDAwMDAwIG4gCjAwMDAwMjUwMzIgMDAwMDAg
+ biAKMDAwMDAyNTkyNyAwMDAwMCBuIAowMDAwMDI1OTgzIDAwMDAwIG4gCjAwMDAwMjY1
+ NDggMDAwMDAgbiAKMDAwMDAyNjYwNSAwMDAwMCBuIAowMDAwMDI3MTcwIDAwMDAwIG4g
+ CjAwMDAwMjcyMjcgMDAwMDAgbiAKMDAwMDAyODAzNSAwMDAwMCBuIAowMDAwMDI4NDMy
+ IDAwMDAwIG4gCjAwMDAwMjg3NjcgMDAwMDAgbiAKMDAwMDAyOTEyNyAwMDAwMCBuIAow
+ MDAwMDI5NDYyIDAwMDAwIG4gCjAwMDAwMjk4MjIgMDAwMDAgbiAKMDAwMDAzMDE1NyAw
+ MDAwMCBuIAowMDAwMDMwNTE3IDAwMDAwIG4gCjAwMDAwMzA4NTIgMDAwMDAgbiAKMDAw
+ MDAzMTIxMiAwMDAwMCBuIAowMDAwMDMxNTcyIDAwMDAwIG4gCjAwMDAwMzE5MDcgMDAw
+ MDAgbiAKMDAwMDAzMjI2NyAwMDAwMCBuIAowMDAwMDMyNjI3IDAwMDAwIG4gCjAwMDAw
+ MzI3MzAgMDAwMDAgbiAKMDAwMDAzMjc5NCAwMDAwMCBuIAowMDAwMDM1NjY3IDAwMDAw
+ IG4gCjAwMDAwMzU2ODggMDAwMDAgbiAKMDAwMDAzNTkzMiAwMDAwMCBuIAowMDAwMDM2
+ MTM1IDAwMDAwIG4gCjAwMDAwNDQyOTYgMDAwMDAgbiAKMDAwMDA0NDMxNyAwMDAwMCBu
+ IAowMDAwMDQ0NTUzIDAwMDAwIG4gCjAwMDAwNDQ5ODYgMDAwMDAgbiAKMDAwMDA0ODc4
+ OCAwMDAwMCBuIAowMDAwMDQ4ODA5IDAwMDAwIG4gCjAwMDAwNDkwNDQgMDAwMDAgbiAK
+ dHJhaWxlcgo8PCAvU2l6ZSA5OCAvUm9vdCA4NSAwIFIgL0luZm8gMSAwIFIgL0lEIFsg
+ PDY3ZGM0MGU2ZDhjY2JjYTM3MjQ4MzQ3MWM5NzkxNGNmPgo8NjdkYzQwZTZkOGNjYmNh
+ MzcyNDgzNDcxYzk3OTE0Y2Y+IF0gPj4Kc3RhcnR4cmVmCjQ5NjQyCiUlRU9GCjEgMCBv
+ YmoKPDwvQXV0aG9yIChSYW5kYWxsIEhhdWNoKS9DcmVhdGlvbkRhdGUgKEQ6MjAwODA5
+ MTkxNTM1MDBaKS9DcmVhdG9yIChPbW5pR3JhZmZsZSA1LjAuMikvTW9kRGF0ZSAoRDoy
+ MDA4MDkxOTE1MzUwMFopL1Byb2R1Y2VyIChNYWMgT1MgWCAxMC41LjUgUXVhcnR6IFBE
+ RkNvbnRleHQpL1RpdGxlIChVbnRpdGxlZCk+PgplbmRvYmoKeHJlZgoxIDEKMDAwMDA1
+ MTc2MCAwMDAwMCBuIAp0cmFpbGVyCjw8L0lEIFs8NjdkYzQwZTZkOGNjYmNhMzcyNDgz
+ NDcxYzk3OTE0Y2Y+IDw2N2RjNDBlNmQ4Y2NiY2EzNzI0ODM0NzFjOTc5MTRjZj5dIC9J
+ bmZvIDEgMCBSIC9QcmV2IDQ5NjQyIC9Sb290IDg1IDAgUiAvU2l6ZSA5OD4+CnN0YXJ0
+ eHJlZgo1MTk1NAolJUVPRgo=
+ </data>
+ <key>QuickLookThumbnail</key>
+ <data>
+ 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
+ 5hjADGZD5C2B1j3BqC3BWAphuGZDgCtB5COD6BfCRBHD1B8BNBuD1BBA1DLC/AWCiDCC
+ GAQC/ByBOB/C9A4A4AoDIDIAdCmDJCXAxD1C8BjBCBoABBIA7DFC4AYC2DUCRAYDPCLA
+ yBdC7BUBUARCsDnA6DICdA8CJBgDPCBCpBaDDB4AmBrD2CODEBoAEElBuD/BCA2DKC+A
+ WCkC/CCAGC8ByCKD5BlCVBVAkF8DqDHCQBPByR2C/BpAWe8e7D/bGLHSsbLjuS5BXnVL
+ LGPDiGRCfALncIyAnj0bYD8DdW/CllXCFlalRACD4CyBuBFD1ZYBHD2C2FVCSlqAAC/A
+ MB3C/CUBTDCBuA2l2Anl5DZDIARB/DJCjBhmCCLmFC+mIDXmLCKDUUuDUCHBGBYC7AeB
+ TARC4maClCaBCDbBxDDAxCaBhALB6AlBED1CICzBpaGBJBuDAmxDZm0B+C/CEBIC8BkA
+ 6D4BzDBBWAiAIIZDMCRA6BuD3CLC/BxA0NwnMWpUElKDeQVAlQTBajtc2c3ncALS5fQQ
+ hDiCyBNCHAHC4CgBQALI1D9DdB3BACTBdC9CRD4CxB7BtCSD2A1AADLANB4CiCRBXAKB
+ wAxBUC9AnA3AoDZDJARB4CqCjBoArDDCMBlBhC9AOA7oQAYV4CTBcAUCJeEC7BImXC4C
+ sA5ClDKBDDbCHDCAwCBBfAQC+AoBABwotDFAPC0ByBpC/ALA2DaC+AVaKCCBMADBzA3C
+ ZBjDECLAkADD8LHDrCXA6BODxCLCqBwAzAUk2F7SmbLhVDfW4AmBZrflIIppSlMCjlOL
+ llQlSlUlWlYlaGlldlflhljlllnlplrltlvlxlzl1l3l5l7l9l/mBmDmFmHmJmLmNmPm
+ RmTmVmXmZmbmdmfmhmjmlmnmpmrmtoxmwmym0m2m4m6m8m+nAnCnEnGnInKnMcdrLnQQ
+ NnSc1nUnWUScorhsyszs0s1s2s3s4LWUGCks8rmAoOHOFroW8hkACW7tFGGI0D6D1DxD
+ 8ANAUAQAGGGDXCeBtDIA3CFBja0AAAOASAJtDlRD+D3DuDyD5AOAWAWAJOHI0D8D0DwD
+ qD2D+OBANUyhRsnD/D7D1D1D8hfACD9L1DtDwD4AHGCe5jgjihQF7DZCyB+CRD1BaCOB
+ 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
+ </data>
+ <key>ReadOnly</key>
+ <string>NO</string>
+ <key>RowAlign</key>
+ <integer>1</integer>
+ <key>RowSpacing</key>
+ <real>36</real>
+ <key>SheetTitle</key>
+ <string>Canvas 1</string>
+ <key>SmartAlignmentGuidesActive</key>
+ <string>YES</string>
+ <key>SmartDistanceGuidesActive</key>
+ <string>YES</string>
+ <key>UniqueID</key>
+ <integer>1</integer>
+ <key>UseEntirePage</key>
+ <false/>
+ <key>VPages</key>
+ <integer>1</integer>
+ <key>WindowInfo</key>
+ <dict>
+ <key>CurrentSheet</key>
+ <integer>0</integer>
+ <key>ExpandedCanvases</key>
+ <array>
+ <dict>
+ <key>name</key>
+ <string>Canvas 1</string>
+ </dict>
+ </array>
+ <key>Frame</key>
+ <string>{{88, 214}, {710, 884}}</string>
+ <key>ListView</key>
+ <true/>
+ <key>OutlineWidth</key>
+ <integer>142</integer>
+ <key>RightSidebar</key>
+ <false/>
+ <key>ShowRuler</key>
+ <true/>
+ <key>Sidebar</key>
+ <true/>
+ <key>SidebarWidth</key>
+ <integer>120</integer>
+ <key>VisibleRegion</key>
+ <string>{{0, 0}, {575, 733}}</string>
+ <key>Zoom</key>
+ <real>1</real>
+ <key>ZoomValues</key>
+ <array>
+ <array>
+ <string>Canvas 1</string>
+ <real>1</real>
+ <real>1</real>
+ </array>
+ </array>
+ </dict>
+ <key>saveQuickLookFiles</key>
+ <string>YES</string>
+</dict>
+</plist>
Added: trunk/docs/gettingstarted/src/main/docbook/en-US/images/dna-connectors-0.2.png
===================================================================
(Binary files differ)
Property changes on: trunk/docs/gettingstarted/src/main/docbook/en-US/images/dna-connectors-0.2.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: trunk/docs/gettingstarted/src/main/docbook/en-US/images/dna-connectors-future.graffle/QuickLook/Preview.pdf
===================================================================
(Binary files differ)
Property changes on: trunk/docs/gettingstarted/src/main/docbook/en-US/images/dna-connectors-future.graffle/QuickLook/Preview.pdf
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: trunk/docs/gettingstarted/src/main/docbook/en-US/images/dna-connectors-future.graffle/QuickLook/Thumbnail.tiff
===================================================================
(Binary files differ)
Property changes on: trunk/docs/gettingstarted/src/main/docbook/en-US/images/dna-connectors-future.graffle/QuickLook/Thumbnail.tiff
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: trunk/docs/gettingstarted/src/main/docbook/en-US/images/dna-connectors-future.graffle/data.plist
===================================================================
--- trunk/docs/gettingstarted/src/main/docbook/en-US/images/dna-connectors-future.graffle/data.plist (rev 0)
+++ trunk/docs/gettingstarted/src/main/docbook/en-US/images/dna-connectors-future.graffle/data.plist 2008-09-19 20:26:37 UTC (rev 538)
@@ -0,0 +1,1635 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>ActiveLayerIndex</key>
+ <integer>0</integer>
+ <key>ApplicationVersion</key>
+ <array>
+ <string>com.omnigroup.OmniGraffle</string>
+ <string>136.19.0.104178</string>
+ </array>
+ <key>AutoAdjust</key>
+ <true/>
+ <key>BackgroundGraphic</key>
+ <dict>
+ <key>Bounds</key>
+ <string>{{0, 0}, {756, 553}}</string>
+ <key>Class</key>
+ <string>SolidGraphic</string>
+ <key>ID</key>
+ <integer>2</integer>
+ <key>Style</key>
+ <dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ </dict>
+ <key>CanvasOrigin</key>
+ <string>{0, 0}</string>
+ <key>ColumnAlign</key>
+ <integer>1</integer>
+ <key>ColumnSpacing</key>
+ <real>36</real>
+ <key>CreationDate</key>
+ <string>2008-09-19 10:36:51 -0500</string>
+ <key>Creator</key>
+ <string>Randall Hauch</string>
+ <key>DisplayScale</key>
+ <string>1 0/72 in = 1 0/72 in</string>
+ <key>GraphDocumentVersion</key>
+ <integer>6</integer>
+ <key>GraphicsList</key>
+ <array>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>ID</key>
+ <integer>231</integer>
+ <key>Points</key>
+ <array>
+ <string>{547.364, 350.439}</string>
+ <string>{547.364, 372.702}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>archive</key>
+ <data>
+ YnBsaXN0MDDUAQIDBAUGCQpYJHZl
+ cnNpb25UJHRvcFkkYXJjaGl2ZXJY
+ JG9iamVjdHMSAAGGoNEHCFRyb290
+ gAFfEA9OU0tleWVkQXJjaGl2ZXKl
+ CwwVGR5VJG51bGzUDQ4PEBESExRW
+ JGNsYXNzXE5TQ29sb3JTcGFjZV8Q
+ Ek5TQ3VzdG9tQ29sb3JTcGFjZVdO
+ U1doaXRlgAQQA4ACRDAuNQDSDRYX
+ GFROU0lEgAMQAtIaGxwOWCRjbGFz
+ c2VzWiRjbGFzc25hbWWiDh1YTlNP
+ YmplY3TSGhsfIKIgHVdOU0NvbG9y
+ CBEaHykyNzo/QVNZX2hvfJGZm52f
+ pKmusLK3wMvO19zfAAAAAAAAAQEA
+ AAAAAAAAIQAAAAAAAAAAAAAAAAAA
+ AOc=
+ </data>
+ <key>b</key>
+ <string>0.500023</string>
+ <key>g</key>
+ <string>0.500023</string>
+ <key>r</key>
+ <string>0.500023</string>
+ </dict>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{510.728, 426.742}, {69, 28}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>Vertical</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>ID</key>
+ <integer>229</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Pad</key>
+ <integer>0</integer>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 File\
+System}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{524.787, 375.263}, {40.8814, 44.2393}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>228</integer>
+ <key>ImageID</key>
+ <integer>1</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{503.728, 276.5}, {83, 29.0002}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>Helvetica</string>
+ <key>NSKern</key>
+ <real>0.0</real>
+ <key>Size</key>
+ <real>12</real>
+ </dict>
+ <key>ID</key>
+ <integer>227</integer>
+ <key>Shape</key>
+ <string>Bezier</string>
+ <key>ShapeData</key>
+ <dict>
+ <key>UnitPoints</key>
+ <array>
+ <string>{-0.5, -0.5}</string>
+ <string>{-0.5, -0.5}</string>
+ <string>{0.5, -0.5}</string>
+ <string>{0.5, -0.5}</string>
+ <string>{0.5, -0.5}</string>
+ <string>{0.5, 0.499996}</string>
+ <string>{0.5, 0.499996}</string>
+ <string>{0.166667, 0.499996}</string>
+ <string>{-0.333334, 0.500008}</string>
+ <string>{-0.5, 0.499996}</string>
+ <string>{-0.499999, 0.499996}</string>
+ <string>{-0.5, -0.5}</string>
+ </array>
+ </dict>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.284764</string>
+ <key>g</key>
+ <string>0.341238</string>
+ <key>r</key>
+ <string>0.527916</string>
+ </dict>
+ <key>GradientColor</key>
+ <dict>
+ <key>w</key>
+ <string>0.666667</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Fuzziness</key>
+ <real>5.7921171188354492</real>
+ <key>ShadowVector</key>
+ <string>{3, 4}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>CornerRadius</key>
+ <real>9</real>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 Repository Source}</string>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{503.728, 305.5}, {83, 37}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>226</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.441947</string>
+ <key>g</key>
+ <string>0.595697</string>
+ <key>r</key>
+ <string>0.630182</string>
+ </dict>
+ <key>GradientCenter</key>
+ <string>{-0.0761905, -0.114286}</string>
+ <key>MiddleFraction</key>
+ <real>0.4841269850730896</real>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Fuzziness</key>
+ <real>5.7921171188354492</real>
+ <key>ShadowVector</key>
+ <string>{3, 4}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 File System}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>ID</key>
+ <integer>225</integer>
+ <key>Points</key>
+ <array>
+ <string>{441, 350.439}</string>
+ <string>{441, 372.702}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>archive</key>
+ <data>
+ YnBsaXN0MDDUAQIDBAUGCQpYJHZl
+ cnNpb25UJHRvcFkkYXJjaGl2ZXJY
+ JG9iamVjdHMSAAGGoNEHCFRyb290
+ gAFfEA9OU0tleWVkQXJjaGl2ZXKl
+ CwwVGR5VJG51bGzUDQ4PEBESExRW
+ JGNsYXNzXE5TQ29sb3JTcGFjZV8Q
+ Ek5TQ3VzdG9tQ29sb3JTcGFjZVdO
+ U1doaXRlgAQQA4ACRDAuNQDSDRYX
+ GFROU0lEgAMQAtIaGxwOWCRjbGFz
+ c2VzWiRjbGFzc25hbWWiDh1YTlNP
+ YmplY3TSGhsfIKIgHVdOU0NvbG9y
+ CBEaHykyNzo/QVNZX2hvfJGZm52f
+ pKmusLK3wMvO19zfAAAAAAAAAQEA
+ AAAAAAAAIQAAAAAAAAAAAAAAAAAA
+ AOc=
+ </data>
+ <key>b</key>
+ <string>0.500023</string>
+ <key>g</key>
+ <string>0.500023</string>
+ <key>r</key>
+ <string>0.500023</string>
+ </dict>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>ID</key>
+ <integer>224</integer>
+ <key>Points</key>
+ <array>
+ <string>{332, 350.439}</string>
+ <string>{332, 372.702}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>archive</key>
+ <data>
+ YnBsaXN0MDDUAQIDBAUGCQpYJHZl
+ cnNpb25UJHRvcFkkYXJjaGl2ZXJY
+ JG9iamVjdHMSAAGGoNEHCFRyb290
+ gAFfEA9OU0tleWVkQXJjaGl2ZXKl
+ CwwVGR5VJG51bGzUDQ4PEBESExRW
+ JGNsYXNzXE5TQ29sb3JTcGFjZV8Q
+ Ek5TQ3VzdG9tQ29sb3JTcGFjZVdO
+ U1doaXRlgAQQA4ACRDAuNQDSDRYX
+ GFROU0lEgAMQAtIaGxwOWCRjbGFz
+ c2VzWiRjbGFzc25hbWWiDh1YTlNP
+ YmplY3TSGhsfIKIgHVdOU0NvbG9y
+ CBEaHykyNzo/QVNZX2hvfJGZm52f
+ pKmusLK3wMvO19zfAAAAAAAAAQEA
+ AAAAAAAAIQAAAAAAAAAAAAAAAAAA
+ AOc=
+ </data>
+ <key>b</key>
+ <string>0.500023</string>
+ <key>g</key>
+ <string>0.500023</string>
+ <key>r</key>
+ <string>0.500023</string>
+ </dict>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>ID</key>
+ <integer>223</integer>
+ <key>Points</key>
+ <array>
+ <string>{223, 350.439}</string>
+ <string>{223, 372.702}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>archive</key>
+ <data>
+ YnBsaXN0MDDUAQIDBAUGCQpYJHZl
+ cnNpb25UJHRvcFkkYXJjaGl2ZXJY
+ JG9iamVjdHMSAAGGoNEHCFRyb290
+ gAFfEA9OU0tleWVkQXJjaGl2ZXKl
+ CwwVGR5VJG51bGzUDQ4PEBESExRW
+ JGNsYXNzXE5TQ29sb3JTcGFjZV8Q
+ Ek5TQ3VzdG9tQ29sb3JTcGFjZVdO
+ U1doaXRlgAQQA4ACRDAuNQDSDRYX
+ GFROU0lEgAMQAtIaGxwOWCRjbGFz
+ c2VzWiRjbGFzc25hbWWiDh1YTlNP
+ YmplY3TSGhsfIKIgHVdOU0NvbG9y
+ CBEaHykyNzo/QVNZX2hvfJGZm52f
+ pKmusLK3wMvO19zfAAAAAAAAAQEA
+ AAAAAAAAIQAAAAAAAAAAAAAAAAAA
+ AOc=
+ </data>
+ <key>b</key>
+ <string>0.500023</string>
+ <key>g</key>
+ <string>0.500023</string>
+ <key>r</key>
+ <string>0.500023</string>
+ </dict>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>ID</key>
+ <integer>222</integer>
+ <key>Points</key>
+ <array>
+ <string>{108, 350.439}</string>
+ <string>{108, 372.702}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>archive</key>
+ <data>
+ YnBsaXN0MDDUAQIDBAUGCQpYJHZl
+ cnNpb25UJHRvcFkkYXJjaGl2ZXJY
+ JG9iamVjdHMSAAGGoNEHCFRyb290
+ gAFfEA9OU0tleWVkQXJjaGl2ZXKl
+ CwwVGR5VJG51bGzUDQ4PEBESExRW
+ JGNsYXNzXE5TQ29sb3JTcGFjZV8Q
+ Ek5TQ3VzdG9tQ29sb3JTcGFjZVdO
+ U1doaXRlgAQQA4ACRDAuNQDSDRYX
+ GFROU0lEgAMQAtIaGxwOWCRjbGFz
+ c2VzWiRjbGFzc25hbWWiDh1YTlNP
+ YmplY3TSGhsfIKIgHVdOU0NvbG9y
+ CBEaHykyNzo/QVNZX2hvfJGZm52f
+ pKmusLK3wMvO19zfAAAAAAAAAQEA
+ AAAAAAAAIQAAAAAAAAAAAAAAAAAA
+ AOc=
+ </data>
+ <key>b</key>
+ <string>0.500023</string>
+ <key>g</key>
+ <string>0.500023</string>
+ <key>r</key>
+ <string>0.500023</string>
+ </dict>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{394, 454.265}, {89.7277, 13}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>Vertical</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>Helvetica</string>
+ <key>Size</key>
+ <real>12</real>
+ </dict>
+ <key>ID</key>
+ <integer>189</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Pad</key>
+ <integer>0</integer>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\i\fs22 \cf0 (e.g., BigTable)}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{404.364, 426.742}, {69, 28}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>Vertical</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>ID</key>
+ <integer>188</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Pad</key>
+ <integer>0</integer>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 Apache HBase}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{418.423, 375.263}, {40.8814, 44.2393}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>187</integer>
+ <key>ImageID</key>
+ <integer>1</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{397.364, 276.5}, {83, 29.0002}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>Helvetica</string>
+ <key>NSKern</key>
+ <real>0.0</real>
+ <key>Size</key>
+ <real>12</real>
+ </dict>
+ <key>ID</key>
+ <integer>186</integer>
+ <key>Shape</key>
+ <string>Bezier</string>
+ <key>ShapeData</key>
+ <dict>
+ <key>UnitPoints</key>
+ <array>
+ <string>{-0.5, -0.5}</string>
+ <string>{-0.5, -0.5}</string>
+ <string>{0.5, -0.5}</string>
+ <string>{0.5, -0.5}</string>
+ <string>{0.5, -0.5}</string>
+ <string>{0.5, 0.499996}</string>
+ <string>{0.5, 0.499996}</string>
+ <string>{0.166667, 0.499996}</string>
+ <string>{-0.333334, 0.500008}</string>
+ <string>{-0.5, 0.499996}</string>
+ <string>{-0.499999, 0.499996}</string>
+ <string>{-0.5, -0.5}</string>
+ </array>
+ </dict>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.284764</string>
+ <key>g</key>
+ <string>0.341238</string>
+ <key>r</key>
+ <string>0.527916</string>
+ </dict>
+ <key>GradientColor</key>
+ <dict>
+ <key>w</key>
+ <string>0.666667</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Fuzziness</key>
+ <real>5.7921171188354492</real>
+ <key>ShadowVector</key>
+ <string>{3, 4}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>CornerRadius</key>
+ <real>9</real>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 Repository Source}</string>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{397.364, 305.5}, {83, 37}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>185</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.441947</string>
+ <key>g</key>
+ <string>0.595697</string>
+ <key>r</key>
+ <string>0.630182</string>
+ </dict>
+ <key>GradientCenter</key>
+ <string>{-0.0761905, -0.114286}</string>
+ <key>MiddleFraction</key>
+ <real>0.4841269850730896</real>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Fuzziness</key>
+ <real>5.7921171188354492</real>
+ <key>ShadowVector</key>
+ <string>{3, 4}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 HBase}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{287.636, 455.144}, {89.7277, 13}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>Vertical</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>Helvetica</string>
+ <key>Size</key>
+ <real>12</real>
+ </dict>
+ <key>ID</key>
+ <integer>184</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Pad</key>
+ <integer>0</integer>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\i\fs22 \cf0 (e.g., SVN, CVS)}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{298, 427.621}, {69, 28}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>Vertical</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>ID</key>
+ <integer>166</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Pad</key>
+ <integer>0</integer>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 SCM Repository}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{312.059, 376.142}, {40.8814, 44.2393}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>165</integer>
+ <key>ImageID</key>
+ <integer>1</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{291, 277.379}, {83, 29.0002}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>Helvetica</string>
+ <key>NSKern</key>
+ <real>0.0</real>
+ <key>Size</key>
+ <real>12</real>
+ </dict>
+ <key>ID</key>
+ <integer>164</integer>
+ <key>Shape</key>
+ <string>Bezier</string>
+ <key>ShapeData</key>
+ <dict>
+ <key>UnitPoints</key>
+ <array>
+ <string>{-0.5, -0.5}</string>
+ <string>{-0.5, -0.5}</string>
+ <string>{0.5, -0.5}</string>
+ <string>{0.5, -0.5}</string>
+ <string>{0.5, -0.5}</string>
+ <string>{0.5, 0.499996}</string>
+ <string>{0.5, 0.499996}</string>
+ <string>{0.166667, 0.499996}</string>
+ <string>{-0.333334, 0.500008}</string>
+ <string>{-0.5, 0.499996}</string>
+ <string>{-0.499999, 0.499996}</string>
+ <string>{-0.5, -0.5}</string>
+ </array>
+ </dict>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.284764</string>
+ <key>g</key>
+ <string>0.341238</string>
+ <key>r</key>
+ <string>0.527916</string>
+ </dict>
+ <key>GradientColor</key>
+ <dict>
+ <key>w</key>
+ <string>0.666667</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Fuzziness</key>
+ <real>5.7921171188354492</real>
+ <key>ShadowVector</key>
+ <string>{3, 4}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>CornerRadius</key>
+ <real>9</real>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 Repository Source}</string>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{291, 306.379}, {83, 37}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>163</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.441947</string>
+ <key>g</key>
+ <string>0.595697</string>
+ <key>r</key>
+ <string>0.630182</string>
+ </dict>
+ <key>GradientCenter</key>
+ <string>{-0.0761905, -0.114286}</string>
+ <key>MiddleFraction</key>
+ <real>0.4841269850730896</real>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Fuzziness</key>
+ <real>5.7921171188354492</real>
+ <key>ShadowVector</key>
+ <string>{3, 4}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 SCM}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{189, 427.621}, {69, 28}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>Vertical</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>ID</key>
+ <integer>162</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Pad</key>
+ <integer>0</integer>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 JDBC Database}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{203.059, 376.142}, {40.8814, 44.2393}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>161</integer>
+ <key>ImageID</key>
+ <integer>1</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{182, 277.379}, {83, 29.0002}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>Helvetica</string>
+ <key>NSKern</key>
+ <real>0.0</real>
+ <key>Size</key>
+ <real>12</real>
+ </dict>
+ <key>ID</key>
+ <integer>160</integer>
+ <key>Shape</key>
+ <string>Bezier</string>
+ <key>ShapeData</key>
+ <dict>
+ <key>UnitPoints</key>
+ <array>
+ <string>{-0.5, -0.5}</string>
+ <string>{-0.5, -0.5}</string>
+ <string>{0.5, -0.5}</string>
+ <string>{0.5, -0.5}</string>
+ <string>{0.5, -0.5}</string>
+ <string>{0.5, 0.499996}</string>
+ <string>{0.5, 0.499996}</string>
+ <string>{0.166667, 0.499996}</string>
+ <string>{-0.333334, 0.500008}</string>
+ <string>{-0.5, 0.499996}</string>
+ <string>{-0.499999, 0.499996}</string>
+ <string>{-0.5, -0.5}</string>
+ </array>
+ </dict>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.284764</string>
+ <key>g</key>
+ <string>0.341238</string>
+ <key>r</key>
+ <string>0.527916</string>
+ </dict>
+ <key>GradientColor</key>
+ <dict>
+ <key>w</key>
+ <string>0.666667</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Fuzziness</key>
+ <real>5.7921171188354492</real>
+ <key>ShadowVector</key>
+ <string>{3, 4}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>CornerRadius</key>
+ <real>9</real>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 Repository Source}</string>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{182, 306.379}, {83, 37}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>159</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.441947</string>
+ <key>g</key>
+ <string>0.595697</string>
+ <key>r</key>
+ <string>0.630182</string>
+ </dict>
+ <key>GradientCenter</key>
+ <string>{-0.0761905, -0.114286}</string>
+ <key>MiddleFraction</key>
+ <real>0.4841269850730896</real>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Fuzziness</key>
+ <real>5.7921171188354492</real>
+ <key>ShadowVector</key>
+ <string>{3, 4}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 JDBC}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{74, 427.621}, {69, 28}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>Vertical</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>ID</key>
+ <integer>157</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Pad</key>
+ <integer>0</integer>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 JCR Repository}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{88.059, 376.142}, {40.8814, 44.2393}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>156</integer>
+ <key>ImageID</key>
+ <integer>1</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{67, 277.379}, {83, 29.0002}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>Helvetica</string>
+ <key>NSKern</key>
+ <real>0.0</real>
+ <key>Size</key>
+ <real>12</real>
+ </dict>
+ <key>ID</key>
+ <integer>50</integer>
+ <key>Shape</key>
+ <string>Bezier</string>
+ <key>ShapeData</key>
+ <dict>
+ <key>UnitPoints</key>
+ <array>
+ <string>{-0.5, -0.5}</string>
+ <string>{-0.5, -0.5}</string>
+ <string>{0.5, -0.5}</string>
+ <string>{0.5, -0.5}</string>
+ <string>{0.5, -0.5}</string>
+ <string>{0.5, 0.499996}</string>
+ <string>{0.5, 0.499996}</string>
+ <string>{0.166667, 0.499996}</string>
+ <string>{-0.333334, 0.500008}</string>
+ <string>{-0.5, 0.499996}</string>
+ <string>{-0.499999, 0.499996}</string>
+ <string>{-0.5, -0.5}</string>
+ </array>
+ </dict>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.284764</string>
+ <key>g</key>
+ <string>0.341238</string>
+ <key>r</key>
+ <string>0.527916</string>
+ </dict>
+ <key>GradientColor</key>
+ <dict>
+ <key>w</key>
+ <string>0.666667</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Fuzziness</key>
+ <real>5.7921171188354492</real>
+ <key>ShadowVector</key>
+ <string>{3, 4}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>CornerRadius</key>
+ <real>9</real>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 Repository Source}</string>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{67, 306.379}, {83, 37}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>49</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.441947</string>
+ <key>g</key>
+ <string>0.595697</string>
+ <key>r</key>
+ <string>0.630182</string>
+ </dict>
+ <key>GradientCenter</key>
+ <string>{-0.0761905, -0.114286}</string>
+ <key>MiddleFraction</key>
+ <real>0.4841269850730896</real>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Fuzziness</key>
+ <real>5.7921171188354492</real>
+ <key>ShadowVector</key>
+ <string>{3, 4}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 JCR}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ </array>
+ <key>GridInfo</key>
+ <dict/>
+ <key>GuidesLocked</key>
+ <string>NO</string>
+ <key>GuidesVisible</key>
+ <string>YES</string>
+ <key>HPages</key>
+ <integer>1</integer>
+ <key>ImageCounter</key>
+ <integer>2</integer>
+ <key>ImageLinkBack</key>
+ <array>
+ <dict/>
+ </array>
+ <key>ImageList</key>
+ <array>
+ <string>image1.jpg</string>
+ </array>
+ <key>KeepToScale</key>
+ <false/>
+ <key>Layers</key>
+ <array>
+ <dict>
+ <key>Lock</key>
+ <string>NO</string>
+ <key>Name</key>
+ <string>Layer 1</string>
+ <key>Print</key>
+ <string>YES</string>
+ <key>View</key>
+ <string>YES</string>
+ </dict>
+ </array>
+ <key>LayoutInfo</key>
+ <dict>
+ <key>Animate</key>
+ <string>NO</string>
+ <key>circoMinDist</key>
+ <real>18</real>
+ <key>circoSeparation</key>
+ <real>0.0</real>
+ <key>layoutEngine</key>
+ <string>dot</string>
+ <key>neatoSeparation</key>
+ <real>0.0</real>
+ <key>twopiSeparation</key>
+ <real>0.0</real>
+ </dict>
+ <key>LinksVisible</key>
+ <string>NO</string>
+ <key>MagnetsVisible</key>
+ <string>NO</string>
+ <key>MasterSheets</key>
+ <array/>
+ <key>ModificationDate</key>
+ <string>2008-09-19 10:39:39 -0500</string>
+ <key>Modifier</key>
+ <string>Randall Hauch</string>
+ <key>NotesVisible</key>
+ <string>NO</string>
+ <key>Orientation</key>
+ <integer>2</integer>
+ <key>OriginVisible</key>
+ <string>NO</string>
+ <key>PageBreaks</key>
+ <string>YES</string>
+ <key>PrintInfo</key>
+ <dict>
+ <key>NSBottomMargin</key>
+ <array>
+ <string>float</string>
+ <string>41</string>
+ </array>
+ <key>NSLeftMargin</key>
+ <array>
+ <string>float</string>
+ <string>18</string>
+ </array>
+ <key>NSOrientation</key>
+ <array>
+ <string>int</string>
+ <string>1</string>
+ </array>
+ <key>NSPaperSize</key>
+ <array>
+ <string>size</string>
+ <string>{792, 612}</string>
+ </array>
+ <key>NSRightMargin</key>
+ <array>
+ <string>float</string>
+ <string>18</string>
+ </array>
+ <key>NSTopMargin</key>
+ <array>
+ <string>float</string>
+ <string>18</string>
+ </array>
+ </dict>
+ <key>PrintOnePage</key>
+ <false/>
+ <key>ReadOnly</key>
+ <string>NO</string>
+ <key>RowAlign</key>
+ <integer>1</integer>
+ <key>RowSpacing</key>
+ <real>36</real>
+ <key>SheetTitle</key>
+ <string>Canvas 1</string>
+ <key>SmartAlignmentGuidesActive</key>
+ <string>YES</string>
+ <key>SmartDistanceGuidesActive</key>
+ <string>YES</string>
+ <key>UniqueID</key>
+ <integer>1</integer>
+ <key>UseEntirePage</key>
+ <false/>
+ <key>VPages</key>
+ <integer>1</integer>
+ <key>WindowInfo</key>
+ <dict>
+ <key>CurrentSheet</key>
+ <integer>0</integer>
+ <key>ExpandedCanvases</key>
+ <array>
+ <dict>
+ <key>name</key>
+ <string>Canvas 1</string>
+ </dict>
+ </array>
+ <key>Frame</key>
+ <string>{{108, 213}, {951, 865}}</string>
+ <key>ListView</key>
+ <true/>
+ <key>OutlineWidth</key>
+ <integer>142</integer>
+ <key>RightSidebar</key>
+ <false/>
+ <key>ShowRuler</key>
+ <true/>
+ <key>Sidebar</key>
+ <true/>
+ <key>SidebarWidth</key>
+ <integer>120</integer>
+ <key>VisibleRegion</key>
+ <string>{{-30, -80}, {816, 714}}</string>
+ <key>Zoom</key>
+ <real>1</real>
+ <key>ZoomValues</key>
+ <array>
+ <array>
+ <string>Canvas 1</string>
+ <real>1</real>
+ <real>1</real>
+ </array>
+ </array>
+ </dict>
+ <key>saveQuickLookFiles</key>
+ <string>YES</string>
+</dict>
+</plist>
Added: trunk/docs/gettingstarted/src/main/docbook/en-US/images/dna-connectors-future.graffle/image1.jpg
===================================================================
(Binary files differ)
Property changes on: trunk/docs/gettingstarted/src/main/docbook/en-US/images/dna-connectors-future.graffle/image1.jpg
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: trunk/docs/gettingstarted/src/main/docbook/en-US/images/dna-connectors-future.png
===================================================================
(Binary files differ)
Property changes on: trunk/docs/gettingstarted/src/main/docbook/en-US/images/dna-connectors-future.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: trunk/docs/gettingstarted/src/main/docbook/en-US/images/dnajcr-and-connector.graffle
===================================================================
--- trunk/docs/gettingstarted/src/main/docbook/en-US/images/dnajcr-and-connector.graffle (rev 0)
+++ trunk/docs/gettingstarted/src/main/docbook/en-US/images/dnajcr-and-connector.graffle 2008-09-19 20:26:37 UTC (rev 538)
@@ -0,0 +1,1123 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>ActiveLayerIndex</key>
+ <integer>0</integer>
+ <key>ApplicationVersion</key>
+ <array>
+ <string>com.omnigroup.OmniGraffle</string>
+ <string>136.19.0.104178</string>
+ </array>
+ <key>AutoAdjust</key>
+ <true/>
+ <key>BackgroundGraphic</key>
+ <dict>
+ <key>Bounds</key>
+ <string>{{0, 0}, {576, 733}}</string>
+ <key>Class</key>
+ <string>SolidGraphic</string>
+ <key>ID</key>
+ <integer>2</integer>
+ <key>Style</key>
+ <dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ </dict>
+ <key>CanvasOrigin</key>
+ <string>{0, 0}</string>
+ <key>ColumnAlign</key>
+ <integer>1</integer>
+ <key>ColumnSpacing</key>
+ <real>36</real>
+ <key>CreationDate</key>
+ <string>2008-09-19 10:34:25 -0500</string>
+ <key>Creator</key>
+ <string>Randall Hauch</string>
+ <key>DisplayScale</key>
+ <string>1 0/72 in = 1 0/72 in</string>
+ <key>GraphDocumentVersion</key>
+ <integer>6</integer>
+ <key>GraphicsList</key>
+ <array>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>40</integer>
+ </dict>
+ <key>ID</key>
+ <integer>41</integer>
+ <key>Points</key>
+ <array>
+ <string>{246.5, 123}</string>
+ <string>{246.5, 169.999}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>6</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{205, 169.999}, {83, 29.0002}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>Helvetica</string>
+ <key>NSKern</key>
+ <real>0.0</real>
+ <key>Size</key>
+ <real>12</real>
+ </dict>
+ <key>ID</key>
+ <integer>40</integer>
+ <key>Shape</key>
+ <string>Bezier</string>
+ <key>ShapeData</key>
+ <dict>
+ <key>UnitPoints</key>
+ <array>
+ <string>{-0.5, -0.5}</string>
+ <string>{-0.5, -0.5}</string>
+ <string>{0.5, -0.5}</string>
+ <string>{0.5, -0.5}</string>
+ <string>{0.5, -0.5}</string>
+ <string>{0.5, 0.499996}</string>
+ <string>{0.5, 0.499996}</string>
+ <string>{0.166667, 0.499996}</string>
+ <string>{-0.333334, 0.500008}</string>
+ <string>{-0.5, 0.499996}</string>
+ <string>{-0.499999, 0.499996}</string>
+ <string>{-0.5, -0.5}</string>
+ </array>
+ </dict>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.284764</string>
+ <key>g</key>
+ <string>0.341238</string>
+ <key>r</key>
+ <string>0.527916</string>
+ </dict>
+ <key>GradientColor</key>
+ <dict>
+ <key>w</key>
+ <string>0.666667</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Fuzziness</key>
+ <real>5.7921171188354492</real>
+ <key>ShadowVector</key>
+ <string>{3, 4}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>CornerRadius</key>
+ <real>9</real>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 Repository Source}</string>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{205, 63}, {83, 23}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>Helvetica</string>
+ <key>NSKern</key>
+ <real>0.0</real>
+ <key>Size</key>
+ <real>12</real>
+ </dict>
+ <key>ID</key>
+ <integer>39</integer>
+ <key>Shape</key>
+ <string>Bezier</string>
+ <key>ShapeData</key>
+ <dict>
+ <key>UnitPoints</key>
+ <array>
+ <string>{-0.5, -0.5}</string>
+ <string>{-0.5, -0.5}</string>
+ <string>{0.5, -0.5}</string>
+ <string>{0.5, -0.5}</string>
+ <string>{0.5, -0.5}</string>
+ <string>{0.5, 0.499995}</string>
+ <string>{0.5, 0.499995}</string>
+ <string>{0.166667, 0.499995}</string>
+ <string>{-0.333334, 0.500006}</string>
+ <string>{-0.5, 0.499995}</string>
+ <string>{-0.499999, 0.499995}</string>
+ <string>{-0.5, -0.5}</string>
+ </array>
+ </dict>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.284764</string>
+ <key>g</key>
+ <string>0.341238</string>
+ <key>r</key>
+ <string>0.527916</string>
+ </dict>
+ <key>GradientColor</key>
+ <dict>
+ <key>w</key>
+ <string>0.666667</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Fuzziness</key>
+ <real>5.7921171188354492</real>
+ <key>ShadowVector</key>
+ <string>{3, 4}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>CornerRadius</key>
+ <real>9</real>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 JCR API}</string>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{205, 86}, {83, 37}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>6</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.441947</string>
+ <key>g</key>
+ <string>0.595697</string>
+ <key>r</key>
+ <string>0.630182</string>
+ </dict>
+ <key>GradientCenter</key>
+ <string>{-0.0761905, -0.114286}</string>
+ <key>MiddleFraction</key>
+ <real>0.4841269850730896</real>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Fuzziness</key>
+ <real>5.7921171188354492</real>
+ <key>ShadowVector</key>
+ <string>{3, 4}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 DNA-JCR}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ </array>
+ <key>GridInfo</key>
+ <dict/>
+ <key>GuidesLocked</key>
+ <string>NO</string>
+ <key>GuidesVisible</key>
+ <string>YES</string>
+ <key>HPages</key>
+ <integer>1</integer>
+ <key>ImageCounter</key>
+ <integer>1</integer>
+ <key>KeepToScale</key>
+ <false/>
+ <key>Layers</key>
+ <array>
+ <dict>
+ <key>Lock</key>
+ <string>NO</string>
+ <key>Name</key>
+ <string>Layer 1</string>
+ <key>Print</key>
+ <string>YES</string>
+ <key>View</key>
+ <string>YES</string>
+ </dict>
+ </array>
+ <key>LayoutInfo</key>
+ <dict>
+ <key>Animate</key>
+ <string>NO</string>
+ <key>circoMinDist</key>
+ <real>18</real>
+ <key>circoSeparation</key>
+ <real>0.0</real>
+ <key>layoutEngine</key>
+ <string>dot</string>
+ <key>neatoSeparation</key>
+ <real>0.0</real>
+ <key>twopiSeparation</key>
+ <real>0.0</real>
+ </dict>
+ <key>LinksVisible</key>
+ <string>NO</string>
+ <key>MagnetsVisible</key>
+ <string>NO</string>
+ <key>MasterSheets</key>
+ <array/>
+ <key>ModificationDate</key>
+ <string>2008-09-19 10:34:37 -0500</string>
+ <key>Modifier</key>
+ <string>Randall Hauch</string>
+ <key>NotesVisible</key>
+ <string>NO</string>
+ <key>Orientation</key>
+ <integer>2</integer>
+ <key>OriginVisible</key>
+ <string>NO</string>
+ <key>PageBreaks</key>
+ <string>YES</string>
+ <key>PrintInfo</key>
+ <dict>
+ <key>NSBottomMargin</key>
+ <array>
+ <string>float</string>
+ <string>41</string>
+ </array>
+ <key>NSLeftMargin</key>
+ <array>
+ <string>float</string>
+ <string>18</string>
+ </array>
+ <key>NSPaperSize</key>
+ <array>
+ <string>size</string>
+ <string>{612, 792}</string>
+ </array>
+ <key>NSRightMargin</key>
+ <array>
+ <string>float</string>
+ <string>18</string>
+ </array>
+ <key>NSTopMargin</key>
+ <array>
+ <string>float</string>
+ <string>18</string>
+ </array>
+ </dict>
+ <key>PrintOnePage</key>
+ <false/>
+ <key>QuickLookPreview</key>
+ <data>
+ JVBERi0xLjMKJcTl8uXrp/Og0MTGCjQgMCBvYmoKPDwgL0xlbmd0aCA1IDAgUiAvRmls
+ dGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeAGNVE1PGzEQvftXzLEc4tjj7yMNrQSH
+ CpJInFG0qEGbBpJQqf++z/aaDQGhZKXIMx4/v5k34xe6oxdS+FzwFIyhXUf39IeU9Kr8
+ aE3T2V7Tak+6fPsVTZR0w+64GgAEAB5petvtVt3z4fWhp90aV6RQb9HESktWIZFLUYbE
+ gN7Q9Hqj6Wpb2AyhJoyh3rgSKmoon4RaM4Y6ZoSahmpq6HTe9Q+H9d9utu23u/WmO+zW
+ KwFmyNMoHRklkC45n0JeWauTxQq5srLSkdfYpmgIrGqCsz3nmpQYJXKKumQ4QYbW5yMc
+ 8Q/C35ekedhjmrCXxrAyZGmJxH9qqXB0+Ujfrn5dTm5m8wuxfKIfS9TiMxHAg0PSPtM0
+ VrOJecXRBm8rYW3y7SET3ggOmUW1euJoJPLyg4NjyJveV2czNZxIvG5ahCilqRfskozG
+ WPLNxzoiFzRN9tiUUqtWC3grn8+YuL8Wc7hQsAI5TkAsbPmI+Yp+07G9yU31ruZozI81
+ dwDMTXJac5Y+uBA/1hz1pgtqBT8X0OS0U7Qf8S5vr0e4T/QTZ+rnPFRE2TdUFWz2qKFo
+ riqUgzo2aD/o5hzaFuebjs5kW6UsQtOx+cSbjoPHDUK1gIxSlGuoTcnx0kHJkVTRslEc
+ 1Wye8/R0FnqC9WeSRkgag6aJOZ2jefe83a8P292/r6T9AlsnqbQKljQG8/2MLraveNhG
+ iTXdYHqfxlHFU1Dey9mijLyixey4T1V5ZNGh9ZHA/GaJy4OBmZYKM9TTArOfQUR5YDDf
+ 5SEqQc5bmWpf2ISZcoGLDUVsnvvRxvwcnxC54gpsFdge9fkpIR8LiUwq44+kKv5giz7P
+ 50C7nci07/4D13JVNgplbmRzdHJlYW0KZW5kb2JqCjUgMCBvYmoKNjQ5CmVuZG9iagoy
+ IDAgb2JqCjw8IC9UeXBlIC9QYWdlIC9QYXJlbnQgMyAwIFIgL1Jlc291cmNlcyA2IDAg
+ UiAvQ29udGVudHMgNCAwIFIgL01lZGlhQm94IFswIDAgNTc2IDczM10KPj4KZW5kb2Jq
+ CjYgMCBvYmoKPDwgL1Byb2NTZXQgWyAvUERGIC9UZXh0IC9JbWFnZUIgL0ltYWdlQyAv
+ SW1hZ2VJIF0gL0NvbG9yU3BhY2UgPDwgL0NzMiAxNCAwIFIKL0NzMSA3IDAgUiA+PiAv
+ Rm9udCA8PCAvRjEuMCAxNSAwIFIgPj4gL1hPYmplY3QgPDwgL0ltMSA4IDAgUiAvSW0z
+ IDEyIDAgUgovSW0yIDEwIDAgUiA+PiA+PgplbmRvYmoKOCAwIG9iago8PCAvTGVuZ3Ro
+ IDkgMCBSIC9UeXBlIC9YT2JqZWN0IC9TdWJ0eXBlIC9JbWFnZSAvV2lkdGggMTk0IC9I
+ ZWlnaHQgMTAyIC9Db2xvclNwYWNlCjE2IDAgUiAvU01hc2sgMTcgMCBSIC9CaXRzUGVy
+ Q29tcG9uZW50IDggL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCngB7dCBAAAA
+ AMOg+VNf4AiFUGHAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+ BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+ gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+ MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+ BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+ gAEDBgwYMGDAgAEDBv7AAOfkAAEKZW5kc3RyZWFtCmVuZG9iago5IDAgb2JqCjI4Mwpl
+ bmRvYmoKMTIgMCBvYmoKPDwgL0xlbmd0aCAxMyAwIFIgL1R5cGUgL1hPYmplY3QgL1N1
+ YnR5cGUgL0ltYWdlIC9XaWR0aCAxOTQgL0hlaWdodCA4NiAvQ29sb3JTcGFjZQoxOSAw
+ IFIgL1NNYXNrIDIwIDAgUiAvQml0c1BlckNvbXBvbmVudCA4IC9GaWx0ZXIgL0ZsYXRl
+ RGVjb2RlID4+CnN0cmVhbQp4Ae3QgQAAAADDoPlTH+SFUGHAgAEDBgwYMGDAgAEDBgwY
+ MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
+ BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
+ gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
+ MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMPA+MMOE
+ AAEKZW5kc3RyZWFtCmVuZG9iagoxMyAwIG9iagoyNDAKZW5kb2JqCjEwIDAgb2JqCjw8
+ IC9MZW5ndGggMTEgMCBSIC9UeXBlIC9YT2JqZWN0IC9TdWJ0eXBlIC9JbWFnZSAvV2lk
+ dGggMTk0IC9IZWlnaHQgNzQgL0NvbG9yU3BhY2UKMjIgMCBSIC9TTWFzayAyMyAwIFIg
+ L0JpdHNQZXJDb21wb25lbnQgOCAvRmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0K
+ eAHt0IEAAAAAw6D5Ux/khVBhwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM
+ GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB
+ AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg
+ wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwa+
+ BgaoPAABCmVuZHN0cmVhbQplbmRvYmoKMTEgMCBvYmoKMjEwCmVuZG9iagoxNyAwIG9i
+ ago8PCAvTGVuZ3RoIDE4IDAgUiAvVHlwZSAvWE9iamVjdCAvU3VidHlwZSAvSW1hZ2Ug
+ L1dpZHRoIDE5NCAvSGVpZ2h0IDEwMiAvQ29sb3JTcGFjZQovRGV2aWNlR3JheSAvQml0
+ c1BlckNvbXBvbmVudCA4IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4Ae1c
+ 61dSaR+VO3g4R4GjKJfEQNQBQSYIxcvQKKhdvBVelqWmRtbCIXEwG43EZTrjpWa8j05o
+ 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
+ kEeqBsSJKAIaH0DTwEGejrCCaHsAFAQIiiVEux6SoAPonwB9D4kYigiiVQnHCUQpEDbw
+ icINCOs2ov0fKFG5wSfuf7Ku4sCGaOkJUXkigBDEvUDvydfGkFgHom860jwT6Z3hQArQ
+ iBOpnjm9eeaABSj/Iepp4ESkmSh6U/ovrQCtwHEF/g8/2JcPCmVuZHN0cmVhbQplbmRv
+ YmoKMTggMCBvYmoKMTkyNwplbmRvYmoKMjAgMCBvYmoKPDwgL0xlbmd0aCAyMSAwIFIg
+ L1R5cGUgL1hPYmplY3QgL1N1YnR5cGUgL0ltYWdlIC9XaWR0aCAxOTQgL0hlaWdodCA4
+ NiAvQ29sb3JTcGFjZQovRGV2aWNlR3JheSAvQml0c1BlckNvbXBvbmVudCA4IC9GaWx0
+ ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4Ae1b+TtbWxc2JiEDiQxk0JAIaUOkRVDa
+ 9Aal1SKk9LpVRA39tAhaqg3xGK7g6kVarZqqqHlqQ9Dn/mvf2idCdLxftT3n+R7vL/xy
+ zl7vXsPZ2Wu9bm4nIPYOuBMA37lD7u4eCJ6enl64AgzADHF3/1+IYNZ7enl7e5PIZDIF
+ X5DJJDDEC/H4tyzQ5oP1JArFx5dKpdHodDoDJ8DSNBqV6utDoZAdLP6FJ8B+2H0yxYdK
+ ozP8mEwWK4CNIwICWEymP4NBo/ogEuCJb3CA+MHsp9IY/swANpcXGMTnCwRCnCAQ8Pn8
+ QB6Pw2b5IxLf5gAOQPtPpfsx2dxAvihYLA6VSCRSaRgukEqlEkloiDhYxA/iIRKIg9fX
+ 3AAOgPD3pfuxOIECkVgSFi4/rVBERkUpcUJUVKRCcVoeLpOEBAsCuQH+dCqFBKH0pUhC
+ BMABDCYnUCiWyOQKpepcbJw6PiEhESckJMSr1bExKmXk6XCJWBTEYTFo4IYvUcAI+ND8
+ AngCsTRCER2jTky+qNFqU1LT8EOqVnvpYnKiOkYVKQ8TC3lsf7rvlyhgBHzpTHaQSBIR
+ qVKf12jTMjKzsnW63Dw9TsjL1emyszKvXE7RJKnPRsklwXwOk+FL+bwXUAgBAQ5fLFOo
+ 1Mna9MwcfUFhUXFJqcFQVnYHB5SVGQylJcVFhTf1umsZ2gvxZxUysYD7JQruHl5kHzqT
+ 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
+ v7L4Zk5akkoewmejKztnHkBPH42oSRUxF9Kz8m8ZKqtrjA2NDwiFxkZjTXWloaggJ0MT
+ FxkGQeQ6noNm1GA6RyxTwqBmpi6/8HZpWXkFwVBeVnq7sEB3LU0Trwx3Dgs6O+KOOUGY
+ 9g1Xxp7XpGZcy87V3yggGPL1uTnXr6RdSopTRoTA5O+RWUEYs4NZTSYXG1iOTUzWaFPT
+ 0jMIhvTLqVpNcmKcKjI8RMhjMWBU8KAh7uYGugmY2mcBhTCY2T8bq05IPJ9EMJxPTFDH
+ nouOlMPsNY/lB0IE17FfDw9vkg8SHvBFIVKZ/IwiShmtIhiilcrIM/JwaUgwn8vyc8gQ
+ nGng5uaQHgAFNo8vDAblijRMRjxIJaHiUyI+j83E5CxHdRQu+hsOL5AvEIoICKEA5Dhc
+ 0OOAluUTPQ7ScIEEx4eKFFyYfotDOICmDKRd/gw6CLtInwqKHDI0UNEhER1uCrpvCffo
+ SF5HQfZ/Tpjm4OBNImEyRh8CAqkrMY0jZr/zQHGYzZDPQAKkpCAkBSEkIQGmYULTrwk0
+ MTEvECEoMPNcd/3k/5MdONkBxw78F/a3ckwKZW5kc3RyZWFtCmVuZG9iagoyMSAwIG9i
+ agoyNzAzCmVuZG9iagoyMyAwIG9iago8PCAvTGVuZ3RoIDI0IDAgUiAvVHlwZSAvWE9i
+ amVjdCAvU3VidHlwZSAvSW1hZ2UgL1dpZHRoIDE5NCAvSGVpZ2h0IDc0IC9Db2xvclNw
+ YWNlCi9EZXZpY2VHcmF5IC9CaXRzUGVyQ29tcG9uZW50IDggL0ZpbHRlciAvRmxhdGVE
+ ZWNvZGUgPj4Kc3RyZWFtCngB7Vv5O1vbGjYmIQOJDGTQkAhpQ6RFUNr0BKXVIqT0OFVE
+ Db1aBD1UG+IxHMHRg6BVU83z1Iagz/nX7rd2hOh4bu9t937u0/eX5Jdkfe/6hv2tb73b
+ ze0nfu7A990BdwLgGxm6u3sgeHp6euEKMAAzxN39PyGCWe/p5e3tTSKTyRR8QSaTwBAv
+ xOOfskCbD9aTKBQfXyqVRqPT6QycAEvTaFSqrw+FQnaw+AeeAPth98kUHyqNzvBjMlms
+ ADaOCAhgMZn+DAaN6oNIgCe+wgHiB7OfSmP4MwPYXF5gEJ8vEAhxgkDA5/MDeTwOm+WP
+ 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
+ mXWJoKNFEAVeIrb/O5O7Y1S+MDO/eZ7/+3y9wwBVj1KOY0U0YMrOu8nemHZ6dEzb/BpV
+ qEYUXCnDczoSiQGfqZXP9Wv1LRRpWWqUsdb7NnyrdpkQUDQqd2QDPix5PODjki/knTw1
+ ZyQbE6k02SE3uEPJTvIt8tZsiMdDnBaeAVS1U5MzHJdxIjvILUUjK2M+IOt22rTJ76U9
+ 7RlT1LDfyDc5C9q48v1A2x5g04uKbcwDHtwDdtdVbPU1wM4RYPFQxfY96c9H2fXKyxxq
+ 9sMp0Rhr+lAqfa8DNt8Afl4vlX7cLpV+3mEO1vHUMgpu0deyMOUlENQb7Gb85Br9i4Oe
+ fFULsMA5jmwB+q8ANz8C+x8C2x8DiWpgqBWRy2w3uPLiIucCdOacadfMTuS1Zl0/onXw
+ aIXWZxtNDVrKsjTf5Wmu8IRbFOkmTFkFztlf23iPCnt4kE/2F7kkvO7frMylU12cJZrY
+ 1qe06OomN5DvZ8yePnI9r/cZt2c4YOWAme8bCjhyyrbiPBepidTY4/GTZMZXVCcfk/OQ
+ POcVB2VM334udSJBrqU9OZnrl5pd3Ns+MzHEM5KsWDMTnfHf/MYtJGXefdTcdSz/m2dt
+ kWcYhQUBEzbvNjQk0YsYGuHARQ4ZekwqTFqlX9BqwsPkX5UWEuVdFhW9WOGeFX/PeRS4
+ W8Y/hVgccw3lCJr+Tv+iL+sL+l3983xtob7imXPPmsara18ZV2aW1ci4QY0yvqwpiG+w
+ 2g56LWRpneIV9OSV9Y3h6jL2fG3Zo8kc4mp8NdSlCGVqxDjjya5l90WyxTfh51vL9q/p
+ Uft89klNJdeyunhmKfp8NlwNa/+zq2DSsqvw5I2QLjxroe5VD6p9aovaCk09prarbWoX
+ 346qA+Udw5yViQus22X1KfZgY5reyklXZovg38Ivhv+lXmEL1zQ0+Q9NuLmMaQnfEdw2
+ cIeU/8NfswMN3gplbmRzdHJlYW0KZW5kb2JqCjI4IDAgb2JqCjc5MgplbmRvYmoKNyAw
+ IG9iagpbIC9JQ0NCYXNlZCAyNyAwIFIgXQplbmRvYmoKMjkgMCBvYmoKPDwgL0xlbmd0
+ aCAzMCAwIFIgL04gMyAvQWx0ZXJuYXRlIC9EZXZpY2VSR0IgL0ZpbHRlciAvRmxhdGVE
+ ZWNvZGUgPj4Kc3RyZWFtCngBhZK/TxRREMc/e8SAIVAI0ZhYPBM1mqBZjiso79wCSQ5y
+ EqJiaPb21uPC3bHZW/FHRcNfoKEg2hEKf9RYWFysLLQyQSI02pmYWKA0eFnn7cuG6mCS
+ l/m82e/MZOYt9NhuENQzQKMZhTMTN9W9ufuqd4cMw5zmEhddrxUUSqWiSLrYwTaW/vTl
+ uq61t9hZj17+PbTaA2+/r/342SUpDQ+E0hAsJYHhquGc5rLhW5ofRUEkmnnN3oJbEQ6E
+ R8LZGUf4hfBg1fAbzWXD7zUve1Wd+0nYblZqTeF/wuMVv+VBRvd65gWhaDIfhfONxpLU
+ 7+kTvqp3IV7s6TYUXkvu4FHsznN4tQzn9QgqkXF5EYb+wLvNo9j+TrIf62xf68FYNtFZ
+ /Vtwai2O9+9C7zXofI3jw6047mxK72/QPvAehlLbqK3PcNLdzGn08HsjpW5sdpGobNho
+ w5xcJvOwLufKOTizCyXh2TzWLyc9Zm8ilUGL2dyoPT2lHLdeK4du5MvmjA1RJEuOUWym
+ mULh4FKnRplQKMInER9TI611so/8x/J+4CwFT8JadSFSBfkTfTXZ9G6MqKxtjx9fw7y5
+ 1syvwu0VTR8qFxKvObX/LjiQyAplbmRzdHJlYW0KZW5kb2JqCjMwIDAgb2JqCjQ2Mgpl
+ bmRvYmoKMTYgMCBvYmoKWyAvSUNDQmFzZWQgMjkgMCBSIF0KZW5kb2JqCjMxIDAgb2Jq
+ Cjw8IC9MZW5ndGggMzIgMCBSIC9OIDMgL0FsdGVybmF0ZSAvRGV2aWNlUkdCIC9GaWx0
+ ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4AYWSv08UURDHP3vEgCFQCNGYWDwTNZqg
+ WY4rKO/cAkkOchKiYmj29tbjwt2x2VvxR0XDX6ChINoRCn/UWFhcrCy0MkEiNNqZmFig
+ NHhZ5+3Lhupgkpf5vNnvzGTmLfTYbhDUM0CjGYUzEzfVvbn7qneHDMOc5hIXXa8VFEql
+ oki62ME2lv705bqutbfYWY9e/j202gNvv6/9+NklKQ0PhNIQLCWB4arhnOay4VuaH0VB
+ JJp5zd6CWxEOhEfC2RlH+IXwYNXwG81lw+81L3tVnftJ2G5Wak3hf8LjFb/lQUb3euYF
+ oWgyH4XzjcaS1O/pE76qdyFe7Ok2FF5L7uBR7M5zeLUM5/UIKpFxeRGG/sC7zaPY/k6y
+ H+tsX+vBWDbRWf1bcGotjvfvQu816HyN48OtOO5sSu9v0D7wHoZS26itz3DS3cxp9PB7
+ I6VubHaRqGzYaMOcXCbzsC7nyjk4swsl4dk81i8nPWZvIpVBi9ncqD09pRy3XiuHbuTL
+ 5owNUSRLjlFspplC4eBSp0aZUCjCJxEfUyOtdbKP/MfyfuAsBU/CWnUhUgX5E3012fRu
+ jKisbY8fX8O8udbMr8LtFU0fKhcSrzm1/y44kMgKZW5kc3RyZWFtCmVuZG9iagozMiAw
+ IG9iago0NjIKZW5kb2JqCjIyIDAgb2JqClsgL0lDQ0Jhc2VkIDMxIDAgUiBdCmVuZG9i
+ agozMyAwIG9iago8PCAvTGVuZ3RoIDM0IDAgUiAvTiAzIC9BbHRlcm5hdGUgL0Rldmlj
+ ZVJHQiAvRmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeAGFkr9PFFEQxz97xIAh
+ UAjRmFg8EzWaoFmOKyjv3AJJDnISomJo9vbW48Ldsdlb8UdFw1+goSDaEQp/1FhYXKws
+ tDJBIjTamZhYoDR4Wefty4bqYJKX+bzZ78xk5i302G4Q1DNAoxmFMxM31b25+6p3hwzD
+ nOYSF12vFRRKpaJIutjBNpb+9OW6rrW32FmPXv49tNoDb7+v/fjZJSkND4TSECwlgeGq
+ 4ZzmsuFbmh9FQSSaec3eglsRDoRHwtkZR/iF8GDV8BvNZcPvNS97VZ37SdhuVmpN4X/C
+ 4xW/5UFG93rmBaFoMh+F843GktTv6RO+qnchXuzpNhReS+7gUezOc3i1DOf1CCqRcXkR
+ hv7Au82j2P5Osh/rbF/rwVg20Vn9W3BqLY7370LvNeh8jePDrTjubErvb9A+8B6GUtuo
+ rc9w0t3MafTweyOlbmx2kahs2GjDnFwm87Au58o5OLMLJeHZPNYvJz1mbyKVQYvZ3Kg9
+ PaUct14rh27ky+aMDVEkS45RbKaZQuHgUqdGmVAowicRH1MjrXWyj/zH8n7gLAVPwlp1
+ IVIF+RN9Ndn0boyorG2PH1/DvLnWzK/C7RVNHyoXEq85tf8uOJDICmVuZHN0cmVhbQpl
+ bmRvYmoKMzQgMCBvYmoKNDYyCmVuZG9iagoxOSAwIG9iagpbIC9JQ0NCYXNlZCAzMyAw
+ IFIgXQplbmRvYmoKMyAwIG9iago8PCAvVHlwZSAvUGFnZXMgL01lZGlhQm94IFswIDAg
+ NTc2IDczM10gL0NvdW50IDEgL0tpZHMgWyAyIDAgUiBdID4+CmVuZG9iagozNSAwIG9i
+ ago8PCAvVHlwZSAvQ2F0YWxvZyAvUGFnZXMgMyAwIFIgL1ZlcnNpb24gLzEuNCA+Pgpl
+ bmRvYmoKMzYgMCBvYmoKPDwgL0xlbmd0aCAzNyAwIFIgL0xlbmd0aDEgOTc5NiAvRmls
+ dGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeAG9Wnl81NW1P/e3z5LJzGT2ZJZfJjOT
+ ZJJMFhIIiWQI2ViCQASTSGwSCCRIFDGGpQ9eXJGIVEEWwarUCgHUDIGHAxQf5YFIXxe0
+ ioVn3bG2z9T2PfS1wsy8c38Jqfhsn3/0099v7nbu8jv3e8895y4DBAC00AcshBd0ty2D
+ T0ktUn6K7icLens8j/x20lMAZDsAu3TRssXdhvf+7ScAPAeg1i5eumrRB2mD/wyQrAcw
+ fNrZ0bbw98+OfxzAcxXrl3QiQZ0u5gHI4zCd0dnds/KWkxJNN2K6cekdC9pCvdmHMR3B
+ dF5328pl0mr1nzH9HqY9t7d1dzR39WwCSMckpC+7464ehmVOYDQD0zOXLe9Y9qP7bi/A
+ dA/y9wukEXzpowUBXsbQA82jFIX8NY/5WvqvJVnM4IAfyxZAHI1LGKrQqUEzlvvNES2S
+ k0azdF8pkgyIHRjACClgGqWbEeEToOePQybfBw4uBG6AxAV0F2kYn5v4mD8D+nh34o9s
+ GdY5Qh0TryiHE/AI7IRB7P0AxjPhVtgOZ8kSOELmwyE4T1yQh2PNQRRmwE9JIvEaLIIf
+ YvkeOAlb4ADilgndYMbcjcSXWI3pMMbb4f7EDyADJsCDcBxKsdWNMJzYmziIuXNgLuyD
+ /Vj/34mXOcClJF5MfAQSzMY278ec1xIzEoPYuxyohFlIvR9eJj72YqITbFCG3D0JT8Mu
+ +DHK3b3kUKIz0Zs4l3gfGMxNgwZ815BD5H12kHsw8WTid4k4IpEJ2fjVVtgMz2L7g/ie
+ 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
+ 2CGVpIUrvbLH32q803i3iTW63KY0Myu7LCbOb8zwuUClShVdGsaflip5fGa3z8IWJHel
+ OrIkvy+gtmdmnZe3jOiEUbTrLw+/gS9UlJdXxEa6U2qwll7TeC04EkGqwgj2ZpzSL1Yu
+ pGcKgugibmKxWqxmnOsh4lcyvWzthmeX37Ao7jjDDAx0/6K7fd7NvMhqjHmX1VpOKy4s
+ XR0vO8OmLdv0/VIXmoFdBbfG7h8o8i7vO31TVo1JTimf9/mjBamxfsSkNfEm9wXqwBCe
+ ccTDt2YlB7x+f4muWK71t/tX61ZkqG6TbDqrj2nSder2pbNq3cT0jHQ1y6XZHjSFQsG0
+ iSaWmxhU5TNqnWTISHdn5ucbbD7rVMmX6Sh0+wxTwReyFxQ+Iy8ZHWDUkH9RlEYD6nx0
+ X1GYdOTzYkUtdyoKpD4zz+AGifEz/lyf4HP42RwIQm6eEvDZUpA4U9xBSDXbgsRuI7lc
+ EFQBTZD4NCQP42IWei5jGmZa0EMNgGpUr2hUJYpalT733HMPSj3irExSHAIF6uJxGUWF
+ nNlLUU8XzCarRRkLs4nzopodT4hLHLfgy2Xzh6bP+MGZf5u9gRiv/IZMOZZccMvFyI7m
+ snM/3zJ7Q/z7/xn//c6dLFNPLq6Zuckz6ZmVRYW+3Jzi+S+9En/3896Kux5vX1royQ+l
+ ly0+dfn1DQ//nsPDYQbwpI49x80EB6TCnnBoj51stw1I+2zsNMmw08SyJsHpEJOcJk2q
+ mJpq1QeMhA0wBodTHbDa05xRIh6Ul6/5i1oqrx8uLf0myzQO7JJPa1b7QZei94/YJDum
+ 0CbJik3SWJL8aJPQU9kEP7VJ8jfYJApfC1hGLJKIWCGSaJF0aJ+YYj0Uicz5D62D+uVr
+ n5+W/9CmZffZB11/OPb6l8T4Rho3M/LWgvsGup/Z9fb6FW+eJkUf4zHjRPw+1CUucg48
+ IUzD02Qf0YZXbZOecOxxs7yOSeZNZp0x2WwKa8MmKctBpmsOs2fIK+yZ1F9JF1Tn3b/y
+ fmL9xKs5YzhjZOZLvJyRvMPizCgVRNEiO9NEtdOi8Ynb0vakvZT2VhrnsyT70ni7Wisa
+ dIFkZ4B3BDLyxIDd7g+8Ie9uGbVtHyly+0ZMWaUoi5VQy5jgUk01jBNZkdoa8HI8i8ev
+ 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
+ aWdodCA3MjcgL0Rlc2NlbnQgLTIzMCAvRmxhZ3MgMzIKL0ZvbnRCQm94IFstOTUxIC00
+ ODEgMTQ0NSAxMTIyXSAvRm9udE5hbWUgL0RTVUJWWCtIZWx2ZXRpY2EgL0l0YWxpY0Fu
+ Z2xlIDAKL1N0ZW1WIDk4IC9NYXhXaWR0aCAxNTAwIC9TdGVtSCA4NSAvWEhlaWdodCA1
+ MzEgL0ZvbnRGaWxlMiAzNiAwIFIgPj4KZW5kb2JqCjM5IDAgb2JqClsgMjc4IDAgMCAw
+ IDAgMCAwIDAgMCAwIDAgMCAwIDMzMyAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAg
+ MCAwIDAgMCAwIDY2NwowIDcyMiA3MjIgMCAwIDAgMCAyNzggNTAwIDAgMCAwIDcyMiAw
+ IDY2NyAwIDcyMiA2NjcgMCAwIDAgMCAwIDAgMCAwIDAgMCAwCjAgMCAwIDAgNTAwIDAg
+ NTU2IDAgMCAwIDIyMiAwIDAgMCAwIDAgNTU2IDU1NiAwIDMzMyA1MDAgMjc4IDU1NiAw
+ IDAgMCA1MDAKXQplbmRvYmoKMTUgMCBvYmoKPDwgL1R5cGUgL0ZvbnQgL1N1YnR5cGUg
+ L1RydWVUeXBlIC9CYXNlRm9udCAvRFNVQlZYK0hlbHZldGljYSAvRm9udERlc2NyaXB0
+ b3IKMzggMCBSIC9XaWR0aHMgMzkgMCBSIC9GaXJzdENoYXIgMzIgL0xhc3RDaGFyIDEy
+ MSAvRW5jb2RpbmcgL01hY1JvbWFuRW5jb2RpbmcKPj4KZW5kb2JqCjEgMCBvYmoKPDwg
+ L1RpdGxlIChVbnRpdGxlZCkgL0F1dGhvciAoUmFuZGFsbCBIYXVjaCkgL0NyZWF0b3Ig
+ KE9tbmlHcmFmZmxlKSAvUHJvZHVjZXIKKE1hYyBPUyBYIDEwLjUuNSBRdWFydHogUERG
+ Q29udGV4dCkgL0NyZWF0aW9uRGF0ZSAoRDoyMDA4MDkxOTE1MzUxNlowMCcwMCcpCi9N
+ b2REYXRlIChEOjIwMDgwOTE5MTUzNTE2WjAwJzAwJykgPj4KZW5kb2JqCnhyZWYKMCA0
+ MAowMDAwMDAwMDAwIDY1NTM1IGYgCjAwMDAwMjE0MDkgMDAwMDAgbiAKMDAwMDAwMDc2
+ NCAwMDAwMCBuIAowMDAwMDEzOTM1IDAwMDAwIG4gCjAwMDAwMDAwMjIgMDAwMDAgbiAK
+ MDAwMDAwMDc0NSAwMDAwMCBuIAowMDAwMDAwODY4IDAwMDAwIG4gCjAwMDAwMTIwMzMg
+ MDAwMDAgbiAKMDAwMDAwMTA1MyAwMDAwMCBuIAowMDAwMDAxNTE3IDAwMDAwIG4gCjAw
+ MDAwMDE5NzggMDAwMDAgbiAKMDAwMDAwMjM3MCAwMDAwMCBuIAowMDAwMDAxNTM2IDAw
+ MDAwIG4gCjAwMDAwMDE5NTggMDAwMDAgbiAKMDAwMDAxMTA4MSAwMDAwMCBuIAowMDAw
+ MDIxMjM0IDAwMDAwIG4gCjAwMDAwMTI2NTQgMDAwMDAgbiAKMDAwMDAwMjM5MCAwMDAw
+ MCBuIAowMDAwMDA0NDkxIDAwMDAwIG4gCjAwMDAwMTM4OTggMDAwMDAgbiAKMDAwMDAw
+ NDUxMiAwMDAwMCBuIAowMDAwMDA3Mzg4IDAwMDAwIG4gCjAwMDAwMTMyNzYgMDAwMDAg
+ biAKMDAwMDAwNzQwOSAwMDAwMCBuIAowMDAwMDEwMjMyIDAwMDAwIG4gCjAwMDAwMTAy
+ NTMgMDAwMDAgbiAKMDAwMDAxMTA2MSAwMDAwMCBuIAowMDAwMDExMTE4IDAwMDAwIG4g
+ CjAwMDAwMTIwMTMgMDAwMDAgbiAKMDAwMDAxMjA2OSAwMDAwMCBuIAowMDAwMDEyNjM0
+ IDAwMDAwIG4gCjAwMDAwMTI2OTEgMDAwMDAgbiAKMDAwMDAxMzI1NiAwMDAwMCBuIAow
+ MDAwMDEzMzEzIDAwMDAwIG4gCjAwMDAwMTM4NzggMDAwMDAgbiAKMDAwMDAxNDAxOCAw
+ MDAwMCBuIAowMDAwMDE0MDgyIDAwMDAwIG4gCjAwMDAwMjA3MzUgMDAwMDAgbiAKMDAw
+ MDAyMDc1NiAwMDAwMCBuIAowMDAwMDIwOTkyIDAwMDAwIG4gCnRyYWlsZXIKPDwgL1Np
+ emUgNDAgL1Jvb3QgMzUgMCBSIC9JbmZvIDEgMCBSIC9JRCBbIDwwMjdhYzQxZTUxZTM1
+ ZWFmNjkyZGMwYzBlZjNiNjBjNz4KPDAyN2FjNDFlNTFlMzVlYWY2OTJkYzBjMGVmM2I2
+ MGM3PiBdID4+CnN0YXJ0eHJlZgoyMTYxNgolJUVPRgoxIDAgb2JqCjw8L0F1dGhvciAo
+ UmFuZGFsbCBIYXVjaCkvQ3JlYXRpb25EYXRlIChEOjIwMDgwOTE5MTUzNDAwWikvQ3Jl
+ YXRvciAoT21uaUdyYWZmbGUgNS4wLjIpL01vZERhdGUgKEQ6MjAwODA5MTkxNTM0MDBa
+ KS9Qcm9kdWNlciAoTWFjIE9TIFggMTAuNS41IFF1YXJ0eiBQREZDb250ZXh0KS9UaXRs
+ ZSAoVW50aXRsZWQpPj4KZW5kb2JqCnhyZWYKMSAxCjAwMDAwMjI1NzQgMDAwMDAgbiAK
+ dHJhaWxlcgo8PC9JRCBbPDAyN2FjNDFlNTFlMzVlYWY2OTJkYzBjMGVmM2I2MGM3PiA8
+ MDI3YWM0MWU1MWUzNWVhZjY5MmRjMGMwZWYzYjYwYzc+XSAvSW5mbyAxIDAgUiAvUHJl
+ diAyMTYxNiAvUm9vdCAzNSAwIFIgL1NpemUgNDA+PgpzdGFydHhyZWYKMjI3NjgKJSVF
+ T0YK
+ </data>
+ <key>QuickLookThumbnail</key>
+ <data>
+ TU0AKgAAJciAP+BACCQWDQeEQmFQuGQ2HQ+IRGJROKRWLReMRmFwJ/xqPR+QSGRSOSSW
+ TRyLvx9PputJnNhksRytpsPR3u99vp8SaeT2fT+IgEAAYEAoIBULiAVi4UDgeB0TiqgA
+ CURN+TmbO9wNVot1nMtzt9uPZ4vJ9vud1O1Wu2R+Ov8DgcFg0JhMNCMTCMZDQPCgWAgF
+ gwCAUCgHDSOqw98vZ7OBrNFiKtTuhwt225fMZmegICAQPigWjgolULh8RgUDAYBavWYb
+ XUKJ4mF4t6tVjMFfKRQPl8PXNb/gcGPW8HhMLj4sl8QCwYAa46wB9HWayI7KD1eWNBmL
+ NKpDeb7heHxeOIW8HcYhGAz3cTZ0CanVav3a/DwrrACVPp6vF4KxGEIyjLPJAcCQKgwA
+ uiDARhQHwuDIBgHAcBEJvg6IBsIwr6IQ+5smYZCyHiWxNklAyKreg76xLFSPgIBIEhaJ
+ AohGGAaAXGwFRwuIDvdDDqIO+5YkqRidHwbRlmPAx/n6fx+nqfYAgaA4BqEf5/Ssep7t
+ 6fUlsMzoBgbCYEAIASCH8fR8n0e5+o6hUEAGBLBgNKbyyqfx6zQAICLkAsyINJUmHmfB
+ 9oXBACAWAzOqFKx+nofJ/AWBM5ODNwIhAEgYiaK0IgcBlOxsBcwww90fKogaDksN4yH6
+ fh+nkdp1QIgR+HWdRyFCa4CDeIANgIfp9nNYBfGWbh0T5Kj5BOEgUh6EYJgSfx8GZaRd
+ HSfgEgHFELgcCQbhGDwbg2CACNgjZ+ngdhylUYRtAaFIYisFQJ2xUtZnScJJmEbIErjc
+ aqUKugiBWEgVgoAp4HScpOmWeQwCQFoLgLSYAAGwAVikLoJYyB+N03ToGTC91RtW+5Ei
+ 6KSqPwfh81if961sZYCDcJgMHnWpSGKcAEBSFAsBECgFACfxznScxWGkcIRBYGYkguAB
+ mmUZBtgqF4nA8BgAUXVZyHOcJem2donCIH4TAVPqEqufJtmuaRVm6ebBAsLIkBWDLC1k
+ dd7E4ZJxieH4bA2AZ/n0fh8G8cJuGCcYFi+I4UAEdxxk+ZZ4YaGOIOAt8ug0Iwo4yCQK
+ 9BzwG9Hj2QM61j7kKLAlxXem8ZeAg1COCJrGeYxiHgFA0CODoEoPJh9nKchxmifIGiAD
+ wEmkZe9g0HArBGBaCTYfx4nmdhal8a4UiAHoZAfeaEH8ex6neXxdmiAYVBEfZtG8BwZh
+ 2IAMgPu508iZZ6DEJIWgqAj0x+DsHaOQTYxhwhRCADkCQ9hyuScoEhyzETxgGBmEAC0F
+ wKQZg0BGDgEIPI4AUfA9zqXVutfsy8AYaQigReW3sDYNgrgiAaeUnQ9RlDLGQNgCgLGq
+ wzTWkwfQ5HhC8HGAILwQgWAaAOQlKo+xzjmHAKQaQ+QwBBBEOkmAuB+gmDcDQDYBmWt4
+ HE3odQUAfAtAw/8fZKhwjjHEMUc4AwuBCBQP8dr+IHwRPIPZGcGgLx/dAUiP8HgIKbRc
+ nAzpiSOCGCyExWK/gAABSqrNWooRmwpCHCx5g24XhfhkfYfysk1gAH6PcZIxxhC9HeXJ
+ fpBSBD7I6AYDwLA4OWf+hsnI9hnjQGMMAAIKgxgpAcOwdA4hXDWHqFkIwNQPgHH63he6
+ 6wFAISkQc5wBwaArBeDkDQCFXx4cq5c8Y6QLLNLrH8C4GJ1ToLqBOQinz4GJSsP4Q4Wg
+ mniZaSodg9R+gUAeAoAY/onNcFKNwA4aQbgSGiMcZA2gNAzC+CcCDZkyj+H4O4dY6BtD
+ 3AUC8DABhoNQG4BkGQVQPwzI6qsfA4TKi1MsF4JIMAMy3IMP4ebBxXi6GiOUA6xnpyRT
+ ICwF4OAkAdAOOxewnRlDjCoEAHDdZIJTAMAoA4ApJq0nBBCcR4hvALAxBwCM6J1AYA1W
+ WdEhFNo6MSP2tgiAthOOErKpA4hQDLHYFoI4NQMACbSNoaQsx1gcDWDoCA3hrDJFoOED
+ IXAjglAyfGSQ9h6DyGUNIZg1EXhiBSAsaLzByQvCtJ+Vw/R3DtHMJ8Y46wtBIBlVAgqT
+ B8jiLEKgbYAArg6BAA0oVbLYjgGiL8eIIQ1A+A4PYdT+B4hfCUDADD4YmUWqxA6cMEjx
+ K4AjISC4Fqxgbu5WUDU7XRgNhBWuttbzxD+smO0VYwxqAfBcC8FQCh9DTGmNUbQCAVBm
+ BuBceg8R0ibGGNkAQEwOBQBSBcBg/x8jfHAOAYo6h8hCBuDYFgCR8rSGSOQDQNrQwzpq
+ PR64sRfjUBmEQIAKGyvTN4PMYgyBljXA2DQNgJQHyuZbUgcIohlDhCUEEHgEx6wNGWPG
+ mFMqaRMxu/cTzk7pnkGmAABrGwHwaAzlW7wHcsTtykp+8g/a3VwPEPxwg2hsjaFqN4dh
+ AgBAMASBUJYOQUgfAZVZJQ7h1DnF8MobY4FSj/ACAkBAEgfgzBMC4CYCCcj3GsNMZ45A
+ KgwCWB56VNbJDvF2MUbIDgXAxCCBl3zWB6LnFmsMGIOAcAoAbRQqg+B7DwGKMMaw/AVA
+ vBoAcd4qxpD3CsEEEwErnRMtJMQVI0R6BVB+Cdgp5BnrWylO2dAH9oAc2llpjbHsu5fS
+ SmdlSVQDAFLjr9H8pDeKsQQakwa5HW7pI0M0fQB8pOerGB7eW0gOSBkJtZU0pLy5g3Vv
+ 3fxwN2AHU256dG8gPZYA7IGsG+E2b6y9ebf/EeJFr4DeHgkf+DcIuzwtTpicxD8ESFwJ
+ /E+SclJNxV0fFwL8I4NxuDnDCC8f5DyPk3NebEZ4Cx7Z0f+Wby4Vy/ju+eZci5v0XoxE
+ ecqdnbdng3BufgR5gQTofNOj9V6sQYZY+AC86LrdnaHXwP9P6iykfgpBOh26v2nqwrha
+ jcU/BqQIIO5cInQ6J0eXRRicDr2rvnRe2DcY9lLKoGeEdfnYXW8PeO9d98ZyYV4thu3h
+ kJBrhHcgQVjylITxXe/G+d4iLAW43mPKbg15a7gG6xwaylx7MXZu0ee9hur0A3oQekgz
+ vQEPue6sZ81vks4+xSieDv7H4iKxWi0G2p/ZpdeDdf9TBn1fQvW9n+L9VAvs1PqbkD6f
+ y3g3PfR4bWwfvefOfW/MeEWQuWcoTrB5TLHho/7UAf5v8/9Tg9/vDWCdvluEVjrA/AIK
+ /E/I/tAIMyFYFmG0U2rAuy8s3onQg08S+k7K+pALAqLW7+64Am6Y3k6+uy7sAa9ZAm9f
+ AtBIJ8FiFwG/AykC7A2g7E6C4a4+9dBKOC4alCTYQ05u/SHBAzA26bBcwTAlBkLYI4SY
+ 1CHsH0TaAEAKLmmoX6leHuHuHmHyH6LmAYR23QSYN6HsH4AMMCqqT8ZaHwHwHkHxCoAc
+ AWSk3QIvCyHqHsH3C6SiTIlfDEHiHifJDKYmACAUAYAWAcAaX2WwSqUYHhCOUIACNQAO
+ AUAWAKXHDULVB1B4gu6a58dA45CBBg+nBGLUSUHoHUHEE+EAFiGuzYAQSmlCAGAOAMA4
+ CMCoBczgAwAOWgGuGIGAEsFyHICgDCCuCIBUAdDkHyHkHcGGFUFaHCBcCqDGBsAiemH6
+ Hw0UF8GAEuGAHKCgDUC4CMBA0+IuwVGDGGFaG2BcCmDSBqAkHwHmHidsGYFIF6G8AQT4
+ SrEOAMAwCUCwBsByBQAiH0HWgaEAFfFGmnECI7CUAIA0BSBUCICEBgBcAyAREcKBEg6U
+ 67ElEnB/BDCELWSUZqroEWF2A0C6b6A60RDEG8GmGkFiGGHEBqCaCeCgBeAWGyGAF4Ea
+ FgHCAeAiBeDkD+B2A9IaHwHiHcGAFIFaGwBkCmDgByAmKofGHeHQFeEgFaGMH2UgBqCC
+ EMCkBCAMIwH/J8HcGFKEG6BiCkDKBiASGoF8F8FCGUHiCcCuCQBsBGAhK2HiGqoYFeGM
+ HUC2DkC4BAHyVsEYF2A8C+CgB0iUoswUHiHYGSFiGAGOAGBuEIDiBbG0LXIgAY6XInB9
+ Eq6BEu5jEyLaSUHlE8E6EcF6BoDkC+B6q2lKHtLMF4FAGKAiDuD6BmHYGCF6EeFsHKg8
+ AOBAB2CEDOCKA6psHfK8FaG7KKDTKQZaHyHMGsGkEQFQHcCeCQAaF0FuHkDQD4COBEAX
+ IcIfLlK7K+BiCgC6BKHwFOESFwAUC2CuC2BixqT8HyP2GSF6GcAMBgBuBUAOHUE9NIBk
+ DgDAB8uaLeH8HyHuG8GUGOEuF6AWDyD8ByAq3AJ/MrMuAtEmA9IrCDApIwVbNFNIBoDe
+ C6B6iUIMJUHOG0GmESFIHUDeDuB8HqGYF6E8HEBIDQBsHsE6FOGgCgDOC6BiAcHpOLOP
+ HEBwAkH2LIGUFsFSFuAOCSDqB2ACFSEcFwAqCyCuCgBWt0KorY4aAANWAGAFDVPBSEBg
+ CeCwA2HcEqEwGSCWDqC4BiAmyOXLI0FEEWF0A4C8CcBwAsAMSWH/CiHaGeGCF+GiAkCO
+ D4CoBCiWLbQpIlQtIpM06hBfM7BFM/Q6HFNHNLRDRHUWKpRNRQEVRWDjRcHmGVNcGwBO
+ EADEA0GcFgFaFmHUBcDqC8BAGkFSFaG0BiCmDUBwAgHkHSHEFHL+AwC2CiB2AoH0GeF0
+ FkF4AEB+EEC+BQAKP2G6HGHkH6ADCUAKAcBGBGAcXmMPK5SEBfJWAoHMEeFEHYDWD/Gw
+ APIckmcGH6NWH2chFAFiGyvFDSteS4NWCKDKC2CSBGAUMxUbA1Mw6dUi7HBjQ3E3UvUz
+ RBRFRIemLQHEGiGYEeFcHsDiDwB2HmGSF4E/VQEMDWBKHyLCE4EwGCAyCGBsAcG6GOG2
+ BWCmDcBkAUG8GaGSEOFUGuAcUkTKI6T4AyDEDqCKAkHYGmEWFCGiIIAOAgAeBkDYDKA0
+ ScASA2AuAOH1J/KDONPHL2HqE8EgF6BiDcC4B+A4ARDALQHuGqGWGsHwA6BKBWAUHcFE
+ EYF4BMDOCsB2A3FiSWHsHcHSGAFWF4GUA5KqCuBJKzUY/VEjUfMyArEtItYYKnNBQ8F6
+ BkDaC2B4seawvQHgHWGIFcFgGOHeB8DsDgBCHEGHZBZEDbWkN4G4GUGCEgFQGsH6MAee
+ CkCyBSAAF6FSFYGMA0CKDYBsAkACSWHwXOFyFGGCAOCcCmC/GUJWH7ADGcG2GIFwFEGK
+ BSEGEIBWADJ+F+FGFcG4BqCkDGBIHyFSEgFwHZN8DYCEeTXcZaH2HUG+G0FCE2GYBgDO
+ CoByAaHZYeDfNQA0upGaHqGuGFZAGyBIEGDbbkMvYLB7YRchM3clE1coH7I0FCESFyAY
+ CcwkAuANQMHqG+GqGsGOHAH0CkDECmBqAmH6GuGGF6E+GyBMEMDYBQiWWgVcFwEyFYFu
+ jiByCmCcCcAyHaEsEyGaCIDkC0BwAupoH4HsHmGgF0FSFMG+BiD8DeBkomXIH7QMG2GK
+ GEE6F4AKC4DPMkHYHIFeFaGmBWDACkCUBAAIG4GWGME4FuHABYCCB8B+BQAgH0HeHOGE
+ FwGOHE1kDQDiByAWHgHFP6F6BnU3YklI1YGqlSFCGqA8ECDeBcznO8J5glYPEpgrUlM4
+ 6lM9CGSatMFWEeF0GoIQAGAIAUA8BECiCIBgBitzjAHuG4GgGSFYHEA6DoCqBHU6V8HU
+ HAG1doGmBqCOCCBcJYFMGKAUDWDqBgAkIQKuHQG6GqExXuCuDSCqBS1ST8H8HutMFmFI
+ FwGSHSIET0AiBmByDcCgxpU8N4GqGQGYFGFyGzBsYm3cBGBaDCCoBeasAAHotMFgE4GK
+ BNhaBsAspoH+JyHGGuGcE8FwHCC3nEBLnLMpcZIjYNcdgpcjQ1gxBnK1CKHqH0H9S8AY
+ SjQkemVkHyUCz8AIAGAUUjpi4jlFpHlJpLExUrpRqGJFp7QvQzqDIvqJqWIzqNUhlLYV
+ lTqZqmItqdcfqBUpqVqpq2IhqtpJgtpNq5rFq7pBMtUdqPYTUnlRqFrHraIVq9p/rBqT
+ cnrdrqABrhQxrTlO7Jq1rtrdrxqRqzrpr9rHsBr1gvsJr9sNqhrVr5sHsTq3sXqxrXr7
+ shsjrLQrrRsZr3YXpPstqpMq7gdA6+4RsCII/FCgHuHltWHhtaHRteHFtiHLtmHVtrta
+ HgHrtztS/E9iFzt8CPuBqmNcPchAY8kIrG4RAcj+yk7HtRCgHnugJuHeHbuptiHEWAHN
+ uoHbtuHpu7DEHwnm9iFfvGCjvLq4QshA8kg8+2u44Q++2rsa/Fu/u6v7DqHXvvteHRuw
+ Hdv5ugHntyTuHyHy4+9iFHwMC7wRuEMMQwR09GQinbuUAunaU2y43y/FwEMWMZtWHltv
+ vztqHVulvptTwxvC9gEhxODhxTvOOiTDvS5SYyuy8xvgAYvG3ynmJWTTCgMYRAHju0HZ
+ x/w3wBwxxxxK88D1yOENyTwVWyNWPgkPwcAckCc8U2hArU3yI49/xxvnu7u5u7yFwxwE
+ /Ft49gC5zKFJzPq4ZCM6R1waU6vCy2RsVCMIPu/E9/yGJXwBu/u/yISs4+Pu76IAPoEw
+ oIAINB4RCYVC4ZDYdD4hEYlEADFQLFwHGYuBQTHY8CpABpFIwJJX/J4U/pU/ZZLXzL33
+ MZe+X5NZbN5ZE51O55PYeKaA16FPqJRaNR4RFQDBwFTZKBIyA6eCKpG5HTQFUZO/4VW6
+ 3OJvMX3KrJZYPW6RabVEwxbXRb7XcblcqVTKbUaxG7xd4zSrRDK9gbJLbPgcLXLnibiD
+ MY9MdishkYndYNSqxdqwAqVm4rf51gcRCM9ktJRqfNX5pdVq4VlKTnIbo9Zs9plc7KNr
+ ud1D9lu99ib9uN/w91veJx6NwdDyOZpONzehEuV0epief1exCen2e5Ruv3ex2/B48/wv
+ J3fF5/VsfN6+r6fd8YN3/lw/h9fX9Pxu/v+/I/T/Nq/sAu7AECNZAcDuxA0FNLBMGujB
+ kIMjB8JuZCULOA27lwy6kMQ6uMKxA38PxGtMRRM4r2xS0kURY2kSxeokXRk1cYxqnkaR
+ w50Vx2ukNx84cbyCiMdSI60eyOpEjSUuMhyahkmSgtMnym7UgSs1kqyy2wAy3LiJy/Hx
+ jzIHUzAdNB5TVNAHIPNR5GLOMzB1MC1TFHZnzzOZ8T4hqsGXQAZUFOsqSTQiGBDRJwUW
+ hoQUcb9IUPO1DUkhJG0uPtMnvTaDo8QVPjpUNKqRO8gnVU4O1SfVVoOkZx1eC1Y1Go9S
+ yOIVbl/XKDiBXlcl/WdCw5YCGFdYowWOg5QWUKVmWHWlKWcAFVn1Nk3TUkdoqLWsmivb
+ qDlTcFs2fYUwpOftVnyfR8H6fbUn8fqVNCsiIW3cTPoMpoAKcAaRAOA4EAGi7OM2uUPn
+ 4fZ9Hod53nAapoG4ZplnOb5uHseJ5JqfN7POrh/38BYGAkCQMBCEgRBiGQOBMFYEgYBq
+ pAIzKmstfKfQYfR7Hsb5rGiYZVFMdJxG9jcUgEkoNhIFIaCaKIMA+EYDKop+ZaoAVy3I
+ hJ8nsepqGMYBfFGUB9a0714H6eZ8H2hqKgAAwCX+ArNQDcx67SA1/ANq14H+rClvrjoG
+ giCobCkK4PhUF4EpAqKrqckuBvZrAAYOfRumgZhZEoR+xntZ5+HWdJwkmYRsgTfwCKWl
+ CpAGE4RhMHYSAwCWYvwfx6nmdxamKbAUB0HAUgUfhxHUeoMgyCYFb8/GOgWCAKBwKwug
+ yEQSqp6wEJIp/HtghLen5VZ6nieBVkWQeg6HQvP9CThknGJ4fhsDYBgAfp/n6dx3nYVx
+ oG8EwYA4CiB8BZXB/NjH2PdeAASpAKAKARuIACTj+HuPtvgAB/D4H4P0rIBQFNudRBCC
+ xMR+D2H2P1tgBgCr/Zi6kfsGR7D6hKUtuLUQDgCH+98c46x6AIAiA0fw9h1CeGINoK4R
+ AfAfAU7QfqfB9j5H8P8ioAwFAHIu1aCMJB/gFS8Pcfg/gDgDKWwFgDfn7QtXXFJvLyjk
+ kZAkB0EQNApBaAcBACBII7RTdOSUjZl3uorGyMwY49B4DwFwJwSjBYbugHGJ8ZY9AxBJ
+ BYBUAkIB/taHuxEZA3wPA2C2CABQ9B4juGSNocIzB0j0AOA4CoPgTgdBcBYBY9h4DoF6
+ NweYDQCj4GcOQeABWRhMBUCIEgEQCD4HuPMaI2RvC/HCO4A5JQTtJB4CMCgDQAj7G8N0
+ cAxBrjkHaVICoFwPBBBWB4CwAh6DNGwOYCIGwLjlGsM0Yo6gATtBIFwGgHQADwHUMQbA
+ 4BsDvH1CgCQOwZAgBgBYBQ9x4jpFyN4e4GADD5GWOEfINQND+H2BYFIQgOALXePocg4x
+ wDFHmA8KoLQLgFLiAJfwIAdhEBCC4GSbDGAMAXTl6xG2ps1ggisWIlRGD5U2NsZgyJEP
+ qHE+wdQUAeyRkmSt8Q7BkjQHGB4G4NgbgQH0MMYwyhrgKBKFAFAE5ZjgF2NsdgRwgg8A
+ sPUcYkxijiAyCcFAUwNgFGyNUaYyh3gaC4EUDw6RsDQF6OgBITAbgkAOPYdwq3+AbBMC
+ 8JgGB9ivF6NMEYOAaAnAKPkaAyRsjbA6CgLYHgACwGANME4PQbgYHqOkXQzh2A2B0CgD
+ wCR9i/FyM8cwIwUhUBEA4do5hvi4rUEMHgOgND5HK6MboFAHgeB+CoCIAR4jWF0OwEIa
+ ggAfmKPQYgyBlDYA2DQNYJQHlzKaAoDIHQSBACSyICUdAIANvxTd6z2iSlYN6JUNwY13
+ j+HkO2eiTpEuhdGNsBT2IPnzJzAoCIXgkgtAKO0cgmRkDeCUDsHIIQFAAqIPMZgwhqD6
+ BiDQHYCB3CgGaPwMoSgS3XH8PMd46RUjCGsCcGgKxyjMGsB8HgPQcgTALSEcg4BtipHG
+ AsMYMgFC5GGNUCwKgWAsAoAsAMLR9wKAaAIewsBfDTBYD8HgJgCj0FmL4cV8gWADHZIs
+ ZY7wwBJBkBcAklR8D1GUMYZI3QPAyCUAwd4nhljuC2EefIBR+jsHWOQUWGwnhEB6BQfI
+ 6RUDDG6D8IQPAUAMask6CAAQDAJA0EEJgE9VAU1ZfS/ADb9NSv6U03oiQuhShAxmpLoB
+ xCdGUO0K4QgYAapY2Ydg7h0CqGcN6rIOAVD/HSJF0gDAERfS8x0jIBgUAqBaDQBI8BQj
+ XAMG8IAGgDQWduOzNY0wNgzBUOQZo1wQg9B8Dh2Y/x/D8HYOqRYzR9hjCMB4cw3RvXIH
+ QVxowDgKBABKB8EgDR8ZizJmYEwAx5CzGAOQH4RwWAEHcOMUIywBBrCbEggzYx6jSGiM
+ gagE9BALHhIweOdQYZ4H+Pgew8mvDOHsC4GILB8jkFcNwBoZgjgfAYdaEAAABgHBmD5W
+ IFtWdTAoBHq19o7PZzyisQoWAlmSJO+rOQ8QvhKBgBh+Z8x8j4HoMgYoyhwAg5eO8UIy
+ h1hQCGDMEIB5rj86CO0eQCAIARAMPMcwoBlj/DSEoEGoB/SDHULEYQ2gTA1BQOEZuQQd
+ A8BwBMA0Nx8DdG4NgWg7AKBnBqBAdg9B/gZAgAkeg8h4jaUWMIcgDQtA/AiL4X/E8z8W
+ FkMDNoSMLYY5CPULgSQVAYdQzkeYx1ADpA+DMIgCB38yC+Ens8k4Wj5G+N4awpxzgFBs
+ AcdI9wMg4ChAI1Q9gRgw6mBf+QFf6fyAvfZNhHinmeK2IYLIJjsDBLsbCgGADKSY+ZdQ
+ eoZYZgZKuhpYCwfYXIYQaofoEYFAIKj4dwdgcwWIawdQI4HQGoDIfDDIY4b4HAGAGQGI
+ CYAIbbggZYdYBoLAHgDQbwaCeQAIDwK4Fac4ewd4Y4ZQbwfwFYFgIQBgeAUQZgcAIQG4
+ G4DoBAfodAcwcgXYcAA4K4HIBwXjMYFTigAQeL4IaQFAHIGwEQAgewWIY4a4CwE4FgGw
+ C4A4dYdAcgWgbgdwJcEICYewcrmUAkAzCBhYc4SgXoaQAgBIByIoHYEQBCNQyIdICwEb
+ VQCb+wtoDD+0SS+ynIBYkYzwsgQ4LQJsAJ+4dYcwVQaQe4KoIIEwCjtKCBhAe4aYahiI
+ AAEYLjmoegdTSAZYbolBfoFQFIFoIYDoBTAx0QYgb4ByL6n4BIqgIAGYGgFh2Z8IdgXb
+ KYbZ1QAgBoDgEgLQFgDIBKH4Z4aYaoYIcr1grh0wBEFAF4FgBYfQYUNQDwHAG4EQAoeY
+ YgY4aAbQfoCQKIHwFQfgdAcIU4aIcIlBfzpwFYF4HIDbb8UgVcU4K0VQCUVrm4fAeYYT
+ Pwa4BoFgM0EQBI1gbwBYDDqwCMSgtoDUlL+z/BNEhAzwloRALYJw9TsKH5+oqDpp1DfB
+ z8XIUIbAAwNwH4DBc4fxmEZQrp+we4mgAAAIAjaoAbUIs6CBPgfQ1LUiByZ8Ro2KDIAA
+ qCMhdiJYlQzUQxvIiSCJ+4d4doY4YYbABoHIG4H4C4BA2Ya4AgCK+zqMSoDcvclIDUST
+ V6O0l4lkmMmZBTsIdodIcgVMQoMgIwDgA5HZ+weIdQcwWgY4bgeABYD4LYIgEQCErQ0g
+ aYAABoB80rqZ4wDMvpVIDsSU0oB8TUwQfswhCYfyogeocwewAU1gBcA5GrfDnAeYbodg
+ fKcICgCwBEqI2YZ4fgBM10ST+wD86IDk6c1s0qm82M2Z5bpYg5thog1QZofQA81y+kSo
+ D0806YDj+gCq+0644UmEmQ/J+hTYfIegmkqyDyPABJuM0E7wtM8CVJNC+j+08wD01c9U
+ ks9o0M98wo8BcyQQdIXwaQawbIeJuRvgjIES4AIQEgCoB52k/ouM/7V9AT+VAk1bqNBA
+ xgzw1ARILgJ48Yf5zgZ4ZwYwYgAQFAMMArxwc4dAcoVcgp/wGwJwDgBQriJZtKJyKCBS
+ KaKqn6CTLoBKNKn7fCCYANKLLaFofQfwAIATfMorUqSZhCEaDIiqlwi4BFD4f5dofgfE
+ qtLYAKKhu6FY9VES/FEgC81dAlFDq1BIg9FlF1GBzgZYZQY4bICwGQK4EMZMqEnYcwcY
+ cgdQBYDIGgCoAsDSfqf6gKgaXygyhACwBIezAwXYcgAgJ4GKlaG4eIdgdNUYAgJgFwCT
+ OIboZVCoBgfQc4foCoGIIACwf4ZyZQYQcIeB7ABYFwE4EAHQEUVgfQe4bAbYb4Y4bodY
+ ewAgBgFIE4D4HQEC6VD48E/6m857+VPM81A9PlFQ4VP9F48YmIewaoaQY4XYc0HIDsbY
+ CSVTWAB7aoBZgBnAd4XAXC3y4C4S4i4y5AdgIYHa5gfQdDkIAgNoJsx7fIdcnoZYAgNQ
+ JICoc4bYaUnx4oEoEgI4DIB4eYcIagXwdQBAJYGwEkL4dIWoa4coH4HAGoBodQbAVwb4
+ ewI4GQFtWwd4V4aQb4EAFAGgKYEaaw8db4xkSTqNAlAlcoCNPog1dMmhdofAb4cIcwaQ
+ cQcQb4ehd6DQqACgJIHoEgCgfAdDxDOjOzmztbPjPzQDQQBgeNhoN9iAAqG9VYcjxAAg
+ NljAcobwaYWQd4DgNoG4CwfR3AXFCIDAHQHYHYCoA5jIcAcIcgeoBgCIdoaQZwc4DoGA
+ JYDwBdLIcIcQboXodoCwNoH4Dkudb08NcDVVptpwD1qFqRyYmtFtdRApeBz4eYfQCYBw
+ BaLVGKGAdsxAZYawbQbABAEoLYEYfoUzkTkjkxaQfLlLlblrl9ulituwDjI4fjAzfoAo
+ NgI4CocoboaoYoAgEoL4EYBb2IdgV4X4agFYIIH6mrtNNQmoe5iwWgW8IIqiGqMkpgAg
+ BQDAEwMgGgDEyF1wA92ACd2Vp12tc40Nqg8Dx4eQdgTl+YIQHwHoFwCB7Zg4e4bwbga4
+ WAdQCYLYE4fwU4Zb5D5T5gAL5z6AZYdIDz6gBId7xAf4NQJYEIBKSocJSAVocoBoNlyF
+ 899N9d9oBYerAoWQYQaYD4HLzjIzvwfAbYcQcofs0gcQZYaQAQF4G4IoDscCDIeAduNI
+ AQBYFCWE5I7NpQBlphWN2d2j+lFIBlFd3FQFBqogeIYQXgZ4aQCQDQJoFQDbIwAD2Qdo
+ ZYa4b4dwCoFQLADwf8NMNcNsN8OMOcOsO8EICoewcjkIb4HgGoGgDmRYYB3YcwDQFYNg
+ GoCeJV9V9gEYBhhAewZxy4YofoDwKYFNs4eAc4WQa4dQIgG4GAATzAXweIDgKYGWBYe5
+ OAY4bQdQE4F4NAFICA8mOWOgC2O2CePVdGPl3VBrGuDIYQZwaoaweY3BowAoBgDYEQKw
+ FIDeEIfkKcgcgsg5fwGchQHSj574eeQYZoYQc4f6FZ2QAoeQA4EoMAFwCJoIbQZYAYEI
+ Kb9jdAeAdwYAYYaYayCAi4AwFJlYIQEQB52weIYYZQaAZ71lLlaoCYEYLAGuesVuBuB+
+ CNp+PFc2cOCucY+SCIfBdI1Joxo1KOOAs8sAfEsUpuowrqCwl9LYjMrIolIwl6KGqTB4
+ 0Wp4fKCgAKFJvOo9pN19pd2OOt2ecGPYfl3NEBe2bmsub2s+nVqOClP2n2thbOOTqc9U
+ 6ID9A2uV2wlpTeaJNSQaWYt9rmLYcocpU4dWwoeux+wQwmu5CYpQp6Oym6+0Ss1c9D+0
+ 12wAlmwQee0RhctN42xAc21F42NSQYxwehPmpQlWyZDoqKOzV6+09UvYDc1a+mz2uggw
+ lu1+1oeO4Yde4ot8KW1Ad25W0Qeex4eomY1G2RCApQjchCm5NkSWzj+USRNk2E9wlgmZ
+ nLnOwiQe4+xm0m1uwQmZee6RCYqJ622tOxkUvItu3oBkwI4QshaewW8W4YeO1QdnAJN+
+ 5wmZae9m9pAhmgAQkYj265NE9S+hNiO0lw4QrYsRae4Ix2wu1vAgmYl4sHBBCC/ht8hB
+ fym7V810TSnYi43olosXAp8Gx+1+1/AwlQ1BevEI3+6gjAjQi4jwj4kIkYkT/ZFYwYnA
+ mfF4l41AsGyXHPBM7pfRx0nBmEpwqukAkQrArRFY0HJglgsQsvMAw/JxA413LIjIvPHk
+ qAviMBLAhY0ArfIwfow7/haHMY8413BQzBvpgYiogIAAAA4BAAADAAAAAQBgAAABAQAD
+ AAAAAQCVAAABAgADAAAAAwAAJnYBAwADAAAAAQAFAAABBgADAAAAAQACAAABEQAEAAAA
+ AQAAAAgBEgADAAAAAQABAAABFQADAAAAAQADAAABFgADAAAAAQHHAAABFwAEAAAAAQAA
+ Jb8BHAADAAAAAQABAAABPQADAAAAAQACAAABUwADAAAAAwAAJnyHcwAHAAADMAAAJoIA
+ AAAAAAgACAAIAAEAAQABAAADMGFwcGwCAAAAbW50clJHQiBYWVogB9gAAgAUAAkAJAAh
+ YWNzcEFQUEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPbWAAEAAAAA0y1hcHBs3Gv9
+ mnSd9fsBwA2t4Zbi6QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANclhZWgAA
+ ASAAAAAUZ1hZWgAAATQAAAAUYlhZWgAAAUgAAAAUd3RwdAAAAVwAAAAUY2hhZAAAAXAA
+ AAAsclRSQwAAAZwAAAAOZ1RSQwAAAawAAAAOYlRSQwAAAbwAAAAOdmNndAAAAcwAAAAw
+ bmRpbgAAAfwAAAA4ZGVzYwAAAjQAAACTY3BydAAAAsgAAABAbW1vZAAAAwgAAAAoWFla
+ IAAAAAAAAHrWAABBqwAAAQ5YWVogAAAAAAAAVpQAAKp2AAAZclhZWiAAAAAAAAAlawAA
+ E/QAALimWFlaIAAAAAAAAPPYAAEAAAABFghzZjMyAAAAAAABC7cAAAWW///zVwAABykA
+ AP3X///7t////aYAAAPaAADA9mN1cnYAAAAAAAAAAQHNAABjdXJ2AAAAAAAAAAEBzQAA
+ Y3VydgAAAAAAAAABAc0AAHZjZ3QAAAAAAAAAAQAA76QAAAAAAAEAAAAA76QAAAAAAAEA
+ AAAA76QAAAAAAAEAAG5kaW4AAAAAAAAAMAAApMAAAFkAAABJQAAAmkAAACYXAAAS2wAA
+ UEAAAFRAAAHsQwAB7EMAAexDZGVzYwAAAAAAAAATTDI0MTBOTSBDYWxpYnJhdGVkAAAA
+ AAAAAAATAEwAMgA0ADEAMABOAE0AIABDAGEAbABpAGIAcgBhAHQAZQBkAAAAABNMMjQx
+ ME5NIENhbGlicmF0ZWQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIEluYy4sIDIwMDgAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABtbW9kAAAAAAAAXIUAAFGAAAAAAMJkHIAA
+ AAAAAAAAAAAAAAAAAAAA
+ </data>
+ <key>ReadOnly</key>
+ <string>NO</string>
+ <key>RowAlign</key>
+ <integer>1</integer>
+ <key>RowSpacing</key>
+ <real>36</real>
+ <key>SheetTitle</key>
+ <string>Canvas 1</string>
+ <key>SmartAlignmentGuidesActive</key>
+ <string>YES</string>
+ <key>SmartDistanceGuidesActive</key>
+ <string>YES</string>
+ <key>UniqueID</key>
+ <integer>1</integer>
+ <key>UseEntirePage</key>
+ <false/>
+ <key>VPages</key>
+ <integer>1</integer>
+ <key>WindowInfo</key>
+ <dict>
+ <key>CurrentSheet</key>
+ <integer>0</integer>
+ <key>ExpandedCanvases</key>
+ <array>
+ <dict>
+ <key>name</key>
+ <string>Canvas 1</string>
+ </dict>
+ </array>
+ <key>Frame</key>
+ <string>{{68, 234}, {710, 884}}</string>
+ <key>ListView</key>
+ <true/>
+ <key>OutlineWidth</key>
+ <integer>142</integer>
+ <key>RightSidebar</key>
+ <false/>
+ <key>ShowRuler</key>
+ <true/>
+ <key>Sidebar</key>
+ <true/>
+ <key>SidebarWidth</key>
+ <integer>120</integer>
+ <key>VisibleRegion</key>
+ <string>{{0, 0}, {575, 733}}</string>
+ <key>Zoom</key>
+ <real>1</real>
+ <key>ZoomValues</key>
+ <array>
+ <array>
+ <string>Canvas 1</string>
+ <real>1</real>
+ <real>1</real>
+ </array>
+ </array>
+ </dict>
+ <key>saveQuickLookFiles</key>
+ <string>YES</string>
+</dict>
+</plist>
Added: trunk/docs/gettingstarted/src/main/docbook/en-US/images/dnajcr-and-connector.png
===================================================================
(Binary files differ)
Property changes on: trunk/docs/gettingstarted/src/main/docbook/en-US/images/dnajcr-and-connector.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: trunk/docs/gettingstarted/src/main/docbook/en-US/images/example-federated-repository.graffle/QuickLook/Preview.pdf
===================================================================
(Binary files differ)
Property changes on: trunk/docs/gettingstarted/src/main/docbook/en-US/images/example-federated-repository.graffle/QuickLook/Preview.pdf
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: trunk/docs/gettingstarted/src/main/docbook/en-US/images/example-federated-repository.graffle/QuickLook/Thumbnail.tiff
===================================================================
(Binary files differ)
Property changes on: trunk/docs/gettingstarted/src/main/docbook/en-US/images/example-federated-repository.graffle/QuickLook/Thumbnail.tiff
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: trunk/docs/gettingstarted/src/main/docbook/en-US/images/example-federated-repository.graffle/data.plist
===================================================================
--- trunk/docs/gettingstarted/src/main/docbook/en-US/images/example-federated-repository.graffle/data.plist (rev 0)
+++ trunk/docs/gettingstarted/src/main/docbook/en-US/images/example-federated-repository.graffle/data.plist 2008-09-19 20:26:37 UTC (rev 538)
@@ -0,0 +1,837 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>ActiveLayerIndex</key>
+ <integer>0</integer>
+ <key>ApplicationVersion</key>
+ <array>
+ <string>com.omnigroup.OmniGraffle</string>
+ <string>136.19.0.104178</string>
+ </array>
+ <key>AutoAdjust</key>
+ <true/>
+ <key>BackgroundGraphic</key>
+ <dict>
+ <key>Bounds</key>
+ <string>{{0, 0}, {576, 733}}</string>
+ <key>Class</key>
+ <string>SolidGraphic</string>
+ <key>ID</key>
+ <integer>2</integer>
+ <key>Style</key>
+ <dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ </dict>
+ <key>CanvasOrigin</key>
+ <string>{0, 0}</string>
+ <key>ColumnAlign</key>
+ <integer>1</integer>
+ <key>ColumnSpacing</key>
+ <real>36</real>
+ <key>CreationDate</key>
+ <string>2008-09-18 21:30:45 -0500</string>
+ <key>Creator</key>
+ <string>Randall Hauch</string>
+ <key>DisplayScale</key>
+ <string>1 0/72 in = 1.0000 in</string>
+ <key>GraphDocumentVersion</key>
+ <integer>6</integer>
+ <key>GraphicsList</key>
+ <array>
+ <dict>
+ <key>Bounds</key>
+ <string>{{166.961, 71}, {162, 44}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>178</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ <string>{0, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.42562</string>
+ <key>g</key>
+ <string>0.572259</string>
+ <key>r</key>
+ <string>0.606622</string>
+ </dict>
+ <key>GradientCenter</key>
+ <string>{0, -0.0761905}</string>
+ <key>MiddleFraction</key>
+ <real>0.81746029853820801</real>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Fuzziness</key>
+ <real>5.7921171188354492</real>
+ <key>ShadowVector</key>
+ <string>{2, 4}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>CornerRadius</key>
+ <real>16</real>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 Repositories \
+Client Application}</string>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>164</integer>
+ </dict>
+ <key>ID</key>
+ <integer>171</integer>
+ <key>Points</key>
+ <array>
+ <string>{247.961, 115}</string>
+ <string>{248.701, 154.02}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>HeadArrow</key>
+ <string>0</string>
+ <key>TailArrow</key>
+ <string>FilledArrow</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>178</integer>
+ <key>Info</key>
+ <integer>1</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>164</integer>
+ </dict>
+ <key>ID</key>
+ <integer>170</integer>
+ <key>Points</key>
+ <array>
+ <string>{323.339, 176}</string>
+ <string>{269.429, 176}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>HeadArrow</key>
+ <string>0</string>
+ <key>TailArrow</key>
+ <string>FilledArrow</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>166</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>162</integer>
+ </dict>
+ <key>ID</key>
+ <integer>169</integer>
+ <key>Points</key>
+ <array>
+ <string>{256.331, 215.02}</string>
+ <string>{304.806, 258.698}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>HeadArrow</key>
+ <string>0</string>
+ <key>TailArrow</key>
+ <string>FilledArrow</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>165</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>159</integer>
+ </dict>
+ <key>ID</key>
+ <integer>168</integer>
+ <key>Points</key>
+ <array>
+ <string>{249.117, 215.02}</string>
+ <string>{249.117, 255.02}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>HeadArrow</key>
+ <string>0</string>
+ <key>TailArrow</key>
+ <string>FilledArrow</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>165</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>158</integer>
+ </dict>
+ <key>ID</key>
+ <integer>140</integer>
+ <key>Points</key>
+ <array>
+ <string>{241.903, 215.02}</string>
+ <string>{193.429, 258.698}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>HeadArrow</key>
+ <string>0</string>
+ <key>TailArrow</key>
+ <string>FilledArrow</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>165</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{317.65, 202.02}, {52, 13}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>Vertical</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>Helvetica-Bold</string>
+ <key>Size</key>
+ <real>12</real>
+ </dict>
+ <key>ID</key>
+ <integer>167</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Pad</key>
+ <integer>0</integer>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\b\fs22 \cf0 Cache}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{323.339, 154.02}, {40.6226, 43.9593}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>166</integer>
+ <key>ImageID</key>
+ <integer>1</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{223.117, 202.02}, {52, 13}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>Vertical</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>Helvetica-Bold</string>
+ <key>Size</key>
+ <real>12</real>
+ </dict>
+ <key>ID</key>
+ <integer>165</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Pad</key>
+ <integer>0</integer>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\b\fs22 \cf0 Vehicles}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{228.806, 154.02}, {40.6226, 43.9593}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>164</integer>
+ <key>ImageID</key>
+ <integer>1</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{299.117, 308.02}, {52, 13}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>Vertical</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>Helvetica-Bold</string>
+ <key>Size</key>
+ <real>12</real>
+ </dict>
+ <key>ID</key>
+ <integer>163</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Pad</key>
+ <integer>0</integer>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\b\fs22 \cf0 Aircraft}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{304.806, 255.02}, {40.6226, 43.9593}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>162</integer>
+ <key>ImageID</key>
+ <integer>1</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{223.117, 308.02}, {52, 13}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>Vertical</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>Helvetica-Bold</string>
+ <key>Size</key>
+ <real>12</real>
+ </dict>
+ <key>ID</key>
+ <integer>161</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Pad</key>
+ <integer>0</integer>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\b\fs22 \cf0 Cars}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{132, 308.02}, {82.2334, 13}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>Vertical</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>Helvetica-Bold</string>
+ <key>Size</key>
+ <real>12</real>
+ </dict>
+ <key>ID</key>
+ <integer>160</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Pad</key>
+ <integer>0</integer>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\b\fs22 \cf0 Configuration}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{228.806, 255.02}, {40.6226, 43.9593}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>159</integer>
+ <key>ImageID</key>
+ <integer>1</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{152.806, 255.02}, {40.6226, 43.9593}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>158</integer>
+ <key>ImageID</key>
+ <integer>1</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ </dict>
+ </array>
+ <key>GridInfo</key>
+ <dict/>
+ <key>GuidesLocked</key>
+ <string>NO</string>
+ <key>GuidesVisible</key>
+ <string>YES</string>
+ <key>HPages</key>
+ <integer>1</integer>
+ <key>ImageCounter</key>
+ <integer>2</integer>
+ <key>ImageLinkBack</key>
+ <array>
+ <dict/>
+ </array>
+ <key>ImageList</key>
+ <array>
+ <string>image1.jpg</string>
+ </array>
+ <key>KeepToScale</key>
+ <false/>
+ <key>Layers</key>
+ <array>
+ <dict>
+ <key>Lock</key>
+ <string>NO</string>
+ <key>Name</key>
+ <string>Layer 1</string>
+ <key>Print</key>
+ <string>YES</string>
+ <key>View</key>
+ <string>YES</string>
+ </dict>
+ </array>
+ <key>LayoutInfo</key>
+ <dict>
+ <key>Animate</key>
+ <string>NO</string>
+ <key>circoMinDist</key>
+ <real>18</real>
+ <key>circoSeparation</key>
+ <real>0.0</real>
+ <key>layoutEngine</key>
+ <string>dot</string>
+ <key>neatoSeparation</key>
+ <real>0.0</real>
+ <key>twopiSeparation</key>
+ <real>0.0</real>
+ </dict>
+ <key>LinksVisible</key>
+ <string>NO</string>
+ <key>MagnetsVisible</key>
+ <string>NO</string>
+ <key>MasterSheets</key>
+ <array/>
+ <key>ModificationDate</key>
+ <string>2008-09-19 09:46:58 -0500</string>
+ <key>Modifier</key>
+ <string>Randall Hauch</string>
+ <key>NotesVisible</key>
+ <string>NO</string>
+ <key>Orientation</key>
+ <integer>2</integer>
+ <key>OriginVisible</key>
+ <string>NO</string>
+ <key>PageBreaks</key>
+ <string>YES</string>
+ <key>PrintInfo</key>
+ <dict>
+ <key>NSBottomMargin</key>
+ <array>
+ <string>float</string>
+ <string>41</string>
+ </array>
+ <key>NSLeftMargin</key>
+ <array>
+ <string>float</string>
+ <string>18</string>
+ </array>
+ <key>NSPaperSize</key>
+ <array>
+ <string>size</string>
+ <string>{612, 792}</string>
+ </array>
+ <key>NSRightMargin</key>
+ <array>
+ <string>float</string>
+ <string>18</string>
+ </array>
+ <key>NSTopMargin</key>
+ <array>
+ <string>float</string>
+ <string>18</string>
+ </array>
+ </dict>
+ <key>PrintOnePage</key>
+ <false/>
+ <key>ReadOnly</key>
+ <string>NO</string>
+ <key>RowAlign</key>
+ <integer>1</integer>
+ <key>RowSpacing</key>
+ <real>36</real>
+ <key>SheetTitle</key>
+ <string>examples-federated-repository</string>
+ <key>SmartAlignmentGuidesActive</key>
+ <string>YES</string>
+ <key>SmartDistanceGuidesActive</key>
+ <string>YES</string>
+ <key>UniqueID</key>
+ <integer>2</integer>
+ <key>UseEntirePage</key>
+ <false/>
+ <key>VPages</key>
+ <integer>1</integer>
+ <key>WindowInfo</key>
+ <dict>
+ <key>CurrentSheet</key>
+ <integer>0</integer>
+ <key>ExpandedCanvases</key>
+ <array/>
+ <key>Frame</key>
+ <string>{{314, 187}, {710, 884}}</string>
+ <key>ListView</key>
+ <true/>
+ <key>OutlineWidth</key>
+ <integer>142</integer>
+ <key>RightSidebar</key>
+ <false/>
+ <key>ShowRuler</key>
+ <true/>
+ <key>Sidebar</key>
+ <true/>
+ <key>SidebarWidth</key>
+ <integer>120</integer>
+ <key>VisibleRegion</key>
+ <string>{{0, 0}, {575, 733}}</string>
+ <key>Zoom</key>
+ <real>1</real>
+ <key>ZoomValues</key>
+ <array>
+ <array>
+ <string>examples-federated-repository</string>
+ <real>1</real>
+ <real>1</real>
+ </array>
+ </array>
+ </dict>
+ <key>saveQuickLookFiles</key>
+ <string>YES</string>
+</dict>
+</plist>
Added: trunk/docs/gettingstarted/src/main/docbook/en-US/images/example-federated-repository.graffle/image1.jpg
===================================================================
(Binary files differ)
Property changes on: trunk/docs/gettingstarted/src/main/docbook/en-US/images/example-federated-repository.graffle/image1.jpg
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: trunk/docs/gettingstarted/src/main/docbook/en-US/images/example-federated-repository.png
===================================================================
(Binary files differ)
Property changes on: trunk/docs/gettingstarted/src/main/docbook/en-US/images/example-federated-repository.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: trunk/docs/gettingstarted/src/main/docbook/en-US/images/example-repositories-client.png
===================================================================
(Binary files differ)
Property changes on: trunk/docs/gettingstarted/src/main/docbook/en-US/images/example-repositories-client.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: trunk/docs/gettingstarted/src/main/docbook/en-US/images/example-repositories-navigating.png
===================================================================
(Binary files differ)
Property changes on: trunk/docs/gettingstarted/src/main/docbook/en-US/images/example-repositories-navigating.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: trunk/docs/gettingstarted/src/main/docbook/en-US/images/example-repositories.graffle/QuickLook/Preview.pdf
===================================================================
(Binary files differ)
Property changes on: trunk/docs/gettingstarted/src/main/docbook/en-US/images/example-repositories.graffle/QuickLook/Preview.pdf
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: trunk/docs/gettingstarted/src/main/docbook/en-US/images/example-repositories.graffle/QuickLook/Thumbnail.tiff
===================================================================
(Binary files differ)
Property changes on: trunk/docs/gettingstarted/src/main/docbook/en-US/images/example-repositories.graffle/QuickLook/Thumbnail.tiff
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: trunk/docs/gettingstarted/src/main/docbook/en-US/images/example-repositories.graffle/data.plist
===================================================================
--- trunk/docs/gettingstarted/src/main/docbook/en-US/images/example-repositories.graffle/data.plist (rev 0)
+++ trunk/docs/gettingstarted/src/main/docbook/en-US/images/example-repositories.graffle/data.plist 2008-09-19 20:26:37 UTC (rev 538)
@@ -0,0 +1,1085 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>ActiveLayerIndex</key>
+ <integer>0</integer>
+ <key>ApplicationVersion</key>
+ <array>
+ <string>com.omnigroup.OmniGraffle</string>
+ <string>136.19.0.104178</string>
+ </array>
+ <key>AutoAdjust</key>
+ <true/>
+ <key>BackgroundGraphic</key>
+ <dict>
+ <key>Bounds</key>
+ <string>{{0, 0}, {576, 733}}</string>
+ <key>Class</key>
+ <string>SolidGraphic</string>
+ <key>ID</key>
+ <integer>2</integer>
+ <key>Style</key>
+ <dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ </dict>
+ <key>CanvasOrigin</key>
+ <string>{0, 0}</string>
+ <key>ColumnAlign</key>
+ <integer>1</integer>
+ <key>ColumnSpacing</key>
+ <real>36</real>
+ <key>CreationDate</key>
+ <string>2008-09-18 21:30:45 -0500</string>
+ <key>Creator</key>
+ <string>Randall Hauch</string>
+ <key>DisplayScale</key>
+ <string>1 0/72 in = 1.0000 in</string>
+ <key>GraphDocumentVersion</key>
+ <integer>6</integer>
+ <key>GraphicsList</key>
+ <array>
+ <dict>
+ <key>Bounds</key>
+ <string>{{369.161, 277}, {62.4553, 13}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>Vertical</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>Helvetica</string>
+ <key>Size</key>
+ <real>12</real>
+ </dict>
+ <key>ID</key>
+ <integer>186</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Pad</key>
+ <integer>0</integer>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\i\fs22 \cf0 (In-Memory)}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{293.161, 277}, {62.4553, 13}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>Vertical</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>Helvetica</string>
+ <key>Size</key>
+ <real>12</real>
+ </dict>
+ <key>ID</key>
+ <integer>185</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Pad</key>
+ <integer>0</integer>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\i\fs22 \cf0 (Federated)}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{217.161, 277}, {62.4553, 13}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>Vertical</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>Helvetica</string>
+ <key>Size</key>
+ <real>12</real>
+ </dict>
+ <key>ID</key>
+ <integer>184</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Pad</key>
+ <integer>0</integer>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\i\fs22 \cf0 (In-Memory)}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{65.1614, 277}, {62.4553, 13}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>Vertical</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>Helvetica</string>
+ <key>Size</key>
+ <real>12</real>
+ </dict>
+ <key>ID</key>
+ <integer>183</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Pad</key>
+ <integer>0</integer>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\i\fs22 \cf0 (In-Memory)}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{55.2724, 264}, {82.2334, 13}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>Vertical</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>Helvetica-Bold</string>
+ <key>Size</key>
+ <real>12</real>
+ </dict>
+ <key>ID</key>
+ <integer>182</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Pad</key>
+ <integer>0</integer>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\b\fs22 \cf0 Configuration}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{143.317, 277}, {62.4553, 13}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>Vertical</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>Helvetica</string>
+ <key>Size</key>
+ <real>12</real>
+ </dict>
+ <key>ID</key>
+ <integer>181</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Pad</key>
+ <integer>0</integer>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\i\fs22 \cf0 (In-Memory)}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>148</integer>
+ </dict>
+ <key>ID</key>
+ <integer>177</integer>
+ <key>Points</key>
+ <array>
+ <string>{380.078, 235.98}</string>
+ <string>{344.701, 235.98}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>HeadArrow</key>
+ <string>0</string>
+ <key>TailArrow</key>
+ <string>FilledArrow</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>156</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>ID</key>
+ <integer>175</integer>
+ <key>Points</key>
+ <array>
+ <string>{269.457, 154}</string>
+ <string>{323.767, 214}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>HeadArrow</key>
+ <string>0</string>
+ <key>TailArrow</key>
+ <string>FilledArrow</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>134</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>ID</key>
+ <integer>174</integer>
+ <key>Points</key>
+ <array>
+ <string>{251.378, 154}</string>
+ <string>{256.521, 215.678}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>HeadArrow</key>
+ <string>0</string>
+ <key>TailArrow</key>
+ <string>FilledArrow</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>134</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>ID</key>
+ <integer>173</integer>
+ <key>Points</key>
+ <array>
+ <string>{231.806, 154}</string>
+ <string>{182.078, 215.678}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>HeadArrow</key>
+ <string>0</string>
+ <key>TailArrow</key>
+ <string>FilledArrow</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>134</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>ID</key>
+ <integer>172</integer>
+ <key>Points</key>
+ <array>
+ <string>{212.234, 154}</string>
+ <string>{107.634, 215.678}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>HeadArrow</key>
+ <string>0</string>
+ <key>TailArrow</key>
+ <string>FilledArrow</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>134</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{168.544, 110}, {162, 44}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>134</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ <string>{0, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.42562</string>
+ <key>g</key>
+ <string>0.572259</string>
+ <key>r</key>
+ <string>0.606622</string>
+ </dict>
+ <key>GradientCenter</key>
+ <string>{0, -0.0761905}</string>
+ <key>MiddleFraction</key>
+ <real>0.81746029853820801</real>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Fuzziness</key>
+ <real>5.7921171188354492</real>
+ <key>ShadowVector</key>
+ <string>{2, 4}</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>CornerRadius</key>
+ <real>16</real>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf0 Repositories \
+Client Application}</string>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{374.389, 264}, {52, 13}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>Vertical</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>Helvetica-Bold</string>
+ <key>Size</key>
+ <real>12</real>
+ </dict>
+ <key>ID</key>
+ <integer>157</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Pad</key>
+ <integer>0</integer>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\b\fs22 \cf0 Cache}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{380.078, 214}, {40.6226, 43.9593}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>156</integer>
+ <key>ImageID</key>
+ <integer>1</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{298.389, 264}, {52, 13}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>Vertical</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>Helvetica-Bold</string>
+ <key>Size</key>
+ <real>12</real>
+ </dict>
+ <key>ID</key>
+ <integer>149</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Pad</key>
+ <integer>0</integer>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\b\fs22 \cf0 Vehicles}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{304.078, 214}, {40.6226, 43.9593}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>148</integer>
+ <key>ImageID</key>
+ <integer>1</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{222.389, 264}, {52, 13}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>Vertical</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>Helvetica-Bold</string>
+ <key>Size</key>
+ <real>12</real>
+ </dict>
+ <key>ID</key>
+ <integer>147</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Pad</key>
+ <integer>0</integer>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\b\fs22 \cf0 Aircraft}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{228.078, 214}, {40.6226, 43.9593}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>146</integer>
+ <key>ImageID</key>
+ <integer>1</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{148.545, 264}, {52, 13}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>Vertical</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>Helvetica-Bold</string>
+ <key>Size</key>
+ <real>12</real>
+ </dict>
+ <key>ID</key>
+ <integer>145</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Pad</key>
+ <integer>0</integer>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\b\fs22 \cf0 Cars}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{152.078, 214}, {40.6226, 43.9593}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>142</integer>
+ <key>ImageID</key>
+ <integer>1</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{76.0778, 214}, {40.6226, 43.9593}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>141</integer>
+ <key>ImageID</key>
+ <integer>1</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ </dict>
+ </array>
+ <key>GridInfo</key>
+ <dict/>
+ <key>GuidesLocked</key>
+ <string>NO</string>
+ <key>GuidesVisible</key>
+ <string>YES</string>
+ <key>HPages</key>
+ <integer>1</integer>
+ <key>ImageCounter</key>
+ <integer>2</integer>
+ <key>ImageLinkBack</key>
+ <array>
+ <dict/>
+ </array>
+ <key>ImageList</key>
+ <array>
+ <string>image1.jpg</string>
+ </array>
+ <key>KeepToScale</key>
+ <false/>
+ <key>Layers</key>
+ <array>
+ <dict>
+ <key>Lock</key>
+ <string>NO</string>
+ <key>Name</key>
+ <string>Layer 1</string>
+ <key>Print</key>
+ <string>YES</string>
+ <key>View</key>
+ <string>YES</string>
+ </dict>
+ </array>
+ <key>LayoutInfo</key>
+ <dict>
+ <key>Animate</key>
+ <string>NO</string>
+ <key>circoMinDist</key>
+ <real>18</real>
+ <key>circoSeparation</key>
+ <real>0.0</real>
+ <key>layoutEngine</key>
+ <string>dot</string>
+ <key>neatoSeparation</key>
+ <real>0.0</real>
+ <key>twopiSeparation</key>
+ <real>0.0</real>
+ </dict>
+ <key>LinksVisible</key>
+ <string>NO</string>
+ <key>MagnetsVisible</key>
+ <string>NO</string>
+ <key>MasterSheets</key>
+ <array/>
+ <key>ModificationDate</key>
+ <string>2008-09-19 09:47:31 -0500</string>
+ <key>Modifier</key>
+ <string>Randall Hauch</string>
+ <key>NotesVisible</key>
+ <string>NO</string>
+ <key>Orientation</key>
+ <integer>2</integer>
+ <key>OriginVisible</key>
+ <string>NO</string>
+ <key>PageBreaks</key>
+ <string>YES</string>
+ <key>PrintInfo</key>
+ <dict>
+ <key>NSBottomMargin</key>
+ <array>
+ <string>float</string>
+ <string>41</string>
+ </array>
+ <key>NSLeftMargin</key>
+ <array>
+ <string>float</string>
+ <string>18</string>
+ </array>
+ <key>NSPaperSize</key>
+ <array>
+ <string>size</string>
+ <string>{612, 792}</string>
+ </array>
+ <key>NSRightMargin</key>
+ <array>
+ <string>float</string>
+ <string>18</string>
+ </array>
+ <key>NSTopMargin</key>
+ <array>
+ <string>float</string>
+ <string>18</string>
+ </array>
+ </dict>
+ <key>PrintOnePage</key>
+ <false/>
+ <key>ReadOnly</key>
+ <string>NO</string>
+ <key>RowAlign</key>
+ <integer>1</integer>
+ <key>RowSpacing</key>
+ <real>36</real>
+ <key>SheetTitle</key>
+ <string>examples-repositories</string>
+ <key>SmartAlignmentGuidesActive</key>
+ <string>YES</string>
+ <key>SmartDistanceGuidesActive</key>
+ <string>YES</string>
+ <key>UniqueID</key>
+ <integer>1</integer>
+ <key>UseEntirePage</key>
+ <false/>
+ <key>VPages</key>
+ <integer>1</integer>
+ <key>WindowInfo</key>
+ <dict>
+ <key>CurrentSheet</key>
+ <integer>0</integer>
+ <key>ExpandedCanvases</key>
+ <array>
+ <dict>
+ <key>name</key>
+ <string>examples-repositories</string>
+ </dict>
+ </array>
+ <key>Frame</key>
+ <string>{{288, 237}, {710, 884}}</string>
+ <key>ListView</key>
+ <true/>
+ <key>OutlineWidth</key>
+ <integer>142</integer>
+ <key>RightSidebar</key>
+ <false/>
+ <key>ShowRuler</key>
+ <true/>
+ <key>Sidebar</key>
+ <true/>
+ <key>SidebarWidth</key>
+ <integer>120</integer>
+ <key>VisibleRegion</key>
+ <string>{{0, 0}, {575, 733}}</string>
+ <key>Zoom</key>
+ <real>1</real>
+ <key>ZoomValues</key>
+ <array>
+ <array>
+ <string>examples-repositories</string>
+ <real>1</real>
+ <real>1</real>
+ </array>
+ </array>
+ </dict>
+ <key>saveQuickLookFiles</key>
+ <string>YES</string>
+</dict>
+</plist>
Added: trunk/docs/gettingstarted/src/main/docbook/en-US/images/example-repositories.graffle/image1.jpg
===================================================================
(Binary files differ)
Property changes on: trunk/docs/gettingstarted/src/main/docbook/en-US/images/example-repositories.graffle/image1.jpg
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: trunk/docs/gettingstarted/src/main/docbook/en-US/images/example-repositories.png
===================================================================
(Binary files differ)
Property changes on: trunk/docs/gettingstarted/src/main/docbook/en-US/images/example-repositories.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
15 years, 7 months
DNA SVN: r537 - trunk/dna-common/src/test/java/org/jboss/dna/common/i18n.
by dna-commits@lists.jboss.org
Author: jverhaeg(a)redhat.com
Date: 2008-09-19 11:18:11 -0400 (Fri, 19 Sep 2008)
New Revision: 537
Modified:
trunk/dna-common/src/test/java/org/jboss/dna/common/i18n/I18nTest.java
Log:
DNA-227: Since the test data that the I18n test class tests against is a US resource bundle, changed I18n test class to set US locale before running tests to ensure they succeed when executed from different locales.
Modified: trunk/dna-common/src/test/java/org/jboss/dna/common/i18n/I18nTest.java
===================================================================
--- trunk/dna-common/src/test/java/org/jboss/dna/common/i18n/I18nTest.java 2008-09-18 19:21:28 UTC (rev 536)
+++ trunk/dna-common/src/test/java/org/jboss/dna/common/i18n/I18nTest.java 2008-09-19 15:18:11 UTC (rev 537)
@@ -38,6 +38,7 @@
import org.jboss.dna.common.CommonI18n;
import org.jboss.dna.common.SystemFailureException;
import org.junit.Before;
+import org.junit.BeforeClass;
import org.junit.Test;
/**
@@ -46,6 +47,11 @@
*/
public final class I18nTest {
+ @BeforeClass
+ public static void beforeClass() {
+ Locale.setDefault(Locale.US);
+ }
+
@Before
public void beforeEach() throws Exception {
clearFields(TestI18n.class);
15 years, 7 months
DNA SVN: r536 - in trunk: extensions/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/merge/strategy and 1 other directory.
by dna-commits@lists.jboss.org
Author: rhauch
Date: 2008-09-18 15:21:28 -0400 (Thu, 18 Sep 2008)
New Revision: 536
Modified:
trunk/docs/examples/gettingstarted/repositories/src/main/java/org/jboss/example/dna/repository/RepositoryClient.java
trunk/extensions/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/merge/strategy/SimpleMergeStrategy.java
Log:
DNA-222 - Create Getting Started example application for repositories
http://jira.jboss.com/jira/browse/DNA-222
Minor change to correct how indexes are shown (or left off) with JCR. Also, minor change to the federated connector to correctly look for duplicate children.
Modified: trunk/docs/examples/gettingstarted/repositories/src/main/java/org/jboss/example/dna/repository/RepositoryClient.java
===================================================================
--- trunk/docs/examples/gettingstarted/repositories/src/main/java/org/jboss/example/dna/repository/RepositoryClient.java 2008-09-18 18:12:00 UTC (rev 535)
+++ trunk/docs/examples/gettingstarted/repositories/src/main/java/org/jboss/example/dna/repository/RepositoryClient.java 2008-09-18 19:21:28 UTC (rev 536)
@@ -24,8 +24,10 @@
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
+import java.util.HashSet;
import java.util.List;
import java.util.Map;
+import java.util.Set;
import java.util.concurrent.TimeUnit;
import javax.jcr.Credentials;
import javax.jcr.Node;
@@ -270,6 +272,7 @@
for (PropertyIterator iter = node.getProperties(); iter.hasNext();) {
javax.jcr.Property property = iter.nextProperty();
Object[] values = null;
+ // Must call either 'getValue()' or 'getValues()' depending upon # of values
if (property.getDefinition().isMultiple()) {
Value[] jcrValues = property.getValues();
values = new String[jcrValues.length];
@@ -283,10 +286,18 @@
}
}
if (children != null) {
+ // Figure out which children need same-name sibling indexes ...
+ Set<String> sameNameSiblings = new HashSet<String>();
for (NodeIterator iter = node.getNodes(); iter.hasNext();) {
javax.jcr.Node child = iter.nextNode();
- children.add(child.getName());
+ if (child.getIndex() > 1) sameNameSiblings.add(child.getName());
}
+ for (NodeIterator iter = node.getNodes(); iter.hasNext();) {
+ javax.jcr.Node child = iter.nextNode();
+ String name = child.getName();
+ if (sameNameSiblings.contains(name)) name = name + "[" + child.getIndex() + "]";
+ children.add(name);
+ }
}
} catch (javax.jcr.PathNotFoundException e) {
return false;
Modified: trunk/extensions/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/merge/strategy/SimpleMergeStrategy.java
===================================================================
--- trunk/extensions/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/merge/strategy/SimpleMergeStrategy.java 2008-09-18 18:12:00 UTC (rev 535)
+++ trunk/extensions/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/merge/strategy/SimpleMergeStrategy.java 2008-09-18 19:21:28 UTC (rev 536)
@@ -100,7 +100,7 @@
Iterator<Segment> childIterator = contribution.getChildren();
while (childIterator.hasNext()) {
Segment child = childIterator.next();
- if (!childNames.containsKey(child)) {
+ if (!childNames.containsKey(child.getName())) {
childNames.put(child.getName(), 1);
children.add(pathFactory.createSegment(child.getName()));
}
15 years, 7 months
DNA SVN: r535 - in trunk: dna-common/src/main/java/org/jboss/dna/common/collection and 26 other directories.
by dna-commits@lists.jboss.org
Author: rhauch
Date: 2008-09-18 14:12:00 -0400 (Thu, 18 Sep 2008)
New Revision: 535
Added:
trunk/dna-common/src/main/java/org/jboss/dna/common/util/CheckArg.java
Removed:
trunk/dna-common/src/main/java/org/jboss/dna/common/util/ArgCheck.java
Modified:
trunk/dna-common/src/main/java/org/jboss/dna/common/collection/Problem.java
trunk/dna-common/src/main/java/org/jboss/dna/common/component/ComponentConfig.java
trunk/dna-common/src/main/java/org/jboss/dna/common/component/ComponentLibrary.java
trunk/dna-common/src/main/java/org/jboss/dna/common/i18n/I18n.java
trunk/dna-common/src/main/java/org/jboss/dna/common/text/Inflector.java
trunk/dna-common/src/main/java/org/jboss/dna/common/util/FileUtil.java
trunk/dna-common/src/main/java/org/jboss/dna/common/util/IoUtil.java
trunk/dna-common/src/main/java/org/jboss/dna/common/util/Reflection.java
trunk/dna-common/src/main/java/org/jboss/dna/common/util/StringUtil.java
trunk/dna-common/src/test/java/org/jboss/dna/common/util/ArgCheckTest.java
trunk/dna-graph/src/main/java/org/jboss/dna/graph/ExecutionContexts.java
trunk/dna-graph/src/main/java/org/jboss/dna/graph/cache/BasicCachePolicy.java
trunk/dna-graph/src/main/java/org/jboss/dna/graph/connectors/BasicExecutionContext.java
trunk/dna-graph/src/main/java/org/jboss/dna/graph/connectors/RepositoryConnectionPool.java
trunk/dna-graph/src/main/java/org/jboss/dna/graph/properties/PathExpression.java
trunk/dna-graph/src/main/java/org/jboss/dna/graph/properties/basic/AbstractValueFactories.java
trunk/dna-graph/src/main/java/org/jboss/dna/graph/properties/basic/AbstractValueFactory.java
trunk/dna-graph/src/main/java/org/jboss/dna/graph/properties/basic/BasicMultiValueProperty.java
trunk/dna-graph/src/main/java/org/jboss/dna/graph/properties/basic/BasicName.java
trunk/dna-graph/src/main/java/org/jboss/dna/graph/properties/basic/BasicNamespaceRegistry.java
trunk/dna-graph/src/main/java/org/jboss/dna/graph/properties/basic/BasicPath.java
trunk/dna-graph/src/main/java/org/jboss/dna/graph/properties/basic/BasicPathSegment.java
trunk/dna-graph/src/main/java/org/jboss/dna/graph/properties/basic/BasicPropertyFactory.java
trunk/dna-graph/src/main/java/org/jboss/dna/graph/properties/basic/InMemoryBinary.java
trunk/dna-graph/src/main/java/org/jboss/dna/graph/properties/basic/JodaDateTime.java
trunk/dna-graph/src/main/java/org/jboss/dna/graph/properties/basic/NameValueFactory.java
trunk/dna-graph/src/main/java/org/jboss/dna/graph/properties/basic/ObjectValueFactory.java
trunk/dna-graph/src/main/java/org/jboss/dna/graph/properties/basic/PathValueFactory.java
trunk/dna-graph/src/main/java/org/jboss/dna/graph/properties/basic/StandardValueFactories.java
trunk/dna-graph/src/main/java/org/jboss/dna/graph/properties/basic/StringValueFactory.java
trunk/dna-graph/src/main/java/org/jboss/dna/graph/properties/basic/UriValueFactory.java
trunk/dna-graph/src/main/java/org/jboss/dna/graph/util/GraphImporter.java
trunk/dna-graph/src/test/java/org/jboss/dna/graph/connectors/RepositoryOperations.java
trunk/dna-graph/src/test/java/org/jboss/dna/graph/properties/AbstractValueComparatorsTest.java
trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/AbstractJcrNode.java
trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/AbstractJcrProperty.java
trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrNodeIterator.java
trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrProperty.java
trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrPropertyIterator.java
trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrRepository.java
trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrSession.java
trunk/dna-repository/src/main/java/org/jboss/dna/repository/RepositoryLibrary.java
trunk/dna-repository/src/main/java/org/jboss/dna/repository/RepositoryService.java
trunk/dna-repository/src/main/java/org/jboss/dna/repository/observation/ObservationService.java
trunk/dna-repository/src/main/java/org/jboss/dna/repository/rules/RuleService.java
trunk/dna-repository/src/main/java/org/jboss/dna/repository/rules/RuleSet.java
trunk/dna-repository/src/main/java/org/jboss/dna/repository/rules/RuleSetRepositoryMonitor.java
trunk/dna-repository/src/main/java/org/jboss/dna/repository/sequencers/SequencerNodeContext.java
trunk/dna-repository/src/main/java/org/jboss/dna/repository/sequencers/SequencerOutputMap.java
trunk/dna-repository/src/main/java/org/jboss/dna/repository/sequencers/SequencerPathExpression.java
trunk/dna-repository/src/main/java/org/jboss/dna/repository/sequencers/SequencingService.java
trunk/dna-repository/src/main/java/org/jboss/dna/repository/util/AbstractSessionFactory.java
trunk/dna-repository/src/main/java/org/jboss/dna/repository/util/BasicJcrExecutionContext.java
trunk/dna-repository/src/main/java/org/jboss/dna/repository/util/JcrNamespaceRegistry.java
trunk/dna-repository/src/main/java/org/jboss/dna/repository/util/JndiSessionFactory.java
trunk/docs/examples/gettingstarted/repositories/src/main/java/org/jboss/example/dna/repository/RepositoryClient.java
trunk/eclipse-preferences.epf
trunk/extensions/dna-classloader-maven/src/main/java/org/jboss/dna/maven/MavenDependency.java
trunk/extensions/dna-classloader-maven/src/main/java/org/jboss/dna/maven/MavenId.java
trunk/extensions/dna-classloader-maven/src/main/java/org/jboss/dna/maven/MavenRepository.java
trunk/extensions/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/FederatedRepository.java
trunk/extensions/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/FederatedRepositoryConfig.java
trunk/extensions/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/FederatedRepositorySource.java
trunk/extensions/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/Projection.java
trunk/extensions/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/ProjectionParser.java
trunk/extensions/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/contribution/ContributionStatistics.java
trunk/extensions/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/merge/MergePlan.java
trunk/extensions/dna-connector-inmemory/src/main/java/org/jboss/dna/connector/inmemory/InMemoryRepository.java
trunk/extensions/dna-connector-inmemory/src/main/java/org/jboss/dna/connector/inmemory/InMemoryRepositorySource.java
trunk/extensions/dna-sequencer-java/src/main/java/org/jboss/dna/sequencer/java/AbstractJavaMetadata.java
trunk/extensions/dna-sequencer-java/src/main/java/org/jboss/dna/sequencer/java/JavaMetadataUtil.java
Log:
DNA-205 Rename/refactor classes
https://jira.jboss.org/jira/browse/DNA-205
Renamed 'org.jboss.dna.common.util.ArgCheck' to 'CheckArg', since that makes more more readable code. This impacted a lot of code.
Modified: trunk/dna-common/src/main/java/org/jboss/dna/common/collection/Problem.java
===================================================================
--- trunk/dna-common/src/main/java/org/jboss/dna/common/collection/Problem.java 2008-09-18 18:00:04 UTC (rev 534)
+++ trunk/dna-common/src/main/java/org/jboss/dna/common/collection/Problem.java 2008-09-18 18:12:00 UTC (rev 535)
@@ -23,7 +23,7 @@
import net.jcip.annotations.Immutable;
import org.jboss.dna.common.i18n.I18n;
-import org.jboss.dna.common.util.ArgCheck;
+import org.jboss.dna.common.util.CheckArg;
import org.jboss.dna.common.util.HashCode;
/**
@@ -55,8 +55,8 @@
String resource,
String location,
Throwable throwable ) {
- ArgCheck.isNotNull(status, "status");
- ArgCheck.isNotNull(message, "message");
+ CheckArg.isNotNull(status, "status");
+ CheckArg.isNotNull(message, "message");
this.status = status;
this.code = code;
this.message = message;
Modified: trunk/dna-common/src/main/java/org/jboss/dna/common/component/ComponentConfig.java
===================================================================
--- trunk/dna-common/src/main/java/org/jboss/dna/common/component/ComponentConfig.java 2008-09-18 18:00:04 UTC (rev 534)
+++ trunk/dna-common/src/main/java/org/jboss/dna/common/component/ComponentConfig.java 2008-09-18 18:12:00 UTC (rev 535)
@@ -26,7 +26,7 @@
import java.util.List;
import net.jcip.annotations.Immutable;
import org.jboss.dna.common.CommonI18n;
-import org.jboss.dna.common.util.ArgCheck;
+import org.jboss.dna.common.util.CheckArg;
import org.jboss.dna.common.util.ClassUtil;
/**
@@ -65,7 +65,7 @@
* Java classname
*/
public ComponentConfig( String name, String description, long timestamp, String classname, String... classpath ) {
- ArgCheck.isNotEmpty(name, "name");
+ CheckArg.isNotEmpty(name, "name");
this.name = name.trim();
this.description = description != null ? description.trim() : "";
this.componentClassname = classname;
@@ -181,8 +181,8 @@
* this object
*/
public boolean hasChanged( ComponentConfig component ) {
- ArgCheck.isNotNull(component, "component");
- ArgCheck.isInstanceOf(component, this.getClass(), "component");
+ CheckArg.isNotNull(component, "component");
+ CheckArg.isInstanceOf(component, this.getClass(), "component");
if (!this.getName().equalsIgnoreCase(component.getName())) return true;
if (!this.getDescription().equals(component.getDescription())) return true;
if (!this.getComponentClassname().equals(component.getComponentClassname())) return true;
Modified: trunk/dna-common/src/main/java/org/jboss/dna/common/component/ComponentLibrary.java
===================================================================
--- trunk/dna-common/src/main/java/org/jboss/dna/common/component/ComponentLibrary.java 2008-09-18 18:00:04 UTC (rev 534)
+++ trunk/dna-common/src/main/java/org/jboss/dna/common/component/ComponentLibrary.java 2008-09-18 18:12:00 UTC (rev 535)
@@ -32,7 +32,7 @@
import net.jcip.annotations.ThreadSafe;
import org.jboss.dna.common.CommonI18n;
import org.jboss.dna.common.SystemFailureException;
-import org.jboss.dna.common.util.ArgCheck;
+import org.jboss.dna.common.util.CheckArg;
/**
* Maintains the list of component instances for the system. This class does not actively update the component configurations, but
@@ -128,7 +128,7 @@
* @see #remove(ComponentConfig)
*/
public boolean add( ConfigType config ) {
- ArgCheck.isNotNull(config, "component configuration");
+ CheckArg.isNotNull(config, "component configuration");
try {
this.lock.lock();
// Find an existing configuration that matches ...
@@ -182,7 +182,7 @@
* @see #update(ComponentConfig)
*/
public boolean remove( ConfigType config ) {
- ArgCheck.isNotNull(config, "component configuration");
+ CheckArg.isNotNull(config, "component configuration");
try {
this.lock.lock();
// Find an existing configuration that matches ...
Modified: trunk/dna-common/src/main/java/org/jboss/dna/common/i18n/I18n.java
===================================================================
--- trunk/dna-common/src/main/java/org/jboss/dna/common/i18n/I18n.java 2008-09-18 18:00:04 UTC (rev 534)
+++ trunk/dna-common/src/main/java/org/jboss/dna/common/i18n/I18n.java 2008-09-18 18:12:00 UTC (rev 535)
@@ -39,7 +39,7 @@
import net.jcip.annotations.ThreadSafe;
import org.jboss.dna.common.CommonI18n;
import org.jboss.dna.common.SystemFailureException;
-import org.jboss.dna.common.util.ArgCheck;
+import org.jboss.dna.common.util.CheckArg;
import org.jboss.dna.common.util.ClassUtil;
import org.jboss.dna.common.util.StringUtil;
@@ -71,7 +71,7 @@
* class; never <code>null</code>.
*/
public static Set<Locale> getLocalizationProblemLocales( Class<?> i18nClass ) {
- ArgCheck.isNotNull(i18nClass, "i18nClass");
+ CheckArg.isNotNull(i18nClass, "i18nClass");
Set<Locale> locales = new HashSet<Locale>(LOCALE_TO_CLASS_TO_PROBLEMS_MAP.size());
for (Entry<Locale, Map<Class<?>, Set<String>>> localeEntry : LOCALE_TO_CLASS_TO_PROBLEMS_MAP.entrySet()) {
for (Entry<Class<?>, Set<String>> classEntry : localeEntry.getValue().entrySet()) {
@@ -106,7 +106,7 @@
*/
public static Set<String> getLocalizationProblems( Class<?> i18nClass,
Locale locale ) {
- ArgCheck.isNotNull(i18nClass, "i18nClass");
+ CheckArg.isNotNull(i18nClass, "i18nClass");
Map<Class<?>, Set<String>> classToProblemsMap = LOCALE_TO_CLASS_TO_PROBLEMS_MAP.get(locale == null ? Locale.getDefault() : locale);
if (classToProblemsMap == null) {
return Collections.emptySet();
@@ -147,7 +147,7 @@
* @param i18nClass A class declaring one or more public, static, non-final fields of type <code>I18n</code>.
*/
public static void initialize( Class<?> i18nClass ) {
- ArgCheck.isNotNull(i18nClass, "i18nClass");
+ CheckArg.isNotNull(i18nClass, "i18nClass");
if (i18nClass.isInterface()) {
throw new IllegalArgumentException(CommonI18n.i18nClassInterface.text(i18nClass.getName()));
}
Modified: trunk/dna-common/src/main/java/org/jboss/dna/common/text/Inflector.java
===================================================================
--- trunk/dna-common/src/main/java/org/jboss/dna/common/text/Inflector.java 2008-09-18 18:00:04 UTC (rev 534)
+++ trunk/dna-common/src/main/java/org/jboss/dna/common/text/Inflector.java 2008-09-18 18:12:00 UTC (rev 535)
@@ -26,7 +26,7 @@
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
-import org.jboss.dna.common.util.ArgCheck;
+import org.jboss.dna.common.util.CheckArg;
/**
* Transforms words to singular, plural, humanized (human readable), underscore, camel case, or ordinal form. This is inspired by
@@ -469,8 +469,8 @@
public void addIrregular( String singular,
String plural ) {
- ArgCheck.isNotEmpty(singular, "singular rule");
- ArgCheck.isNotEmpty(plural, "plural rule");
+ CheckArg.isNotEmpty(singular, "singular rule");
+ CheckArg.isNotEmpty(plural, "plural rule");
String singularRemainder = singular.length() > 1 ? singular.substring(1) : "";
String pluralRemainder = plural.length() > 1 ? plural.substring(1) : "";
addPluralize("(" + singular.charAt(0) + ")" + singularRemainder + "$", "$1" + pluralRemainder);
Deleted: trunk/dna-common/src/main/java/org/jboss/dna/common/util/ArgCheck.java
===================================================================
--- trunk/dna-common/src/main/java/org/jboss/dna/common/util/ArgCheck.java 2008-09-18 18:00:04 UTC (rev 534)
+++ trunk/dna-common/src/main/java/org/jboss/dna/common/util/ArgCheck.java 2008-09-18 18:12:00 UTC (rev 535)
@@ -1,788 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * Copyright 2008, Red Hat Middleware LLC, and individual contributors
- * as indicated by the @author tags. See the copyright.txt file in the
- * distribution for a full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.jboss.dna.common.util;
-
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.Map;
-import org.jboss.dna.common.CommonI18n;
-
-/**
- * Utility class that checks arguments to methods. This class is to be used only in API methods, where failure to supply correct
- * arguments should result in a useful error message. In all cases, use the <code>assert</code> statement.
- */
-public final class ArgCheck {
-
- // ########################## int METHODS ###################################
-
- /**
- * Check that the argument is not less than the supplied value
- *
- * @param argument The argument
- * @param notLessThanValue the value that is to be used to check the value
- * @param name The name of the argument
- * @throws IllegalArgumentException If argument greater than or equal to the supplied vlaue
- */
- public static void isNotLessThan( int argument,
- int notLessThanValue,
- String name ) {
- if (argument < notLessThanValue) {
- throw new IllegalArgumentException(CommonI18n.argumentMayNotBeLessThan.text(name, argument, notLessThanValue));
- }
- }
-
- /**
- * Check that the argument is not greater than the supplied value
- *
- * @param argument The argument
- * @param notGreaterThanValue the value that is to be used to check the value
- * @param name The name of the argument
- * @throws IllegalArgumentException If argument is less than or equal to the supplied value
- */
- public static void isNotGreaterThan( int argument,
- int notGreaterThanValue,
- String name ) {
- if (argument > notGreaterThanValue) {
- throw new IllegalArgumentException(CommonI18n.argumentMayNotBeGreaterThan.text(name, argument, notGreaterThanValue));
- }
- }
-
- /**
- * Check that the argument is greater than the supplied value
- *
- * @param argument The argument
- * @param greaterThanValue the value that is to be used to check the value
- * @param name The name of the argument
- * @throws IllegalArgumentException If argument is not greater than the supplied value
- */
- public static void isGreaterThan( int argument,
- int greaterThanValue,
- String name ) {
- if (argument <= greaterThanValue) {
- throw new IllegalArgumentException(CommonI18n.argumentMustBeGreaterThan.text(name, argument, greaterThanValue));
- }
- }
-
- /**
- * Check that the argument is less than the supplied value
- *
- * @param argument The argument
- * @param lessThanValue the value that is to be used to check the value
- * @param name The name of the argument
- * @throws IllegalArgumentException If argument is not less than the supplied value
- */
- public static void isLessThan( int argument,
- int lessThanValue,
- String name ) {
- if (argument >= lessThanValue) {
- throw new IllegalArgumentException(CommonI18n.argumentMustBeLessThan.text(name, argument, lessThanValue));
- }
- }
-
- /**
- * Check that the argument is greater than or equal to the supplied value
- *
- * @param argument The argument
- * @param greaterThanOrEqualToValue the value that is to be used to check the value
- * @param name The name of the argument
- * @throws IllegalArgumentException If argument is not greater than or equal to the supplied value
- */
- public static void isGreaterThanOrEqualTo( int argument,
- int greaterThanOrEqualToValue,
- String name ) {
- if (argument < greaterThanOrEqualToValue) {
- throw new IllegalArgumentException(CommonI18n.argumentMustBeGreaterThanOrEqualTo.text(name,
- argument,
- greaterThanOrEqualToValue));
- }
- }
-
- /**
- * Check that the argument is less than or equal to the supplied value
- *
- * @param argument The argument
- * @param lessThanOrEqualToValue the value that is to be used to check the value
- * @param name The name of the argument
- * @throws IllegalArgumentException If argument is not less than or equal to the supplied value
- */
- public static void isLessThanOrEqualTo( int argument,
- int lessThanOrEqualToValue,
- String name ) {
- if (argument > lessThanOrEqualToValue) {
- throw new IllegalArgumentException(CommonI18n.argumentMustBeLessThanOrEqualTo.text(name,
- argument,
- lessThanOrEqualToValue));
- }
- }
-
- /**
- * Check that the argument is non-negative (>=0).
- *
- * @param argument The argument
- * @param name The name of the argument
- * @throws IllegalArgumentException If argument is negative (<0)
- */
- public static void isNonNegative( int argument,
- String name ) {
- if (argument < 0) {
- throw new IllegalArgumentException(CommonI18n.argumentMayNotBeNegative.text(name, argument));
- }
- }
-
- /**
- * Check that the argument is non-positive (<=0).
- *
- * @param argument The argument
- * @param name The name of the argument
- * @throws IllegalArgumentException If argument is positive (>0)
- */
- public static void isNonPositive( int argument,
- String name ) {
- if (argument > 0) {
- throw new IllegalArgumentException(CommonI18n.argumentMayNotBePositive.text(name, argument));
- }
- }
-
- /**
- * Check that the argument is negative (<0).
- *
- * @param argument The argument
- * @param name The name of the argument
- * @throws IllegalArgumentException If argument is non-negative (>=0)
- */
- public static void isNegative( int argument,
- String name ) {
- if (argument >= 0) {
- throw new IllegalArgumentException(CommonI18n.argumentMustBeNegative.text(name, argument));
- }
- }
-
- /**
- * Check that the argument is positive (>0).
- *
- * @param argument The argument
- * @param name The name of the argument
- * @throws IllegalArgumentException If argument is non-positive (<=0)
- */
- public static void isPositive( int argument,
- String name ) {
- if (argument <= 0) {
- throw new IllegalArgumentException(CommonI18n.argumentMustBePositive.text(name, argument));
- }
- }
-
- // ########################## long METHODS ###################################
-
- /**
- * Check that the argument is non-negative (>=0).
- *
- * @param argument The argument
- * @param name The name of the argument
- * @throws IllegalArgumentException If argument is negative (<0)
- */
- public static void isNonNegative( long argument,
- String name ) {
- if (argument < 0) {
- throw new IllegalArgumentException(CommonI18n.argumentMayNotBeNegative.text(name, argument));
- }
- }
-
- /**
- * Check that the argument is non-positive (<=0).
- *
- * @param argument The argument
- * @param name The name of the argument
- * @throws IllegalArgumentException If argument is positive (>0)
- */
- public static void isNonPositive( long argument,
- String name ) {
- if (argument > 0) {
- throw new IllegalArgumentException(CommonI18n.argumentMayNotBePositive.text(name, argument));
- }
- }
-
- /**
- * Check that the argument is negative (<0).
- *
- * @param argument The argument
- * @param name The name of the argument
- * @throws IllegalArgumentException If argument is non-negative (>=0)
- */
- public static void isNegative( long argument,
- String name ) {
- if (argument >= 0) {
- throw new IllegalArgumentException(CommonI18n.argumentMustBeNegative.text(name, argument));
- }
- }
-
- /**
- * Check that the argument is positive (>0).
- *
- * @param argument The argument
- * @param name The name of the argument
- * @throws IllegalArgumentException If argument is non-positive (<=0)
- */
- public static void isPositive( long argument,
- String name ) {
- if (argument <= 0) {
- throw new IllegalArgumentException(CommonI18n.argumentMustBePositive.text(name, argument));
- }
- }
-
- // ########################## double METHODS ###################################
-
- /**
- * Check that the argument is non-negative (>=0).
- *
- * @param argument The argument
- * @param name The name of the argument
- * @throws IllegalArgumentException If argument is negative (<0)
- */
- public static void isNonNegative( double argument,
- String name ) {
- if (argument < 0.0) {
- throw new IllegalArgumentException(CommonI18n.argumentMayNotBeNegative.text(name, argument));
- }
- }
-
- /**
- * Check that the argument is non-positive (<=0).
- *
- * @param argument The argument
- * @param name The name of the argument
- * @throws IllegalArgumentException If argument is positive (>0)
- */
- public static void isNonPositive( double argument,
- String name ) {
- if (argument > 0.0) {
- throw new IllegalArgumentException(CommonI18n.argumentMayNotBePositive.text(name, argument));
- }
- }
-
- /**
- * Check that the argument is negative (<0).
- *
- * @param argument The argument
- * @param name The name of the argument
- * @throws IllegalArgumentException If argument is non-negative (>=0)
- */
- public static void isNegative( double argument,
- String name ) {
- if (argument >= 0.0) {
- throw new IllegalArgumentException(CommonI18n.argumentMustBeNegative.text(name, argument));
- }
- }
-
- /**
- * Check that the argument is positive (>0).
- *
- * @param argument The argument
- * @param name The name of the argument
- * @throws IllegalArgumentException If argument is non-positive (<=0)
- */
- public static void isPositive( double argument,
- String name ) {
- if (argument <= 0.0) {
- throw new IllegalArgumentException(CommonI18n.argumentMustBePositive.text(name, argument));
- }
- }
-
- /**
- * Check that the argument is not NaN.
- *
- * @param argument The argument
- * @param name The name of the argument
- * @throws IllegalArgumentException If argument is NaN
- */
- public static void isNotNan( double argument,
- String name ) {
- if (Double.isNaN(argument)) {
- throw new IllegalArgumentException(CommonI18n.argumentMustBeNumber.text(name));
- }
- }
-
- // ########################## String METHODS ###################################
-
- /**
- * Check that the string is non-null and has length > 0
- *
- * @param argument The argument
- * @param name The name of the argument
- * @throws IllegalArgumentException If value is null or length == 0
- */
- public static void isNotZeroLength( String argument,
- String name ) {
- isNotNull(argument, name);
- if (argument.length() <= 0) {
- throw new IllegalArgumentException(CommonI18n.argumentMayNotBeNullOrZeroLength.text(name));
- }
- }
-
- /**
- * Check that the string is not empty, is not null, and does not contain only whitespace.
- *
- * @param argument String
- * @param name The name of the argument
- * @throws IllegalArgumentException If string is null or empty
- */
- public static void isNotEmpty( String argument,
- String name ) {
- isNotZeroLength(argument, name);
- if (argument != null && argument.trim().length() == 0) {
- throw new IllegalArgumentException(CommonI18n.argumentMayNotBeNullOrZeroLengthOrEmpty.text(name));
- }
- }
-
- // ########################## Object METHODS ###################################
-
- /**
- * Check that the specified argument is non-null
- *
- * @param argument The argument
- * @param name The name of the argument
- * @throws IllegalArgumentException If argument is null
- */
- public static void isNotNull( Object argument,
- String name ) {
- if (argument == null) {
- throw new IllegalArgumentException(CommonI18n.argumentMayNotBeNull.text(name));
- }
- }
-
- /**
- * Returns the specified argument if it is not <code>null</code>.
- *
- * @param <T>
- * @param argument The argument
- * @param name The name of the argument
- * @return The argument
- * @throws IllegalArgumentException If argument is <code>null</code>
- */
- public static <T> T getNotNull( T argument,
- String name ) {
- isNotNull(argument, name);
- return argument;
- }
-
- /**
- * Check that the argument is null
- *
- * @param argument The argument
- * @param name The name of the argument
- * @throws IllegalArgumentException If value is non-null
- */
- public static void isNull( Object argument,
- String name ) {
- if (argument != null) {
- throw new IllegalArgumentException(CommonI18n.argumentMustBeNull.text(name));
- }
- }
-
- /**
- * Check that the object is an instance of the specified Class
- *
- * @param argument Value
- * @param expectedClass Class
- * @param name The name of the argument
- * @throws IllegalArgumentException If value is null
- */
- public static void isInstanceOf( Object argument,
- Class<?> expectedClass,
- String name ) {
- isNotNull(argument, name);
- if (!expectedClass.isInstance(argument)) {
- throw new IllegalArgumentException(CommonI18n.argumentMustBeInstanceOf.text(name,
- argument.getClass(),
- expectedClass.getName()));
- }
- }
-
- /**
- * Checks that the object is an instance of the specified Class and then returns the object cast to the specified Class
- *
- * @param <C> the class type
- * @param argument Value
- * @param expectedClass Class
- * @param name The name of the argument
- * @return value cast to the specified Class
- * @throws IllegalArgumentException If value is not an instance of theClass.
- */
- // due to cast in return
- public static <C> C getInstanceOf( Object argument,
- Class<C> expectedClass,
- String name ) {
- isInstanceOf(argument, expectedClass, name);
- return expectedClass.cast(argument);
- }
-
- /**
- * Asserts that the specified first object is the same as (==) the specified second object.
- *
- * @param <T>
- * @param argument The argument to assert as the same as <code>object</code>.
- * @param argumentName The name that will be used within the exception message for the argument should an exception be thrown
- * @param object The object to assert as the same as <code>argument</code>.
- * @param objectName The name that will be used within the exception message for <code>object</code> should an exception be
- * thrown; if <code>null</code> and <code>object</code> is not <code>null</code>, <code>object.toString()</code> will
- * be used.
- * @throws IllegalArgumentException If the specified objects are not the same.
- */
- public static <T> void isSame( final T argument,
- String argumentName,
- final T object,
- String objectName ) {
- if (argument != object) {
- if (objectName == null) objectName = getObjectName(object);
- throw new IllegalArgumentException(CommonI18n.argumentMustBeSameAs.text(argumentName, objectName));
- }
- }
-
- /**
- * Asserts that the specified first object is not the same as (==) the specified second object.
- *
- * @param <T>
- * @param argument The argument to assert as not the same as <code>object</code>.
- * @param argumentName The name that will be used within the exception message for the argument should an exception be thrown
- * @param object The object to assert as not the same as <code>argument</code>.
- * @param objectName The name that will be used within the exception message for <code>object</code> should an exception be
- * thrown; if <code>null</code> and <code>object</code> is not <code>null</code>, <code>object.toString()</code> will
- * be used.
- * @throws IllegalArgumentException If the specified objects are the same.
- */
- public static <T> void isNotSame( final T argument,
- String argumentName,
- final T object,
- String objectName ) {
- if (argument == object) {
- if (objectName == null) objectName = getObjectName(object);
- throw new IllegalArgumentException(CommonI18n.argumentMustNotBeSameAs.text(argumentName, objectName));
- }
- }
-
- /**
- * Asserts that the specified first object is {@link Object#equals(Object) equal to} the specified second object.
- *
- * @param <T>
- * @param argument The argument to assert equal to <code>object</code>.
- * @param argumentName The name that will be used within the exception message for the argument should an exception be thrown
- * @param object The object to assert as equal to <code>argument</code>.
- * @param objectName The name that will be used within the exception message for <code>object</code> should an exception be
- * thrown; if <code>null</code> and <code>object</code> is not <code>null</code>, <code>object.toString()</code> will
- * be used.
- * @throws IllegalArgumentException If the specified objects are not equal.
- */
- public static <T> void isEquals( final T argument,
- String argumentName,
- final T object,
- String objectName ) {
- if (!argument.equals(object)) {
- if (objectName == null) objectName = getObjectName(object);
- throw new IllegalArgumentException(CommonI18n.argumentMustBeEquals.text(argumentName, objectName));
- }
- }
-
- /**
- * Asserts that the specified first object is not {@link Object#equals(Object) equal to} the specified second object.
- *
- * @param <T>
- * @param argument The argument to assert equal to <code>object</code>.
- * @param argumentName The name that will be used within the exception message for the argument should an exception be thrown
- * @param object The object to assert as equal to <code>argument</code>.
- * @param objectName The name that will be used within the exception message for <code>object</code> should an exception be
- * thrown; if <code>null</code> and <code>object</code> is not <code>null</code>, <code>object.toString()</code> will
- * be used.
- * @throws IllegalArgumentException If the specified objects are equals.
- */
- public static <T> void isNotEquals( final T argument,
- String argumentName,
- final T object,
- String objectName ) {
- if (argument.equals(object)) {
- if (objectName == null) objectName = getObjectName(object);
- throw new IllegalArgumentException(CommonI18n.argumentMustNotBeEquals.text(argumentName, objectName));
- }
- }
-
- // ########################## ITERATOR METHODS ###################################
-
- /**
- * Checks that the iterator is not empty, and throws an exception if it is.
- *
- * @param argument the iterator to check
- * @param name The name of the argument
- * @throws IllegalArgumentException If iterator is empty (i.e., iterator.hasNext() returns false)
- */
- public static void isNotEmpty( Iterator<?> argument,
- String name ) {
- isNotNull(argument, name);
- if (!argument.hasNext()) {
- throw new IllegalArgumentException(CommonI18n.argumentMayNotBeEmpty.text(name));
- }
- }
-
- // ########################## COLLECTION METHODS ###################################
-
- /**
- * Check that the collection is not empty
- *
- * @param argument Collection
- * @param name The name of the argument
- * @throws IllegalArgumentException If collection is null or empty
- */
- public static void isNotEmpty( Collection<?> argument,
- String name ) {
- isNotNull(argument, name);
- if (argument.isEmpty()) {
- throw new IllegalArgumentException(CommonI18n.argumentMayNotBeEmpty.text(name));
- }
- }
-
- /**
- * Check that the map is not empty
- *
- * @param argument Map
- * @param name The name of the argument
- * @throws IllegalArgumentException If map is null or empty
- */
- public static void isNotEmpty( Map<?, ?> argument,
- String name ) {
- isNotNull(argument, name);
- if (argument.isEmpty()) {
- throw new IllegalArgumentException(CommonI18n.argumentMayNotBeEmpty.text(name));
- }
- }
-
- /**
- * Check that the array is not empty
- *
- * @param argument Array
- * @param name The name of the argument
- * @throws IllegalArgumentException If array is null or empty
- */
- public static void isNotEmpty( Object[] argument,
- String name ) {
- isNotNull(argument, name);
- if (argument.length == 0) {
- throw new IllegalArgumentException(CommonI18n.argumentMayNotBeEmpty.text(name));
- }
- }
-
- protected static String getObjectName( Object obj ) {
- return obj == null ? null : "'" + obj.toString() + "'";
- }
-
- /**
- * Check that the collection contains the value
- *
- * @param argument Collection to check
- * @param value Value to check for, may be null
- * @param name The name of the argument
- * @throws IllegalArgumentException If collection is null or doesn't contain value
- */
- public static void contains( Collection<?> argument,
- Object value,
- String name ) {
- isNotNull(argument, name);
- if (!argument.contains(value)) {
- throw new IllegalArgumentException(CommonI18n.argumentDidNotContainObject.text(name, getObjectName(value)));
- }
- }
-
- /**
- * Check that the map contains the key
- *
- * @param argument Map to check
- * @param key Key to check for, may be null
- * @param name The name of the argument
- * @throws IllegalArgumentException If map is null or doesn't contain key
- */
- public static void containsKey( Map<?, ?> argument,
- Object key,
- String name ) {
- isNotNull(argument, name);
- if (!argument.containsKey(key)) {
- throw new IllegalArgumentException(CommonI18n.argumentDidNotContainKey.text(name, getObjectName(key)));
- }
- }
-
- /**
- * Check that the collection is not null and contains no nulls
- *
- * @param argument Array
- * @param name The name of the argument
- * @throws IllegalArgumentException If array is null or has null values
- */
- public static void containsNoNulls( Iterable<?> argument,
- String name ) {
- isNotNull(argument, name);
- int i = 0;
- for (Object object : argument) {
- if (object == null) {
- throw new IllegalArgumentException(CommonI18n.argumentMayNotContainNullValue.text(name, i));
- }
- ++i;
- }
- }
-
- /**
- * Check that the array is not null and contains no nulls
- *
- * @param argument Array
- * @param name The name of the argument
- * @throws IllegalArgumentException If array is null or has null values
- */
- public static void containsNoNulls( Object[] argument,
- String name ) {
- isNotNull(argument, name);
- int i = 0;
- for (Object object : argument) {
- if (object == null) {
- throw new IllegalArgumentException(CommonI18n.argumentMayNotContainNullValue.text(name, i));
- }
- ++i;
- }
- }
-
- /**
- * Check that the collection contains at least the supplied number of elements
- *
- * @param argument Collection
- * @param minimumSize the minimum size
- * @param name The name of the argument
- * @throws IllegalArgumentException If collection has a size smaller than the supplied value
- */
- public static void hasSizeOfAtLeast( Collection<?> argument,
- int minimumSize,
- String name ) {
- isNotNull(argument, name);
- if (argument.size() < minimumSize) {
- throw new IllegalArgumentException(CommonI18n.argumentMustBeOfMinimumSize.text(name,
- Collection.class.getSimpleName(),
- argument.size(),
- minimumSize));
- }
- }
-
- /**
- * Check that the collection contains no more than the supplied number of elements
- *
- * @param argument Collection
- * @param maximumSize the maximum size
- * @param name The name of the argument
- * @throws IllegalArgumentException If collection has a size smaller than the supplied value
- */
- public static void hasSizeOfAtMost( Collection<?> argument,
- int maximumSize,
- String name ) {
- isNotNull(argument, name);
- if (argument.size() > maximumSize) {
- throw new IllegalArgumentException(CommonI18n.argumentMustBeOfMinimumSize.text(name,
- Collection.class.getSimpleName(),
- argument.size(),
- maximumSize));
- }
- }
-
- /**
- * Check that the map contains at least the supplied number of entries
- *
- * @param argument the map
- * @param minimumSize the minimum size
- * @param name The name of the argument
- * @throws IllegalArgumentException If the map has a size smaller than the supplied value
- */
- public static void hasSizeOfAtLeast( Map<?, ?> argument,
- int minimumSize,
- String name ) {
- isNotNull(argument, name);
- if (argument.size() < minimumSize) {
- throw new IllegalArgumentException(CommonI18n.argumentMustBeOfMinimumSize.text(name,
- Map.class.getSimpleName(),
- argument.size(),
- minimumSize));
- }
- }
-
- /**
- * Check that the map contains no more than the supplied number of entries
- *
- * @param argument the map
- * @param maximumSize the maximum size
- * @param name The name of the argument
- * @throws IllegalArgumentException If the map has a size smaller than the supplied value
- */
- public static void hasSizeOfAtMost( Map<?, ?> argument,
- int maximumSize,
- String name ) {
- isNotNull(argument, name);
- if (argument.size() > maximumSize) {
- throw new IllegalArgumentException(CommonI18n.argumentMustBeOfMinimumSize.text(name,
- Map.class.getSimpleName(),
- argument.size(),
- maximumSize));
- }
- }
-
- /**
- * Check that the array contains at least the supplied number of elements
- *
- * @param argument the array
- * @param minimumSize the minimum size
- * @param name The name of the argument
- * @throws IllegalArgumentException If the array has a size smaller than the supplied value
- */
- public static void hasSizeOfAtLeast( Object[] argument,
- int minimumSize,
- String name ) {
- isNotNull(argument, name);
- if (argument.length < minimumSize) {
- throw new IllegalArgumentException(CommonI18n.argumentMustBeOfMinimumSize.text(name,
- Object[].class.getSimpleName(),
- argument.length,
- minimumSize));
- }
- }
-
- /**
- * Check that the array contains no more than the supplied number of elements
- *
- * @param argument the array
- * @param maximumSize the maximum size
- * @param name The name of the argument
- * @throws IllegalArgumentException If the array has a size smaller than the supplied value
- */
- public static void hasSizeOfAtMost( Object[] argument,
- int maximumSize,
- String name ) {
- isNotNull(argument, name);
- if (argument.length > maximumSize) {
- throw new IllegalArgumentException(CommonI18n.argumentMustBeOfMinimumSize.text(name,
- Object[].class.getSimpleName(),
- argument.length,
- maximumSize));
- }
- }
-
- private ArgCheck() {
- // prevent construction
- }
-}
Copied: trunk/dna-common/src/main/java/org/jboss/dna/common/util/CheckArg.java (from rev 532, trunk/dna-common/src/main/java/org/jboss/dna/common/util/ArgCheck.java)
===================================================================
--- trunk/dna-common/src/main/java/org/jboss/dna/common/util/CheckArg.java (rev 0)
+++ trunk/dna-common/src/main/java/org/jboss/dna/common/util/CheckArg.java 2008-09-18 18:12:00 UTC (rev 535)
@@ -0,0 +1,788 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dna.common.util;
+
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.Map;
+import org.jboss.dna.common.CommonI18n;
+
+/**
+ * Utility class that checks arguments to methods. This class is to be used only in API methods, where failure to supply correct
+ * arguments should result in a useful error message. In all cases, use the <code>assert</code> statement.
+ */
+public final class CheckArg {
+
+ // ########################## int METHODS ###################################
+
+ /**
+ * Check that the argument is not less than the supplied value
+ *
+ * @param argument The argument
+ * @param notLessThanValue the value that is to be used to check the value
+ * @param name The name of the argument
+ * @throws IllegalArgumentException If argument greater than or equal to the supplied vlaue
+ */
+ public static void isNotLessThan( int argument,
+ int notLessThanValue,
+ String name ) {
+ if (argument < notLessThanValue) {
+ throw new IllegalArgumentException(CommonI18n.argumentMayNotBeLessThan.text(name, argument, notLessThanValue));
+ }
+ }
+
+ /**
+ * Check that the argument is not greater than the supplied value
+ *
+ * @param argument The argument
+ * @param notGreaterThanValue the value that is to be used to check the value
+ * @param name The name of the argument
+ * @throws IllegalArgumentException If argument is less than or equal to the supplied value
+ */
+ public static void isNotGreaterThan( int argument,
+ int notGreaterThanValue,
+ String name ) {
+ if (argument > notGreaterThanValue) {
+ throw new IllegalArgumentException(CommonI18n.argumentMayNotBeGreaterThan.text(name, argument, notGreaterThanValue));
+ }
+ }
+
+ /**
+ * Check that the argument is greater than the supplied value
+ *
+ * @param argument The argument
+ * @param greaterThanValue the value that is to be used to check the value
+ * @param name The name of the argument
+ * @throws IllegalArgumentException If argument is not greater than the supplied value
+ */
+ public static void isGreaterThan( int argument,
+ int greaterThanValue,
+ String name ) {
+ if (argument <= greaterThanValue) {
+ throw new IllegalArgumentException(CommonI18n.argumentMustBeGreaterThan.text(name, argument, greaterThanValue));
+ }
+ }
+
+ /**
+ * Check that the argument is less than the supplied value
+ *
+ * @param argument The argument
+ * @param lessThanValue the value that is to be used to check the value
+ * @param name The name of the argument
+ * @throws IllegalArgumentException If argument is not less than the supplied value
+ */
+ public static void isLessThan( int argument,
+ int lessThanValue,
+ String name ) {
+ if (argument >= lessThanValue) {
+ throw new IllegalArgumentException(CommonI18n.argumentMustBeLessThan.text(name, argument, lessThanValue));
+ }
+ }
+
+ /**
+ * Check that the argument is greater than or equal to the supplied value
+ *
+ * @param argument The argument
+ * @param greaterThanOrEqualToValue the value that is to be used to check the value
+ * @param name The name of the argument
+ * @throws IllegalArgumentException If argument is not greater than or equal to the supplied value
+ */
+ public static void isGreaterThanOrEqualTo( int argument,
+ int greaterThanOrEqualToValue,
+ String name ) {
+ if (argument < greaterThanOrEqualToValue) {
+ throw new IllegalArgumentException(CommonI18n.argumentMustBeGreaterThanOrEqualTo.text(name,
+ argument,
+ greaterThanOrEqualToValue));
+ }
+ }
+
+ /**
+ * Check that the argument is less than or equal to the supplied value
+ *
+ * @param argument The argument
+ * @param lessThanOrEqualToValue the value that is to be used to check the value
+ * @param name The name of the argument
+ * @throws IllegalArgumentException If argument is not less than or equal to the supplied value
+ */
+ public static void isLessThanOrEqualTo( int argument,
+ int lessThanOrEqualToValue,
+ String name ) {
+ if (argument > lessThanOrEqualToValue) {
+ throw new IllegalArgumentException(CommonI18n.argumentMustBeLessThanOrEqualTo.text(name,
+ argument,
+ lessThanOrEqualToValue));
+ }
+ }
+
+ /**
+ * Check that the argument is non-negative (>=0).
+ *
+ * @param argument The argument
+ * @param name The name of the argument
+ * @throws IllegalArgumentException If argument is negative (<0)
+ */
+ public static void isNonNegative( int argument,
+ String name ) {
+ if (argument < 0) {
+ throw new IllegalArgumentException(CommonI18n.argumentMayNotBeNegative.text(name, argument));
+ }
+ }
+
+ /**
+ * Check that the argument is non-positive (<=0).
+ *
+ * @param argument The argument
+ * @param name The name of the argument
+ * @throws IllegalArgumentException If argument is positive (>0)
+ */
+ public static void isNonPositive( int argument,
+ String name ) {
+ if (argument > 0) {
+ throw new IllegalArgumentException(CommonI18n.argumentMayNotBePositive.text(name, argument));
+ }
+ }
+
+ /**
+ * Check that the argument is negative (<0).
+ *
+ * @param argument The argument
+ * @param name The name of the argument
+ * @throws IllegalArgumentException If argument is non-negative (>=0)
+ */
+ public static void isNegative( int argument,
+ String name ) {
+ if (argument >= 0) {
+ throw new IllegalArgumentException(CommonI18n.argumentMustBeNegative.text(name, argument));
+ }
+ }
+
+ /**
+ * Check that the argument is positive (>0).
+ *
+ * @param argument The argument
+ * @param name The name of the argument
+ * @throws IllegalArgumentException If argument is non-positive (<=0)
+ */
+ public static void isPositive( int argument,
+ String name ) {
+ if (argument <= 0) {
+ throw new IllegalArgumentException(CommonI18n.argumentMustBePositive.text(name, argument));
+ }
+ }
+
+ // ########################## long METHODS ###################################
+
+ /**
+ * Check that the argument is non-negative (>=0).
+ *
+ * @param argument The argument
+ * @param name The name of the argument
+ * @throws IllegalArgumentException If argument is negative (<0)
+ */
+ public static void isNonNegative( long argument,
+ String name ) {
+ if (argument < 0) {
+ throw new IllegalArgumentException(CommonI18n.argumentMayNotBeNegative.text(name, argument));
+ }
+ }
+
+ /**
+ * Check that the argument is non-positive (<=0).
+ *
+ * @param argument The argument
+ * @param name The name of the argument
+ * @throws IllegalArgumentException If argument is positive (>0)
+ */
+ public static void isNonPositive( long argument,
+ String name ) {
+ if (argument > 0) {
+ throw new IllegalArgumentException(CommonI18n.argumentMayNotBePositive.text(name, argument));
+ }
+ }
+
+ /**
+ * Check that the argument is negative (<0).
+ *
+ * @param argument The argument
+ * @param name The name of the argument
+ * @throws IllegalArgumentException If argument is non-negative (>=0)
+ */
+ public static void isNegative( long argument,
+ String name ) {
+ if (argument >= 0) {
+ throw new IllegalArgumentException(CommonI18n.argumentMustBeNegative.text(name, argument));
+ }
+ }
+
+ /**
+ * Check that the argument is positive (>0).
+ *
+ * @param argument The argument
+ * @param name The name of the argument
+ * @throws IllegalArgumentException If argument is non-positive (<=0)
+ */
+ public static void isPositive( long argument,
+ String name ) {
+ if (argument <= 0) {
+ throw new IllegalArgumentException(CommonI18n.argumentMustBePositive.text(name, argument));
+ }
+ }
+
+ // ########################## double METHODS ###################################
+
+ /**
+ * Check that the argument is non-negative (>=0).
+ *
+ * @param argument The argument
+ * @param name The name of the argument
+ * @throws IllegalArgumentException If argument is negative (<0)
+ */
+ public static void isNonNegative( double argument,
+ String name ) {
+ if (argument < 0.0) {
+ throw new IllegalArgumentException(CommonI18n.argumentMayNotBeNegative.text(name, argument));
+ }
+ }
+
+ /**
+ * Check that the argument is non-positive (<=0).
+ *
+ * @param argument The argument
+ * @param name The name of the argument
+ * @throws IllegalArgumentException If argument is positive (>0)
+ */
+ public static void isNonPositive( double argument,
+ String name ) {
+ if (argument > 0.0) {
+ throw new IllegalArgumentException(CommonI18n.argumentMayNotBePositive.text(name, argument));
+ }
+ }
+
+ /**
+ * Check that the argument is negative (<0).
+ *
+ * @param argument The argument
+ * @param name The name of the argument
+ * @throws IllegalArgumentException If argument is non-negative (>=0)
+ */
+ public static void isNegative( double argument,
+ String name ) {
+ if (argument >= 0.0) {
+ throw new IllegalArgumentException(CommonI18n.argumentMustBeNegative.text(name, argument));
+ }
+ }
+
+ /**
+ * Check that the argument is positive (>0).
+ *
+ * @param argument The argument
+ * @param name The name of the argument
+ * @throws IllegalArgumentException If argument is non-positive (<=0)
+ */
+ public static void isPositive( double argument,
+ String name ) {
+ if (argument <= 0.0) {
+ throw new IllegalArgumentException(CommonI18n.argumentMustBePositive.text(name, argument));
+ }
+ }
+
+ /**
+ * Check that the argument is not NaN.
+ *
+ * @param argument The argument
+ * @param name The name of the argument
+ * @throws IllegalArgumentException If argument is NaN
+ */
+ public static void isNotNan( double argument,
+ String name ) {
+ if (Double.isNaN(argument)) {
+ throw new IllegalArgumentException(CommonI18n.argumentMustBeNumber.text(name));
+ }
+ }
+
+ // ########################## String METHODS ###################################
+
+ /**
+ * Check that the string is non-null and has length > 0
+ *
+ * @param argument The argument
+ * @param name The name of the argument
+ * @throws IllegalArgumentException If value is null or length == 0
+ */
+ public static void isNotZeroLength( String argument,
+ String name ) {
+ isNotNull(argument, name);
+ if (argument.length() <= 0) {
+ throw new IllegalArgumentException(CommonI18n.argumentMayNotBeNullOrZeroLength.text(name));
+ }
+ }
+
+ /**
+ * Check that the string is not empty, is not null, and does not contain only whitespace.
+ *
+ * @param argument String
+ * @param name The name of the argument
+ * @throws IllegalArgumentException If string is null or empty
+ */
+ public static void isNotEmpty( String argument,
+ String name ) {
+ isNotZeroLength(argument, name);
+ if (argument != null && argument.trim().length() == 0) {
+ throw new IllegalArgumentException(CommonI18n.argumentMayNotBeNullOrZeroLengthOrEmpty.text(name));
+ }
+ }
+
+ // ########################## Object METHODS ###################################
+
+ /**
+ * Check that the specified argument is non-null
+ *
+ * @param argument The argument
+ * @param name The name of the argument
+ * @throws IllegalArgumentException If argument is null
+ */
+ public static void isNotNull( Object argument,
+ String name ) {
+ if (argument == null) {
+ throw new IllegalArgumentException(CommonI18n.argumentMayNotBeNull.text(name));
+ }
+ }
+
+ /**
+ * Returns the specified argument if it is not <code>null</code>.
+ *
+ * @param <T>
+ * @param argument The argument
+ * @param name The name of the argument
+ * @return The argument
+ * @throws IllegalArgumentException If argument is <code>null</code>
+ */
+ public static <T> T getNotNull( T argument,
+ String name ) {
+ isNotNull(argument, name);
+ return argument;
+ }
+
+ /**
+ * Check that the argument is null
+ *
+ * @param argument The argument
+ * @param name The name of the argument
+ * @throws IllegalArgumentException If value is non-null
+ */
+ public static void isNull( Object argument,
+ String name ) {
+ if (argument != null) {
+ throw new IllegalArgumentException(CommonI18n.argumentMustBeNull.text(name));
+ }
+ }
+
+ /**
+ * Check that the object is an instance of the specified Class
+ *
+ * @param argument Value
+ * @param expectedClass Class
+ * @param name The name of the argument
+ * @throws IllegalArgumentException If value is null
+ */
+ public static void isInstanceOf( Object argument,
+ Class<?> expectedClass,
+ String name ) {
+ isNotNull(argument, name);
+ if (!expectedClass.isInstance(argument)) {
+ throw new IllegalArgumentException(CommonI18n.argumentMustBeInstanceOf.text(name,
+ argument.getClass(),
+ expectedClass.getName()));
+ }
+ }
+
+ /**
+ * Checks that the object is an instance of the specified Class and then returns the object cast to the specified Class
+ *
+ * @param <C> the class type
+ * @param argument Value
+ * @param expectedClass Class
+ * @param name The name of the argument
+ * @return value cast to the specified Class
+ * @throws IllegalArgumentException If value is not an instance of theClass.
+ */
+ // due to cast in return
+ public static <C> C getInstanceOf( Object argument,
+ Class<C> expectedClass,
+ String name ) {
+ isInstanceOf(argument, expectedClass, name);
+ return expectedClass.cast(argument);
+ }
+
+ /**
+ * Asserts that the specified first object is the same as (==) the specified second object.
+ *
+ * @param <T>
+ * @param argument The argument to assert as the same as <code>object</code>.
+ * @param argumentName The name that will be used within the exception message for the argument should an exception be thrown
+ * @param object The object to assert as the same as <code>argument</code>.
+ * @param objectName The name that will be used within the exception message for <code>object</code> should an exception be
+ * thrown; if <code>null</code> and <code>object</code> is not <code>null</code>, <code>object.toString()</code> will
+ * be used.
+ * @throws IllegalArgumentException If the specified objects are not the same.
+ */
+ public static <T> void isSame( final T argument,
+ String argumentName,
+ final T object,
+ String objectName ) {
+ if (argument != object) {
+ if (objectName == null) objectName = getObjectName(object);
+ throw new IllegalArgumentException(CommonI18n.argumentMustBeSameAs.text(argumentName, objectName));
+ }
+ }
+
+ /**
+ * Asserts that the specified first object is not the same as (==) the specified second object.
+ *
+ * @param <T>
+ * @param argument The argument to assert as not the same as <code>object</code>.
+ * @param argumentName The name that will be used within the exception message for the argument should an exception be thrown
+ * @param object The object to assert as not the same as <code>argument</code>.
+ * @param objectName The name that will be used within the exception message for <code>object</code> should an exception be
+ * thrown; if <code>null</code> and <code>object</code> is not <code>null</code>, <code>object.toString()</code> will
+ * be used.
+ * @throws IllegalArgumentException If the specified objects are the same.
+ */
+ public static <T> void isNotSame( final T argument,
+ String argumentName,
+ final T object,
+ String objectName ) {
+ if (argument == object) {
+ if (objectName == null) objectName = getObjectName(object);
+ throw new IllegalArgumentException(CommonI18n.argumentMustNotBeSameAs.text(argumentName, objectName));
+ }
+ }
+
+ /**
+ * Asserts that the specified first object is {@link Object#equals(Object) equal to} the specified second object.
+ *
+ * @param <T>
+ * @param argument The argument to assert equal to <code>object</code>.
+ * @param argumentName The name that will be used within the exception message for the argument should an exception be thrown
+ * @param object The object to assert as equal to <code>argument</code>.
+ * @param objectName The name that will be used within the exception message for <code>object</code> should an exception be
+ * thrown; if <code>null</code> and <code>object</code> is not <code>null</code>, <code>object.toString()</code> will
+ * be used.
+ * @throws IllegalArgumentException If the specified objects are not equal.
+ */
+ public static <T> void isEquals( final T argument,
+ String argumentName,
+ final T object,
+ String objectName ) {
+ if (!argument.equals(object)) {
+ if (objectName == null) objectName = getObjectName(object);
+ throw new IllegalArgumentException(CommonI18n.argumentMustBeEquals.text(argumentName, objectName));
+ }
+ }
+
+ /**
+ * Asserts that the specified first object is not {@link Object#equals(Object) equal to} the specified second object.
+ *
+ * @param <T>
+ * @param argument The argument to assert equal to <code>object</code>.
+ * @param argumentName The name that will be used within the exception message for the argument should an exception be thrown
+ * @param object The object to assert as equal to <code>argument</code>.
+ * @param objectName The name that will be used within the exception message for <code>object</code> should an exception be
+ * thrown; if <code>null</code> and <code>object</code> is not <code>null</code>, <code>object.toString()</code> will
+ * be used.
+ * @throws IllegalArgumentException If the specified objects are equals.
+ */
+ public static <T> void isNotEquals( final T argument,
+ String argumentName,
+ final T object,
+ String objectName ) {
+ if (argument.equals(object)) {
+ if (objectName == null) objectName = getObjectName(object);
+ throw new IllegalArgumentException(CommonI18n.argumentMustNotBeEquals.text(argumentName, objectName));
+ }
+ }
+
+ // ########################## ITERATOR METHODS ###################################
+
+ /**
+ * Checks that the iterator is not empty, and throws an exception if it is.
+ *
+ * @param argument the iterator to check
+ * @param name The name of the argument
+ * @throws IllegalArgumentException If iterator is empty (i.e., iterator.hasNext() returns false)
+ */
+ public static void isNotEmpty( Iterator<?> argument,
+ String name ) {
+ isNotNull(argument, name);
+ if (!argument.hasNext()) {
+ throw new IllegalArgumentException(CommonI18n.argumentMayNotBeEmpty.text(name));
+ }
+ }
+
+ // ########################## COLLECTION METHODS ###################################
+
+ /**
+ * Check that the collection is not empty
+ *
+ * @param argument Collection
+ * @param name The name of the argument
+ * @throws IllegalArgumentException If collection is null or empty
+ */
+ public static void isNotEmpty( Collection<?> argument,
+ String name ) {
+ isNotNull(argument, name);
+ if (argument.isEmpty()) {
+ throw new IllegalArgumentException(CommonI18n.argumentMayNotBeEmpty.text(name));
+ }
+ }
+
+ /**
+ * Check that the map is not empty
+ *
+ * @param argument Map
+ * @param name The name of the argument
+ * @throws IllegalArgumentException If map is null or empty
+ */
+ public static void isNotEmpty( Map<?, ?> argument,
+ String name ) {
+ isNotNull(argument, name);
+ if (argument.isEmpty()) {
+ throw new IllegalArgumentException(CommonI18n.argumentMayNotBeEmpty.text(name));
+ }
+ }
+
+ /**
+ * Check that the array is not empty
+ *
+ * @param argument Array
+ * @param name The name of the argument
+ * @throws IllegalArgumentException If array is null or empty
+ */
+ public static void isNotEmpty( Object[] argument,
+ String name ) {
+ isNotNull(argument, name);
+ if (argument.length == 0) {
+ throw new IllegalArgumentException(CommonI18n.argumentMayNotBeEmpty.text(name));
+ }
+ }
+
+ protected static String getObjectName( Object obj ) {
+ return obj == null ? null : "'" + obj.toString() + "'";
+ }
+
+ /**
+ * Check that the collection contains the value
+ *
+ * @param argument Collection to check
+ * @param value Value to check for, may be null
+ * @param name The name of the argument
+ * @throws IllegalArgumentException If collection is null or doesn't contain value
+ */
+ public static void contains( Collection<?> argument,
+ Object value,
+ String name ) {
+ isNotNull(argument, name);
+ if (!argument.contains(value)) {
+ throw new IllegalArgumentException(CommonI18n.argumentDidNotContainObject.text(name, getObjectName(value)));
+ }
+ }
+
+ /**
+ * Check that the map contains the key
+ *
+ * @param argument Map to check
+ * @param key Key to check for, may be null
+ * @param name The name of the argument
+ * @throws IllegalArgumentException If map is null or doesn't contain key
+ */
+ public static void containsKey( Map<?, ?> argument,
+ Object key,
+ String name ) {
+ isNotNull(argument, name);
+ if (!argument.containsKey(key)) {
+ throw new IllegalArgumentException(CommonI18n.argumentDidNotContainKey.text(name, getObjectName(key)));
+ }
+ }
+
+ /**
+ * Check that the collection is not null and contains no nulls
+ *
+ * @param argument Array
+ * @param name The name of the argument
+ * @throws IllegalArgumentException If array is null or has null values
+ */
+ public static void containsNoNulls( Iterable<?> argument,
+ String name ) {
+ isNotNull(argument, name);
+ int i = 0;
+ for (Object object : argument) {
+ if (object == null) {
+ throw new IllegalArgumentException(CommonI18n.argumentMayNotContainNullValue.text(name, i));
+ }
+ ++i;
+ }
+ }
+
+ /**
+ * Check that the array is not null and contains no nulls
+ *
+ * @param argument Array
+ * @param name The name of the argument
+ * @throws IllegalArgumentException If array is null or has null values
+ */
+ public static void containsNoNulls( Object[] argument,
+ String name ) {
+ isNotNull(argument, name);
+ int i = 0;
+ for (Object object : argument) {
+ if (object == null) {
+ throw new IllegalArgumentException(CommonI18n.argumentMayNotContainNullValue.text(name, i));
+ }
+ ++i;
+ }
+ }
+
+ /**
+ * Check that the collection contains at least the supplied number of elements
+ *
+ * @param argument Collection
+ * @param minimumSize the minimum size
+ * @param name The name of the argument
+ * @throws IllegalArgumentException If collection has a size smaller than the supplied value
+ */
+ public static void hasSizeOfAtLeast( Collection<?> argument,
+ int minimumSize,
+ String name ) {
+ isNotNull(argument, name);
+ if (argument.size() < minimumSize) {
+ throw new IllegalArgumentException(CommonI18n.argumentMustBeOfMinimumSize.text(name,
+ Collection.class.getSimpleName(),
+ argument.size(),
+ minimumSize));
+ }
+ }
+
+ /**
+ * Check that the collection contains no more than the supplied number of elements
+ *
+ * @param argument Collection
+ * @param maximumSize the maximum size
+ * @param name The name of the argument
+ * @throws IllegalArgumentException If collection has a size smaller than the supplied value
+ */
+ public static void hasSizeOfAtMost( Collection<?> argument,
+ int maximumSize,
+ String name ) {
+ isNotNull(argument, name);
+ if (argument.size() > maximumSize) {
+ throw new IllegalArgumentException(CommonI18n.argumentMustBeOfMinimumSize.text(name,
+ Collection.class.getSimpleName(),
+ argument.size(),
+ maximumSize));
+ }
+ }
+
+ /**
+ * Check that the map contains at least the supplied number of entries
+ *
+ * @param argument the map
+ * @param minimumSize the minimum size
+ * @param name The name of the argument
+ * @throws IllegalArgumentException If the map has a size smaller than the supplied value
+ */
+ public static void hasSizeOfAtLeast( Map<?, ?> argument,
+ int minimumSize,
+ String name ) {
+ isNotNull(argument, name);
+ if (argument.size() < minimumSize) {
+ throw new IllegalArgumentException(CommonI18n.argumentMustBeOfMinimumSize.text(name,
+ Map.class.getSimpleName(),
+ argument.size(),
+ minimumSize));
+ }
+ }
+
+ /**
+ * Check that the map contains no more than the supplied number of entries
+ *
+ * @param argument the map
+ * @param maximumSize the maximum size
+ * @param name The name of the argument
+ * @throws IllegalArgumentException If the map has a size smaller than the supplied value
+ */
+ public static void hasSizeOfAtMost( Map<?, ?> argument,
+ int maximumSize,
+ String name ) {
+ isNotNull(argument, name);
+ if (argument.size() > maximumSize) {
+ throw new IllegalArgumentException(CommonI18n.argumentMustBeOfMinimumSize.text(name,
+ Map.class.getSimpleName(),
+ argument.size(),
+ maximumSize));
+ }
+ }
+
+ /**
+ * Check that the array contains at least the supplied number of elements
+ *
+ * @param argument the array
+ * @param minimumSize the minimum size
+ * @param name The name of the argument
+ * @throws IllegalArgumentException If the array has a size smaller than the supplied value
+ */
+ public static void hasSizeOfAtLeast( Object[] argument,
+ int minimumSize,
+ String name ) {
+ isNotNull(argument, name);
+ if (argument.length < minimumSize) {
+ throw new IllegalArgumentException(CommonI18n.argumentMustBeOfMinimumSize.text(name,
+ Object[].class.getSimpleName(),
+ argument.length,
+ minimumSize));
+ }
+ }
+
+ /**
+ * Check that the array contains no more than the supplied number of elements
+ *
+ * @param argument the array
+ * @param maximumSize the maximum size
+ * @param name The name of the argument
+ * @throws IllegalArgumentException If the array has a size smaller than the supplied value
+ */
+ public static void hasSizeOfAtMost( Object[] argument,
+ int maximumSize,
+ String name ) {
+ isNotNull(argument, name);
+ if (argument.length > maximumSize) {
+ throw new IllegalArgumentException(CommonI18n.argumentMustBeOfMinimumSize.text(name,
+ Object[].class.getSimpleName(),
+ argument.length,
+ maximumSize));
+ }
+ }
+
+ private CheckArg() {
+ // prevent construction
+ }
+}
Modified: trunk/dna-common/src/main/java/org/jboss/dna/common/util/FileUtil.java
===================================================================
--- trunk/dna-common/src/main/java/org/jboss/dna/common/util/FileUtil.java 2008-09-18 18:00:04 UTC (rev 534)
+++ trunk/dna-common/src/main/java/org/jboss/dna/common/util/FileUtil.java 2008-09-18 18:12:00 UTC (rev 535)
@@ -71,7 +71,7 @@
* @throws IllegalArgumentException if the file path is null, empty or blank
*/
public static URL convertFileToURL( String filePath ) throws MalformedURLException {
- ArgCheck.isNotEmpty(filePath, "filePath");
+ CheckArg.isNotEmpty(filePath, "filePath");
File file = new File(filePath.trim());
return file.toURI().toURL();
}
Modified: trunk/dna-common/src/main/java/org/jboss/dna/common/util/IoUtil.java
===================================================================
--- trunk/dna-common/src/main/java/org/jboss/dna/common/util/IoUtil.java 2008-09-18 18:00:04 UTC (rev 534)
+++ trunk/dna-common/src/main/java/org/jboss/dna/common/util/IoUtil.java 2008-09-18 18:12:00 UTC (rev 535)
@@ -99,7 +99,7 @@
* @throws IllegalArgumentException if the stream is null
*/
public static void write( String content, OutputStream stream ) throws IOException {
- ArgCheck.isNotNull(stream, "destination stream");
+ CheckArg.isNotNull(stream, "destination stream");
try {
if (content != null) {
byte[] bytes = content.getBytes();
@@ -123,7 +123,7 @@
* @throws IllegalArgumentException if the writer is null
*/
public static void write( String content, Writer writer ) throws IOException {
- ArgCheck.isNotNull(writer, "destination writer");
+ CheckArg.isNotNull(writer, "destination writer");
try {
if (content != null) {
writer.write(content);
@@ -146,7 +146,7 @@
* @throws IllegalArgumentException if the stream is null
*/
public static void write( InputStream input, OutputStream stream ) throws IOException {
- ArgCheck.isNotNull(stream, "destination stream");
+ CheckArg.isNotNull(stream, "destination stream");
try {
if (input != null) {
byte[] buffer = new byte[1024];
@@ -177,7 +177,7 @@
* @throws IllegalArgumentException if the writer is null
*/
public static void write( Reader input, Writer writer ) throws IOException {
- ArgCheck.isNotNull(writer, "destination writer");
+ CheckArg.isNotNull(writer, "destination writer");
try {
if (input != null) {
char[] buffer = new char[1024];
Modified: trunk/dna-common/src/main/java/org/jboss/dna/common/util/Reflection.java
===================================================================
--- trunk/dna-common/src/main/java/org/jboss/dna/common/util/Reflection.java 2008-09-18 18:00:04 UTC (rev 534)
+++ trunk/dna-common/src/main/java/org/jboss/dna/common/util/Reflection.java 2008-09-18 18:12:00 UTC (rev 535)
@@ -205,7 +205,7 @@
* @throws IllegalArgumentException if the target class is null
*/
public Reflection( Class<?> targetClass ) {
- ArgCheck.isNotNull(targetClass, "targetClass");
+ CheckArg.isNotNull(targetClass, "targetClass");
this.targetClass = targetClass;
}
Modified: trunk/dna-common/src/main/java/org/jboss/dna/common/util/StringUtil.java
===================================================================
--- trunk/dna-common/src/main/java/org/jboss/dna/common/util/StringUtil.java 2008-09-18 18:00:04 UTC (rev 534)
+++ trunk/dna-common/src/main/java/org/jboss/dna/common/util/StringUtil.java 2008-09-18 18:12:00 UTC (rev 535)
@@ -79,7 +79,7 @@
*/
public static String createString( String pattern,
Object... parameters ) {
- ArgCheck.isNotNull(pattern, "pattern");
+ CheckArg.isNotNull(pattern, "pattern");
if (parameters == null) parameters = EMPTY_STRING_ARRAY;
Matcher matcher = PARAMETER_COUNT_PATTERN.matcher(pattern);
StringBuffer text = new StringBuffer();
@@ -306,7 +306,7 @@
public static String truncate( Object obj,
int maxLength,
String suffix ) {
- ArgCheck.isNonNegative(maxLength, "maxLength");
+ CheckArg.isNonNegative(maxLength, "maxLength");
if (obj == null || maxLength == 0) {
return "";
}
@@ -644,7 +644,7 @@
* @return the normalized text
*/
public static String normalize( String text ) {
- ArgCheck.isNotNull(text, "text");
+ CheckArg.isNotNull(text, "text");
// This could be much more efficient.
return NORMALIZE_PATTERN.matcher(text).replaceAll(" ").trim();
}
Modified: trunk/dna-common/src/test/java/org/jboss/dna/common/util/ArgCheckTest.java
===================================================================
--- trunk/dna-common/src/test/java/org/jboss/dna/common/util/ArgCheckTest.java 2008-09-18 18:00:04 UTC (rev 534)
+++ trunk/dna-common/src/test/java/org/jboss/dna/common/util/ArgCheckTest.java 2008-09-18 18:12:00 UTC (rev 535)
@@ -36,174 +36,174 @@
@Test
public void isNonNegativeShouldNotThrowExceptionIfPositiveNumber() {
- ArgCheck.isNonNegative(1, "test");
+ CheckArg.isNonNegative(1, "test");
}
@Test
public void isNonNegativeShouldNotThrowExceptionIfZero() {
- ArgCheck.isNonNegative(0, "test");
+ CheckArg.isNonNegative(0, "test");
}
@Test( expected = IllegalArgumentException.class )
public void isNonNegativeShouldThrowExceptionIfNegative() {
- ArgCheck.isNonNegative(-1, "test");
+ CheckArg.isNonNegative(-1, "test");
}
@Test
public void isNonPositiveShouldNotThrowExceptionIfNegativeNumber() {
- ArgCheck.isNonPositive(-1, "test");
+ CheckArg.isNonPositive(-1, "test");
}
@Test
public void isNonPositiveShouldNotThrowExceptionIfZero() {
- ArgCheck.isNonPositive(0, "test");
+ CheckArg.isNonPositive(0, "test");
}
@Test( expected = IllegalArgumentException.class )
public void isNonPositiveShouldThrowExceptionIfPositive() {
- ArgCheck.isNonPositive(1, "test");
+ CheckArg.isNonPositive(1, "test");
}
@Test
public void isNegativeShouldNotThrowExceptionIfNegativeNumber() {
- ArgCheck.isNegative(-1, "test");
+ CheckArg.isNegative(-1, "test");
}
@Test( expected = IllegalArgumentException.class )
public void isNegativeShouldThrowExceptionIfZero() {
- ArgCheck.isNegative(0, "test");
+ CheckArg.isNegative(0, "test");
}
@Test( expected = IllegalArgumentException.class )
public void isNegativeShouldThrowExceptionIfPositive() {
- ArgCheck.isNegative(1, "test");
+ CheckArg.isNegative(1, "test");
}
@Test
public void isPositiveShouldNotThrowExceptionIfPositiveNumber() {
- ArgCheck.isPositive(1, "test");
+ CheckArg.isPositive(1, "test");
}
@Test( expected = IllegalArgumentException.class )
public void isPositiveShouldThrowExceptionIfZero() {
- ArgCheck.isPositive(0, "test");
+ CheckArg.isPositive(0, "test");
}
@Test( expected = IllegalArgumentException.class )
public void isPositiveShouldThrowExceptionIfNegative() {
- ArgCheck.isPositive(-1, "test");
+ CheckArg.isPositive(-1, "test");
}
@Test
public void isNonNegativeLongShouldNotThrowExceptionIfPositiveNumber() {
- ArgCheck.isNonNegative(1l, "test");
+ CheckArg.isNonNegative(1l, "test");
}
@Test
public void isNonNegativeLongShouldNotThrowExceptionIfZero() {
- ArgCheck.isNonNegative(0l, "test");
+ CheckArg.isNonNegative(0l, "test");
}
@Test( expected = IllegalArgumentException.class )
public void isNonNegativeLongShouldThrowExceptionIfNegative() {
- ArgCheck.isNonNegative(-1l, "test");
+ CheckArg.isNonNegative(-1l, "test");
}
@Test
public void isNonPositiveLongShouldNotThrowExceptionIfNegativeNumber() {
- ArgCheck.isNonPositive(-1l, "test");
+ CheckArg.isNonPositive(-1l, "test");
}
@Test
public void isNonPositiveLongShouldNotThrowExceptionIfZero() {
- ArgCheck.isNonPositive(0l, "test");
+ CheckArg.isNonPositive(0l, "test");
}
@Test( expected = IllegalArgumentException.class )
public void isNonPositiveLongShouldThrowExceptionIfPositive() {
- ArgCheck.isNonPositive(1l, "test");
+ CheckArg.isNonPositive(1l, "test");
}
@Test
public void isNegativeLongShouldNotThrowExceptionIfNegativeNumber() {
- ArgCheck.isNegative(-1l, "test");
+ CheckArg.isNegative(-1l, "test");
}
@Test( expected = IllegalArgumentException.class )
public void isNegativeLongShouldThrowExceptionIfZero() {
- ArgCheck.isNegative(0l, "test");
+ CheckArg.isNegative(0l, "test");
}
@Test( expected = IllegalArgumentException.class )
public void isNegativeLongShouldThrowExceptionIfPositive() {
- ArgCheck.isNegative(1l, "test");
+ CheckArg.isNegative(1l, "test");
}
@Test
public void isPositiveLongShouldNotThrowExceptionIfPositiveNumber() {
- ArgCheck.isPositive(1l, "test");
+ CheckArg.isPositive(1l, "test");
}
@Test( expected = IllegalArgumentException.class )
public void isPositiveLongShouldThrowExceptionIfZero() {
- ArgCheck.isPositive(0l, "test");
+ CheckArg.isPositive(0l, "test");
}
@Test( expected = IllegalArgumentException.class )
public void isPositiveLongShouldThrowExceptionIfNegative() {
- ArgCheck.isPositive(-1l, "test");
+ CheckArg.isPositive(-1l, "test");
}
@Test
public void isNotEmptyStringShouldNotThrowExceptionIfGivenStringWithAtLeastOneCharacter() {
- ArgCheck.isNotEmpty("a string", "test");
+ CheckArg.isNotEmpty("a string", "test");
}
@Test( expected = IllegalArgumentException.class )
public void isNotEmptyStringShouldThrowExceptionIfGivenNullString() {
- ArgCheck.isNotEmpty((String)null, "test");
+ CheckArg.isNotEmpty((String)null, "test");
}
@Test( expected = IllegalArgumentException.class )
public void isNotEmptyStringShouldThrowExceptionIfGivenEmptyString() {
- ArgCheck.isNotEmpty("", "test");
+ CheckArg.isNotEmpty("", "test");
}
@Test( expected = IllegalArgumentException.class )
public void isNotEmptyStringShouldThrowExceptionIfGivenStringWithOnlyWhitespace() {
- ArgCheck.isNotEmpty("\t\t ", "test");
+ CheckArg.isNotEmpty("\t\t ", "test");
}
@Test
public void isNotZeroLengthShouldNotThrowExceptionIfGivenAStringOneCharacterOrLonger() {
- ArgCheck.isNotZeroLength("a", "test");
+ CheckArg.isNotZeroLength("a", "test");
}
@Test
public void isNotZeroLengthShouldNotThrowExceptionIfGivenAStringWithOnlyWhitespace() {
- ArgCheck.isNotZeroLength(" ", "test");
- ArgCheck.isNotZeroLength("\t\t", "test");
+ CheckArg.isNotZeroLength(" ", "test");
+ CheckArg.isNotZeroLength("\t\t", "test");
}
@Test( expected = IllegalArgumentException.class )
public void isNotZeroLengthShouldThrowExceptionIfGivenAStringWithNoCharacters() {
- ArgCheck.isNotZeroLength("", "test");
+ CheckArg.isNotZeroLength("", "test");
}
@Test( expected = IllegalArgumentException.class )
public void isNotZeroLengthShouldThrowExceptionIfGivenANullString() {
- ArgCheck.isNotZeroLength(null, "test");
+ CheckArg.isNotZeroLength(null, "test");
}
@Test
public void isNotNullShouldNotThrowExceptionIfGivenNonNullReference() {
- ArgCheck.isNotNull("a", "test");
- ArgCheck.isNotNull(new Object(), "test");
+ CheckArg.isNotNull("a", "test");
+ CheckArg.isNotNull(new Object(), "test");
}
@Test( expected = IllegalArgumentException.class )
public void isNotNullShouldThrowExceptionIfGivenNullReference() {
- ArgCheck.isNotNull(null, "test");
+ CheckArg.isNotNull(null, "test");
}
@Test
@@ -213,386 +213,386 @@
@Test( expected = IllegalArgumentException.class )
public void getNotNullShouldThrowExceptionIfGivenNullReference() {
- ArgCheck.getNotNull(null, "test");
+ CheckArg.getNotNull(null, "test");
}
@Test
public void isNullShouldNotThrowExceptionIfGivenNullReference() {
- ArgCheck.isNull(null, "test");
+ CheckArg.isNull(null, "test");
}
@Test( expected = IllegalArgumentException.class )
public void isNullShouldThrowExceptionIfGivenNonNullReference() {
- ArgCheck.isNull(this, "test");
+ CheckArg.isNull(this, "test");
}
@Test
public void isInstanceOfShouldNotThrowExceptionIfReferenceIsInstanceOfTheSuppliedClass() {
- ArgCheck.isInstanceOf(this, this.getClass(), "test");
+ CheckArg.isInstanceOf(this, this.getClass(), "test");
}
@Test( expected = IllegalArgumentException.class )
public void isInstanceOfShouldNotThrowExceptionIfReferenceIsNotInstanceOfTheSuppliedClass() {
- ArgCheck.isInstanceOf(" ", this.getClass(), "test");
+ CheckArg.isInstanceOf(" ", this.getClass(), "test");
}
@Test( expected = IllegalArgumentException.class )
public void isInstanceOfShouldNotThrowExceptionIfReferenceIsNull() {
- ArgCheck.isInstanceOf(null, this.getClass(), "test");
+ CheckArg.isInstanceOf(null, this.getClass(), "test");
}
@Test
public void getInstanceOfShouldReturnCastArgument() {
Object obj = "a";
- ArgCheck.getInstanceOf(obj, String.class, "test").length();
+ CheckArg.getInstanceOf(obj, String.class, "test").length();
}
@Test( expected = IllegalArgumentException.class )
public void getInstanceOfShouldThrowExceptionIfGivenNullReference() {
- ArgCheck.getInstanceOf(null, getClass(), "test");
+ CheckArg.getInstanceOf(null, getClass(), "test");
}
@Test
public void isNotEmptyCollectionShouldNotThrowExceptionIfGivenCollectionWithAtLeastOneObject() {
- ArgCheck.isNotEmpty(Collections.singletonList(" "), "test");
+ CheckArg.isNotEmpty(Collections.singletonList(" "), "test");
}
@Test( expected = IllegalArgumentException.class )
public void isNotEmptyCollectionShouldThrowExceptionIfGivenNullCollection() {
- ArgCheck.isNotEmpty((Collection<?>)null, "test");
+ CheckArg.isNotEmpty((Collection<?>)null, "test");
}
@Test( expected = IllegalArgumentException.class )
public void isNotEmptyCollectionShouldThrowExceptionIfGivenEmptyCollection() {
- ArgCheck.isNotEmpty(Collections.emptyList(), "test");
+ CheckArg.isNotEmpty(Collections.emptyList(), "test");
}
@Test
public void isNotEmptyMapShouldNotThrowExceptionIfGivenMapWithAtLeastOneEntry() {
- ArgCheck.isNotEmpty(Collections.singletonMap("key", "value"), "test");
+ CheckArg.isNotEmpty(Collections.singletonMap("key", "value"), "test");
}
@Test( expected = IllegalArgumentException.class )
public void isNotEmptyMapShouldThrowExceptionIfGivenNullMap() {
- ArgCheck.isNotEmpty((Map<?, ?>)null, "test");
+ CheckArg.isNotEmpty((Map<?, ?>)null, "test");
}
@Test( expected = IllegalArgumentException.class )
public void isNotEmptyMapShouldThrowExceptionIfGivenEmptyMap() {
- ArgCheck.isNotEmpty(Collections.emptyMap(), "test");
+ CheckArg.isNotEmpty(Collections.emptyMap(), "test");
}
@Test
public void isNotEmptyArrayShouldNotThrowExceptionIfGivenArrayWithAtLeastOneEntry() {
- ArgCheck.isNotEmpty(new Object[] {"key", "value"}, "test");
+ CheckArg.isNotEmpty(new Object[] {"key", "value"}, "test");
}
@Test
public void isNotEmptyArrayShouldNotThrowExceptionIfGivenArrayWithAtNullEntry() {
- ArgCheck.isNotEmpty(new Object[] {"key", "value", null}, "test");
+ CheckArg.isNotEmpty(new Object[] {"key", "value", null}, "test");
}
@Test( expected = IllegalArgumentException.class )
public void isNotEmptyArrayShouldThrowExceptionIfGivenNullArray() {
- ArgCheck.isNotEmpty((Object[])null, "test");
+ CheckArg.isNotEmpty((Object[])null, "test");
}
@Test( expected = IllegalArgumentException.class )
public void isNotEmptyArrayShouldThrowExceptionIfGivenEmptyArray() {
- ArgCheck.isNotEmpty(new Object[] {}, "test");
+ CheckArg.isNotEmpty(new Object[] {}, "test");
}
@Test
public void isNotSameShouldNotThrowAnExceptionIfPassedSameObject() {
- ArgCheck.isNotSame("a", "first", "b", "second");
- ArgCheck.isNotSame(new String("a"), "first", new String("a"), "second");
+ CheckArg.isNotSame("a", "first", "b", "second");
+ CheckArg.isNotSame(new String("a"), "first", new String("a"), "second");
}
@Test
public void isNotSameShouldNotThrowAnExceptionIfPassedSameObjectWithNoNames() {
- ArgCheck.isNotSame("a", null, "b", null);
- ArgCheck.isNotSame(new String("a"), null, new String("a"), null);
+ CheckArg.isNotSame("a", null, "b", null);
+ CheckArg.isNotSame(new String("a"), null, new String("a"), null);
}
@Test
public void isNotSameShouldNotThrowAnExceptionIfPassedNullFirstObjectAndNonNullSecondObject() {
- ArgCheck.isNotSame(null, "first", "b", "second");
+ CheckArg.isNotSame(null, "first", "b", "second");
}
@Test
public void isNotSameShouldNotThrowAnExceptionIfPassedNonNullFirstObjectAndNullSecondObject() {
- ArgCheck.isNotSame("a", "first", null, "second");
+ CheckArg.isNotSame("a", "first", null, "second");
}
@Test( expected = IllegalArgumentException.class )
public void isNotSameShouldThrowAnExceptionIfPassedNullFirstObjectAndNullSecondObject() {
- ArgCheck.isNotSame(null, "first", null, "second");
+ CheckArg.isNotSame(null, "first", null, "second");
}
@Test( expected = IllegalArgumentException.class )
public void isNotSameShouldThrowAnExceptionIfPassedSameReferenceForFirstSecondObject() {
String obj = "something";
- ArgCheck.isNotSame(obj, "first", obj, "second");
+ CheckArg.isNotSame(obj, "first", obj, "second");
}
@Test
public void containsShouldNotThrowExceptionIfPassedObjectInCollection() {
- ArgCheck.contains(Collections.singletonList(" "), " ", "test");
+ CheckArg.contains(Collections.singletonList(" "), " ", "test");
}
@Test
public void containsShouldNotThrowExceptionIfPassedNullIfCollectionContainsNull() {
- ArgCheck.contains(Collections.singletonList(null), null, "test");
+ CheckArg.contains(Collections.singletonList(null), null, "test");
}
@Test( expected = IllegalArgumentException.class )
public void containsShouldThrowExceptionIfPassedObjectNotInCollection() {
- ArgCheck.contains(Collections.singletonList(" "), "a", "test");
+ CheckArg.contains(Collections.singletonList(" "), "a", "test");
}
@Test( expected = IllegalArgumentException.class )
public void containsShouldThrowExceptionIfPassedNullAndCollectionDoesNotContainNull() {
- ArgCheck.contains(Collections.singletonList(" "), null, "test");
+ CheckArg.contains(Collections.singletonList(" "), null, "test");
}
@Test
public void containsKeyShouldNotThrowExceptionIfPassedObjectInCollection() {
- ArgCheck.containsKey(Collections.singletonMap("key", "value"), "key", "test");
+ CheckArg.containsKey(Collections.singletonMap("key", "value"), "key", "test");
}
@Test
public void containsKeyShouldNotThrowExceptionIfPassedNullIfMapContainsNullKey() {
- ArgCheck.containsKey(Collections.singletonMap(null, "value"), null, "test");
+ CheckArg.containsKey(Collections.singletonMap(null, "value"), null, "test");
}
@Test( expected = IllegalArgumentException.class )
public void containsKeyShouldThrowExceptionIfPassedKeyNotInMap() {
- ArgCheck.containsKey(Collections.singletonMap("key", "value"), "a", "test");
+ CheckArg.containsKey(Collections.singletonMap("key", "value"), "a", "test");
}
@Test( expected = IllegalArgumentException.class )
public void containsKeyShouldThrowExceptionIfPassedNullAndMapDoesNotContainNullKey() {
- ArgCheck.containsKey(Collections.singletonMap("key", "value"), null, "test");
+ CheckArg.containsKey(Collections.singletonMap("key", "value"), null, "test");
}
@Test
public void containsNoNullsCollectionShouldNotThrowExceptionIfGivenArrayWithAtLeastOneEntry() {
- ArgCheck.containsNoNulls(Collections.singletonList(" "), "test");
+ CheckArg.containsNoNulls(Collections.singletonList(" "), "test");
}
@Test( expected = IllegalArgumentException.class )
public void containsNoNullsCollectionShouldThrowExceptionIfGivenNullCollection() {
- ArgCheck.containsNoNulls((Collection<?>)null, "test");
+ CheckArg.containsNoNulls((Collection<?>)null, "test");
}
@Test
public void containsNoNullsCollectionShouldNotThrowExceptionIfGivenEmptyCollection() {
- ArgCheck.containsNoNulls(Collections.emptyList(), "test");
+ CheckArg.containsNoNulls(Collections.emptyList(), "test");
}
@Test( expected = IllegalArgumentException.class )
public void containsNoNullsCollectionShouldThrowExceptionIfGivenCollectionWithNullEntry() {
- ArgCheck.containsNoNulls(Collections.singletonList(null), "test");
+ CheckArg.containsNoNulls(Collections.singletonList(null), "test");
}
@Test
public void containsNoNullsArrayShouldNotThrowExceptionIfGivenArrayWithAtLeastOneEntry() {
- ArgCheck.containsNoNulls(new Object[] {"key", "value"}, "test");
+ CheckArg.containsNoNulls(new Object[] {"key", "value"}, "test");
}
@Test( expected = IllegalArgumentException.class )
public void containsNoNullsArrayShouldThrowExceptionIfGivenNullArray() {
- ArgCheck.containsNoNulls((Object[])null, "test");
+ CheckArg.containsNoNulls((Object[])null, "test");
}
@Test
public void containsNoNullsArrayShouldNotThrowExceptionIfGivenEmptyArray() {
- ArgCheck.containsNoNulls(new Object[] {}, "test");
+ CheckArg.containsNoNulls(new Object[] {}, "test");
}
@Test( expected = IllegalArgumentException.class )
public void containsNoNullsArrayShouldThrowExceptionIfGivenArrayWithNullEntry() {
- ArgCheck.containsNoNulls(new Object[] {"some", null, "thing", null}, "test");
+ CheckArg.containsNoNulls(new Object[] {"some", null, "thing", null}, "test");
}
@Test( expected = IllegalArgumentException.class )
public void isNotLessThanShouldThrowExceptionIfValueIsLessThanSuppliedValue() {
- ArgCheck.isNotLessThan(0, 1, "value");
+ CheckArg.isNotLessThan(0, 1, "value");
}
@Test( expected = IllegalArgumentException.class )
public void isNotGreaterThanShouldThrowExceptionIfValueIsGreaterThanSuppliedValue() {
- ArgCheck.isNotGreaterThan(1, 0, "value");
+ CheckArg.isNotGreaterThan(1, 0, "value");
}
@Test( expected = IllegalArgumentException.class )
public void isNotLessThanShouldThrowExceptionIfValueIsEqualToSuppliedValue() {
- ArgCheck.isNotLessThan(1, 2, "value");
+ CheckArg.isNotLessThan(1, 2, "value");
}
@Test( expected = IllegalArgumentException.class )
public void isNotGreaterThanShouldThrowExceptionIfValueIsEqualToSuppliedValue() {
- ArgCheck.isNotGreaterThan(2, 1, "value");
+ CheckArg.isNotGreaterThan(2, 1, "value");
}
@Test( expected = IllegalArgumentException.class )
public void isLessThanShouldThrowExceptionIfValueIsGreaterThanSuppliedValue() {
- ArgCheck.isLessThan(1, 0, "value");
+ CheckArg.isLessThan(1, 0, "value");
}
@Test( expected = IllegalArgumentException.class )
public void isGreaterThanShouldThrowExceptionIfValueIsLessThanSuppliedValue() {
- ArgCheck.isGreaterThan(0, 1, "value");
+ CheckArg.isGreaterThan(0, 1, "value");
}
@Test( expected = IllegalArgumentException.class )
public void isLessThanShouldThrowExceptionIfValueIsEqualToSuppliedValue() {
- ArgCheck.isLessThan(1, 1, "value");
+ CheckArg.isLessThan(1, 1, "value");
}
@Test( expected = IllegalArgumentException.class )
public void isGreaterThanShouldThrowExceptionIfValueIsEqualToSuppliedValue() {
- ArgCheck.isGreaterThan(1, 1, "value");
+ CheckArg.isGreaterThan(1, 1, "value");
}
@Test( expected = IllegalArgumentException.class )
public void isLessThanOrEqualToShouldThrowExceptionIfValueIsNotLessThanOrEqualToSuppliedValue() {
- ArgCheck.isLessThanOrEqualTo(1, 0, "value");
+ CheckArg.isLessThanOrEqualTo(1, 0, "value");
}
@Test( expected = IllegalArgumentException.class )
public void isGreaterThanOrEqualToShouldThrowExceptionIfValueIsNotGreaterThanOrEqualToSuppliedValue() {
- ArgCheck.isGreaterThanOrEqualTo(0, 1, "value");
+ CheckArg.isGreaterThanOrEqualTo(0, 1, "value");
}
@Test
public void isNotLessThanShouldNotThrowExceptionIfValueIsNotLessThanSuppliedValue() {
- ArgCheck.isNotLessThan(1, 1, "value");
- ArgCheck.isNotLessThan(2, 1, "value");
- ArgCheck.isNotLessThan(100, 1, "value");
+ CheckArg.isNotLessThan(1, 1, "value");
+ CheckArg.isNotLessThan(2, 1, "value");
+ CheckArg.isNotLessThan(100, 1, "value");
}
@Test
public void isNotGreaterThanShouldNotThrowExceptionIfValueIsNotGreaterThanSuppliedValue() {
- ArgCheck.isNotGreaterThan(1, 1, "value");
- ArgCheck.isNotGreaterThan(1, 2, "value");
- ArgCheck.isNotGreaterThan(1, 100, "value");
+ CheckArg.isNotGreaterThan(1, 1, "value");
+ CheckArg.isNotGreaterThan(1, 2, "value");
+ CheckArg.isNotGreaterThan(1, 100, "value");
}
@Test
public void isLessThanShouldNotThrowExceptionIfValueIsLessThanSuppliedValue() {
- ArgCheck.isLessThanOrEqualTo(1, 2, "value");
- ArgCheck.isLessThanOrEqualTo(1, 100, "value");
+ CheckArg.isLessThanOrEqualTo(1, 2, "value");
+ CheckArg.isLessThanOrEqualTo(1, 100, "value");
}
@Test
public void isGreaterThanShouldNotThrowExceptionIfValueIsGreaterThanSuppliedValue() {
- ArgCheck.isGreaterThan(2, 1, "value");
- ArgCheck.isGreaterThan(100, 1, "value");
+ CheckArg.isGreaterThan(2, 1, "value");
+ CheckArg.isGreaterThan(100, 1, "value");
}
@Test
public void isLessThanOrEqualToShouldNotThrowExceptionIfValueIsLessThanOrEqualToSuppliedValue() {
- ArgCheck.isLessThanOrEqualTo(1, 1, "value");
- ArgCheck.isLessThanOrEqualTo(1, 2, "value");
- ArgCheck.isLessThanOrEqualTo(1, 100, "value");
+ CheckArg.isLessThanOrEqualTo(1, 1, "value");
+ CheckArg.isLessThanOrEqualTo(1, 2, "value");
+ CheckArg.isLessThanOrEqualTo(1, 100, "value");
}
@Test
public void isGreaterThanOrEqualToShouldNotThrowExceptionIfValueIsGreaterThanOrEqualToSuppliedValue() {
- ArgCheck.isGreaterThanOrEqualTo(1, 1, "value");
- ArgCheck.isGreaterThanOrEqualTo(2, 1, "value");
- ArgCheck.isGreaterThanOrEqualTo(100, 1, "value");
+ CheckArg.isGreaterThanOrEqualTo(1, 1, "value");
+ CheckArg.isGreaterThanOrEqualTo(2, 1, "value");
+ CheckArg.isGreaterThanOrEqualTo(100, 1, "value");
}
@Test( expected = IllegalArgumentException.class )
public void hasSizeOfAtLeastShouldThrowExceptionIfCollectionSizeIsSmallerThanSuppliedValue() {
- ArgCheck.hasSizeOfAtLeast(Collections.singletonList(" "), 2, "value");
+ CheckArg.hasSizeOfAtLeast(Collections.singletonList(" "), 2, "value");
}
@Test( expected = IllegalArgumentException.class )
public void hasSizeOfAtMostShouldThrowExceptionIfCollectionSizeIsLargerThanSuppliedValue() {
- ArgCheck.hasSizeOfAtMost(Collections.singletonList(" "), 0, "value");
+ CheckArg.hasSizeOfAtMost(Collections.singletonList(" "), 0, "value");
}
@Test
public void hasSizeOfAtLeastShouldNotThrowExceptionIfCollectionSizeIsEqualToSuppliedValue() {
- ArgCheck.hasSizeOfAtLeast(Collections.singletonList(" "), 1, "value");
+ CheckArg.hasSizeOfAtLeast(Collections.singletonList(" "), 1, "value");
}
@Test
public void hasSizeOfAtMostShouldNotThrowExceptionIfCollectionSizeIsEqualToSuppliedValue() {
- ArgCheck.hasSizeOfAtMost(Collections.singletonList(" "), 1, "value");
+ CheckArg.hasSizeOfAtMost(Collections.singletonList(" "), 1, "value");
}
@Test
public void hasSizeOfAtLeastShouldNotThrowExceptionIfCollectionSizeIsGreaterThanSuppliedValue() {
- ArgCheck.hasSizeOfAtLeast(Collections.singletonList(" "), 0, "value");
+ CheckArg.hasSizeOfAtLeast(Collections.singletonList(" "), 0, "value");
}
@Test
public void hasSizeOfAtMostShouldNotThrowExceptionIfCollectionSizeIsGreaterThanSuppliedValue() {
- ArgCheck.hasSizeOfAtMost(Collections.singletonList(" "), 2, "value");
+ CheckArg.hasSizeOfAtMost(Collections.singletonList(" "), 2, "value");
}
@Test( expected = IllegalArgumentException.class )
public void hasSizeOfAtLeastShouldThrowExceptionIfMapSizeIsSmallerThanSuppliedValue() {
- ArgCheck.hasSizeOfAtLeast(Collections.singletonMap("key", "value"), 2, "value");
+ CheckArg.hasSizeOfAtLeast(Collections.singletonMap("key", "value"), 2, "value");
}
@Test( expected = IllegalArgumentException.class )
public void hasSizeOfAtMostShouldThrowExceptionIfMapSizeIsLargerThanSuppliedValue() {
- ArgCheck.hasSizeOfAtMost(Collections.singletonMap("key", "value"), 0, "value");
+ CheckArg.hasSizeOfAtMost(Collections.singletonMap("key", "value"), 0, "value");
}
@Test
public void hasSizeOfAtLeastShouldNotThrowExceptionIfMapSizeIsEqualToSuppliedValue() {
- ArgCheck.hasSizeOfAtLeast(Collections.singletonMap("key", "value"), 1, "value");
+ CheckArg.hasSizeOfAtLeast(Collections.singletonMap("key", "value"), 1, "value");
}
@Test
public void hasSizeOfAtMostShouldNotThrowExceptionIfMapSizeIsEqualToSuppliedValue() {
- ArgCheck.hasSizeOfAtMost(Collections.singletonMap("key", "value"), 1, "value");
+ CheckArg.hasSizeOfAtMost(Collections.singletonMap("key", "value"), 1, "value");
}
@Test
public void hasSizeOfAtLeastShouldNotThrowExceptionIfMapSizeIsGreaterThanSuppliedValue() {
- ArgCheck.hasSizeOfAtLeast(Collections.singletonMap("key", "value"), 0, "value");
+ CheckArg.hasSizeOfAtLeast(Collections.singletonMap("key", "value"), 0, "value");
}
@Test
public void hasSizeOfAtMostShouldNotThrowExceptionIfMapSizeIsGreaterThanSuppliedValue() {
- ArgCheck.hasSizeOfAtMost(Collections.singletonMap("key", "value"), 2, "value");
+ CheckArg.hasSizeOfAtMost(Collections.singletonMap("key", "value"), 2, "value");
}
@Test( expected = IllegalArgumentException.class )
public void hasSizeOfAtLeastShouldThrowExceptionIfArraySizeIsSmallerThanSuppliedValue() {
- ArgCheck.hasSizeOfAtLeast(new Object[] {"key", "value"}, 3, "value");
+ CheckArg.hasSizeOfAtLeast(new Object[] {"key", "value"}, 3, "value");
}
@Test( expected = IllegalArgumentException.class )
public void hasSizeOfAtMostShouldThrowExceptionIfArraySizeIsLargerThanSuppliedValue() {
- ArgCheck.hasSizeOfAtMost(new Object[] {"key", "value"}, 1, "value");
+ CheckArg.hasSizeOfAtMost(new Object[] {"key", "value"}, 1, "value");
}
@Test
public void hasSizeOfAtLeastShouldNotThrowExceptionIfArraySizeIsEqualToSuppliedValue() {
- ArgCheck.hasSizeOfAtLeast(new Object[] {"key", "value"}, 2, "value");
+ CheckArg.hasSizeOfAtLeast(new Object[] {"key", "value"}, 2, "value");
}
@Test
public void hasSizeOfAtMostShouldNotThrowExceptionIfArraySizeIsEqualToSuppliedValue() {
- ArgCheck.hasSizeOfAtMost(new Object[] {"key", "value"}, 2, "value");
+ CheckArg.hasSizeOfAtMost(new Object[] {"key", "value"}, 2, "value");
}
@Test
public void hasSizeOfAtLeastShouldNotThrowExceptionIfArraySizeIsGreaterThanSuppliedValue() {
- ArgCheck.hasSizeOfAtLeast(new Object[] {"key", "value"}, 1, "value");
+ CheckArg.hasSizeOfAtLeast(new Object[] {"key", "value"}, 1, "value");
}
@Test
public void hasSizeOfAtMostShouldNotThrowExceptionIfArraySizeIsGreaterThanSuppliedValue() {
- ArgCheck.hasSizeOfAtMost(new Object[] {"key", "value"}, 3, "value");
+ CheckArg.hasSizeOfAtMost(new Object[] {"key", "value"}, 3, "value");
}
}
Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/ExecutionContexts.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/ExecutionContexts.java 2008-09-18 18:00:04 UTC (rev 534)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/ExecutionContexts.java 2008-09-18 18:12:00 UTC (rev 535)
@@ -24,7 +24,7 @@
import java.security.AccessControlContext;
import javax.security.auth.Subject;
import javax.security.auth.login.LoginContext;
-import org.jboss.dna.common.util.ArgCheck;
+import org.jboss.dna.common.util.CheckArg;
import org.jboss.dna.common.util.Logger;
import org.jboss.dna.graph.properties.NameFactory;
import org.jboss.dna.graph.properties.NamespaceRegistry;
@@ -51,8 +51,8 @@
*/
public static ExecutionContext replace( ExecutionContext context,
PathFactory pathFactory ) {
- ArgCheck.isNotNull(context, "context");
- ArgCheck.isNotNull(pathFactory, "pathFactory");
+ CheckArg.isNotNull(context, "context");
+ CheckArg.isNotNull(pathFactory, "pathFactory");
return new DelegatingExecutionEnvironment(context, null, null, null, pathFactory);
}
@@ -66,8 +66,8 @@
*/
public static ExecutionContext replace( ExecutionContext context,
NameFactory nameFactory ) {
- ArgCheck.isNotNull(context, "context");
- ArgCheck.isNotNull(nameFactory, "nameFactory");
+ CheckArg.isNotNull(context, "context");
+ CheckArg.isNotNull(nameFactory, "nameFactory");
return new DelegatingExecutionEnvironment(context, null, null, nameFactory, null);
}
@@ -83,9 +83,9 @@
public static ExecutionContext replace( ExecutionContext context,
NameFactory nameFactory,
PathFactory pathFactory ) {
- ArgCheck.isNotNull(context, "context");
- ArgCheck.isNotNull(nameFactory, "nameFactory");
- ArgCheck.isNotNull(pathFactory, "pathFactory");
+ CheckArg.isNotNull(context, "context");
+ CheckArg.isNotNull(nameFactory, "nameFactory");
+ CheckArg.isNotNull(pathFactory, "pathFactory");
return new DelegatingExecutionEnvironment(context, null, null, nameFactory, pathFactory);
}
@@ -99,8 +99,8 @@
*/
public static ExecutionContext replace( ExecutionContext context,
NamespaceRegistry namespaceRegistry ) {
- ArgCheck.isNotNull(context, "context");
- ArgCheck.isNotNull(namespaceRegistry, "namespaceRegistry");
+ CheckArg.isNotNull(context, "context");
+ CheckArg.isNotNull(namespaceRegistry, "namespaceRegistry");
return new DelegatingExecutionEnvironment(context, namespaceRegistry, null, null, null);
}
Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/cache/BasicCachePolicy.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/cache/BasicCachePolicy.java 2008-09-18 18:00:04 UTC (rev 534)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/cache/BasicCachePolicy.java 2008-09-18 18:12:00 UTC (rev 535)
@@ -22,7 +22,7 @@
package org.jboss.dna.graph.cache;
import java.util.concurrent.TimeUnit;
-import org.jboss.dna.common.util.ArgCheck;
+import org.jboss.dna.common.util.CheckArg;
/**
* @author Randall Hauch
@@ -37,7 +37,7 @@
public BasicCachePolicy( long timeToCache,
TimeUnit unit ) {
- ArgCheck.isNotNull(unit, "unit");
+ CheckArg.isNotNull(unit, "unit");
this.timeToLiveInMillis = TimeUnit.MILLISECONDS.convert(timeToCache, unit);
}
Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/connectors/BasicExecutionContext.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/connectors/BasicExecutionContext.java 2008-09-18 18:00:04 UTC (rev 534)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connectors/BasicExecutionContext.java 2008-09-18 18:12:00 UTC (rev 535)
@@ -25,7 +25,7 @@
import java.security.AccessController;
import javax.security.auth.Subject;
import javax.security.auth.login.LoginContext;
-import org.jboss.dna.common.util.ArgCheck;
+import org.jboss.dna.common.util.CheckArg;
import org.jboss.dna.common.util.Logger;
import org.jboss.dna.graph.ExecutionContext;
import org.jboss.dna.graph.properties.NamespaceRegistry;
@@ -99,7 +99,7 @@
NamespaceRegistry namespaceRegistry,
ValueFactories valueFactories,
PropertyFactory propertyFactory ) {
- ArgCheck.isNotNull(namespaceRegistry, "namespaceRegistry");
+ CheckArg.isNotNull(namespaceRegistry, "namespaceRegistry");
this.loginContext = loginContext;
this.accessControlContext = accessControlContext;
if (loginContext == null) {
Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/connectors/RepositoryConnectionPool.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/connectors/RepositoryConnectionPool.java 2008-09-18 18:00:04 UTC (rev 534)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/connectors/RepositoryConnectionPool.java 2008-09-18 18:12:00 UTC (rev 535)
@@ -36,7 +36,7 @@
import javax.transaction.xa.XAResource;
import net.jcip.annotations.GuardedBy;
import net.jcip.annotations.ThreadSafe;
-import org.jboss.dna.common.util.ArgCheck;
+import org.jboss.dna.common.util.CheckArg;
import org.jboss.dna.common.util.Logger;
import org.jboss.dna.graph.ExecutionContext;
import org.jboss.dna.graph.GraphI18n;
@@ -188,10 +188,10 @@
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit ) {
- ArgCheck.isNonNegative(corePoolSize, "corePoolSize");
- ArgCheck.isPositive(maximumPoolSize, "maximumPoolSize");
- ArgCheck.isNonNegative(keepAliveTime, "keepAliveTime");
- ArgCheck.isNotNull(source, "source");
+ CheckArg.isNonNegative(corePoolSize, "corePoolSize");
+ CheckArg.isPositive(maximumPoolSize, "maximumPoolSize");
+ CheckArg.isNonNegative(keepAliveTime, "keepAliveTime");
+ CheckArg.isNotNull(source, "source");
if (maximumPoolSize < corePoolSize) {
throw new IllegalArgumentException(GraphI18n.maximumPoolSizeMayNotBeSmallerThanCorePoolSize.text());
}
@@ -251,7 +251,7 @@
*/
public void setPingTimeout( long pingTimeout,
TimeUnit unit ) {
- ArgCheck.isNonNegative(pingTimeout, "time");
+ CheckArg.isNonNegative(pingTimeout, "time");
this.pingTimeout.set(unit.toNanos(pingTimeout));
}
@@ -282,7 +282,7 @@
*/
public void setKeepAliveTime( long time,
TimeUnit unit ) {
- ArgCheck.isNonNegative(time, "time");
+ CheckArg.isNonNegative(time, "time");
this.keepAliveTime = unit.toNanos(time);
}
@@ -315,7 +315,7 @@
* @see #getMaximumPoolSize
*/
public void setMaximumPoolSize( int maximumPoolSize ) {
- ArgCheck.isPositive(maximumPoolSize, "maximum pool size");
+ CheckArg.isPositive(maximumPoolSize, "maximum pool size");
if (maximumPoolSize < corePoolSize) {
throw new IllegalArgumentException(GraphI18n.maximumPoolSizeMayNotBeSmallerThanCorePoolSize.text());
}
@@ -355,7 +355,7 @@
* @see #getCorePoolSize()
*/
public void setCorePoolSize( int corePoolSize ) throws RepositorySourceException, InterruptedException {
- ArgCheck.isNonNegative(corePoolSize, "core pool size");
+ CheckArg.isNonNegative(corePoolSize, "core pool size");
if (maximumPoolSize < corePoolSize) {
throw new IllegalArgumentException(GraphI18n.maximumPoolSizeMayNotBeSmallerThanCorePoolSize.text());
}
Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/properties/PathExpression.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/properties/PathExpression.java 2008-09-18 18:00:04 UTC (rev 534)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/properties/PathExpression.java 2008-09-18 18:12:00 UTC (rev 535)
@@ -25,7 +25,7 @@
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
import net.jcip.annotations.Immutable;
-import org.jboss.dna.common.util.ArgCheck;
+import org.jboss.dna.common.util.CheckArg;
import org.jboss.dna.common.util.HashCode;
import org.jboss.dna.graph.GraphI18n;
@@ -201,7 +201,7 @@
* @throws InvalidPathExpressionException if the expression is blank or is not a valid expression
*/
public PathExpression( String expression ) throws InvalidPathExpressionException {
- ArgCheck.isNotNull(expression, "path expression");
+ CheckArg.isNotNull(expression, "path expression");
this.expression = expression.trim();
if (this.expression.length() == 0) {
throw new InvalidPathExpressionException(GraphI18n.pathExpressionMayNotBeBlank.text());
Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/properties/basic/AbstractValueFactories.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/properties/basic/AbstractValueFactories.java 2008-09-18 18:00:04 UTC (rev 534)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/properties/basic/AbstractValueFactories.java 2008-09-18 18:12:00 UTC (rev 535)
@@ -22,7 +22,7 @@
package org.jboss.dna.graph.properties.basic;
import java.util.Iterator;
-import org.jboss.dna.common.util.ArgCheck;
+import org.jboss.dna.common.util.CheckArg;
import org.jboss.dna.graph.properties.PropertyType;
import org.jboss.dna.graph.properties.ValueFactories;
import org.jboss.dna.graph.properties.ValueFactory;
@@ -52,7 +52,7 @@
* {@inheritDoc}
*/
public ValueFactory<?> getValueFactory( PropertyType type ) {
- ArgCheck.isNotNull(type, "type");
+ CheckArg.isNotNull(type, "type");
switch (type) {
case BINARY:
return getBinaryFactory();
@@ -88,7 +88,7 @@
* {@inheritDoc}
*/
public ValueFactory<?> getValueFactory( Object prototype ) {
- ArgCheck.isNotNull(prototype, "prototype");
+ CheckArg.isNotNull(prototype, "prototype");
PropertyType inferredType = PropertyType.discoverType(prototype);
assert inferredType != null;
return getValueFactory(inferredType);
Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/properties/basic/AbstractValueFactory.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/properties/basic/AbstractValueFactory.java 2008-09-18 18:00:04 UTC (rev 534)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/properties/basic/AbstractValueFactory.java 2008-09-18 18:12:00 UTC (rev 535)
@@ -31,7 +31,7 @@
import java.util.UUID;
import net.jcip.annotations.Immutable;
import org.jboss.dna.common.text.TextDecoder;
-import org.jboss.dna.common.util.ArgCheck;
+import org.jboss.dna.common.util.CheckArg;
import org.jboss.dna.graph.properties.Binary;
import org.jboss.dna.graph.properties.DateTime;
import org.jboss.dna.graph.properties.IoException;
@@ -59,7 +59,7 @@
protected AbstractValueFactory( PropertyType type,
TextDecoder decoder,
ValueFactory<String> stringValueFactory ) {
- ArgCheck.isNotNull(type, "type");
+ CheckArg.isNotNull(type, "type");
this.propertyType = type;
this.decoder = decoder != null ? decoder : DEFAULT_DECODER;
this.stringValueFactory = stringValueFactory;
Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/properties/basic/BasicMultiValueProperty.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/properties/basic/BasicMultiValueProperty.java 2008-09-18 18:00:04 UTC (rev 534)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/properties/basic/BasicMultiValueProperty.java 2008-09-18 18:12:00 UTC (rev 535)
@@ -25,7 +25,7 @@
import java.util.Iterator;
import java.util.List;
import net.jcip.annotations.Immutable;
-import org.jboss.dna.common.util.ArgCheck;
+import org.jboss.dna.common.util.CheckArg;
import org.jboss.dna.graph.properties.Name;
/**
@@ -50,8 +50,8 @@
public BasicMultiValueProperty( Name name,
List<Object> values ) {
super(name);
- ArgCheck.isNotNull(values, "values");
- ArgCheck.hasSizeOfAtLeast(values, 2, "values");
+ CheckArg.isNotNull(values, "values");
+ CheckArg.hasSizeOfAtLeast(values, 2, "values");
this.values = values;
}
@@ -65,8 +65,8 @@
public BasicMultiValueProperty( Name name,
Object... values ) {
super(name);
- ArgCheck.isNotNull(values, "values");
- ArgCheck.hasSizeOfAtLeast(values, 2, "values");
+ CheckArg.isNotNull(values, "values");
+ CheckArg.hasSizeOfAtLeast(values, 2, "values");
this.values = Arrays.asList(values);
}
Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/properties/basic/BasicName.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/properties/basic/BasicName.java 2008-09-18 18:00:04 UTC (rev 534)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/properties/basic/BasicName.java 2008-09-18 18:12:00 UTC (rev 535)
@@ -23,7 +23,7 @@
import net.jcip.annotations.Immutable;
import org.jboss.dna.common.text.TextEncoder;
-import org.jboss.dna.common.util.ArgCheck;
+import org.jboss.dna.common.util.CheckArg;
import org.jboss.dna.common.util.HashCode;
import org.jboss.dna.graph.properties.Name;
import org.jboss.dna.graph.properties.NamespaceRegistry;
@@ -47,7 +47,7 @@
public BasicName( String namespaceUri,
String localName ) {
- ArgCheck.isNotEmpty(localName, "localName");
+ CheckArg.isNotEmpty(localName, "localName");
this.namespaceUri = namespaceUri != null ? namespaceUri.trim() : "";
this.localName = localName != null ? localName.trim() : "";
this.hc = HashCode.compute(this.namespaceUri, this.localName);
@@ -90,7 +90,7 @@
* {@inheritDoc}
*/
public String getString( NamespaceRegistry namespaceRegistry ) {
- ArgCheck.isNotNull(namespaceRegistry, "namespaceRegistry");
+ CheckArg.isNotNull(namespaceRegistry, "namespaceRegistry");
String prefix = namespaceRegistry.getPrefixForNamespaceUri(this.namespaceUri, true);
if (prefix != null && prefix.length() != 0) {
return prefix + ":" + this.localName;
@@ -103,7 +103,7 @@
*/
public String getString( NamespaceRegistry namespaceRegistry,
TextEncoder encoder ) {
- ArgCheck.isNotNull(namespaceRegistry, "namespaceRegistry");
+ CheckArg.isNotNull(namespaceRegistry, "namespaceRegistry");
String prefix = namespaceRegistry.getPrefixForNamespaceUri(this.namespaceUri, true);
if (prefix != null && prefix.length() != 0) {
return encoder.encode(prefix) + ":" + encoder.encode(this.localName);
Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/properties/basic/BasicNamespaceRegistry.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/properties/basic/BasicNamespaceRegistry.java 2008-09-18 18:00:04 UTC (rev 534)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/properties/basic/BasicNamespaceRegistry.java 2008-09-18 18:12:00 UTC (rev 535)
@@ -32,7 +32,7 @@
import java.util.concurrent.locks.ReentrantReadWriteLock;
import net.jcip.annotations.GuardedBy;
import net.jcip.annotations.ThreadSafe;
-import org.jboss.dna.common.util.ArgCheck;
+import org.jboss.dna.common.util.CheckArg;
import org.jboss.dna.graph.properties.NamespaceRegistry;
/**
@@ -96,7 +96,7 @@
* {@inheritDoc}
*/
public String getNamespaceForPrefix( String prefix ) {
- ArgCheck.isNotNull(prefix, "prefix");
+ CheckArg.isNotNull(prefix, "prefix");
Lock lock = this.registryLock.readLock();
try {
lock.lock();
@@ -111,7 +111,7 @@
*/
public String getPrefixForNamespaceUri( String namespaceUri,
boolean generateIfMissing ) {
- ArgCheck.isNotNull(namespaceUri, "namespaceUri");
+ CheckArg.isNotNull(namespaceUri, "namespaceUri");
String prefix = null;
Lock lock = this.registryLock.readLock();
try {
@@ -144,7 +144,7 @@
* {@inheritDoc}
*/
public boolean isRegisteredNamespaceUri( String namespaceUri ) {
- ArgCheck.isNotNull(namespaceUri, "namespaceUri");
+ CheckArg.isNotNull(namespaceUri, "namespaceUri");
Lock lock = this.registryLock.readLock();
try {
lock.lock();
@@ -172,7 +172,7 @@
*/
public String register( String prefix,
String namespaceUri ) {
- ArgCheck.isNotNull(namespaceUri, "namespaceUri");
+ CheckArg.isNotNull(namespaceUri, "namespaceUri");
String previousNamespaceForPrefix = null;
namespaceUri = namespaceUri.trim();
Lock lock = this.registryLock.writeLock();
Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/properties/basic/BasicPath.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/properties/basic/BasicPath.java 2008-09-18 18:00:04 UTC (rev 534)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/properties/basic/BasicPath.java 2008-09-18 18:12:00 UTC (rev 535)
@@ -30,7 +30,7 @@
import org.jboss.dna.common.CommonI18n;
import org.jboss.dna.common.text.Inflector;
import org.jboss.dna.common.text.TextEncoder;
-import org.jboss.dna.common.util.ArgCheck;
+import org.jboss.dna.common.util.CheckArg;
import org.jboss.dna.graph.GraphI18n;
import org.jboss.dna.graph.properties.InvalidPathException;
import org.jboss.dna.graph.properties.NamespaceRegistry;
@@ -66,7 +66,7 @@
*/
public BasicPath( List<Segment> segments,
boolean absolute ) {
- ArgCheck.isNotNull(segments, "segments");
+ CheckArg.isNotNull(segments, "segments");
this.segments = segments.isEmpty() ? EMPTY_SEGMENTS : Collections.unmodifiableList(segments);
this.absolute = absolute;
this.normalized = isNormalized(this.segments);
@@ -92,7 +92,7 @@
* {@inheritDoc}
*/
public Path getAncestor( int degree ) {
- ArgCheck.isNonNegative(degree, "degree");
+ CheckArg.isNonNegative(degree, "degree");
if (degree == 0) return this;
if (this.isRoot()) return null;
int endIndex = this.segments.size() - degree;
@@ -213,7 +213,7 @@
* {@inheritDoc}
*/
public String getString( NamespaceRegistry namespaceRegistry ) {
- ArgCheck.isNotNull(namespaceRegistry, "namespaceRegistry");
+ CheckArg.isNotNull(namespaceRegistry, "namespaceRegistry");
return doGetString(namespaceRegistry, null);
}
@@ -222,7 +222,7 @@
*/
public String getString( NamespaceRegistry namespaceRegistry,
TextEncoder encoder ) {
- ArgCheck.isNotNull(namespaceRegistry, "namespaceRegistry");
+ CheckArg.isNotNull(namespaceRegistry, "namespaceRegistry");
return doGetString(namespaceRegistry, encoder);
}
@@ -378,7 +378,7 @@
* {@inheritDoc}
*/
public Path relativeTo( Path startingPath ) {
- ArgCheck.isNotNull(startingPath, "to");
+ CheckArg.isNotNull(startingPath, "to");
if (!this.isAbsolute()) {
String msg = GraphI18n.pathIsNotAbsolute.text(this);
throw new InvalidPathException(msg);
@@ -421,7 +421,7 @@
* {@inheritDoc}
*/
public Path resolve( Path relativePath ) {
- ArgCheck.isNotNull(relativePath, "relative path");
+ CheckArg.isNotNull(relativePath, "relative path");
if (!this.isAbsolute()) {
String msg = GraphI18n.pathIsAlreadyAbsolute.text(this.path);
throw new InvalidPathException(msg);
@@ -447,7 +447,7 @@
* {@inheritDoc}
*/
public Path resolveAgainst( Path absolutePath ) {
- ArgCheck.isNotNull(absolutePath, "absolute path");
+ CheckArg.isNotNull(absolutePath, "absolute path");
return absolutePath.resolve(this);
}
Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/properties/basic/BasicPathSegment.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/properties/basic/BasicPathSegment.java 2008-09-18 18:00:04 UTC (rev 534)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/properties/basic/BasicPathSegment.java 2008-09-18 18:12:00 UTC (rev 535)
@@ -23,7 +23,7 @@
import net.jcip.annotations.Immutable;
import org.jboss.dna.common.text.TextEncoder;
-import org.jboss.dna.common.util.ArgCheck;
+import org.jboss.dna.common.util.CheckArg;
import org.jboss.dna.graph.properties.Name;
import org.jboss.dna.graph.properties.NamespaceRegistry;
import org.jboss.dna.graph.properties.Path;
@@ -57,8 +57,8 @@
*/
public BasicPathSegment( Name name,
int index ) {
- ArgCheck.isNotNull(name, "name");
- ArgCheck.isNotLessThan(index, Path.NO_INDEX, "index");
+ CheckArg.isNotNull(name, "name");
+ CheckArg.isNotLessThan(index, Path.NO_INDEX, "index");
this.name = name;
this.index = (this.isSelfReference() || this.isParentReference()) ? Path.NO_INDEX : index;
}
@@ -179,7 +179,7 @@
*/
public String getString( NamespaceRegistry namespaceRegistry,
TextEncoder encoder ) {
- ArgCheck.isNotNull(namespaceRegistry, "namespaceRegistry");
+ CheckArg.isNotNull(namespaceRegistry, "namespaceRegistry");
if (encoder == null) encoder = Path.DEFAULT_ENCODER;
String encodedName = this.getName().getString(namespaceRegistry, encoder);
if (this.hasIndex()) {
Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/properties/basic/BasicPropertyFactory.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/properties/basic/BasicPropertyFactory.java 2008-09-18 18:00:04 UTC (rev 534)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/properties/basic/BasicPropertyFactory.java 2008-09-18 18:12:00 UTC (rev 535)
@@ -25,7 +25,7 @@
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
-import org.jboss.dna.common.util.ArgCheck;
+import org.jboss.dna.common.util.CheckArg;
import org.jboss.dna.graph.properties.Name;
import org.jboss.dna.graph.properties.Property;
import org.jboss.dna.graph.properties.PropertyFactory;
@@ -45,7 +45,7 @@
* @throws IllegalArgumentException if the reference to the value factories is null
*/
public BasicPropertyFactory( ValueFactories valueFactories ) {
- ArgCheck.isNotNull(valueFactories, "value factories");
+ CheckArg.isNotNull(valueFactories, "value factories");
this.factories = valueFactories;
}
@@ -79,7 +79,7 @@
public Property create( Name name,
PropertyType desiredType,
Object... values ) {
- ArgCheck.isNotNull(name, "name");
+ CheckArg.isNotNull(name, "name");
if (values == null || values.length == 0) {
return new BasicEmptyProperty(name);
}
@@ -111,7 +111,7 @@
public Property create( Name name,
PropertyType desiredType,
Iterable<?> values ) {
- ArgCheck.isNotNull(name, "name");
+ CheckArg.isNotNull(name, "name");
List<Object> valueList = null;
if (values instanceof Collection) {
Collection<Object> originalValues = (Collection<Object>)values;
@@ -144,7 +144,7 @@
public Property create( Name name,
PropertyType desiredType,
Iterator<?> values ) {
- ArgCheck.isNotNull(name, "name");
+ CheckArg.isNotNull(name, "name");
final List<Object> valueList = new ArrayList<Object>();
if (desiredType == null) desiredType = PropertyType.OBJECT;
final ValueFactory<?> factory = factories.getValueFactory(desiredType);
Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/properties/basic/InMemoryBinary.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/properties/basic/InMemoryBinary.java 2008-09-18 18:00:04 UTC (rev 534)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/properties/basic/InMemoryBinary.java 2008-09-18 18:12:00 UTC (rev 535)
@@ -28,7 +28,7 @@
import java.util.Set;
import java.util.concurrent.CopyOnWriteArraySet;
import net.jcip.annotations.Immutable;
-import org.jboss.dna.common.util.ArgCheck;
+import org.jboss.dna.common.util.CheckArg;
import org.jboss.dna.common.util.Logger;
import org.jboss.dna.graph.GraphI18n;
import org.jboss.dna.graph.properties.Binary;
@@ -56,7 +56,7 @@
private byte[] sha1hash;
public InMemoryBinary( byte[] bytes ) {
- ArgCheck.isNotNull(bytes, "bytes");
+ CheckArg.isNotNull(bytes, "bytes");
this.bytes = bytes;
}
Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/properties/basic/JodaDateTime.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/properties/basic/JodaDateTime.java 2008-09-18 18:00:04 UTC (rev 534)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/properties/basic/JodaDateTime.java 2008-09-18 18:12:00 UTC (rev 535)
@@ -27,7 +27,7 @@
import java.util.Locale;
import java.util.concurrent.TimeUnit;
import net.jcip.annotations.Immutable;
-import org.jboss.dna.common.util.ArgCheck;
+import org.jboss.dna.common.util.CheckArg;
import org.joda.time.Chronology;
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
@@ -372,7 +372,7 @@
* {@inheritDoc}
*/
public org.jboss.dna.graph.properties.DateTime toTimeZone( String timeZoneId ) {
- ArgCheck.isNotNull(timeZoneId, "time zone identifier");
+ CheckArg.isNotNull(timeZoneId, "time zone identifier");
DateTime jodaTime = this.instance.withZone(DateTimeZone.forID(timeZoneId));
return new JodaDateTime(jodaTime);
}
@@ -411,7 +411,7 @@
*/
public org.jboss.dna.graph.properties.DateTime minus( long timeAmount,
TimeUnit unit ) {
- ArgCheck.isNotNull(unit, "unit");
+ CheckArg.isNotNull(unit, "unit");
return new JodaDateTime(this.instance.minus(TimeUnit.MILLISECONDS.convert(timeAmount, unit)));
}
@@ -494,7 +494,7 @@
*/
public org.jboss.dna.graph.properties.DateTime plus( long timeAmount,
TimeUnit unit ) {
- ArgCheck.isNotNull(unit, "unit");
+ CheckArg.isNotNull(unit, "unit");
return new JodaDateTime(this.instance.plus(TimeUnit.MILLISECONDS.convert(timeAmount, unit)));
}
Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/properties/basic/NameValueFactory.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/properties/basic/NameValueFactory.java 2008-09-18 18:00:04 UTC (rev 534)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/properties/basic/NameValueFactory.java 2008-09-18 18:12:00 UTC (rev 535)
@@ -32,7 +32,7 @@
import java.util.regex.Pattern;
import net.jcip.annotations.Immutable;
import org.jboss.dna.common.text.TextDecoder;
-import org.jboss.dna.common.util.ArgCheck;
+import org.jboss.dna.common.util.CheckArg;
import org.jboss.dna.graph.GraphI18n;
import org.jboss.dna.graph.properties.Binary;
import org.jboss.dna.graph.properties.DateTime;
@@ -70,7 +70,7 @@
TextDecoder decoder,
ValueFactory<String> stringValueFactory ) {
super(PropertyType.NAME, decoder, stringValueFactory);
- ArgCheck.isNotNull(namespaceRegistry, "namespaceRegistry");
+ CheckArg.isNotNull(namespaceRegistry, "namespaceRegistry");
this.namespaceRegistry = namespaceRegistry;
}
@@ -140,7 +140,7 @@
public Name create( String namespaceUri,
String localName,
TextDecoder decoder ) {
- ArgCheck.isNotEmpty(localName, "localName");
+ CheckArg.isNotEmpty(localName, "localName");
if (decoder == null) decoder = getDecoder();
namespaceUri = namespaceUri != null ? decoder.decode(namespaceUri.trim()) : null;
localName = decoder.decode(localName.trim());
Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/properties/basic/ObjectValueFactory.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/properties/basic/ObjectValueFactory.java 2008-09-18 18:00:04 UTC (rev 534)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/properties/basic/ObjectValueFactory.java 2008-09-18 18:12:00 UTC (rev 535)
@@ -30,7 +30,7 @@
import java.util.UUID;
import net.jcip.annotations.Immutable;
import org.jboss.dna.common.text.TextDecoder;
-import org.jboss.dna.common.util.ArgCheck;
+import org.jboss.dna.common.util.CheckArg;
import org.jboss.dna.graph.properties.Binary;
import org.jboss.dna.graph.properties.DateTime;
import org.jboss.dna.graph.properties.IoException;
@@ -56,7 +56,7 @@
ValueFactory<String> stringValueFactory,
ValueFactory<Binary> binaryValueFactory ) {
super(PropertyType.OBJECT, decoder, stringValueFactory);
- ArgCheck.isNotNull(binaryValueFactory, "binaryValueFactory");
+ CheckArg.isNotNull(binaryValueFactory, "binaryValueFactory");
this.binaryValueFactory = binaryValueFactory;
}
Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/properties/basic/PathValueFactory.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/properties/basic/PathValueFactory.java 2008-09-18 18:00:04 UTC (rev 534)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/properties/basic/PathValueFactory.java 2008-09-18 18:12:00 UTC (rev 535)
@@ -34,7 +34,7 @@
import java.util.regex.Pattern;
import net.jcip.annotations.Immutable;
import org.jboss.dna.common.text.TextDecoder;
-import org.jboss.dna.common.util.ArgCheck;
+import org.jboss.dna.common.util.CheckArg;
import org.jboss.dna.graph.GraphI18n;
import org.jboss.dna.graph.properties.Binary;
import org.jboss.dna.graph.properties.DateTime;
@@ -85,7 +85,7 @@
ValueFactory<String> stringValueFactory,
ValueFactory<Name> nameValueFactory ) {
super(PropertyType.PATH, decoder, stringValueFactory);
- ArgCheck.isNotNull(nameValueFactory, "nameValueFactory");
+ CheckArg.isNotNull(nameValueFactory, "nameValueFactory");
this.nameValueFactory = nameValueFactory;
}
@@ -278,7 +278,7 @@
List<Segment> segments = new ArrayList<Segment>(segmentNames.length);
for (Name segmentName : segmentNames) {
if (segmentName == null) {
- ArgCheck.containsNoNulls(segmentNames, "segment names");
+ CheckArg.containsNoNulls(segmentNames, "segment names");
}
segments.add(new BasicPathSegment(segmentName));
}
@@ -293,7 +293,7 @@
List<Segment> segmentsList = new ArrayList<Segment>(segments.length);
for (Segment segment : segments) {
if (segment == null) {
- ArgCheck.containsNoNulls(segments, "segments");
+ CheckArg.containsNoNulls(segments, "segments");
}
segmentsList.add(segment);
}
@@ -309,7 +309,7 @@
List<Segment> segmentsList = new LinkedList<Segment>();
for (Segment segment : segments) {
if (segment == null) {
- ArgCheck.containsNoNulls(segments, "segments");
+ CheckArg.containsNoNulls(segments, "segments");
}
segmentsList.add(segment);
}
@@ -336,7 +336,7 @@
List<Segment> segments = new ArrayList<Segment>(segmentNames.length);
for (Name segmentName : segmentNames) {
if (segmentName == null) {
- ArgCheck.containsNoNulls(segmentNames, "segment names");
+ CheckArg.containsNoNulls(segmentNames, "segment names");
}
segments.add(new BasicPathSegment(segmentName));
}
@@ -351,7 +351,7 @@
List<Segment> segmentsList = new ArrayList<Segment>(segments.length);
for (Segment segment : segments) {
if (segment == null) {
- ArgCheck.containsNoNulls(segments, "segments");
+ CheckArg.containsNoNulls(segments, "segments");
}
segmentsList.add(segment);
}
@@ -367,7 +367,7 @@
List<Segment> segmentsList = new LinkedList<Segment>();
for (Segment segment : segments) {
if (segment == null) {
- ArgCheck.containsNoNulls(segments, "segments");
+ CheckArg.containsNoNulls(segments, "segments");
}
segmentsList.add(segment);
}
@@ -382,8 +382,8 @@
*/
public Path create( Path parentPath,
Path childPath ) {
- ArgCheck.isNotNull(parentPath, "parent path");
- ArgCheck.isNotNull(childPath, "child path");
+ CheckArg.isNotNull(parentPath, "parent path");
+ CheckArg.isNotNull(childPath, "child path");
if (childPath.size() == 0) return parentPath;
if (parentPath.size() == 0) {
// Just need to return the child path, but it must be absolute if the parent is ...
@@ -403,8 +403,8 @@
public Path create( Path parentPath,
Name segmentName,
int index ) {
- ArgCheck.isNotNull(parentPath, "parent path");
- ArgCheck.isNotNull(segmentName, "segment name");
+ CheckArg.isNotNull(parentPath, "parent path");
+ CheckArg.isNotNull(segmentName, "segment name");
List<Segment> segments = new ArrayList<Segment>(parentPath.size() + 1);
segments.addAll(parentPath.getSegmentsList());
segments.add(new BasicPathSegment(segmentName, index));
@@ -416,14 +416,14 @@
*/
public Path create( Path parentPath,
Name... segmentNames ) {
- ArgCheck.isNotNull(parentPath, "parent path");
+ CheckArg.isNotNull(parentPath, "parent path");
if (segmentNames == null || segmentNames.length == 0) return parentPath;
List<Segment> segments = new ArrayList<Segment>(parentPath.size() + 1);
segments.addAll(parentPath.getSegmentsList());
for (Name segmentName : segmentNames) {
if (segmentName == null) {
- ArgCheck.containsNoNulls(segmentNames, "segment names");
+ CheckArg.containsNoNulls(segmentNames, "segment names");
}
segments.add(new BasicPathSegment(segmentName));
}
@@ -435,14 +435,14 @@
*/
public Path create( Path parentPath,
Segment... segments ) {
- ArgCheck.isNotNull(parentPath, "parent path");
+ CheckArg.isNotNull(parentPath, "parent path");
if (segments == null || segments.length == 0) return BasicPath.ROOT;
List<Segment> segmentsList = new ArrayList<Segment>(parentPath.size() + 1);
segmentsList.addAll(parentPath.getSegmentsList());
for (Segment segment : segments) {
if (segment == null) {
- ArgCheck.containsNoNulls(segments, "segments");
+ CheckArg.containsNoNulls(segments, "segments");
}
segmentsList.add(segment);
}
@@ -456,13 +456,13 @@
*/
public Path create( Path parentPath,
Iterable<Segment> segments ) {
- ArgCheck.isNotNull(parentPath, "parent path");
+ CheckArg.isNotNull(parentPath, "parent path");
List<Segment> segmentsList = new LinkedList<Segment>();
segmentsList.addAll(parentPath.getSegmentsList());
for (Segment segment : segments) {
if (segment == null) {
- ArgCheck.containsNoNulls(segments, "segments");
+ CheckArg.containsNoNulls(segments, "segments");
}
segmentsList.add(segment);
}
@@ -486,7 +486,7 @@
* {@inheritDoc}
*/
public Segment createSegment( Name segmentName ) {
- ArgCheck.isNotNull(segmentName, "segment name");
+ CheckArg.isNotNull(segmentName, "segment name");
if (Path.SELF_NAME.equals(segmentName)) return Path.SELF_SEGMENT;
if (Path.PARENT_NAME.equals(segmentName)) return Path.PARENT_SEGMENT;
return new BasicPathSegment(segmentName);
@@ -497,7 +497,7 @@
*/
public Segment createSegment( Name segmentName,
int index ) {
- ArgCheck.isNotNull(segmentName, "segment name");
+ CheckArg.isNotNull(segmentName, "segment name");
if (Path.SELF_NAME.equals(segmentName)) return Path.SELF_SEGMENT;
if (Path.PARENT_NAME.equals(segmentName)) return Path.PARENT_SEGMENT;
return new BasicPathSegment(segmentName, index);
@@ -521,7 +521,7 @@
*/
public Segment createSegment( String segmentName,
TextDecoder decoder ) {
- ArgCheck.isNotNull(segmentName, "segment name");
+ CheckArg.isNotNull(segmentName, "segment name");
if (Path.SELF.equals(segmentName)) return Path.SELF_SEGMENT;
if (Path.PARENT.equals(segmentName)) return Path.PARENT_SEGMENT;
int startBracketNdx = segmentName.indexOf('[');
@@ -547,7 +547,7 @@
*/
public Segment createSegment( String segmentName,
int index ) {
- ArgCheck.isNotNull(segmentName, "segment name");
+ CheckArg.isNotNull(segmentName, "segment name");
if (Path.SELF.equals(segmentName)) return Path.SELF_SEGMENT;
if (Path.PARENT.equals(segmentName)) return Path.PARENT_SEGMENT;
return new BasicPathSegment(this.nameValueFactory.create(segmentName), index);
Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/properties/basic/StandardValueFactories.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/properties/basic/StandardValueFactories.java 2008-09-18 18:00:04 UTC (rev 534)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/properties/basic/StandardValueFactories.java 2008-09-18 18:12:00 UTC (rev 535)
@@ -28,7 +28,7 @@
import net.jcip.annotations.Immutable;
import org.jboss.dna.common.text.TextDecoder;
import org.jboss.dna.common.text.TextEncoder;
-import org.jboss.dna.common.util.ArgCheck;
+import org.jboss.dna.common.util.CheckArg;
import org.jboss.dna.graph.properties.Binary;
import org.jboss.dna.graph.properties.DateTimeFactory;
import org.jboss.dna.graph.properties.NameFactory;
@@ -90,7 +90,7 @@
TextDecoder decoder,
TextEncoder encoder,
ValueFactory<?>... extraFactories ) {
- ArgCheck.isNotNull(namespaceRegistry, "namespaceRegistry");
+ CheckArg.isNotNull(namespaceRegistry, "namespaceRegistry");
this.namespaceRegistry = namespaceRegistry;
this.decoder = decoder != null ? decoder : ValueFactory.DEFAULT_DECODER;
this.encoder = encoder != null ? encoder : ValueFactory.DEFAULT_ENCODER;
Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/properties/basic/StringValueFactory.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/properties/basic/StringValueFactory.java 2008-09-18 18:00:04 UTC (rev 534)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/properties/basic/StringValueFactory.java 2008-09-18 18:12:00 UTC (rev 535)
@@ -33,7 +33,7 @@
import net.jcip.annotations.Immutable;
import org.jboss.dna.common.text.TextDecoder;
import org.jboss.dna.common.text.TextEncoder;
-import org.jboss.dna.common.util.ArgCheck;
+import org.jboss.dna.common.util.CheckArg;
import org.jboss.dna.common.util.IoUtil;
import org.jboss.dna.common.util.Logger;
import org.jboss.dna.graph.GraphI18n;
@@ -61,7 +61,7 @@
public StringValueFactory( TextDecoder decoder,
TextEncoder encoder ) {
super(PropertyType.STRING, decoder, null);
- ArgCheck.isNotNull(encoder, "encoder");
+ CheckArg.isNotNull(encoder, "encoder");
this.encoder = encoder;
}
Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/properties/basic/UriValueFactory.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/properties/basic/UriValueFactory.java 2008-09-18 18:00:04 UTC (rev 534)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/properties/basic/UriValueFactory.java 2008-09-18 18:12:00 UTC (rev 535)
@@ -31,7 +31,7 @@
import java.util.UUID;
import net.jcip.annotations.Immutable;
import org.jboss.dna.common.text.TextDecoder;
-import org.jboss.dna.common.util.ArgCheck;
+import org.jboss.dna.common.util.CheckArg;
import org.jboss.dna.graph.GraphI18n;
import org.jboss.dna.graph.properties.Binary;
import org.jboss.dna.graph.properties.DateTime;
@@ -59,7 +59,7 @@
TextDecoder decoder,
ValueFactory<String> stringValueFactory ) {
super(PropertyType.URI, decoder, stringValueFactory);
- ArgCheck.isNotNull(namespaceRegistry, "namespaceRegistry");
+ CheckArg.isNotNull(namespaceRegistry, "namespaceRegistry");
this.namespaceRegistry = namespaceRegistry;
}
Modified: trunk/dna-graph/src/main/java/org/jboss/dna/graph/util/GraphImporter.java
===================================================================
--- trunk/dna-graph/src/main/java/org/jboss/dna/graph/util/GraphImporter.java 2008-09-18 18:00:04 UTC (rev 534)
+++ trunk/dna-graph/src/main/java/org/jboss/dna/graph/util/GraphImporter.java 2008-09-18 18:12:00 UTC (rev 535)
@@ -38,7 +38,7 @@
import org.jboss.dna.common.i18n.I18n;
import org.jboss.dna.common.monitor.ProgressMonitor;
import org.jboss.dna.common.monitor.SimpleProgressMonitor;
-import org.jboss.dna.common.util.ArgCheck;
+import org.jboss.dna.common.util.CheckArg;
import org.jboss.dna.common.util.Logger;
import org.jboss.dna.graph.ExecutionContext;
import org.jboss.dna.graph.GraphI18n;
@@ -163,8 +163,8 @@
*/
public void into( String sourceName,
Path pathInSource ) throws IOException, RepositorySourceException {
- ArgCheck.isNotNull(sourceName, "sourceName");
- ArgCheck.isNotNull(pathInSource, "pathInSource");
+ CheckArg.isNotNull(sourceName, "sourceName");
+ CheckArg.isNotNull(pathInSource, "pathInSource");
importWithSequencer(getSequencer(), uri, mimeType, sourceName, pathInSource, getConflictBehavior());
}
}
@@ -174,8 +174,8 @@
public GraphImporter( RepositoryConnectionFactory sources,
ExecutionContext context ) {
- ArgCheck.isNotNull(sources, "sources");
- ArgCheck.isNotNull(context, "context");
+ CheckArg.isNotNull(sources, "sources");
+ CheckArg.isNotNull(context, "context");
this.sources = sources;
this.context = context;
}
@@ -198,7 +198,7 @@
* @throws IllegalArgumentException if the <code>uri</code> or destination path are null
*/
public ImportSpecification importXml( URI uri ) {
- ArgCheck.isNotNull(uri, "uri");
+ CheckArg.isNotNull(uri, "uri");
// Create the sequencer ...
StreamSequencer sequencer = new XmlSequencer();
@@ -214,7 +214,7 @@
* @throws IllegalArgumentException if the <code>uri</code> or destination path are null
*/
public ImportSpecification importXml( String pathToFile ) {
- ArgCheck.isNotNull(pathToFile, "pathToFile");
+ CheckArg.isNotNull(pathToFile, "pathToFile");
return importXml(new File(pathToFile).toURI());
}
@@ -227,7 +227,7 @@
* @throws IllegalArgumentException if the <code>uri</code> or destination path are null
*/
public ImportSpecification importXml( File file ) {
- ArgCheck.isNotNull(file, "file");
+ CheckArg.isNotNull(file, "file");
return importXml(file.toURI());
}
@@ -246,8 +246,8 @@
public void importXml( URI uri,
String sourceName,
Path destinationPathInSource ) throws IOException, RepositorySourceException {
- ArgCheck.isNotNull(uri, "uri");
- ArgCheck.isNotNull(destinationPathInSource, "destinationPathInSource");
+ CheckArg.isNotNull(uri, "uri");
+ CheckArg.isNotNull(destinationPathInSource, "destinationPathInSource");
// Create the sequencer ...
StreamSequencer sequencer = new XmlSequencer();
@@ -354,7 +354,7 @@
private final RepositorySource source;
protected SingleRepositorySourceConnectionFactory( RepositorySource source ) {
- ArgCheck.isNotNull(source, "source");
+ CheckArg.isNotNull(source, "source");
this.source = source;
}
@@ -381,8 +381,8 @@
protected ImporterCommands( Path destinationPath,
NodeConflictBehavior conflictBehavior ) {
- ArgCheck.isNotNull(destinationPath, "destinationPath");
- ArgCheck.isNotNull(conflictBehavior, "conflictBehavior");
+ CheckArg.isNotNull(destinationPath, "destinationPath");
+ CheckArg.isNotNull(conflictBehavior, "conflictBehavior");
this.conflictBehavior = conflictBehavior;
this.destinationPath = destinationPath;
this.nameFactory = getContext().getValueFactories().getNameFactory();
Modified: trunk/dna-graph/src/test/java/org/jboss/dna/graph/connectors/RepositoryOperations.java
===================================================================
--- trunk/dna-graph/src/test/java/org/jboss/dna/graph/connectors/RepositoryOperations.java 2008-09-18 18:00:04 UTC (rev 534)
+++ trunk/dna-graph/src/test/java/org/jboss/dna/graph/connectors/RepositoryOperations.java 2008-09-18 18:12:00 UTC (rev 535)
@@ -25,7 +25,7 @@
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.Callable;
-import org.jboss.dna.common.util.ArgCheck;
+import org.jboss.dna.common.util.CheckArg;
import org.jboss.dna.common.util.LogContext;
import org.jboss.dna.graph.ExecutionContext;
import org.jboss.dna.graph.connectors.RepositoryConnection;
@@ -55,7 +55,7 @@
public static <T> T call( ExecutionContext context,
RepositoryConnectionPool pool,
RepositoryOperation<T> operation ) throws RepositorySourceException, InterruptedException {
- ArgCheck.isNotNull(operation, "repository operation");
+ CheckArg.isNotNull(operation, "repository operation");
// Get a connection ...
T result = null;
LogContext.set("context", operation.getName());
@@ -86,7 +86,7 @@
public static <T> Callable<T> createCallable( final ExecutionContext context,
final RepositoryConnectionPool pool,
final RepositoryOperation<T> operation ) {
- ArgCheck.isNotNull(operation, "repository operation");
+ CheckArg.isNotNull(operation, "repository operation");
return new Callable<T>() {
/**
Modified: trunk/dna-graph/src/test/java/org/jboss/dna/graph/properties/AbstractValueComparatorsTest.java
===================================================================
--- trunk/dna-graph/src/test/java/org/jboss/dna/graph/properties/AbstractValueComparatorsTest.java 2008-09-18 18:00:04 UTC (rev 534)
+++ trunk/dna-graph/src/test/java/org/jboss/dna/graph/properties/AbstractValueComparatorsTest.java 2008-09-18 18:12:00 UTC (rev 535)
@@ -29,7 +29,7 @@
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
-import org.jboss.dna.common.util.ArgCheck;
+import org.jboss.dna.common.util.CheckArg;
import org.jboss.dna.graph.properties.ValueFactories;
import org.jboss.dna.graph.properties.basic.BasicNamespaceRegistry;
import org.jboss.dna.graph.properties.basic.StandardValueFactories;
@@ -48,8 +48,8 @@
protected final T[] validNonNullValues;
protected AbstractValueComparatorsTest( Comparator<T> comparator, T... validNonNullValues ) {
- ArgCheck.isNotNull(comparator, "comparator");
- ArgCheck.isNotEmpty(validNonNullValues, "validNonNullValues");
+ CheckArg.isNotNull(comparator, "comparator");
+ CheckArg.isNotEmpty(validNonNullValues, "validNonNullValues");
this.comparator = comparator;
this.validNonNullValues = validNonNullValues;
}
Modified: trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/AbstractJcrNode.java
===================================================================
--- trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/AbstractJcrNode.java 2008-09-18 18:00:04 UTC (rev 534)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/AbstractJcrNode.java 2008-09-18 18:12:00 UTC (rev 535)
@@ -45,7 +45,7 @@
import javax.jcr.version.Version;
import javax.jcr.version.VersionHistory;
import net.jcip.annotations.NotThreadSafe;
-import org.jboss.dna.common.util.ArgCheck;
+import org.jboss.dna.common.util.CheckArg;
import org.jboss.dna.graph.properties.Name;
import org.jboss.dna.graph.properties.Path.Segment;
@@ -73,7 +73,7 @@
* @see javax.jcr.Item#accept(javax.jcr.ItemVisitor)
*/
public final void accept( ItemVisitor visitor ) throws RepositoryException {
- ArgCheck.isNotNull(visitor, "visitor");
+ CheckArg.isNotNull(visitor, "visitor");
visitor.visit(this);
}
@@ -165,7 +165,7 @@
* @see javax.jcr.Item#getAncestor(int)
*/
public final Item getAncestor( int depth ) throws RepositoryException {
- ArgCheck.isNonNegative(depth, "depth");
+ CheckArg.isNonNegative(depth, "depth");
Node ancestor = this;
while (--depth >= 0) {
ancestor = ancestor.getParent();
@@ -234,7 +234,7 @@
* @see javax.jcr.Node#getNode(java.lang.String)
*/
public final Node getNode( String relativePath ) throws RepositoryException {
- ArgCheck.isNotEmpty(relativePath, "relativePath");
+ CheckArg.isNotEmpty(relativePath, "relativePath");
Item item = getSession().getItem(getPath(getPath(), relativePath));
if (item instanceof Node) {
return (Node)item;
@@ -261,12 +261,12 @@
// TODO: Implement after changing impl to delegate to Graph API
throw new UnsupportedOperationException();
/*
- ArgCheck.isNotEmpty(namePattern, "namePattern");
+ CheckArg.isNotEmpty(namePattern, "namePattern");
String[] disjuncts = namePattern.split("\\|");
List<Segment> nodes = new ArrayList<Segment>();
for (String disjunct : disjuncts) {
String pattern = disjunct.trim();
- ArgCheck.isNotEmpty(pattern, "namePattern");
+ CheckArg.isNotEmpty(pattern, "namePattern");
String ndxPattern;
int endNdx = pattern.length() - 1;
if (pattern.charAt(endNdx) == ']') {
@@ -337,7 +337,7 @@
* @see javax.jcr.Node#getProperty(java.lang.String)
*/
public final Property getProperty( String relativePath ) throws RepositoryException {
- ArgCheck.isNotEmpty(relativePath, "relativePath");
+ CheckArg.isNotEmpty(relativePath, "relativePath");
if (relativePath.indexOf('/') >= 0) {
Item item = session.getItem(getPath(getPath(), relativePath));
if (item instanceof Property) {
@@ -413,13 +413,13 @@
* @see javax.jcr.Node#hasNode(java.lang.String)
*/
public final boolean hasNode( String relativePath ) throws RepositoryException {
- ArgCheck.isNotEmpty(relativePath, "relativePath");
+ CheckArg.isNotEmpty(relativePath, "relativePath");
if (relativePath.indexOf('/') >= 0) {
return (getNode(relativePath) != null);
}
int ndxNdx = relativePath.indexOf('[');
String name = (ndxNdx < 0 ? relativePath : relativePath.substring(0, ndxNdx));
- ArgCheck.isNotEmpty(name, "relativePath");
+ CheckArg.isNotEmpty(name, "relativePath");
int childNdx = 0;
if (children != null) {
for (Name child : children) {
@@ -461,7 +461,7 @@
* @see javax.jcr.Node#hasProperty(java.lang.String)
*/
public final boolean hasProperty( String relativePath ) throws RepositoryException {
- ArgCheck.isNotEmpty(relativePath, "relativePath");
+ CheckArg.isNotEmpty(relativePath, "relativePath");
if (relativePath.indexOf('/') >= 0) {
return (getProperty(relativePath) != null);
}
@@ -532,7 +532,7 @@
*/
@Override
public final boolean isSame( Item otherItem ) throws RepositoryException {
- ArgCheck.isNotNull(otherItem, "otherItem");
+ CheckArg.isNotNull(otherItem, "otherItem");
if (super.isSame(otherItem) && otherItem instanceof Node) {
if (otherItem instanceof AbstractJcrNode) {
return getInternalUuid().equals(((AbstractJcrNode)otherItem).getInternalUuid());
Modified: trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/AbstractJcrProperty.java
===================================================================
--- trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/AbstractJcrProperty.java 2008-09-18 18:00:04 UTC (rev 534)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/AbstractJcrProperty.java 2008-09-18 18:12:00 UTC (rev 535)
@@ -35,7 +35,7 @@
import javax.jcr.Session;
import javax.jcr.Value;
import net.jcip.annotations.NotThreadSafe;
-import org.jboss.dna.common.util.ArgCheck;
+import org.jboss.dna.common.util.CheckArg;
import org.jboss.dna.graph.ExecutionContext;
import org.jboss.dna.graph.properties.Name;
import org.jboss.dna.graph.properties.Path;
@@ -69,7 +69,7 @@
* @see javax.jcr.Item#accept(javax.jcr.ItemVisitor)
*/
public final void accept( ItemVisitor visitor ) throws RepositoryException {
- ArgCheck.isNotNull(visitor, "visitor");
+ CheckArg.isNotNull(visitor, "visitor");
visitor.visit(this);
}
Modified: trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrNodeIterator.java
===================================================================
--- trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrNodeIterator.java 2008-09-18 18:00:04 UTC (rev 534)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrNodeIterator.java 2008-09-18 18:12:00 UTC (rev 535)
@@ -27,7 +27,7 @@
import javax.jcr.Node;
import javax.jcr.NodeIterator;
import javax.jcr.RepositoryException;
-import org.jboss.dna.common.util.ArgCheck;
+import org.jboss.dna.common.util.CheckArg;
import org.jboss.dna.graph.properties.Name;
/**
@@ -133,7 +133,7 @@
* @see javax.jcr.RangeIterator#skip(long)
*/
public void skip( long count ) {
- ArgCheck.isNonNegative(count, "count");
+ CheckArg.isNonNegative(count, "count");
while (--count >= 0) {
nextNode();
}
Modified: trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrProperty.java
===================================================================
--- trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrProperty.java 2008-09-18 18:00:04 UTC (rev 534)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrProperty.java 2008-09-18 18:12:00 UTC (rev 535)
@@ -172,7 +172,7 @@
*
@SuppressWarnings( "fallthrough" )
public void setValue( Value value ) throws RepositoryException {
- ArgCheck.isNotNull(value, "value");
+ CheckArg.isNotNull(value, "value");
// TODOx: Check node type constraint
try {
jcrValue = JcrValue.class.cast(value);
Modified: trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrPropertyIterator.java
===================================================================
--- trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrPropertyIterator.java 2008-09-18 18:00:04 UTC (rev 534)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrPropertyIterator.java 2008-09-18 18:12:00 UTC (rev 535)
@@ -25,7 +25,7 @@
import java.util.Set;
import javax.jcr.Property;
import javax.jcr.PropertyIterator;
-import org.jboss.dna.common.util.ArgCheck;
+import org.jboss.dna.common.util.CheckArg;
/**
* @author jverhaeg
@@ -105,7 +105,7 @@
* @see javax.jcr.RangeIterator#skip(long)
*/
public void skip( long count ) {
- ArgCheck.isNonNegative(count, "count");
+ CheckArg.isNonNegative(count, "count");
while (--count >= 0) {
nextProperty();
}
Modified: trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrRepository.java
===================================================================
--- trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrRepository.java 2008-09-18 18:00:04 UTC (rev 534)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrRepository.java 2008-09-18 18:12:00 UTC (rev 535)
@@ -36,7 +36,7 @@
import javax.jcr.SimpleCredentials;
import javax.security.auth.login.LoginContext;
import net.jcip.annotations.ThreadSafe;
-import org.jboss.dna.common.util.ArgCheck;
+import org.jboss.dna.common.util.CheckArg;
import org.jboss.dna.graph.ExecutionContext;
import org.jboss.dna.graph.ExecutionContextFactory;
import org.jboss.dna.graph.connectors.RepositoryConnectionFactory;
@@ -101,8 +101,8 @@
public JcrRepository( Map<String, String> descriptors,
ExecutionContextFactory executionContextFactory,
RepositoryConnectionFactory connectionFactory ) {
- ArgCheck.isNotNull(executionContextFactory, "executionContextFactory");
- ArgCheck.isNotNull(connectionFactory, "connectionFactory");
+ CheckArg.isNotNull(executionContextFactory, "executionContextFactory");
+ CheckArg.isNotNull(connectionFactory, "connectionFactory");
this.executionContextFactory = executionContextFactory;
this.connectionFactory = connectionFactory;
Map<String, String> modifiableDescriptors;
@@ -146,7 +146,7 @@
* @see javax.jcr.Repository#getDescriptor(java.lang.String)
*/
public String getDescriptor( String key ) {
- ArgCheck.isNotEmpty(key, "key");
+ CheckArg.isNotEmpty(key, "key");
return descriptors.get(key);
}
Modified: trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrSession.java
===================================================================
--- trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrSession.java 2008-09-18 18:00:04 UTC (rev 534)
+++ trunk/dna-jcr/src/main/java/org/jboss/dna/jcr/JcrSession.java 2008-09-18 18:12:00 UTC (rev 535)
@@ -45,7 +45,7 @@
import javax.security.auth.login.LoginContext;
import javax.security.auth.login.LoginException;
import net.jcip.annotations.NotThreadSafe;
-import org.jboss.dna.common.util.ArgCheck;
+import org.jboss.dna.common.util.CheckArg;
import org.jboss.dna.common.util.StringUtil;
import org.jboss.dna.graph.DnaLexicon;
import org.jboss.dna.graph.ExecutionContext;
@@ -115,8 +115,8 @@
*/
public void checkPermission( String path,
String actions ) {
- ArgCheck.isNotEmpty(path, "path");
- ArgCheck.isNotEmpty(actions, "actions");
+ CheckArg.isNotEmpty(path, "path");
+ CheckArg.isNotEmpty(actions, "actions");
if (!"read".equals(actions)) {
throw new AccessControlException(JcrI18n.permissionDenied.text(path, actions));
}
@@ -226,7 +226,7 @@
* @see javax.jcr.Session#getItem(java.lang.String)
*/
public Item getItem( String absolutePath ) throws RepositoryException {
- ArgCheck.isNotEmpty(absolutePath, "absolutePath");
+ CheckArg.isNotEmpty(absolutePath, "absolutePath");
// Return root node if path is "/"
Path path = executionContext.getValueFactories().getPathFactory().create(absolutePath);
if (path.isRoot()) {
Modified: trunk/dna-repository/src/main/java/org/jboss/dna/repository/RepositoryLibrary.java
===================================================================
--- trunk/dna-repository/src/main/java/org/jboss/dna/repository/RepositoryLibrary.java 2008-09-18 18:00:04 UTC (rev 534)
+++ trunk/dna-repository/src/main/java/org/jboss/dna/repository/RepositoryLibrary.java 2008-09-18 18:12:00 UTC (rev 535)
@@ -32,7 +32,7 @@
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import net.jcip.annotations.ThreadSafe;
-import org.jboss.dna.common.util.ArgCheck;
+import org.jboss.dna.common.util.CheckArg;
import org.jboss.dna.graph.ExecutionContext;
import org.jboss.dna.graph.ExecutionContextFactory;
import org.jboss.dna.graph.connectors.BasicExecutionContextFactory;
@@ -144,7 +144,7 @@
*/
public RepositoryLibrary( ExecutionContextFactory executionContextFactory,
RepositoryConnectionFactory delegate ) {
- ArgCheck.isNotNull(executionContextFactory, "executionContextFactory");
+ CheckArg.isNotNull(executionContextFactory, "executionContextFactory");
this.delegate = delegate;
this.executionContextFactory = executionContextFactory;
this.repositoryContext = new RepositoryContext() {
Modified: trunk/dna-repository/src/main/java/org/jboss/dna/repository/RepositoryService.java
===================================================================
--- trunk/dna-repository/src/main/java/org/jboss/dna/repository/RepositoryService.java 2008-09-18 18:00:04 UTC (rev 534)
+++ trunk/dna-repository/src/main/java/org/jboss/dna/repository/RepositoryService.java 2008-09-18 18:12:00 UTC (rev 535)
@@ -31,7 +31,7 @@
import org.jboss.dna.common.collection.SimpleProblems;
import org.jboss.dna.common.component.ClassLoaderFactory;
import org.jboss.dna.common.component.StandardClassLoaderFactory;
-import org.jboss.dna.common.util.ArgCheck;
+import org.jboss.dna.common.util.CheckArg;
import org.jboss.dna.common.util.Reflection;
import org.jboss.dna.connector.federation.FederationException;
import org.jboss.dna.graph.DnaLexicon;
@@ -147,9 +147,9 @@
Path pathToConfigurationRoot,
ExecutionContext context,
ClassLoaderFactory classLoaderFactory ) {
- ArgCheck.isNotNull(configurationSourceName, "configurationSourceName");
- ArgCheck.isNotNull(sources, "sources");
- ArgCheck.isNotNull(context, "context");
+ CheckArg.isNotNull(configurationSourceName, "configurationSourceName");
+ CheckArg.isNotNull(sources, "sources");
+ CheckArg.isNotNull(context, "context");
if (pathToConfigurationRoot == null) pathToConfigurationRoot = context.getValueFactories().getPathFactory().create("/dna:system");
this.sources = sources;
this.pathToConfigurationRoot = pathToConfigurationRoot;
Modified: trunk/dna-repository/src/main/java/org/jboss/dna/repository/observation/ObservationService.java
===================================================================
--- trunk/dna-repository/src/main/java/org/jboss/dna/repository/observation/ObservationService.java 2008-09-18 18:00:04 UTC (rev 534)
+++ trunk/dna-repository/src/main/java/org/jboss/dna/repository/observation/ObservationService.java 2008-09-18 18:12:00 UTC (rev 535)
@@ -41,7 +41,7 @@
import javax.jcr.observation.ObservationManager;
import net.jcip.annotations.GuardedBy;
import net.jcip.annotations.ThreadSafe;
-import org.jboss.dna.common.util.ArgCheck;
+import org.jboss.dna.common.util.CheckArg;
import org.jboss.dna.common.util.Logger;
import org.jboss.dna.repository.RepositoryI18n;
import org.jboss.dna.repository.services.AbstractServiceAdministrator;
@@ -141,7 +141,7 @@
private final Administrator administrator = new Administrator();
public ObservationService( SessionFactory sessionFactory ) {
- ArgCheck.isNotNull(sessionFactory, "session factory");
+ CheckArg.isNotNull(sessionFactory, "session factory");
this.sessionFactory = sessionFactory;
}
Modified: trunk/dna-repository/src/main/java/org/jboss/dna/repository/rules/RuleService.java
===================================================================
--- trunk/dna-repository/src/main/java/org/jboss/dna/repository/rules/RuleService.java 2008-09-18 18:00:04 UTC (rev 534)
+++ trunk/dna-repository/src/main/java/org/jboss/dna/repository/rules/RuleService.java 2008-09-18 18:12:00 UTC (rev 535)
@@ -52,7 +52,7 @@
import org.jboss.dna.common.SystemFailureException;
import org.jboss.dna.common.component.ClassLoaderFactory;
import org.jboss.dna.common.component.StandardClassLoaderFactory;
-import org.jboss.dna.common.util.ArgCheck;
+import org.jboss.dna.common.util.CheckArg;
import org.jboss.dna.common.util.Logger;
import org.jboss.dna.common.util.StringUtil;
import org.jboss.dna.repository.RepositoryI18n;
@@ -194,7 +194,7 @@
* @see #removeRuleSet(String)
*/
public boolean addRuleSet( RuleSet ruleSet ) {
- ArgCheck.isNotNull(ruleSet, "rule set");
+ CheckArg.isNotNull(ruleSet, "rule set");
final String providerUri = ruleSet.getProviderUri();
final String ruleSetName = ruleSet.getName();
final String rules = ruleSet.getRules();
@@ -304,7 +304,7 @@
* @see #updateRuleSet(RuleSet)
*/
public boolean removeRuleSet( String ruleSetName ) {
- ArgCheck.isNotEmpty(ruleSetName, "rule set");
+ CheckArg.isNotEmpty(ruleSetName, "rule set");
try {
this.lock.writeLock().lock();
RuleSet ruleSet = this.ruleSets.remove(ruleSetName);
@@ -358,7 +358,7 @@
* {@link RuleSet#getProviderUri() RuleSet's provider URI}.
*/
public List<?> executeRules( String ruleSetName, Map<String, Object> globals, Object... facts ) {
- ArgCheck.isNotEmpty(ruleSetName, "rule set name");
+ CheckArg.isNotEmpty(ruleSetName, "rule set name");
List<?> result = null;
List<?> factList = Arrays.asList(facts);
try {
Modified: trunk/dna-repository/src/main/java/org/jboss/dna/repository/rules/RuleSet.java
===================================================================
--- trunk/dna-repository/src/main/java/org/jboss/dna/repository/rules/RuleSet.java 2008-09-18 18:00:04 UTC (rev 534)
+++ trunk/dna-repository/src/main/java/org/jboss/dna/repository/rules/RuleSet.java 2008-09-18 18:12:00 UTC (rev 535)
@@ -33,7 +33,7 @@
import net.jcip.annotations.Immutable;
import org.jboss.dna.common.component.ClassLoaderFactory;
import org.jboss.dna.common.component.ComponentConfig;
-import org.jboss.dna.common.util.ArgCheck;
+import org.jboss.dna.common.util.CheckArg;
/**
* A description of a set of rules compatible with a JSR-94 rule engine.
@@ -64,9 +64,9 @@
public RuleSet( String name, String description, String classname, String[] classpath, String providerUri, String ruleSetUri, String rules, Map<String, Object> properties ) {
super(name, description, System.currentTimeMillis(), classname, classpath);
if (ruleSetUri == null) ruleSetUri = name.trim();
- ArgCheck.isNotEmpty(ruleSetUri, "rule set URI");
- ArgCheck.isNotEmpty(providerUri, "provider URI");
- ArgCheck.isNotEmpty(rules, "rules");
+ CheckArg.isNotEmpty(ruleSetUri, "rule set URI");
+ CheckArg.isNotEmpty(providerUri, "provider URI");
+ CheckArg.isNotEmpty(rules, "rules");
this.providerUri = providerUri;
this.ruleSetUri = ruleSetUri;
this.rules = rules;
Modified: trunk/dna-repository/src/main/java/org/jboss/dna/repository/rules/RuleSetRepositoryMonitor.java
===================================================================
--- trunk/dna-repository/src/main/java/org/jboss/dna/repository/rules/RuleSetRepositoryMonitor.java 2008-09-18 18:00:04 UTC (rev 534)
+++ trunk/dna-repository/src/main/java/org/jboss/dna/repository/rules/RuleSetRepositoryMonitor.java 2008-09-18 18:12:00 UTC (rev 535)
@@ -35,7 +35,7 @@
import javax.jcr.Session;
import net.jcip.annotations.ThreadSafe;
import org.jboss.dna.common.collection.SimpleProblems;
-import org.jboss.dna.common.util.ArgCheck;
+import org.jboss.dna.common.util.CheckArg;
import org.jboss.dna.common.util.Logger;
import org.jboss.dna.repository.RepositoryI18n;
import org.jboss.dna.repository.observation.NodeChange;
@@ -85,8 +85,8 @@
public RuleSetRepositoryMonitor( RuleService ruleService,
String jcrAbsolutePath,
JcrExecutionContext executionContext ) {
- ArgCheck.isNotNull(ruleService, "rule service");
- ArgCheck.isNotNull(executionContext, "execution context");
+ CheckArg.isNotNull(ruleService, "rule service");
+ CheckArg.isNotNull(executionContext, "execution context");
this.ruleService = ruleService;
this.executionContext = executionContext;
this.executorService = Executors.newSingleThreadExecutor();
Modified: trunk/dna-repository/src/main/java/org/jboss/dna/repository/sequencers/SequencerNodeContext.java
===================================================================
--- trunk/dna-repository/src/main/java/org/jboss/dna/repository/sequencers/SequencerNodeContext.java 2008-09-18 18:00:04 UTC (rev 534)
+++ trunk/dna-repository/src/main/java/org/jboss/dna/repository/sequencers/SequencerNodeContext.java 2008-09-18 18:12:00 UTC (rev 535)
@@ -32,7 +32,7 @@
import javax.jcr.RepositoryException;
import javax.jcr.Value;
import net.jcip.annotations.Immutable;
-import org.jboss.dna.common.util.ArgCheck;
+import org.jboss.dna.common.util.CheckArg;
import org.jboss.dna.common.util.Logger;
import org.jboss.dna.graph.properties.Name;
import org.jboss.dna.graph.properties.NamespaceRegistry;
@@ -164,7 +164,7 @@
* @see org.jboss.dna.graph.sequencers.SequencerContext#getInputProperty(org.jboss.dna.graph.properties.Name)
*/
public Property getInputProperty( Name name ) {
- ArgCheck.isNotNull(name, "name");
+ CheckArg.isNotNull(name, "name");
for (Property prop : props) {
if (name.equals(prop.getName())) {
return prop;
Modified: trunk/dna-repository/src/main/java/org/jboss/dna/repository/sequencers/SequencerOutputMap.java
===================================================================
--- trunk/dna-repository/src/main/java/org/jboss/dna/repository/sequencers/SequencerOutputMap.java 2008-09-18 18:00:04 UTC (rev 534)
+++ trunk/dna-repository/src/main/java/org/jboss/dna/repository/sequencers/SequencerOutputMap.java 2008-09-18 18:12:00 UTC (rev 535)
@@ -30,7 +30,7 @@
import java.util.Map;
import net.jcip.annotations.Immutable;
import net.jcip.annotations.NotThreadSafe;
-import org.jboss.dna.common.util.ArgCheck;
+import org.jboss.dna.common.util.CheckArg;
import org.jboss.dna.common.util.StringUtil;
import org.jboss.dna.graph.properties.Name;
import org.jboss.dna.graph.properties.NameFactory;
@@ -57,7 +57,7 @@
private final Name jcrName;
public SequencerOutputMap( ValueFactories factories ) {
- ArgCheck.isNotNull(factories, "factories");
+ CheckArg.isNotNull(factories, "factories");
this.data = new HashMap<Path, List<PropertyValue>>();
this.factories = factories;
this.jcrName = this.factories.getNameFactory().create(JCR_NAME_PROPERTY_NAME);
@@ -87,8 +87,8 @@
public void setProperty( Path nodePath,
Name propertyName,
Object... values ) {
- ArgCheck.isNotNull(nodePath, "nodePath");
- ArgCheck.isNotNull(propertyName, "property");
+ CheckArg.isNotNull(nodePath, "nodePath");
+ CheckArg.isNotNull(propertyName, "property");
// Ignore the "jcr:name" property, as that's handled by the path ...
if (this.jcrName.equals(propertyName)) return;
@@ -115,8 +115,8 @@
public void setProperty( String nodePath,
String property,
Object... values ) {
- ArgCheck.isNotEmpty(nodePath, "nodePath");
- ArgCheck.isNotEmpty(property, "property");
+ CheckArg.isNotEmpty(nodePath, "nodePath");
+ CheckArg.isNotEmpty(property, "property");
Path path = this.factories.getPathFactory().create(nodePath);
Name propertyName = this.factories.getNameFactory().create(property);
setProperty(path, propertyName, values);
Modified: trunk/dna-repository/src/main/java/org/jboss/dna/repository/sequencers/SequencerPathExpression.java
===================================================================
--- trunk/dna-repository/src/main/java/org/jboss/dna/repository/sequencers/SequencerPathExpression.java 2008-09-18 18:00:04 UTC (rev 534)
+++ trunk/dna-repository/src/main/java/org/jboss/dna/repository/sequencers/SequencerPathExpression.java 2008-09-18 18:12:00 UTC (rev 535)
@@ -26,7 +26,7 @@
import java.util.Map;
import java.util.regex.Pattern;
import net.jcip.annotations.Immutable;
-import org.jboss.dna.common.util.ArgCheck;
+import org.jboss.dna.common.util.CheckArg;
import org.jboss.dna.common.util.HashCode;
import org.jboss.dna.graph.properties.PathExpression;
import org.jboss.dna.repository.RepositoryI18n;
@@ -80,7 +80,7 @@
* @throws InvalidSequencerPathExpression if the expression is blank or is not a valid expression
*/
public static final SequencerPathExpression compile( String expression ) throws InvalidSequencerPathExpression {
- ArgCheck.isNotNull(expression, "sequencer path expression");
+ CheckArg.isNotNull(expression, "sequencer path expression");
expression = expression.trim();
if (expression.length() == 0) {
throw new InvalidSequencerPathExpression(RepositoryI18n.pathExpressionMayNotBeBlank.text());
@@ -100,7 +100,7 @@
protected SequencerPathExpression( PathExpression selectExpression,
String outputExpression ) throws InvalidSequencerPathExpression {
- ArgCheck.isNotNull(selectExpression, "select expression");
+ CheckArg.isNotNull(selectExpression, "select expression");
this.selectExpression = selectExpression;
this.outputExpression = outputExpression != null ? outputExpression.trim() : DEFAULT_OUTPUT_EXPRESSION;
this.hc = HashCode.compute(this.selectExpression, this.outputExpression);
Modified: trunk/dna-repository/src/main/java/org/jboss/dna/repository/sequencers/SequencingService.java
===================================================================
--- trunk/dna-repository/src/main/java/org/jboss/dna/repository/sequencers/SequencingService.java 2008-09-18 18:00:04 UTC (rev 534)
+++ trunk/dna-repository/src/main/java/org/jboss/dna/repository/sequencers/SequencingService.java 2008-09-18 18:12:00 UTC (rev 535)
@@ -49,7 +49,7 @@
import org.jboss.dna.common.monitor.LoggingProgressMonitor;
import org.jboss.dna.common.monitor.ProgressMonitor;
import org.jboss.dna.common.monitor.SimpleProgressMonitor;
-import org.jboss.dna.common.util.ArgCheck;
+import org.jboss.dna.common.util.CheckArg;
import org.jboss.dna.common.util.HashCode;
import org.jboss.dna.common.util.Logger;
import org.jboss.dna.graph.properties.NamespaceRegistry;
@@ -326,7 +326,7 @@
* @param executionContext Sets executionContext to the specified value.
*/
public void setExecutionContext( JcrExecutionContext executionContext ) {
- ArgCheck.isNotNull(executionContext, "execution context");
+ CheckArg.isNotNull(executionContext, "execution context");
if (this.getAdministrator().isStarted()) {
throw new IllegalStateException(RepositoryI18n.unableToChangeExecutionContextWhileRunning.text());
}
@@ -361,7 +361,7 @@
* @see Executors#newSingleThreadScheduledExecutor(java.util.concurrent.ThreadFactory)
*/
public void setExecutorService( ExecutorService executorService ) {
- ArgCheck.isNotNull(executorService, "executor service");
+ CheckArg.isNotNull(executorService, "executor service");
if (this.getAdministrator().isStarted()) {
throw new IllegalStateException(RepositoryI18n.unableToChangeExecutionContextWhileRunning.text());
}
Modified: trunk/dna-repository/src/main/java/org/jboss/dna/repository/util/AbstractSessionFactory.java
===================================================================
--- trunk/dna-repository/src/main/java/org/jboss/dna/repository/util/AbstractSessionFactory.java 2008-09-18 18:00:04 UTC (rev 534)
+++ trunk/dna-repository/src/main/java/org/jboss/dna/repository/util/AbstractSessionFactory.java 2008-09-18 18:12:00 UTC (rev 535)
@@ -30,7 +30,7 @@
import javax.jcr.Session;
import javax.jcr.SimpleCredentials;
import org.jboss.dna.common.SystemFailureException;
-import org.jboss.dna.common.util.ArgCheck;
+import org.jboss.dna.common.util.CheckArg;
/**
* A SessionFactory implementation that creates {@link Session} instances using {@link Repository} instances.
@@ -174,7 +174,7 @@
* {@inheritDoc}
*/
public Session createSession( String name ) throws RepositoryException {
- ArgCheck.isNotNull(name, "session name");
+ CheckArg.isNotNull(name, "session name");
name = name.trim();
// Look up the Repository object in JNDI ...
String repositoryName = getRepositoryName(name);
Modified: trunk/dna-repository/src/main/java/org/jboss/dna/repository/util/BasicJcrExecutionContext.java
===================================================================
--- trunk/dna-repository/src/main/java/org/jboss/dna/repository/util/BasicJcrExecutionContext.java 2008-09-18 18:00:04 UTC (rev 534)
+++ trunk/dna-repository/src/main/java/org/jboss/dna/repository/util/BasicJcrExecutionContext.java 2008-09-18 18:12:00 UTC (rev 535)
@@ -21,7 +21,7 @@
*/
package org.jboss.dna.repository.util;
-import org.jboss.dna.common.util.ArgCheck;
+import org.jboss.dna.common.util.CheckArg;
import org.jboss.dna.graph.connectors.BasicExecutionContext;
import org.jboss.dna.graph.properties.NamespaceRegistry;
import org.jboss.dna.graph.properties.PropertyFactory;
@@ -50,7 +50,7 @@
ValueFactories valueFactories,
PropertyFactory propertyFactory ) {
super(namespaceRegistry, valueFactories, propertyFactory);
- ArgCheck.isNotNull(sessionFactory, "session factory");
+ CheckArg.isNotNull(sessionFactory, "session factory");
this.sessionFactory = sessionFactory;
}
Modified: trunk/dna-repository/src/main/java/org/jboss/dna/repository/util/JcrNamespaceRegistry.java
===================================================================
--- trunk/dna-repository/src/main/java/org/jboss/dna/repository/util/JcrNamespaceRegistry.java 2008-09-18 18:00:04 UTC (rev 534)
+++ trunk/dna-repository/src/main/java/org/jboss/dna/repository/util/JcrNamespaceRegistry.java 2008-09-18 18:12:00 UTC (rev 535)
@@ -26,7 +26,7 @@
import java.util.Set;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
-import org.jboss.dna.common.util.ArgCheck;
+import org.jboss.dna.common.util.CheckArg;
import org.jboss.dna.graph.properties.NamespaceException;
import org.jboss.dna.graph.properties.NamespaceRegistry;
@@ -39,8 +39,8 @@
private final SessionFactory sessionFactory;
public JcrNamespaceRegistry( SessionFactory sessionFactory, String repositoryWorkspaceName ) {
- ArgCheck.isNotNull(sessionFactory, "sessionFactory");
- ArgCheck.isNotNull(repositoryWorkspaceName, "repositoryWorkspaceName");
+ CheckArg.isNotNull(sessionFactory, "sessionFactory");
+ CheckArg.isNotNull(repositoryWorkspaceName, "repositoryWorkspaceName");
this.repositoryWorkspaceName = repositoryWorkspaceName;
this.sessionFactory = sessionFactory;
}
Modified: trunk/dna-repository/src/main/java/org/jboss/dna/repository/util/JndiSessionFactory.java
===================================================================
--- trunk/dna-repository/src/main/java/org/jboss/dna/repository/util/JndiSessionFactory.java 2008-09-18 18:00:04 UTC (rev 534)
+++ trunk/dna-repository/src/main/java/org/jboss/dna/repository/util/JndiSessionFactory.java 2008-09-18 18:12:00 UTC (rev 535)
@@ -29,7 +29,7 @@
import javax.naming.InitialContext;
import javax.naming.NamingException;
import org.jboss.dna.common.SystemFailureException;
-import org.jboss.dna.common.util.ArgCheck;
+import org.jboss.dna.common.util.CheckArg;
import org.jboss.dna.repository.RepositoryI18n;
/**
@@ -96,7 +96,7 @@
*/
public JndiSessionFactory( Context context, char... workspaceDelimiters ) {
super(workspaceDelimiters);
- ArgCheck.isNotNull(context, "initial context");
+ CheckArg.isNotNull(context, "initial context");
this.context = context;
}
Modified: trunk/docs/examples/gettingstarted/repositories/src/main/java/org/jboss/example/dna/repository/RepositoryClient.java
===================================================================
--- trunk/docs/examples/gettingstarted/repositories/src/main/java/org/jboss/example/dna/repository/RepositoryClient.java 2008-09-18 18:00:04 UTC (rev 534)
+++ trunk/docs/examples/gettingstarted/repositories/src/main/java/org/jboss/example/dna/repository/RepositoryClient.java 2008-09-18 18:12:00 UTC (rev 535)
@@ -40,7 +40,7 @@
import org.jboss.dna.common.component.ClassLoaderFactory;
import org.jboss.dna.common.component.StandardClassLoaderFactory;
import org.jboss.dna.common.text.NoOpEncoder;
-import org.jboss.dna.common.util.ArgCheck;
+import org.jboss.dna.common.util.CheckArg;
import org.jboss.dna.connector.inmemory.InMemoryRepositorySource;
import org.jboss.dna.graph.ExecutionContext;
import org.jboss.dna.graph.ExecutionContextFactory;
@@ -370,7 +370,7 @@
private final LoginContext context;
public JaasCredentials( LoginContext context ) {
- ArgCheck.isNotNull(context, "context");
+ CheckArg.isNotNull(context, "context");
this.context = context;
}
Modified: trunk/eclipse-preferences.epf
===================================================================
--- trunk/eclipse-preferences.epf 2008-09-18 18:00:04 UTC (rev 534)
+++ trunk/eclipse-preferences.epf 2008-09-18 18:12:00 UTC (rev 535)
@@ -72,7 +72,7 @@
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.compiler.source=1.5
-/instance/org.eclipse.jdt.ui/content_assist_favorite_static_members=org.junit.Assert.*;org.hamcrest.core.IsEqual.*;org.junit.matchers.JUnitMatchers.*;org.hamcrest.core.AllOf.*;org.hamcrest.core.AnyOf.*;org.hamcrest.core.IsInstanceOf.*;org.hamcrest.core.IsNot.*;org.hamcrest.core.IsNull.*;org.hamcrest.core.IsSame.*;org.hamcrest.core.DescribedAs.*;org.junit.matchers.IsCollectionContaining.*;org.junit.matchers.StringContains.*;org.hamcrest.core.Is.is;org.hamcrest.core.IsNot.not;org.hamcrest.core.IsNull.nullValue;org.hamcrest.core.IsNull.notNullValue;org.hamcrest.core.IsSame.sameInstance;org.hamcrest.core.IsInstanceOf.instanceOf;org.hamcrest.core.IsEqual.equalTo;org.hamcrest.core.IsAnything.anything;org.hamcrest.core.IsAnything.any;org.hamcrest.core.DescribedAs.describedAs;org.hamcrest.core.AnyOf.anyOf;org.hamcrest.core.AllOf.allOf;org.junit.matchers.IsCollectionContaining.hasItem;org.junit.matchers.IsCollectionContaining.hasItems;org.junit.matchers.Each.each;org.junit.matchers.!
JUnitMatchers.hasItem;org.junit.matchers.JUnitMatchers.hasItems;org.junit.matchers.JUnitMatchers.containsString;org.junit.matchers.JUnitMatchers.each;org.junit.matchers.JUnitMatchers.both;org.junit.matchers.JUnitMatchers.either;org.junit.matchers.StringContains.containsString;org.junit.matchers.TypeSafeMatcher.matches;org.hamcrest.collection.IsArray.*;org.hamcrest.collection.IsArrayContaining.*;org.hamcrest.number.IsCloseTo.*;org.mockito.Mockito.mock;org.mockito.Mockito.stub;org.mockito.Mockito.verify;org.mockito.Mockito.atLeastOnce;org.mockito.Mockito.inOrder;org.mockito.Mockito.never;org.mockito.Mockito.stubVoid;org.mockito.Mockito.times;org.mockito.Matchers;org.mockito.Matchers.anyBoolean;org.mockito.Matchers.anyByte;org.mockito.Matchers.anyChar;org.mockito.Matchers.anyDouble;org.mockito.Matchers.anyFloat;org.mockito.Matchers.anyInt;org.mockito.Matchers.anyLong;org.mockito.Matchers.anyObject;org.mockito.Matchers.anyShort;org.mockito.Matchers.anyString;org.mockito.Matcher!
s.argThat;org.mockito.Matchers.booleanThat;org.mockito.Matchers.byteTh
at;org.mockito.Matchers.charThat;org.mockito.Matchers.contains;org.mockito.Matchers.doubleThat;org.mockito.Matchers.endsWith;org.mockito.Matchers.eq;org.mockito.Matchers.floatThat;org.mockito.Matchers.intThat;org.mockito.Matchers.isA;org.mockito.Matchers.isNull;org.mockito.Matchers.longThat;org.mockito.Matchers.matches;org.mockito.Matchers.notNull;org.mockito.Matchers.refEq;org.mockito.Matchers.same;org.mockito.Matchers.shortThat;org.mockito.Matchers.startsWith;org.jboss.dna.common.text.StringMatcher.startsWith;org.jboss.dna.spi.graph.connection.RepositorySourceLoadHarness.runLoadTest;org.mockito.Mockito.verifyNoMoreInteractions;org.mockito.Mockito.verifyZeroInteractions;org.jboss.dna.common.collection.IsIteratorContaining.hasItems;org.jboss.dna.common.collection.IsIteratorContaining.hasItem.*;org.mockito.Mockito.doReturn;org.mockito.Mockito.doThrow;org.mockito.Mockito.doAnswer;org.mockito.Mockito.doNothing;org.mockito.Mockito.anyList;org.mockito.Mockito.anyMap;org.mockito.M!
ockito.anyCollection;org.mockito.Mockito.spy
+/instance/org.eclipse.jdt.ui/content_assist_favorite_static_members=org.junit.Assert.*;org.hamcrest.core.IsEqual.*;org.junit.matchers.JUnitMatchers.*;org.hamcrest.core.AllOf.*;org.hamcrest.core.AnyOf.*;org.hamcrest.core.IsInstanceOf.*;org.hamcrest.core.IsNot.*;org.hamcrest.core.IsNull.*;org.hamcrest.core.IsSame.*;org.hamcrest.core.DescribedAs.*;org.junit.matchers.IsCollectionContaining.*;org.junit.matchers.StringContains.*;org.hamcrest.core.Is.is;org.hamcrest.core.IsNot.not;org.hamcrest.core.IsNull.nullValue;org.hamcrest.core.IsNull.notNullValue;org.hamcrest.core.IsSame.sameInstance;org.hamcrest.core.IsInstanceOf.instanceOf;org.hamcrest.core.IsEqual.equalTo;org.hamcrest.core.IsAnything.anything;org.hamcrest.core.IsAnything.any;org.hamcrest.core.DescribedAs.describedAs;org.hamcrest.core.AnyOf.anyOf;org.hamcrest.core.AllOf.allOf;org.junit.matchers.IsCollectionContaining.hasItem;org.junit.matchers.IsCollectionContaining.hasItems;org.junit.matchers.Each.each;org.junit.matchers.!
JUnitMatchers.hasItem;org.junit.matchers.JUnitMatchers.hasItems;org.junit.matchers.JUnitMatchers.containsString;org.junit.matchers.JUnitMatchers.each;org.junit.matchers.JUnitMatchers.both;org.junit.matchers.JUnitMatchers.either;org.junit.matchers.StringContains.containsString;org.junit.matchers.TypeSafeMatcher.matches;org.hamcrest.collection.IsArray.*;org.hamcrest.collection.IsArrayContaining.*;org.hamcrest.number.IsCloseTo.*;org.mockito.Mockito.mock;org.mockito.Mockito.stub;org.mockito.Mockito.verify;org.mockito.Mockito.atLeastOnce;org.mockito.Mockito.inOrder;org.mockito.Mockito.never;org.mockito.Mockito.stubVoid;org.mockito.Mockito.times;org.mockito.Matchers;org.mockito.Matchers.anyBoolean;org.mockito.Matchers.anyByte;org.mockito.Matchers.anyChar;org.mockito.Matchers.anyDouble;org.mockito.Matchers.anyFloat;org.mockito.Matchers.anyInt;org.mockito.Matchers.anyLong;org.mockito.Matchers.anyObject;org.mockito.Matchers.anyShort;org.mockito.Matchers.anyString;org.mockito.Matcher!
s.argThat;org.mockito.Matchers.booleanThat;org.mockito.Matchers.byteTh
at;org.mockito.Matchers.charThat;org.mockito.Matchers.contains;org.mockito.Matchers.doubleThat;org.mockito.Matchers.endsWith;org.mockito.Matchers.eq;org.mockito.Matchers.floatThat;org.mockito.Matchers.intThat;org.mockito.Matchers.isA;org.mockito.Matchers.isNull;org.mockito.Matchers.longThat;org.mockito.Matchers.matches;org.mockito.Matchers.notNull;org.mockito.Matchers.refEq;org.mockito.Matchers.same;org.mockito.Matchers.shortThat;org.mockito.Matchers.startsWith;org.jboss.dna.common.text.StringMatcher.startsWith;org.jboss.dna.graph.connectors.RepositorySourceLoadHarness.runLoadTest;org.mockito.Mockito.verifyNoMoreInteractions;org.mockito.Mockito.verifyZeroInteractions;org.jboss.dna.common.collection.IsIteratorContaining.hasItems;org.jboss.dna.common.collection.IsIteratorContaining.hasItem.*;org.mockito.Mockito.doReturn;org.mockito.Mockito.doThrow;org.mockito.Mockito.doAnswer;org.mockito.Mockito.doNothing;org.mockito.Mockito.anyList;org.mockito.Mockito.anyMap;org.mockito.Mocki!
to.anyCollection;org.mockito.Mockito.spy
/instance/org.eclipse.jdt.ui/org.eclipse.jdt.ui.gettersetter.use.is=true
/instance/org.eclipse.jdt.ui/org.eclipse.jdt.ui.ignorelowercasenames=true
/instance/org.eclipse.jdt.ui/org.eclipse.jdt.ui.importorder=\#;java;javax;org;com;
Modified: trunk/extensions/dna-classloader-maven/src/main/java/org/jboss/dna/maven/MavenDependency.java
===================================================================
--- trunk/extensions/dna-classloader-maven/src/main/java/org/jboss/dna/maven/MavenDependency.java 2008-09-18 18:00:04 UTC (rev 534)
+++ trunk/extensions/dna-classloader-maven/src/main/java/org/jboss/dna/maven/MavenDependency.java 2008-09-18 18:12:00 UTC (rev 535)
@@ -24,7 +24,7 @@
import java.util.EnumSet;
import java.util.LinkedHashSet;
import java.util.Set;
-import org.jboss.dna.common.util.ArgCheck;
+import org.jboss.dna.common.util.CheckArg;
/**
* The cornerstone of Maven is its dependency list. Most every project depends upon others to build and run correctly, and if all
@@ -89,7 +89,7 @@
}
public MavenDependency( MavenId id ) {
- ArgCheck.isNotNull(id, "id");
+ CheckArg.isNotNull(id, "id");
this.id = id;
}
Modified: trunk/extensions/dna-classloader-maven/src/main/java/org/jboss/dna/maven/MavenId.java
===================================================================
--- trunk/extensions/dna-classloader-maven/src/main/java/org/jboss/dna/maven/MavenId.java 2008-09-18 18:00:04 UTC (rev 534)
+++ trunk/extensions/dna-classloader-maven/src/main/java/org/jboss/dna/maven/MavenId.java 2008-09-18 18:12:00 UTC (rev 535)
@@ -27,7 +27,7 @@
import java.util.regex.Pattern;
import org.jboss.dna.common.text.TextEncoder;
import org.jboss.dna.common.text.NoOpEncoder;
-import org.jboss.dna.common.util.ArgCheck;
+import org.jboss.dna.common.util.CheckArg;
import org.jboss.dna.common.util.HashCode;
import org.jboss.dna.common.util.StringUtil;
@@ -110,9 +110,9 @@
* @throws IllegalArgumentException if the supplied string is null or if the string does not match the expected format
*/
public MavenId( String coordinates ) {
- ArgCheck.isNotNull(coordinates, "coordinates");
+ CheckArg.isNotNull(coordinates, "coordinates");
coordinates = coordinates.trim();
- ArgCheck.isNotEmpty(coordinates, "coordinates");
+ CheckArg.isNotEmpty(coordinates, "coordinates");
// This regular expression has the following groups:
// 1) groupId
@@ -131,8 +131,8 @@
String artifactId = matcher.group(3);
String version = matcher.group(5);
String classifier = matcher.group(7);
- ArgCheck.isNotEmpty(groupId, "groupId");
- ArgCheck.isNotEmpty(artifactId, "artifactId");
+ CheckArg.isNotEmpty(groupId, "groupId");
+ CheckArg.isNotEmpty(artifactId, "artifactId");
this.groupId = groupId.trim();
this.artifactId = artifactId.trim();
this.classifier = classifier != null ? classifier.trim() : "";
@@ -169,8 +169,8 @@
* @throws IllegalArgumentException if the group or artifact identifiers are null, empty or blank
*/
public MavenId( String groupId, String artifactId, String version, String classifier ) {
- ArgCheck.isNotEmpty(groupId, "groupId");
- ArgCheck.isNotEmpty(artifactId, "artifactId");
+ CheckArg.isNotEmpty(groupId, "groupId");
+ CheckArg.isNotEmpty(artifactId, "artifactId");
this.groupId = groupId.trim();
this.artifactId = artifactId.trim();
this.classifier = classifier != null ? classifier.trim() : "";
Modified: trunk/extensions/dna-classloader-maven/src/main/java/org/jboss/dna/maven/MavenRepository.java
===================================================================
--- trunk/extensions/dna-classloader-maven/src/main/java/org/jboss/dna/maven/MavenRepository.java 2008-09-18 18:00:04 UTC (rev 534)
+++ trunk/extensions/dna-classloader-maven/src/main/java/org/jboss/dna/maven/MavenRepository.java 2008-09-18 18:12:00 UTC (rev 535)
@@ -43,7 +43,7 @@
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import org.jboss.dna.common.component.ClassLoaderFactory;
-import org.jboss.dna.common.util.ArgCheck;
+import org.jboss.dna.common.util.CheckArg;
import org.jboss.dna.common.util.Logger;
import org.jboss.dna.common.xml.SimpleNamespaceContext;
import org.jboss.dna.maven.spi.JcrMavenUrlProvider;
@@ -73,7 +73,7 @@
private final Logger logger;
public MavenRepository( final MavenUrlProvider urlProvider ) {
- ArgCheck.isNotNull(urlProvider, "urlProvider");
+ CheckArg.isNotNull(urlProvider, "urlProvider");
this.urlProvider = urlProvider;
this.classLoaders = new MavenClassLoaders(this);
this.logger = Logger.getLogger(this.getClass());
@@ -94,8 +94,8 @@
* @throws IllegalArgumentException if no Maven IDs are passed in or if any of the IDs are null
*/
public ClassLoader getClassLoader( ClassLoader parent, MavenId... mavenIds ) {
- ArgCheck.isNotEmpty(mavenIds, "mavenIds");
- ArgCheck.containsNoNulls(mavenIds, "mavenIds");
+ CheckArg.isNotEmpty(mavenIds, "mavenIds");
+ CheckArg.containsNoNulls(mavenIds, "mavenIds");
return this.classLoaders.getClassLoader(parent, mavenIds);
}
@@ -121,8 +121,8 @@
* @throws IllegalArgumentException if no coordinates are passed in or if any of the coordinate references is null
*/
public ClassLoader getClassLoader( ClassLoader parent, String... coordinates ) {
- ArgCheck.isNotEmpty(coordinates, "coordinates");
- ArgCheck.containsNoNulls(coordinates, "coordinates");
+ CheckArg.isNotEmpty(coordinates, "coordinates");
+ CheckArg.containsNoNulls(coordinates, "coordinates");
MavenId[] mavenIds = new MavenId[coordinates.length];
for (int i = 0; i < coordinates.length; i++) {
String coordinate = coordinates[i];
@@ -212,8 +212,8 @@
* @throws MavenRepositoryException if there is a problem reading the POM file given the supplied stream and MavenId
*/
protected List<MavenDependency> getDependencies( MavenId mavenId, InputStream pomStream, MavenDependency.Scope... allowedScopes ) throws IOException {
- ArgCheck.isNotNull(mavenId, "mavenId");
- ArgCheck.isNotNull(pomStream, "pomStream");
+ CheckArg.isNotNull(mavenId, "mavenId");
+ CheckArg.isNotNull(pomStream, "pomStream");
EnumSet<MavenDependency.Scope> includedScopes = MavenDependency.Scope.getRuntimeScopes();
if (allowedScopes != null && allowedScopes.length > 0) includedScopes = EnumSet.of(allowedScopes[0], allowedScopes);
List<MavenDependency> results = new ArrayList<MavenDependency>();
Modified: trunk/extensions/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/FederatedRepository.java
===================================================================
--- trunk/extensions/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/FederatedRepository.java 2008-09-18 18:00:04 UTC (rev 534)
+++ trunk/extensions/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/FederatedRepository.java 2008-09-18 18:12:00 UTC (rev 535)
@@ -28,7 +28,7 @@
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
import net.jcip.annotations.ThreadSafe;
-import org.jboss.dna.common.util.ArgCheck;
+import org.jboss.dna.common.util.CheckArg;
import org.jboss.dna.connector.federation.executor.FederatingCommandExecutor;
import org.jboss.dna.graph.ExecutionContext;
import org.jboss.dna.graph.commands.executor.CommandExecutor;
@@ -66,9 +66,9 @@
public FederatedRepository( ExecutionContext context,
RepositoryConnectionFactory connectionFactory,
FederatedRepositoryConfig config ) {
- ArgCheck.isNotNull(connectionFactory, "connectionFactory");
- ArgCheck.isNotNull(context, "context");
- ArgCheck.isNotNull(config, "config");
+ CheckArg.isNotNull(connectionFactory, "connectionFactory");
+ CheckArg.isNotNull(context, "context");
+ CheckArg.isNotNull(config, "config");
this.context = context;
this.connectionFactory = connectionFactory;
this.config = config;
@@ -216,7 +216,7 @@
* @throws IllegalArgumentException if the configuration is null
*/
public void setConfiguration( FederatedRepositoryConfig config ) {
- ArgCheck.isNotNull(config, "config");
+ CheckArg.isNotNull(config, "config");
this.config = config;
}
Modified: trunk/extensions/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/FederatedRepositoryConfig.java
===================================================================
--- trunk/extensions/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/FederatedRepositoryConfig.java 2008-09-18 18:00:04 UTC (rev 534)
+++ trunk/extensions/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/FederatedRepositoryConfig.java 2008-09-18 18:12:00 UTC (rev 535)
@@ -28,7 +28,7 @@
import net.jcip.annotations.Immutable;
import org.jboss.dna.common.collection.Problems;
import org.jboss.dna.common.collection.ThreadSafeProblems;
-import org.jboss.dna.common.util.ArgCheck;
+import org.jboss.dna.common.util.CheckArg;
import org.jboss.dna.graph.cache.CachePolicy;
import org.jboss.dna.graph.connectors.RepositorySource;
@@ -61,8 +61,8 @@
Projection cacheProjection,
Iterable<Projection> sourceProjections,
CachePolicy defaultCachePolicy ) {
- ArgCheck.isNotEmpty(repositoryName, "repositoryName");
- ArgCheck.isNotNull(cacheProjection, "cacheProjection");
+ CheckArg.isNotEmpty(repositoryName, "repositoryName");
+ CheckArg.isNotNull(cacheProjection, "cacheProjection");
this.name = repositoryName;
this.problems = new ThreadSafeProblems();
this.defaultCachePolicy = defaultCachePolicy;
@@ -75,7 +75,7 @@
}
}
this.sourceProjections = Collections.unmodifiableList(projectionList);
- ArgCheck.isNotEmpty(this.sourceProjections, "sourceProjections");
+ CheckArg.isNotEmpty(this.sourceProjections, "sourceProjections");
}
/**
Modified: trunk/extensions/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/FederatedRepositorySource.java
===================================================================
--- trunk/extensions/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/FederatedRepositorySource.java 2008-09-18 18:00:04 UTC (rev 534)
+++ trunk/extensions/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/FederatedRepositorySource.java 2008-09-18 18:12:00 UTC (rev 535)
@@ -44,7 +44,7 @@
import org.jboss.dna.common.collection.Problems;
import org.jboss.dna.common.collection.SimpleProblems;
import org.jboss.dna.common.i18n.I18n;
-import org.jboss.dna.common.util.ArgCheck;
+import org.jboss.dna.common.util.CheckArg;
import org.jboss.dna.common.util.Logger;
import org.jboss.dna.connector.federation.executor.FederatingCommandExecutor;
import org.jboss.dna.connector.federation.executor.SingleProjectionCommandExecutor;
@@ -133,7 +133,7 @@
*/
public FederatedRepositorySource( String repositoryName ) {
super();
- ArgCheck.isNotNull(repositoryName, "repositoryName");
+ CheckArg.isNotNull(repositoryName, "repositoryName");
this.repositoryName = repositoryName;
}
@@ -328,7 +328,7 @@
* @see #setName(String)
*/
public synchronized void setRepositoryName( String repositoryName ) {
- ArgCheck.isNotEmpty(repositoryName, "repositoryName");
+ CheckArg.isNotEmpty(repositoryName, "repositoryName");
if (this.repositoryName != null && this.repositoryName.equals(repositoryName)) return; // unchanged
this.repositoryName = repositoryName;
changeRepositoryConfig();
Modified: trunk/extensions/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/Projection.java
===================================================================
--- trunk/extensions/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/Projection.java 2008-09-18 18:00:04 UTC (rev 534)
+++ trunk/extensions/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/Projection.java 2008-09-18 18:12:00 UTC (rev 535)
@@ -35,7 +35,7 @@
import java.util.regex.Pattern;
import net.jcip.annotations.Immutable;
import org.jboss.dna.common.text.TextEncoder;
-import org.jboss.dna.common.util.ArgCheck;
+import org.jboss.dna.common.util.CheckArg;
import org.jboss.dna.common.util.HashCode;
import org.jboss.dna.common.util.Logger;
import org.jboss.dna.graph.ExecutionContext;
@@ -106,9 +106,9 @@
public static void addRuleParser( ClassLoader classLoader,
String className,
String methodName ) throws SecurityException, NoSuchMethodException, ClassNotFoundException {
- ArgCheck.isNotNull(classLoader, "classLoader");
- ArgCheck.isNotEmpty(className, "className");
- ArgCheck.isNotEmpty(methodName, "methodName");
+ CheckArg.isNotNull(classLoader, "classLoader");
+ CheckArg.isNotEmpty(className, "className");
+ CheckArg.isNotEmpty(methodName, "methodName");
Class<?> clazz = Class.forName(className, true, classLoader);
parserMethods.add(clazz.getMethod(className, String.class, ExecutionContext.class));
}
@@ -134,8 +134,8 @@
*/
public static boolean removeRuleParser( String declaringClassName,
String methodName ) {
- ArgCheck.isNotEmpty(declaringClassName, "declaringClassName");
- ArgCheck.isNotEmpty(methodName, "methodName");
+ CheckArg.isNotEmpty(declaringClassName, "declaringClassName");
+ CheckArg.isNotEmpty(methodName, "methodName");
for (Method method : parserMethods) {
if (method.getName().equals(methodName) && method.getDeclaringClass().getName().equals(declaringClassName)) {
return parserMethods.remove(method);
@@ -153,7 +153,7 @@
*/
public static Rule fromString( String definition,
ExecutionContext context ) {
- ArgCheck.isNotNull(context, "env");
+ CheckArg.isNotNull(context, "env");
definition = definition != null ? definition.trim() : "";
if (definition.length() == 0) return null;
for (Method method : parserMethods) {
@@ -243,15 +243,15 @@
*/
public Projection( String sourceName,
Rule... rules ) {
- ArgCheck.isNotEmpty(sourceName, "sourceName");
- ArgCheck.isNotEmpty(rules, "rules");
+ CheckArg.isNotEmpty(sourceName, "sourceName");
+ CheckArg.isNotEmpty(rules, "rules");
this.sourceName = sourceName;
List<Rule> rulesList = new ArrayList<Rule>();
for (Rule rule : rules) {
if (rule != null) rulesList.add(rule);
}
this.rules = Collections.unmodifiableList(rulesList);
- ArgCheck.isNotEmpty(this.rules, "rules");
+ CheckArg.isNotEmpty(this.rules, "rules");
this.simple = computeSimpleProjection(this.rules);
}
@@ -286,7 +286,7 @@
*/
public Set<Path> getPathsInSource( Path canonicalPathInRepository,
PathFactory factory ) {
- ArgCheck.isNotNull(factory, "factory");
+ CheckArg.isNotNull(factory, "factory");
assert canonicalPathInRepository == null ? true : canonicalPathInRepository.equals(canonicalPathInRepository.getCanonicalPath());
Set<Path> paths = new HashSet<Path>();
for (Rule rule : getRules()) {
@@ -308,7 +308,7 @@
*/
public Set<Path> getPathsInRepository( Path canonicalPathInSource,
PathFactory factory ) {
- ArgCheck.isNotNull(factory, "factory");
+ CheckArg.isNotNull(factory, "factory");
assert canonicalPathInSource == null ? true : canonicalPathInSource.equals(canonicalPathInSource.getCanonicalPath());
Set<Path> paths = new HashSet<Path>();
for (Rule rule : getRules()) {
@@ -325,7 +325,7 @@
* @return the list of top-level paths, in the proper order and containing no duplicates; never null
*/
public List<Path> getTopLevelPathsInRepository( PathFactory factory ) {
- ArgCheck.isNotNull(factory, "factory");
+ CheckArg.isNotNull(factory, "factory");
List<Rule> rules = getRules();
Set<Path> uniquePaths = new HashSet<Path>();
List<Path> paths = new ArrayList<Path>(rules.size());
Modified: trunk/extensions/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/ProjectionParser.java
===================================================================
--- trunk/extensions/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/ProjectionParser.java 2008-09-18 18:00:04 UTC (rev 534)
+++ trunk/extensions/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/ProjectionParser.java 2008-09-18 18:12:00 UTC (rev 535)
@@ -27,7 +27,7 @@
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import org.jboss.dna.common.text.TextEncoder;
-import org.jboss.dna.common.util.ArgCheck;
+import org.jboss.dna.common.util.CheckArg;
import org.jboss.dna.common.util.Logger;
import org.jboss.dna.common.util.StringUtil;
import org.jboss.dna.connector.federation.Projection.Rule;
@@ -99,8 +99,8 @@
*/
public void addRuleParser( Class<?> clazz,
String methodName ) throws SecurityException, NoSuchMethodException {
- ArgCheck.isNotNull(clazz, "clazz");
- ArgCheck.isNotEmpty(methodName, "methodName");
+ CheckArg.isNotNull(clazz, "clazz");
+ CheckArg.isNotEmpty(methodName, "methodName");
parserMethods.add(clazz.getMethod(methodName, String.class, ExecutionContext.class));
}
@@ -125,9 +125,9 @@
public void addRuleParser( ClassLoader classLoader,
String className,
String methodName ) throws SecurityException, NoSuchMethodException, ClassNotFoundException {
- ArgCheck.isNotNull(classLoader, "classLoader");
- ArgCheck.isNotEmpty(className, "className");
- ArgCheck.isNotEmpty(methodName, "methodName");
+ CheckArg.isNotNull(classLoader, "classLoader");
+ CheckArg.isNotEmpty(className, "className");
+ CheckArg.isNotEmpty(methodName, "methodName");
Class<?> clazz = Class.forName(className, true, classLoader);
parserMethods.add(clazz.getMethod(methodName, String.class, ExecutionContext.class));
}
@@ -153,8 +153,8 @@
*/
public boolean removeRuleParser( String declaringClassName,
String methodName ) {
- ArgCheck.isNotEmpty(declaringClassName, "declaringClassName");
- ArgCheck.isNotEmpty(methodName, "methodName");
+ CheckArg.isNotEmpty(declaringClassName, "declaringClassName");
+ CheckArg.isNotEmpty(methodName, "methodName");
for (Method method : parserMethods) {
if (method.getName().equals(methodName) && method.getDeclaringClass().getName().equals(declaringClassName)) {
return parserMethods.remove(method);
@@ -179,7 +179,7 @@
*/
public Rule ruleFromString( String definition,
ExecutionContext context ) {
- ArgCheck.isNotNull(context, "env");
+ CheckArg.isNotNull(context, "env");
definition = definition != null ? definition.trim() : "";
if (definition.length() == 0) return null;
Logger logger = context.getLogger(getClass());
Modified: trunk/extensions/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/contribution/ContributionStatistics.java
===================================================================
--- trunk/extensions/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/contribution/ContributionStatistics.java 2008-09-18 18:00:04 UTC (rev 534)
+++ trunk/extensions/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/contribution/ContributionStatistics.java 2008-09-18 18:12:00 UTC (rev 535)
@@ -29,7 +29,7 @@
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.atomic.AtomicLong;
-import org.jboss.dna.common.util.ArgCheck;
+import org.jboss.dna.common.util.CheckArg;
import org.jboss.dna.common.util.HashCode;
/**
@@ -81,7 +81,7 @@
* @return the list of N (or fewer)
*/
public static List<Data> getTop( int n ) {
- ArgCheck.isPositive(n, "n");
+ CheckArg.isPositive(n, "n");
LinkedList<Data> results = new LinkedList<Data>();
for (Map.Entry<Stats, AtomicLong> entry : DATA.entrySet()) {
long value = entry.getValue().get();
Modified: trunk/extensions/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/merge/MergePlan.java
===================================================================
--- trunk/extensions/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/merge/MergePlan.java 2008-09-18 18:00:04 UTC (rev 534)
+++ trunk/extensions/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/merge/MergePlan.java 2008-09-18 18:12:00 UTC (rev 535)
@@ -35,7 +35,7 @@
import net.jcip.annotations.GuardedBy;
import net.jcip.annotations.ThreadSafe;
import org.jboss.dna.common.CommonI18n;
-import org.jboss.dna.common.util.ArgCheck;
+import org.jboss.dna.common.util.CheckArg;
import org.jboss.dna.common.util.StringUtil;
import org.jboss.dna.connector.federation.contribution.Contribution;
import org.jboss.dna.connector.federation.contribution.EmptyContribution;
@@ -60,7 +60,7 @@
public abstract class MergePlan implements Serializable, Iterable<Contribution> {
public static MergePlan create( Contribution... contributions ) {
- ArgCheck.isNotNull(contributions, "contributions");
+ CheckArg.isNotNull(contributions, "contributions");
switch (contributions.length) {
case 0:
throw new IllegalArgumentException(CommonI18n.argumentMayNotBeEmpty.text("contributions"));
@@ -81,7 +81,7 @@
}
public static MergePlan create( Collection<Contribution> contributions ) {
- ArgCheck.isNotNull(contributions, "contributions");
+ CheckArg.isNotNull(contributions, "contributions");
Iterator<Contribution> iter = contributions.iterator();
switch (contributions.size()) {
case 0:
@@ -103,8 +103,8 @@
public static MergePlan addContribution( MergePlan plan,
Contribution contribution ) {
- ArgCheck.isNotNull(plan, "plan");
- ArgCheck.isNotNull(contribution, "contribution");
+ CheckArg.isNotNull(plan, "plan");
+ CheckArg.isNotNull(contribution, "contribution");
if (plan instanceof MultipleContributionMergePlan) {
((MultipleContributionMergePlan)plan).addContribution(contribution);
return plan;
Modified: trunk/extensions/dna-connector-inmemory/src/main/java/org/jboss/dna/connector/inmemory/InMemoryRepository.java
===================================================================
--- trunk/extensions/dna-connector-inmemory/src/main/java/org/jboss/dna/connector/inmemory/InMemoryRepository.java 2008-09-18 18:00:04 UTC (rev 534)
+++ trunk/extensions/dna-connector-inmemory/src/main/java/org/jboss/dna/connector/inmemory/InMemoryRepository.java 2008-09-18 18:12:00 UTC (rev 535)
@@ -29,7 +29,7 @@
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import net.jcip.annotations.NotThreadSafe;
-import org.jboss.dna.common.util.ArgCheck;
+import org.jboss.dna.common.util.CheckArg;
import org.jboss.dna.graph.DnaLexicon;
import org.jboss.dna.graph.ExecutionContext;
import org.jboss.dna.graph.commands.ActsOnPath;
@@ -65,8 +65,8 @@
public InMemoryRepository( String name,
UUID rootNodeUUID ) {
- ArgCheck.isNotNull(rootNodeUUID, "rootNodeUUID");
- ArgCheck.isNotEmpty(name, "name");
+ CheckArg.isNotNull(rootNodeUUID, "rootNodeUUID");
+ CheckArg.isNotEmpty(name, "name");
this.name = name;
this.rootNodeUuid = rootNodeUUID;
// Create the root node ...
Modified: trunk/extensions/dna-connector-inmemory/src/main/java/org/jboss/dna/connector/inmemory/InMemoryRepositorySource.java
===================================================================
--- trunk/extensions/dna-connector-inmemory/src/main/java/org/jboss/dna/connector/inmemory/InMemoryRepositorySource.java 2008-09-18 18:00:04 UTC (rev 534)
+++ trunk/extensions/dna-connector-inmemory/src/main/java/org/jboss/dna/connector/inmemory/InMemoryRepositorySource.java 2008-09-18 18:12:00 UTC (rev 535)
@@ -42,7 +42,7 @@
import javax.naming.spi.ObjectFactory;
import net.jcip.annotations.GuardedBy;
import org.jboss.dna.common.i18n.I18n;
-import org.jboss.dna.common.util.ArgCheck;
+import org.jboss.dna.common.util.CheckArg;
import org.jboss.dna.graph.cache.CachePolicy;
import org.jboss.dna.graph.connectors.RepositoryConnection;
import org.jboss.dna.graph.connectors.RepositoryContext;
@@ -176,7 +176,7 @@
*/
public synchronized void setJndiName( String name,
Context context ) throws NamingException {
- ArgCheck.isNotNull(name, "name");
+ CheckArg.isNotNull(name, "name");
if (context == null) context = new InitialContext();
// First register in JNDI under the new name ...
Modified: trunk/extensions/dna-sequencer-java/src/main/java/org/jboss/dna/sequencer/java/AbstractJavaMetadata.java
===================================================================
--- trunk/extensions/dna-sequencer-java/src/main/java/org/jboss/dna/sequencer/java/AbstractJavaMetadata.java 2008-09-18 18:00:04 UTC (rev 534)
+++ trunk/extensions/dna-sequencer-java/src/main/java/org/jboss/dna/sequencer/java/AbstractJavaMetadata.java 2008-09-18 18:12:00 UTC (rev 535)
@@ -45,7 +45,7 @@
import org.eclipse.jdt.core.dom.Type;
import org.eclipse.jdt.core.dom.TypeDeclaration;
import org.eclipse.jdt.core.dom.VariableDeclarationFragment;
-import org.jboss.dna.common.util.ArgCheck;
+import org.jboss.dna.common.util.CheckArg;
import org.jboss.dna.sequencer.java.metadata.ArrayTypeFieldMetadata;
import org.jboss.dna.sequencer.java.metadata.ClassMetadata;
import org.jboss.dna.sequencer.java.metadata.ConstructorMetadata;
@@ -431,7 +431,7 @@
* @throws IllegalArgumentException if type is null.
*/
private String getTypeName( Type type ) {
- ArgCheck.isNotNull(type, "type");
+ CheckArg.isNotNull(type, "type");
if (type.isPrimitiveType()) {
PrimitiveType primitiveType = (PrimitiveType)type;
return primitiveType.getPrimitiveTypeCode().toString();
Modified: trunk/extensions/dna-sequencer-java/src/main/java/org/jboss/dna/sequencer/java/JavaMetadataUtil.java
===================================================================
--- trunk/extensions/dna-sequencer-java/src/main/java/org/jboss/dna/sequencer/java/JavaMetadataUtil.java 2008-09-18 18:00:04 UTC (rev 534)
+++ trunk/extensions/dna-sequencer-java/src/main/java/org/jboss/dna/sequencer/java/JavaMetadataUtil.java 2008-09-18 18:12:00 UTC (rev 535)
@@ -25,7 +25,7 @@
import java.io.InputStream;
import org.eclipse.jdt.core.dom.Name;
import org.eclipse.jdt.internal.compiler.util.Util;
-import org.jboss.dna.common.util.ArgCheck;
+import org.jboss.dna.common.util.CheckArg;
/**
* @author Serge Pagop
@@ -65,7 +65,7 @@
* @return a FQN of the name.
*/
public static String getName( Name name ) {
- ArgCheck.isNotNull(name, "name");
+ CheckArg.isNotNull(name, "name");
return name.getFullyQualifiedName();
}
@@ -79,8 +79,8 @@
*/
public static String createPathWithIndex( String path,
int index ) {
- ArgCheck.isNotEmpty(path, "path");
- ArgCheck.isPositive(index, "index");
+ CheckArg.isNotEmpty(path, "path");
+ CheckArg.isPositive(index, "index");
return path + "[" + index + "]";
}
@@ -92,7 +92,7 @@
* @throws IllegalArgumentException if the path is null, blank or empty
*/
public static String createPath( String path ) {
- ArgCheck.isNotEmpty(path, "path");
+ CheckArg.isNotEmpty(path, "path");
return path;
}
15 years, 7 months