# Apache Polygene™ (Java Edition)

> Composite Oriented Programming on the Java platform

[![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)
[![Build Status](https://builds.apache.org/buildStatus/icon?job=Polygene(JavaEdition)-develop-java8-checkDists)](https://builds.apache.org/view/P/view/Polygene/job/Polygene(JavaEdition)-develop-java8-checkDists/)

## What is Apache Polygene™

The short answer is that **Apache Polygene™** is a community based effort exploring Composite Oriented Programming for
domain centric application development. This includes evolved concepts from
[Aspect Oriented Programming](https://en.wikipedia.org/wiki/Aspect-oriented_programming),
[Dependency Injection](https://en.wikipedia.org/wiki/Dependency_injection)
and [Domain Driven Design](https://en.wikipedia.org/wiki/Domain-driven_design).

**Composite Oriented Programming** allows developers to work with _fragments_, smaller than classes, and _compose_
fragments into larger _composites_ which acts like the regular objects. Apache Polygene™ also tackles the enforcement
of _application_ composition, i.e. composites are declared in _modules_, modules are contained in _layers_ and access
between layers are controlled/enforced.

**Apache Polygene™ (Java Edition)**, first Apache Polygene sub-project, is an implementation of Composite Oriented
Programming, using the standard Java platform, without the use of any pre-processors or new language elements.
Everything you know from Java still applies and you can leverage both your experience and toolkits to become more
productive with Composite Oriented Programming today.

The Apache Polygene™ community welcomes any effort exploring Composite Oriented Programming for domain centric
application development using any technology.

Please see https://polygene.apache.org for more information.

## Downloading

You can download released versions from: https://polygene.apache.org/download.html

## Building

Build instructions can be found here: http://polygene.apache.org/java/latest/build-system.html

## Contributing

Polygene™ started in 2007, and is still in heavy development under the umbrella of
the Apache Polygene™ project at the Apache Software Foundation. We would like
developers around the world to participate in the advancement of this
cool, new and challenging technology. We are especially interested in
people willing to help improve the SDK, samples, tutorials, documentation
and other supporting material.

Please see http://polygene.apache.org/community/participate.html and http://zest.apache.org/community/playing_field.html
for more information.

## Opening in your IDE

### IntelliJ IDEA

IntelliJ IDEA Community Edition has everything you need to open Apache Polygene™.
To open the project in IDEA, simply open this repository as a project.
During import, make sure *"Create separate module per source set"* is checked.

### Netbeans

To open Apache Polygene™ in Netbeans you need to install the _Gradle Support_ plugin.
It is directly available via the Update Center (Tools/Plugins: Look for _Gradle Support_).
Then, to open the project in Netbeans, simply open this repository as a project.

### Eclipse

Eclipse supports Gradle based projects out of the box thanks to the Buildship project.
To open the project in Eclipse, simply import this repository as a Gradle project.

## Licensing

    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.


