Title:
Notice:    Licensed to the Apache Software Foundation (ASF) under one
           or more contributor license agreements.  See the NOTICE file
           distributed with this work for additional information
           regarding copyright ownership.  The ASF licenses this file
           to you under the Apache License, Version 2.0 (the
           "License"); you may not use this file except in compliance
           with the License.  You may obtain a copy of the License at
           .
             http://www.apache.org/licenses/LICENSE-2.0
           .
           Unless required by applicable law or agreed to in writing,
           software distributed under the License is distributed on an
           "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
           KIND, either express or implied.  See the License for the
           specific language governing permissions and limitations
           under the License.

# October 2014 Board report

Apache Aries delivers a set of pluggable Java components enabling an enterprise OSGi application programming model.

## New modules
Aries Blueprint Authz: An Aries Blueprint extension that supports role based access control based on a JAAS login and the JEE @RolesAllowed annotation.

## Releases

#### Apache Aries Spi-Fly releases 
Aries SPI Fly provides OSGi support for the JRE SPI mechanisms, including the usage of java.util.ServiceLoader, META-INF/services and similar methods. It is the Reference Implementation of the OSGi ServiceLoader Mediator specification, chapter 133 in the OSGi Enterprise Specification R5.

The votes for these releases closed on  2014/7/15

* Aries SPI Fly Core 1.0.1
* Aries SPI Fly Dynamic Weaving Bundle 1.0.1
* Aries SPI Fly Static Weaving Bundle 1.0.1
* Aries SPI Fly Static Weaving Tool 1.0.1
* Aries SPI Fly Weaver (internal module) 1.0.1

#### Apache Aries JPA releases:
Aries JPA makes it easy for JPA persistence providers to be used in an OSGi environment.

* Aries JPA API 1.0.1 closed on 2014/7/19
* Aries JPA Container 1.0.1 closed on 2014/7/19
* Aries JPA Container Context 1.0.2 closed on 2014/7/19
* Aries JPA Blueprint Aries 1.0.2 closed on 2014/7/19
* Aries JPA Container API 1.0.2 closed on 2014/9/22
* Aries JPA Container Managed Contexts 1.0.3 closed on 2014/9/22
* Aries JPA Container blueprint integration for Aries blueprint 1.0.3 closed on 2014/9/22

#### Other releases:

* Aries Blueprint Parser 1.3.0 closed on 2014/9/22
* Aries Blueprint Core 1.4.2 closed on 2014/9/22
* Aries Blueprint CM 1.0.5 closed on 2014/10/10
* Aries JNDI API 1.1.0 closed on 2014/9/22
* Aries JNDI Core 1.0.1 closed on 2014/9/22
* Aries Proxy Service 1.0.4 closed on 2014/9/22
* Aries Subsystem Core 1.1.0 closed on 2014/10/1

## Project update
Discussions on the user@ list are becoming more sophisticated and contributions continue to come via GitHub.
The last PMC member was added 28th July 2013.

There are no issues requiring board attention at this time.