You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by bu...@apache.org on 2015/03/18 19:37:02 UTC

svn commit: r944235 - in /websites/staging/cayenne/trunk/content: ./ 2015/ 2015/03/ 2015/03/cayenne-40m2-released.html

Author: buildbot
Date: Wed Mar 18 18:37:02 2015
New Revision: 944235

Log:
Staging update by buildbot for cayenne

Added:
    websites/staging/cayenne/trunk/content/2015/
    websites/staging/cayenne/trunk/content/2015/03/
    websites/staging/cayenne/trunk/content/2015/03/cayenne-40m2-released.html
Modified:
    websites/staging/cayenne/trunk/content/   (props changed)

Propchange: websites/staging/cayenne/trunk/content/
------------------------------------------------------------------------------
--- cms:source-revision (original)
+++ cms:source-revision Wed Mar 18 18:37:02 2015
@@ -1 +1 @@
-1667584
+1667600

Added: websites/staging/cayenne/trunk/content/2015/03/cayenne-40m2-released.html
==============================================================================
--- websites/staging/cayenne/trunk/content/2015/03/cayenne-40m2-released.html (added)
+++ websites/staging/cayenne/trunk/content/2015/03/cayenne-40m2-released.html Wed Mar 18 18:37:02 2015
@@ -0,0 +1,287 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html lang="en">
+<head>
+<title>Cayenne 4.0 Milestone 2 Released | Apache Cayenne</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<meta name="keywords" content=" apache cayenne, object relational mapping, open source orm, orm">
+<meta name="description" content=" Apache Cayenne is a powerful, full-featured, open-source object relational mapping framework created for developers working with relational databases.">
+<link rel="stylesheet" type="text/css" media="screen, projection" href="/css/styles.css">
+<link rel="stylesheet" type="text/css" media="print" href="/css/print.css">
+<link rel="shortcut icon" href="/img/favicon.ico" type="image/ico">
+<script type="text/javascript" src="/js/scripts.js"></script>
+<script type="text/javascript">
+  var _gaq = _gaq || [];
+  _gaq.push(['_setAccount', 'UA-7036673-1']);
+  _gaq.push(['_trackPageview']);
+  (function() {
+    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
+    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
+    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
+  })();
+</script>
+</head>
+<body>
+<div id="wrap"><div id="wrap-inner">
+
+<div id="header">
+	<h1><a href="/" title="Return to Apache Cayenne home"><span>The Apache Cayenne Project</span></a></h1>
+	<h2><a href="http://www.apache.org" title="The Apache Software Foundation"><span>The Apache Software Foundation</span></a></h2>
+</div>
+
+<div id="container">
+
+ 
+<div id="sidebar">
+<ul id="nav">
+	<li><a href="/about.html">About</a>
+		<ul>
+			<li><a href="/why-cayenne.html">Why Cayenne?</a></li>
+			<li><a href="/download.html">Download</a></li>
+			<li><a href="/success-stories.html">Success Stories</a></li>
+			<li><a href="/support.html">Support</a></li>
+		</ul>
+	</li>
+	<li><a href="/docs/index.html">Documentation</a>
+		<ul>
+			<li><a href="/docs/4.0/tutorial/index.html">Getting Started (4.0)</a></li>
+			<li class="trigger"><a href="/docs/4.0/index.html">Version 4.0 (snapshot)</a>
+				<ul>
+					<li><a href="/docs/4.0/cayenne-guide/index.html">Cayenne Guide</a></li>
+					<li><a href="/docs/4.0/tutorial/index.html">Tutorial</a></li>
+					<li><a href="/docs/4.0/tutorial-rop/index.html">ROP Tutorial</a></li>
+					<li><a href="/docs/4.0/upgrade-guide/index.html">Upgrade Guide</a></li>
+					<li><a href="/docs/4.0/api/index.html">JavaDoc</a></li>
+				</ul>
+			</li>
+			<li class="trigger"><a href="/docs/3.1/index.html">Version 3.1 (stable)</a>
+				<ul>
+					<li><a href="/docs/3.1/cayenne-guide/index.html">Cayenne Guide</a></li>
+					<li><a href="/docs/3.1/tutorial/index.html">Tutorial</a></li>
+					<li><a href="/docs/3.1/tutorial-rop/index.html">ROP Tutorial</a></li>
+					<li><a href="/docs/3.1/upgrade-guide/index.html">Upgrade Guide</a></li>
+					<li><a href="/docs/3.1/api/index.html">JavaDoc</a></li>
+				</ul>
+			</li>
+			<li class="trigger"><a href="/docs/3.0/index.html">Version 3.0 (aging)</a>
+				<ul>
+					<li><a href="/docs/3.0/overview.html">Overview</a></li>
+					<li><a href="/docs/3.0/cayenne-guide.html">Cayenne Guide</a></li>
+					<li><a href="/docs/3.0/remote-object-persistence-guide.html">Remote Client Guide</a></li>
+					<li><a href="/docs/3.0/modeler-guide.html">Modeler Guide</a></li>
+					<li><a href="/docs/3.0/api/index.html">JavaDoc</a></li>
+				</ul>
+			</li>
+			<li class="trigger"><a href="/docs/2.0/index.html">Version 2.0 (legacy)</a>
+				<ul>
+					<li><a href="/docs/2.0/user-guide.html">User Guide</a></li>
+					<li><a href="/docs/2.0/remote-object-persistence-guide.html">Remote Client Guide</a></li>
+					<li><a href="/docs/2.0/modeler-guide.html">Modeler Guide</a></li>
+					<li><a href="/docs/2.0/api/cayenne/index.html">JavaDoc</a></li>
+				</ul>
+			</li>
+			<li class="trigger"><a href="/docs/1.2/index.html">Version 1.2 (legacy)</a>
+				<ul>
+					<li><a href="/docs/1.2/user-guide.html">User Guide</a></li>
+					<li><a href="/docs/1.2/remote-object-persistence-guide.html">Remote Client Guide</a></li>
+					<li><a href="/docs/1.2/modeler-guide.html">Modeler Guide</a></li>
+					<li><a href="/docs/1.2/api/cayenne/index.html">JavaDoc</a></li>
+				</ul>
+			</li>
+		</ul>
+	</li>
+	<li><a href="/collaboration.html">Collaboration</a>
+		<ul>
+			<li><a href="http://issues.apache.org/jira/browse/CAY">Bug/Feature Tracker</a></li>
+			<li><a href="/mailing-lists.html">Mailing Lists</a></li>
+			<li><a href="/dev/code-repository.html">Code Repository</a></li>
+			<li><a href="/dev/index.html">Developer Guide</a></li>
+			<li><a href="/how-can-i-help.html">How Can I Help?</a></li>
+			<li><a href="/contributors.html">Contributors</a></li>
+		</ul>
+	</li>
+</ul>
+</div>
+
+
+<hr>
+<div id="content">
+       <h2 id="cayenne-40-milestone-2-released">Cayenne 4.0 Milestone 2 Released</h2>
+<p><em>Mar 18, 2015</em> </p>
+<p>This is a huge new milestone release of the development branch of Apache Cayenne. Existing users may have noticed that we renamed version 3.2 to 4.0 as the scope of new features had been vastly expanded. So 4.0.M2 is a direct successor of 3.2M1. There are tons of new features and bug fixes. Here are just the main highlights. For more details, go to the upgrade-guide.pdf and check out the full release notes below.</p>
+<h3 id="fluent-query-api">Fluent Query API</h3>
+<p>Here is a simple example:</p>
+<p>   Artist a = ObjectSelect
+        .query(Artist.class)
+     .where(Artist.NAME.eq("Picasso"))
+        .selectOne(context);</p>
+<p>Cayenne now provides a set of new fluent query classes: ObjectSelect, SQLSelect, SelectById. More will be coming in the future releases. A related addition is positional bindings in Expression, SQLTemplate and in the new query classes. Using the new API you'll avoid any boilerplate in the most-commonly written Cayenne code, all with full support for generics and type safety. The "old" style of bean-like queries is still supported.</p>
+<h3 id="powerful-automated-workflow-with-cdbimport">Powerful Automated Workflow with 'cdbimport'</h3>
+<p>'cdbimport' (a Maven/Ant task that generates DataMap from DB) was always there in Cayenne, just not very usable. In this release it was reworked to become a cornerstone of an automated workflow that allows you to keep mapping and Java classes always in sync with the underlying DB, and yet provide arbitrary customizations to the object layer.</p>
+<h3 id="osgi">OSGI</h3>
+<p>All Cayenne runtime jars have proper OSGi manifests and can be used as OSGi bundles. Here is a <a href="https://github.com/andrus/cayenne-osgi-example">demo app</a> showing how to write an OSGi Cayenne app. The main trick is to add a special OSGi module to Cayenne runtime:</p>
+<div class="codehilite"><pre><span class="n">Module</span> <span class="n">osgiModule</span> <span class="p">=</span> 
+   <span class="n">OsgiModuleBuilder</span><span class="p">.</span><span class="n">forProject</span><span class="p">(</span><span class="n">Activator</span><span class="p">.</span><span class="n">class</span><span class="p">).</span><span class="n">withDriver</span><span class="p">(</span><span class="n">Driver</span><span class="p">.</span><span class="n">class</span><span class="p">).</span><span class="n">module</span><span class="p">();</span>
+</pre></div>
+
+
+<h3 id="serverruntimebuilder">ServerRuntimeBuilder</h3>
+<p>We found that customizing ServerRuntime is a frequent task in different environments. Things like setting a custom DataSource, loading multiple projects into a single runtime, overriding a service here and there are all very common customizations. While of those can be done via ServerRuntime constructor and custom modules, we decided to add some syntactic sugar for such a common task. Enter ServerRuntimeBuilder:</p>
+<div class="codehilite"><pre><span class="n">ServerRuntime</span> <span class="n">runtime</span> <span class="p">=</span> <span class="n">new</span> <span class="n">ServerRuntimeBuilder</span><span class="p">(</span>&quot;<span class="n">myproject</span>&quot;<span class="p">)</span>
+    <span class="p">.</span><span class="n">addConfigs</span><span class="p">(</span>&quot;<span class="n">cayenne</span><span class="o">-</span><span class="n">project1</span><span class="p">.</span><span class="n">xml</span>&quot;<span class="p">,</span> &quot;<span class="n">cayenne</span><span class="o">-</span><span class="n">project2</span><span class="p">.</span><span class="n">xml</span>&quot;<span class="p">)</span>
+    <span class="p">.</span><span class="n">addModule</span><span class="p">(</span><span class="n">binder</span> <span class="o">-&gt;</span> <span class="n">binder</span><span class="p">.</span><span class="n">bind</span><span class="p">(</span><span class="n">JdbcEventLogger</span><span class="p">.</span><span class="n">class</span><span class="p">).</span><span class="n">toInstance</span><span class="p">(</span><span class="n">myLogger</span><span class="p">))</span>
+    <span class="p">.</span><span class="n">dataSource</span><span class="p">(</span><span class="n">myDataSource</span><span class="p">)</span>
+    <span class="p">.</span><span class="n">build</span><span class="p">();</span>
+</pre></div>
+
+
+<p>While we are on the topic of ServerRuntime, we also provide the ability to start a mapping-free runtime, which gives a powerful SQL execution stack (e.g. for unit tests).</p>
+<h3 id="transparent-database-cryptography-with-cayenne-crypto">Transparent Database Cryptography with 'cayenne-crypto'</h3>
+<p>Cayenne now includes <a href="http://search.maven.org/#artifactdetails|org.apache.cayenne|cayenne-crypto|4.0.M2|jar">cayenne-crypto.jar</a>, that allows you to implement seemless data encryption. With a bit of extra configuration you get automatic encryption/decryption of data in certain columns:</p>
+<div class="codehilite"><pre><span class="n">Module</span> <span class="n">cryptoModule</span> <span class="p">=</span> <span class="n">new</span> <span class="n">CryptoModuleBuilder</span><span class="p">()</span>
+   <span class="p">.</span><span class="n">keyStore</span><span class="p">(</span>&quot;<span class="n">file</span><span class="p">:</span><span class="o">///</span><span class="n">mykeystore</span>&quot;<span class="p">,</span> &quot;<span class="n">changeit</span>&quot;<span class="p">.</span><span class="n">toCharArray</span><span class="p">(),</span> &quot;<span class="n">keyalias</span>&quot;<span class="p">)</span>
+   <span class="p">.</span><span class="n">compress</span><span class="p">()</span>
+   <span class="p">.</span><span class="n">build</span><span class="p">();</span>
+</pre></div>
+
+
+<p>By default encrypted columns are designated based on naming conventions, but this is fully customizable. The rest of your application code doesn't need to worry about cryptography, and would look like a regular Cayenne application.</p>
+<h3 id="di-container-decorators">DI Container Decorators</h3>
+<p>In addition to overriding services in DI container, now Cayenne allows to supply decorators. True to the "smallest-footprint" DI philosophy, decorator approach is very simple and does not require proxies or class enhancement. Just implement the decoarted interface and provide a constructor that takes a delegate instance being decorated:</p>
+<div class="codehilite"><pre><span class="n">public</span> <span class="n">class</span> <span class="n">MyInterfaceDecorator</span> <span class="n">implements</span> <span class="n">MyInterface</span> <span class="p">{</span>
+
+    <span class="n">private</span> <span class="n">MyInterface</span> <span class="n">delegate</span><span class="p">;</span>
+
+    <span class="n">public</span> <span class="n">MockInterface1_Decorator3</span><span class="p">(@</span><span class="n">Inject</span> <span class="n">MyInterface</span> <span class="n">delegate</span><span class="p">)</span> <span class="p">{</span>
+        <span class="n">this</span><span class="p">.</span><span class="n">delegate</span> <span class="p">=</span> <span class="n">delegate</span><span class="p">;</span>
+    <span class="p">}</span>
+
+    <span class="p">@</span><span class="n">Override</span>
+    <span class="n">public</span> <span class="n">String</span> <span class="n">getName</span><span class="p">()</span> <span class="p">{</span>
+        <span class="k">return</span> &quot;<span class="o">&lt;</span>&quot; <span class="o">+</span> <span class="n">delegate</span><span class="p">.</span><span class="n">getName</span><span class="p">()</span> <span class="o">+</span> &quot;<span class="o">&gt;</span>&quot;<span class="p">;</span>
+    <span class="p">}</span>
+<span class="p">}</span>
+
+<span class="n">Module</span> <span class="n">module</span> <span class="p">=</span> <span class="n">new</span> <span class="n">Module</span><span class="p">()</span> <span class="p">{</span>
+
+    <span class="p">@</span><span class="n">Override</span>
+    <span class="n">public</span> <span class="n">void</span> <span class="n">configure</span><span class="p">(</span><span class="n">Binder</span> <span class="n">binder</span><span class="p">)</span> <span class="p">{</span>
+        <span class="n">binder</span><span class="p">.</span><span class="n">decorate</span><span class="p">(</span><span class="n">MyInterface</span><span class="p">.</span><span class="n">class</span><span class="p">).</span><span class="n">before</span><span class="p">(</span><span class="n">MyInterfaceDecorator</span><span class="p">.</span><span class="n">class</span><span class="p">);</span>
+    <span class="p">}</span>
+<span class="p">};</span>
+</pre></div>
+
+
+<h3 id="stability-improvements">Stability Improvements</h3>
+<p>We got rid of the hated "runtime" ObjRelationships that caused random issues, and fixed more than 30 other bugs.</p>
+<p>Cayenne can be downloaded from <a href="/download.html">here</a>.</p>
+<p>A full list of changes in this release:</p>
+<ul>
+<li>CAY-1267 Some changes to LogDialog</li>
+<li>CAY-1826 Merge Entity Attributes and Relationships tabs together with one toolbar.</li>
+<li>CAY-1839 Allow to link DataMaps to DataNodes from DataNode editor.</li>
+<li>CAY-1841 Filters for Left-hand project navigator</li>
+<li>CAY-1842 Remove Listeners support from the Modeler </li>
+<li>CAY-1843 DataMap v7: Stop saving listeners in DataMap, add upgrade handler</li>
+<li>CAY-1845 Upgrade javadoc plugin to 2.9.1 </li>
+<li>CAY-1846 Reworking of callback mapping</li>
+<li>CAY-1847 Make ConverterFactory extensible</li>
+<li>CAY-1848 New method: ObjectContext.selectOne(Select query) </li>
+<li>CAY-1851 Generate default serialVersionUID for generated java classes to avoid eclipse warnings</li>
+<li>CAY-1852 Straighten thread model and synchronization in the Modeler </li>
+<li>CAY-1855 Iterated and paginated queries must print result counts </li>
+<li>CAY-1856 Expression.expWithParameters does not work when parameters are placed in the inline collection </li>
+<li>CAY-1860 In-memory matching of DataObjects against ObjectId or int</li>
+<li>CAY-1861 Remove runtime relationships</li>
+<li>CAY-1870 cgen - smarter default for 'superPkg' and 'destDir'</li>
+<li>CAY-1882 Porting to OSGi environment</li>
+<li>CAY-1883 Clean up Cayenne maven structure</li>
+<li>CAY-1886 cayenne-di module reorg, new exceptions</li>
+<li>CAY-1890 Remove Cayenne-level buffering when retrieving LOBs</li>
+<li>CAY-1894 Support native PK generation using sequences for H2 databases</li>
+<li>CAY-1899 ServerRuntimeBuilder</li>
+<li>CAY-1900 Allow DataNode name to be used as a root of SQLTemplate</li>
+<li>CAY-1901 Config-free ServerRuntime</li>
+<li>CAY-1904 Simple injection-friendly constructor for AuditableFilter</li>
+<li>CAY-1907 RowReaderFactory</li>
+<li>CAY-1908 Refactor all SQLActions to work with DataNode</li>
+<li>CAY-1911 BatchQuery refactoring - make Iterable</li>
+<li>CAY-1912 BatchQueryBuilder refactoring</li>
+<li>CAY-1913 Refactor org.apache.cayenne.access.trans into query-specific packages</li>
+<li>CAY-1914 Refactor EJBQL-related translators to a standalone 'org.apache.cayenne.access.translator.ejbql' package</li>
+<li>CAY-1915 BatchTranslator instead of performing bindings should return binding object whose values can be altered</li>
+<li>CAY-1916 cayenne-crypto module that enables data encryption for certain model attributes</li>
+<li>CAY-1918 Replace Oracle LOB hacks with JDBC 4.0 API</li>
+<li>CAY-1919 Split DataNode creation into a separate DataNodeFactory</li>
+<li>CAY-1920 DI: add support for decorators</li>
+<li>CAY-1921 Support for schema selection in 'Migrate Database Schema'</li>
+<li>CAY-1923 Optimize BatchTranslator - use fixed size array of BatchParameterBinding</li>
+<li>CAY-1925 cayenne-crypto: add optional compression to the encryption pipeline</li>
+<li>CAY-1928 Second INNER join generated for OUTER flattended relationships in disjoint prefetches</li>
+<li>CAY-1929 Property.outer method to build OUTER join properties</li>
+<li>CAY-1932 Improved Handling for Scalar Parameters Converting Expressions to EJBQL</li>
+<li>CAY-1933 Problems in Evaluating EJBQL Statements with Integral Literals &gt; Integer.MAX_VALUE</li>
+<li>CAY-1934 A problem exists where the escape character is not conveyed in the EJBQL when toEJBQL() is invoked on the expression.</li>
+<li>CAY-1936 ServerRuntime.getDataSource() returning DataSource of a default DataNode</li>
+<li>CAY-1937 Make Transaction an interface</li>
+<li>CAY-1938 Create a DI factory for transactions, get rid of TransactionDelegate and modeler config for tx policies</li>
+<li>CAY-1939 DataDomain must use injectable TransactionManager</li>
+<li>CAY-1946 CDbimport improvements</li>
+<li>CAY-1949 Search in configuration fields (Catalog, Schema) in DbEntity</li>
+<li>CAY-1952 Undeprecate (actually restore) ObjectContext.deleteObject(..)</li>
+<li>CAY-1953 Redo ResultIteratorCallback to handle single row callback instead of iterator</li>
+<li>CAY-1954 Make Cayenne class constructor protected</li>
+<li>CAY-1958 SelectById - a new full-featured select query to get objects by id</li>
+<li>CAY-1959 ObjectSelect query - a fluent API alternative to SelectQuery</li>
+<li>CAY-1960 ExpressionFactory.exp(..) , and(..), or(..)</li>
+<li>CAY-1962 Implement CayenneTable column resize on double-click on the header separator</li>
+<li>CAY-1965 Change version from 3.2 to 4.0</li>
+<li>CAY-1966 SQLTemplate/SQLSelect positional parameter binding</li>
+<li>CAY-1967 Deprecate SQLTemplate parameter batches</li>
+<li>CAY-1968 SQLSelect cleanup and omissions</li>
+<li>CAY-1971 Variants of Property.like(..) : contains(..), startsWith(..), endsWith(..)</li>
+<li>CAY-1972 A property to override DataSources of multi-module projects </li>
+<li>CAY-1981 Add support of JDBC 4.0 N-types (nchar, nvarchar, longnvarchar, nclob)</li>
+<li>CAY-1984 cdbimport doesn't flatten many to many relationships</li>
+</ul>
+<p>Bug Fixes:</p>
+<ul>
+<li>CAY-1480 Implement cross-db functional expressions</li>
+<li>CAY-1695 Unexpected null value in bidirectional one-to-one prefetch </li>
+<li>CAY-1736 IllegalArgumentException when synchronizing entities in the Modeler</li>
+<li>CAY-1795 "Invisible" ObjAttribute in subclass</li>
+<li>CAY-1796 ROP: All entity's to-many relationships getting faulted from database when using it as a parameter in qualifier expression</li>
+<li>CAY-1797 NPE importing DataMap</li>
+<li>CAY-1798 ROP: Reverse relationships of prefetched entity objects are not filled during server to client objects conversion</li>
+<li>CAY-1799 ROP: Server can't deserialize LIKE expression with pattern already compiled</li>
+<li>CAY-1818 Fix copyright year in the Modeler "about" panel</li>
+<li>CAY-1834 Exception: ToManyList cannot be cast to DataObject </li>
+<li>CAY-1857 Problem with hotkeys </li>
+<li>CAY-1859 NullPointerException when importing EOModel </li>
+<li>CAY-1863 Make determining whether a particular database type supports length adapter-specific not universal</li>
+<li>CAY-1866 Change in General Modeler Preferences reverts old settings to default value</li>
+<li>CAY-1868 Select contention with multiple contexts </li>
+<li>CAY-1869 ResultIterator from cayenne-client dependency is subclassed from org.apache.cayenne.access.ResultIterator which is present only in cayenne-server dependency </li>
+<li>CAY-1874 DB2 Procedure action ignores the first result set</li>
+<li>CAY-1877 In-memory evaluation of expression may fail with UnsupportedOpeartionException depending on order of nodes</li>
+<li>CAY-1880 objectStore snapshots never cleared from RefreshQuery when "use shared cache" unchecked</li>
+<li>CAY-1881 CayenneModeler (Mac version) doesn't work with Java 7</li>
+<li>CAY-1885 Null value in subclass's field.</li>
+<li>CAY-1905 Multi-step prefetching NPE : 1..N..1 with absent N and root with no qualifier</li>
+<li>CAY-1943 XML file not deleted when a DataMap is deleted from the project</li>
+<li>CAY-1961 Fix RemoveAction for DataMaps in ProjectTree</li>
+<li>CAY-1964 Fix convertAdditionalDataMaps() in CayenneGeneratorMojo.java</li>
+<li>CAY-1973 error while generating classes</li>
+<li>CAY-1974 Copy/Paste DbEntiry throws exception</li>
+<li>CAY-1978 ESCAPE clause should be included in LIKE parenthesis</li>
+<li>CAY-1979 Prefetches on Many-to-Many Relationships with Longvarchar</li>
+<li>CAY-1980 'mvn cayenne-modeler:run' seems to be broken in 4.0</li>
+<li>CAY-1988 ServerRuntimeBuilder: synthetic DataNode does not have domain's DataMaps linked</li>
+</ul>
+       <hr>
+       <p id="footer">Copyright &#169; 2001-2014 Apache Software Foundation. Apache Cayenne, Cayenne, Apache, the Apache feather logo, and the Apache Cayenne project logo are trademarks of The Apache Software Foundation. <a href="/privacy-policy.html">Privacy policy</a>.
+</div>
+</div>
+
+</div></div>
+</body>
+</html>