You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@jackrabbit.apache.org by Marcel Reutegger <mr...@apache.org> on 2022/07/18 06:00:00 UTC

[ANNOUNCE] Apache Jackrabbit Oak 1.44.0 released

The Apache Jackrabbit community is pleased to announce the release of
Apache Jackrabbit Oak 1.44.0. The release is available for download at:

     http://jackrabbit.apache.org/downloads.html

See the full release notes below for details about this release:

Release Notes -- Apache Jackrabbit Oak -- Version 1.44.0

Introduction
------------

Jackrabbit Oak is a scalable, high-performance hierarchical content
repository designed for use as the foundation of modern world-class
web sites and other demanding content applications.

Apache Jackrabbit Oak 1.44.0 is an incremental feature release based
on and compatible with earlier stable Jackrabbit Oak 1.x
releases. This release is considered stable and targeted for
production use.

While Oak 1.44.0 compiles and tests successfully on Java 17, Javadocs
generation fails on Java 17 (but works as expected on Java 8).

The Oak effort is a part of the Apache Jackrabbit project.
Apache Jackrabbit is a project of the Apache Software Foundation.

Changes in Oak 1.44.0
---------------------

Technical task

    [OAK-9585] - BrokenNetworkIT fails on Java 17
    [OAK-9703] - benchmarks comparing new restrictions to rep:glob
    [OAK-9833] - UpgradeIT fails on Java 17

Bug

    [OAK-9564] - Lease failure when update takes longer than socket timeout
    [OAK-9649] - Improve multithreaded download retry strategy during indexing
    [OAK-9656] - Recovery runs mistakenly when system clock jumps ahead
    [OAK-9676] - In CompositeNodeStore, mounts are ignored when
iterating through child nodes
    [OAK-9684] - elastic: avoid ingesting FVs with size different from
the one in the index definition
    [OAK-9695] - Deleting a property fails in case there is a residual
protected property definition in its node type with a non-matching
type
    [OAK-9700] - RevisionGC may fail with NPE
    [OAK-9708] - Invalid logging of 'improper' regex WARN
    [OAK-9709] - PropertyDelegate.isProtected() throws NPE when parent is stale
    [OAK-9729] - Reduce execution time for oak-search-elastic tests
    [OAK-9732] - oak-it-osgi ITs broken on Windows
    [OAK-9735] - Reset/update corrupt index counter in metrics
    [OAK-9736] - oak-store-composite ITs broken
    [OAK-9750] - Oak-search-elastic: Add right tika dependency
    [OAK-9751] - Exception while reading external changes from journal
    [OAK-9769] - PathPredicate not being used properly when building
FlatFileStore
    [OAK-9773] - DefaultSyncContext#syncMembership() compares external
ids case-sensitively
    [OAK-9775] - ACEs with unsupported restrictions must be cleared upon editing
    [OAK-9779] - PermissionConstants.PERMISSION_PROPERTY_NAMES does
not list rep:isAllow
    [OAK-9782] - CompositeRestrictionProvider must call validate on
aggregated providers
    [OAK-9791] - Missing check for restriction node being present
    [OAK-9793] - AbstractRestrictionProvider: validation to respect
aggregation for unsupported paths
    [OAK-9797] - Direct access blob cache override breaks metrics and monitoring
    [OAK-9798] - Inconsistent handling of supported permissions in
CompositePermissionProviderOr
    [OAK-9809] - oak-run server: update Jetty because of outdated
servlet API version
    [OAK-9813] - [oak-run-commons] LoggingInitializer shutdownLogging
should not shut down if not initialized
    [OAK-9817] - Index stats logging indexing cycle failures after
changes from OAK-9802

Epic

    [OAK-9538] - Oak should compile & test on Java 17
    [OAK-9614] - Document best pratices for Oak Access Control
Management and Permission Evaluation

New Feature

    [OAK-9680] - Container level SAS URI Support in Oak-Segment-Azure
    [OAK-9689] - When BlobEndpoint is not configured use AccountName
in connection string for  Azure  blob store connector
    [OAK-9704] - oak-blob-cloud-azure: in AzureBlobStoreBackend,
interpret empty string like null for boolean properties

Story

    [OAK-9726] - Improve index purge old version commands logs
    [OAK-9734] - Index purge should prevent fully delete index
definition which is is read-only repo

Improvement

    [OAK-9612] - write to a readonly builder throws a
java.lang.UnsupportedOperationException
    [OAK-9662] - Perform inequality matches in Lucene+Elastic, rather
than just in the query engine
    [OAK-9663] - Configuration option for allowed system-principals in
ExternalPrincipalConfiguration
    [OAK-9664] - Reduce Slow Query threshold
    [OAK-9665] - Unparseable date property causes entire node to fail indexing
    [OAK-9672] - Robust Json formatting
    [OAK-9673] - JackrabbitAccessControlManagerDelegator should
implement privilegeCollectionFromNames
    [OAK-9674] -
AbstractAccessControlManager.privilegeCollectionFromNames should
validate the passed privilege names
    [OAK-9685] - Bump and align testcontainers dependency to v1.16.3
    [OAK-9690] - Add support to bring elastic async index uptodate
post an OutofBand reindex operation
    [OAK-9701] - Additional restrictions to simplify permission setup
    [OAK-9707] - Don't fail oak-run indexing on invalid data
    [OAK-9714] - Allow DocumentStoreIndexer to build a flat file store
and reindex on it, in separate steps
    [OAK-9715] - IndexDefMergerUtils Uses Incorrect Index Name for
merges Property
    [OAK-9717] - IndexDefMergerUtils Should not Remove Nodes From
Product Index Definition
    [OAK-9721] - Add state information while indeximporting
    [OAK-9723] - Allow comparing index definitions against a file
    [OAK-9724] - Handle duplicate functions gracefully in indexing
    [OAK-9725] - Enable Matomo Web Analytics
    [OAK-9727] - Elastic: Implement Function index
    [OAK-9737] - Avoid duplicate tree resolution by using ResultRow.getTree
    [OAK-9738] - Merge indexing files in parallel and during download
    [OAK-9739] - Avoid duplicate tree resolution in MembershipProvider
    [OAK-9740] - Add Support For Limit / Offset Options in Queries
    [OAK-9741] - Test cases for invalid index definitions
    [OAK-9743] - oak-run indexing doesn't support facets (document
store + document order traversal)
    [OAK-9744] - Add check for StackOverflowError
    [OAK-9746] - DefaultSyncHandler.syncProperties should sync
Supplier type properties
    [OAK-9753] - Refactor:  ES connection parameters should be easily
accessible from ElasticConnectionRule
    [OAK-9756] - Calculate total duration of Index Sanitization
    [OAK-9757] - Getting Node name is too long Exception (150 bytes)
while saving node in mongo db
    [OAK-9767] - Support Int / Long Terms in LuceneIndexMBean
    [OAK-9771] - IndexWriter config should be customisable from oak.
    [OAK-9772] - Elastic and Lucene tokenizer difference
    [OAK-9778] - Improve exception message with OakAccessControl0013
regarding ACE duplicates
    [OAK-9788] - Add an index property to disable similarity for lucene index
    [OAK-9799] - Optional validator to mark external users/groups as protected
    [OAK-9801] - Many SessionImpl operations just log a NPE if null
values provided
    [OAK-9802] - Configuration to enable/disable updating elastic indexes
    [OAK-9804] - Flaky unit test
FlatFileStoreTest.resumePreviousUnfinishedDownload()
    [OAK-9812] - TokenConfigurationImpl does not define Context
    [OAK-9814] - Improvements in NodeState/VersionCopier for
visibility of paths added and preserve sub-paths
    [OAK-9824] - Confusing warning "This index MUST be reindexed for
indexing to work properly"
    [OAK-9830] - Fix typos in tests and documentation

Task

    [OAK-9658] - Update flapdoodle version to 3.2.6
    [OAK-9661] - Upgrade Solr to v8.11.1
    [OAK-9668] - Update H2DB dependency
    [OAK-9669] - Update commons-io dependency to 2.11.0
    [OAK-9671] - Increase dynamicBoost and dynamicBoostLite full-text
test coverage
    [OAK-9681] - oak-doc-railroad-macro build broken by h2db update
    [OAK-9683] - Bump elasticsearch version to 7.16.3
    [OAK-9686] - oak-search-elastic: migrate from Rest High Level
Client to the new Java API Client
    [OAK-9687] - oak-search-elastic: expose additional index metrics
    [OAK-9691] - Improve fulltext query syntax support for ElasticSearch
    [OAK-9712] - Add support for Azure SAS URIs in oak-run
    [OAK-9720] - Update Oak trunk and Oak 1.22 to Jackrabbit 2.20.5
    [OAK-9755] - Revisit oak-lucene metrics introducing labels
    [OAK-9828] - Update Oak trunk and Oak 1.22 to Jackrabbit 2.20.6
    [OAK-9831] - Update spotbugs plugin to 4.7.1.0
    [OAK-9832] - Update jacoco plugin to 0.8.8


In addition to the above-mentioned changes, this release contains all
changes up to the previous release.

For more detailed information about all the changes in this and other
Oak releases, please see the Oak issue tracker at

  https://issues.apache.org/jira/browse/OAK

Release Contents
----------------

This release consists of a single source archive packaged as a zip file.
The archive can be unpacked with the jar tool from your JDK installation.
See the README.md file for instructions on how to build this release.

The source archive is accompanied by SHA512 checksums and a
PGP signature that you can use to verify the authenticity of your
download. The public key used for the PGP signature can be found at
https://www.apache.org/dist/jackrabbit/KEYS.

About Apache Jackrabbit Oak
---------------------------

Jackrabbit Oak is a scalable, high-performance hierarchical content
repository designed for use as the foundation of modern world-class
web sites and other demanding content applications.

The Oak effort is a part of the Apache Jackrabbit project.
Apache Jackrabbit is a project of the Apache Software Foundation.

For more information, visit http://jackrabbit.apache.org/oak

About The Apache Software Foundation
------------------------------------

Established in 1999, The Apache Software Foundation provides organizational,
legal, and financial support for more than 140 freely-available,
collaboratively-developed Open Source projects. The pragmatic Apache License
enables individual and commercial users to easily deploy Apache software;
the Foundation's intellectual property framework limits the legal exposure
of its 3,800+ contributors.

For more information, visit http://www.apache.org/

Re: [ANNOUNCE] Apache Jackrabbit Oak 1.44.0 released

Posted by Marcel Reutegger <mr...@adobe.com.INVALID>.
Hi,

On 22.07.22, 12:46, "Konrad Windszus" <kw...@apache.org> wrote:
> I use this information to quickly check:
>
> - which is the latest release

To me the displayed version is just confusing. Currently
it says 1.43-SNAPSHOT. How do I know 1.44.0 is the latest
release? Beware, it's a trap! ;)

> - whether the documentation is probably outdated

I think the 'Last Published' data is much better suited
for this.

Anyway, I created the following issue. I'll be away
next week. Feel free to merge the PR or close when there
is consensus what to do with the version info.

https://issues.apache.org/jira/browse/OAK-9854

Regards
Marcel

Re: [ANNOUNCE] Apache Jackrabbit Oak 1.44.0 released

Posted by Konrad Windszus <kw...@apache.org>.

> On 22. Jul 2022, at 12:21, Marcel Reutegger <mr...@adobe.com.INVALID> wrote:
> 
> In my view this information is useless
> and I'd even suggest we remove it.


I use this information to quickly check:

- which is the latest release
- whether the documentation is probably outdated

But I don’t a very strong opinion on keeping it. 
What do others think?

Konrad

Re: [ANNOUNCE] Apache Jackrabbit Oak 1.44.0 released

Posted by Marcel Reutegger <mr...@adobe.com.INVALID>.
Hi,

On 22.07.22, 12:18, "Konrad Windszus" <kw...@apache.org> wrote:
> The version Is part of the header contained in every page of the site,
> so IMHO a release (i.e. version change) requires a republish.

The version on those pages never matches the latest release. It's always
just the current SNAPSHOT version. In my view this information is useless
and I'd even suggest we remove it.

Regards
Marcel

Re: [ANNOUNCE] Apache Jackrabbit Oak 1.44.0 released

Posted by Konrad Windszus <kw...@apache.org>.
> 
> I did not make any changes to Oak pages. So I didn't see a need to update
> that part of the website.
The version Is part of the header contained in every page of the site, so IMHO a release (i.e. version change) requires a republish.

> 
> The JavaDocs I forgot to generate and I'll do that right away.

Thanks.
> 
>> Do we need to make that more explicit in
>> https://jackrabbit.apache.org/jcr/creating-releases.html#part-ii-after-
>> the-release-vote?
> 
> Yes, might be good to amend point 9. It talks about Jackrabbit, which is
> probably the reason why I skipped it. A pointer to oak-doc/README.md
> would also be helpful.
> 
> Regards
> Marcel


Re: [ANNOUNCE] Apache Jackrabbit Oak 1.44.0 released

Posted by Marcel Reutegger <mr...@adobe.com.INVALID>.
Hi Konrad,

On 21.07.22, 15:30, "Konrad Windszus" <kw...@apache.org> wrote:
> Neither the website (https://jackrabbit.apache.org/oak/docs/index.html)
> nor the published javadoc
> (https://jackrabbit.apache.org/oak/docs/apidocs/) have been updated
> unfortunately.

I did not make any changes to Oak pages. So I didn't see a need to update
that part of the website.

The JavaDocs I forgot to generate and I'll do that right away.

> Do we need to make that more explicit in
> https://jackrabbit.apache.org/jcr/creating-releases.html#part-ii-after-
> the-release-vote?

Yes, might be good to amend point 9. It talks about Jackrabbit, which is
probably the reason why I skipped it. A pointer to oak-doc/README.md
would also be helpful.

Regards
Marcel

Re: [ANNOUNCE] Apache Jackrabbit Oak 1.44.0 released

Posted by Konrad Windszus <kw...@apache.org>.
Hi Marcel,
Neither the website (https://jackrabbit.apache.org/oak/docs/index.html <https://jackrabbit.apache.org/oak/docs/index.html>) nor the published javadoc (https://jackrabbit.apache.org/oak/docs/apidocs/ <https://jackrabbit.apache.org/oak/docs/apidocs/>) have been updated unfortunately.
Do we need to make that more explicit in https://jackrabbit.apache.org/jcr/creating-releases.html#part-ii-after-the-release-vote? <https://jackrabbit.apache.org/jcr/creating-releases.html#part-ii-after-the-release-vote?>

Konrad


> On 18. Jul 2022, at 08:00, Marcel Reutegger <mr...@apache.org> wrote:
> 
> The Apache Jackrabbit community is pleased to announce the release of
> Apache Jackrabbit Oak 1.44.0. The release is available for download at:
> 
>     http://jackrabbit.apache.org/downloads.html
> 
> See the full release notes below for details about this release:
> 
> Release Notes -- Apache Jackrabbit Oak -- Version 1.44.0
> 
> Introduction
> ------------
> 
> Jackrabbit Oak is a scalable, high-performance hierarchical content
> repository designed for use as the foundation of modern world-class
> web sites and other demanding content applications.
> 
> Apache Jackrabbit Oak 1.44.0 is an incremental feature release based
> on and compatible with earlier stable Jackrabbit Oak 1.x
> releases. This release is considered stable and targeted for
> production use.
> 
> While Oak 1.44.0 compiles and tests successfully on Java 17, Javadocs
> generation fails on Java 17 (but works as expected on Java 8).
> 
> The Oak effort is a part of the Apache Jackrabbit project.
> Apache Jackrabbit is a project of the Apache Software Foundation.
> 
> Changes in Oak 1.44.0
> ---------------------
> 
> Technical task
> 
>    [OAK-9585] - BrokenNetworkIT fails on Java 17
>    [OAK-9703] - benchmarks comparing new restrictions to rep:glob
>    [OAK-9833] - UpgradeIT fails on Java 17
> 
> Bug
> 
>    [OAK-9564] - Lease failure when update takes longer than socket timeout
>    [OAK-9649] - Improve multithreaded download retry strategy during indexing
>    [OAK-9656] - Recovery runs mistakenly when system clock jumps ahead
>    [OAK-9676] - In CompositeNodeStore, mounts are ignored when
> iterating through child nodes
>    [OAK-9684] - elastic: avoid ingesting FVs with size different from
> the one in the index definition
>    [OAK-9695] - Deleting a property fails in case there is a residual
> protected property definition in its node type with a non-matching
> type
>    [OAK-9700] - RevisionGC may fail with NPE
>    [OAK-9708] - Invalid logging of 'improper' regex WARN
>    [OAK-9709] - PropertyDelegate.isProtected() throws NPE when parent is stale
>    [OAK-9729] - Reduce execution time for oak-search-elastic tests
>    [OAK-9732] - oak-it-osgi ITs broken on Windows
>    [OAK-9735] - Reset/update corrupt index counter in metrics
>    [OAK-9736] - oak-store-composite ITs broken
>    [OAK-9750] - Oak-search-elastic: Add right tika dependency
>    [OAK-9751] - Exception while reading external changes from journal
>    [OAK-9769] - PathPredicate not being used properly when building
> FlatFileStore
>    [OAK-9773] - DefaultSyncContext#syncMembership() compares external
> ids case-sensitively
>    [OAK-9775] - ACEs with unsupported restrictions must be cleared upon editing
>    [OAK-9779] - PermissionConstants.PERMISSION_PROPERTY_NAMES does
> not list rep:isAllow
>    [OAK-9782] - CompositeRestrictionProvider must call validate on
> aggregated providers
>    [OAK-9791] - Missing check for restriction node being present
>    [OAK-9793] - AbstractRestrictionProvider: validation to respect
> aggregation for unsupported paths
>    [OAK-9797] - Direct access blob cache override breaks metrics and monitoring
>    [OAK-9798] - Inconsistent handling of supported permissions in
> CompositePermissionProviderOr
>    [OAK-9809] - oak-run server: update Jetty because of outdated
> servlet API version
>    [OAK-9813] - [oak-run-commons] LoggingInitializer shutdownLogging
> should not shut down if not initialized
>    [OAK-9817] - Index stats logging indexing cycle failures after
> changes from OAK-9802
> 
> Epic
> 
>    [OAK-9538] - Oak should compile & test on Java 17
>    [OAK-9614] - Document best pratices for Oak Access Control
> Management and Permission Evaluation
> 
> New Feature
> 
>    [OAK-9680] - Container level SAS URI Support in Oak-Segment-Azure
>    [OAK-9689] - When BlobEndpoint is not configured use AccountName
> in connection string for  Azure  blob store connector
>    [OAK-9704] - oak-blob-cloud-azure: in AzureBlobStoreBackend,
> interpret empty string like null for boolean properties
> 
> Story
> 
>    [OAK-9726] - Improve index purge old version commands logs
>    [OAK-9734] - Index purge should prevent fully delete index
> definition which is is read-only repo
> 
> Improvement
> 
>    [OAK-9612] - write to a readonly builder throws a
> java.lang.UnsupportedOperationException
>    [OAK-9662] - Perform inequality matches in Lucene+Elastic, rather
> than just in the query engine
>    [OAK-9663] - Configuration option for allowed system-principals in
> ExternalPrincipalConfiguration
>    [OAK-9664] - Reduce Slow Query threshold
>    [OAK-9665] - Unparseable date property causes entire node to fail indexing
>    [OAK-9672] - Robust Json formatting
>    [OAK-9673] - JackrabbitAccessControlManagerDelegator should
> implement privilegeCollectionFromNames
>    [OAK-9674] -
> AbstractAccessControlManager.privilegeCollectionFromNames should
> validate the passed privilege names
>    [OAK-9685] - Bump and align testcontainers dependency to v1.16.3
>    [OAK-9690] - Add support to bring elastic async index uptodate
> post an OutofBand reindex operation
>    [OAK-9701] - Additional restrictions to simplify permission setup
>    [OAK-9707] - Don't fail oak-run indexing on invalid data
>    [OAK-9714] - Allow DocumentStoreIndexer to build a flat file store
> and reindex on it, in separate steps
>    [OAK-9715] - IndexDefMergerUtils Uses Incorrect Index Name for
> merges Property
>    [OAK-9717] - IndexDefMergerUtils Should not Remove Nodes From
> Product Index Definition
>    [OAK-9721] - Add state information while indeximporting
>    [OAK-9723] - Allow comparing index definitions against a file
>    [OAK-9724] - Handle duplicate functions gracefully in indexing
>    [OAK-9725] - Enable Matomo Web Analytics
>    [OAK-9727] - Elastic: Implement Function index
>    [OAK-9737] - Avoid duplicate tree resolution by using ResultRow.getTree
>    [OAK-9738] - Merge indexing files in parallel and during download
>    [OAK-9739] - Avoid duplicate tree resolution in MembershipProvider
>    [OAK-9740] - Add Support For Limit / Offset Options in Queries
>    [OAK-9741] - Test cases for invalid index definitions
>    [OAK-9743] - oak-run indexing doesn't support facets (document
> store + document order traversal)
>    [OAK-9744] - Add check for StackOverflowError
>    [OAK-9746] - DefaultSyncHandler.syncProperties should sync
> Supplier type properties
>    [OAK-9753] - Refactor:  ES connection parameters should be easily
> accessible from ElasticConnectionRule
>    [OAK-9756] - Calculate total duration of Index Sanitization
>    [OAK-9757] - Getting Node name is too long Exception (150 bytes)
> while saving node in mongo db
>    [OAK-9767] - Support Int / Long Terms in LuceneIndexMBean
>    [OAK-9771] - IndexWriter config should be customisable from oak.
>    [OAK-9772] - Elastic and Lucene tokenizer difference
>    [OAK-9778] - Improve exception message with OakAccessControl0013
> regarding ACE duplicates
>    [OAK-9788] - Add an index property to disable similarity for lucene index
>    [OAK-9799] - Optional validator to mark external users/groups as protected
>    [OAK-9801] - Many SessionImpl operations just log a NPE if null
> values provided
>    [OAK-9802] - Configuration to enable/disable updating elastic indexes
>    [OAK-9804] - Flaky unit test
> FlatFileStoreTest.resumePreviousUnfinishedDownload()
>    [OAK-9812] - TokenConfigurationImpl does not define Context
>    [OAK-9814] - Improvements in NodeState/VersionCopier for
> visibility of paths added and preserve sub-paths
>    [OAK-9824] - Confusing warning "This index MUST be reindexed for
> indexing to work properly"
>    [OAK-9830] - Fix typos in tests and documentation
> 
> Task
> 
>    [OAK-9658] - Update flapdoodle version to 3.2.6
>    [OAK-9661] - Upgrade Solr to v8.11.1
>    [OAK-9668] - Update H2DB dependency
>    [OAK-9669] - Update commons-io dependency to 2.11.0
>    [OAK-9671] - Increase dynamicBoost and dynamicBoostLite full-text
> test coverage
>    [OAK-9681] - oak-doc-railroad-macro build broken by h2db update
>    [OAK-9683] - Bump elasticsearch version to 7.16.3
>    [OAK-9686] - oak-search-elastic: migrate from Rest High Level
> Client to the new Java API Client
>    [OAK-9687] - oak-search-elastic: expose additional index metrics
>    [OAK-9691] - Improve fulltext query syntax support for ElasticSearch
>    [OAK-9712] - Add support for Azure SAS URIs in oak-run
>    [OAK-9720] - Update Oak trunk and Oak 1.22 to Jackrabbit 2.20.5
>    [OAK-9755] - Revisit oak-lucene metrics introducing labels
>    [OAK-9828] - Update Oak trunk and Oak 1.22 to Jackrabbit 2.20.6
>    [OAK-9831] - Update spotbugs plugin to 4.7.1.0
>    [OAK-9832] - Update jacoco plugin to 0.8.8
> 
> 
> In addition to the above-mentioned changes, this release contains all
> changes up to the previous release.
> 
> For more detailed information about all the changes in this and other
> Oak releases, please see the Oak issue tracker at
> 
>  https://issues.apache.org/jira/browse/OAK
> 
> Release Contents
> ----------------
> 
> This release consists of a single source archive packaged as a zip file.
> The archive can be unpacked with the jar tool from your JDK installation.
> See the README.md file for instructions on how to build this release.
> 
> The source archive is accompanied by SHA512 checksums and a
> PGP signature that you can use to verify the authenticity of your
> download. The public key used for the PGP signature can be found at
> https://www.apache.org/dist/jackrabbit/KEYS.
> 
> About Apache Jackrabbit Oak
> ---------------------------
> 
> Jackrabbit Oak is a scalable, high-performance hierarchical content
> repository designed for use as the foundation of modern world-class
> web sites and other demanding content applications.
> 
> The Oak effort is a part of the Apache Jackrabbit project.
> Apache Jackrabbit is a project of the Apache Software Foundation.
> 
> For more information, visit http://jackrabbit.apache.org/oak
> 
> About The Apache Software Foundation
> ------------------------------------
> 
> Established in 1999, The Apache Software Foundation provides organizational,
> legal, and financial support for more than 140 freely-available,
> collaboratively-developed Open Source projects. The pragmatic Apache License
> enables individual and commercial users to easily deploy Apache software;
> the Foundation's intellectual property framework limits the legal exposure
> of its 3,800+ contributors.
> 
> For more information, visit http://www.apache.org/