You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@polygene.apache.org by ni...@apache.org on 2018/05/04 02:22:08 UTC

[01/13] polygene-java git commit: I still don't understand how Docker generation/execution works in our system... But need to remove the MySQL one for some unknown reason.

Repository: polygene-java
Updated Branches:
  refs/heads/develop 77b68068a -> 42bc67f2c


I still don't understand how Docker generation/execution works in our system... But need to remove the MySQL one for some unknown reason.


Project: http://git-wip-us.apache.org/repos/asf/polygene-java/repo
Commit: http://git-wip-us.apache.org/repos/asf/polygene-java/commit/c68ad9ac
Tree: http://git-wip-us.apache.org/repos/asf/polygene-java/tree/c68ad9ac
Diff: http://git-wip-us.apache.org/repos/asf/polygene-java/diff/c68ad9ac

Branch: refs/heads/develop
Commit: c68ad9ac0c9e57b48e4dd6d7e0c3bb30c8383479
Parents: 77b6806
Author: niclas <ni...@hedhman.org>
Authored: Wed Apr 25 13:33:11 2018 +0800
Committer: niclas <ni...@hedhman.org>
Committed: Wed Apr 25 13:33:11 2018 +0800

----------------------------------------------------------------------
 dependencies.gradle                                 |  1 -
 .../src/main/docker/mysql/Dockerfile                | 16 ----------------
 2 files changed, 17 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/polygene-java/blob/c68ad9ac/dependencies.gradle
----------------------------------------------------------------------
diff --git a/dependencies.gradle b/dependencies.gradle
index 9e51642..e2aad56 100644
--- a/dependencies.gradle
+++ b/dependencies.gradle
@@ -282,7 +282,6 @@ dependencies.dockerImagesVersions << [
         memcached: 'memcached:1.4.39-alpine',
         mariadb  : 'mariadb:10.1.21',
         mongo    : 'mongo:3.5.10',
-        mysql    : 'mysql:5.5.9',
         postgres : 'postgres:9.6.3-alpine',
         redis    : 'redis:4.0.0-alpine',
         riak     : 'basho/riak-kv:ubuntu-2.2.3',

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/c68ad9ac/internals/testsupport-internal/src/main/docker/mysql/Dockerfile
----------------------------------------------------------------------
diff --git a/internals/testsupport-internal/src/main/docker/mysql/Dockerfile b/internals/testsupport-internal/src/main/docker/mysql/Dockerfile
deleted file mode 100644
index e2620e6..0000000
--- a/internals/testsupport-internal/src/main/docker/mysql/Dockerfile
+++ /dev/null
@@ -1,16 +0,0 @@
-# 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.
-
-FROM @mysql@
\ No newline at end of file


[09/13] polygene-java git commit: issue report with composite method invocation

Posted by ni...@apache.org.
issue report with composite method invocation


Project: http://git-wip-us.apache.org/repos/asf/polygene-java/repo
Commit: http://git-wip-us.apache.org/repos/asf/polygene-java/commit/fe8ed3e0
Tree: http://git-wip-us.apache.org/repos/asf/polygene-java/tree/fe8ed3e0
Diff: http://git-wip-us.apache.org/repos/asf/polygene-java/diff/fe8ed3e0

Branch: refs/heads/develop
Commit: fe8ed3e01bd81f1fd4cc921e1277c6c947f2c343
Parents: 77b6806
Author: tbml <ti...@adleritech.com>
Authored: Wed May 2 08:15:41 2018 +0200
Committer: tbml <ti...@adleritech.com>
Committed: Wed May 2 08:15:41 2018 +0200

----------------------------------------------------------------------
 .../CompositeMethodInvocationTest.java          | 55 ++++++++++++++++++++
 1 file changed, 55 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/polygene-java/blob/fe8ed3e0/core/runtime/src/test/java/org/apache/polygene/runtime/composite/CompositeMethodInvocationTest.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/test/java/org/apache/polygene/runtime/composite/CompositeMethodInvocationTest.java b/core/runtime/src/test/java/org/apache/polygene/runtime/composite/CompositeMethodInvocationTest.java
new file mode 100644
index 0000000..44d4ea3
--- /dev/null
+++ b/core/runtime/src/test/java/org/apache/polygene/runtime/composite/CompositeMethodInvocationTest.java
@@ -0,0 +1,55 @@
+package org.apache.polygene.runtime.composite;
+
+import org.apache.polygene.api.injection.scope.Service;
+import org.apache.polygene.api.mixin.Mixins;
+import org.apache.polygene.api.service.ServiceComposite;
+import org.apache.polygene.bootstrap.AssemblyException;
+import org.apache.polygene.bootstrap.ModuleAssembly;
+import org.apache.polygene.test.AbstractPolygeneTest;
+import org.junit.jupiter.api.Test;
+
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
+
+public class CompositeMethodInvocationTest extends AbstractPolygeneTest {
+
+    @Service
+    MyService srv;
+
+    /**
+     * To correct, change instance pool type in CompositeMethodModel
+     * AtomicInstancePool -> SynchronizedCompositeMethodInstancePool
+     */
+    @Test
+    public void corruptedMethodInvocation() throws InterruptedException {
+        srv.dummy(); // to avoid concurrent activation (it can have own issues)
+
+        ExecutorService exe = Executors.newFixedThreadPool(10);
+        for (int i = 0; i < 10; i++) {
+            exe.execute(() -> {
+                while (true) {
+                    srv.dummy();
+                }
+            });
+        }
+        exe.awaitTermination(10, TimeUnit.MINUTES);
+    }
+
+    @Override
+    public void assemble(ModuleAssembly module) throws AssemblyException {
+        module.services(MyService.class);
+    }
+
+    @Mixins(Impl.class)
+    public interface MyService extends ServiceComposite {
+        void dummy();
+    }
+
+    public abstract static class Impl implements MyService {
+        @Override
+        public void dummy() {
+        }
+    }
+
+}


[02/13] polygene-java git commit: Initial Zookeeper Entity Store done.

Posted by ni...@apache.org.
Initial Zookeeper Entity Store done.


Project: http://git-wip-us.apache.org/repos/asf/polygene-java/repo
Commit: http://git-wip-us.apache.org/repos/asf/polygene-java/commit/68b55fa9
Tree: http://git-wip-us.apache.org/repos/asf/polygene-java/tree/68b55fa9
Diff: http://git-wip-us.apache.org/repos/asf/polygene-java/diff/68b55fa9

Branch: refs/heads/develop
Commit: 68b55fa9b6950275a7ec2397cd89c40414526014
Parents: c68ad9a
Author: niclas <ni...@hedhman.org>
Authored: Thu Apr 26 08:30:44 2018 +0800
Committer: niclas <ni...@hedhman.org>
Committed: Thu Apr 26 08:30:44 2018 +0800

----------------------------------------------------------------------
 dependencies.gradle                             |   3 +
 .../entitystore/riak/RiakEntityStoreMixin.java  |   3 +-
 extensions/entitystore-zookeeper/build.gradle   |  41 +++
 extensions/entitystore-zookeeper/dev-status.xml |  38 +++
 .../src/docs/es-zookeeper.txt                   |  53 +++
 .../ZookeeperEntityStoreConfiguration.java      |  89 +++++
 .../zookeeper/ZookeeperEntityStoreMixin.java    | 336 +++++++++++++++++++
 .../zookeeper/ZookeeperEntityStoreService.java  |  52 +++
 .../assembly/ZookeeperEntityStoreAssembler.java |  50 +++
 .../polygene/entitystore/zookeeper/package.html |  24 ++
 .../polygene/entitystore/zookeeper/ZkUtil.java  |  33 ++
 .../zookeeper/ZookeeperEntityStoreTest.java     |  67 ++++
 .../ZookeeperEntityStoreTestSuite.java          |  62 ++++
 .../ZookeeperEntityStoreWithCacheTest.java      |  60 ++++
 settings.gradle                                 |   1 +
 15 files changed, 911 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/polygene-java/blob/68b55fa9/dependencies.gradle
----------------------------------------------------------------------
diff --git a/dependencies.gradle b/dependencies.gradle
index e2aad56..6bf9405 100644
--- a/dependencies.gradle
+++ b/dependencies.gradle
@@ -83,6 +83,8 @@ def solrVersion = "1.4.1" // 4.x Fails to compile!
 def springVersion = '5.0.5.RELEASE'
 def spymemcachedVersion = '2.12.3'
 def velocityVersion = '1.7'
+def zookeeperVersion = '3.4.10'
+
 dependencies.libraries << [
         bdb_je            : "com.sleepycat:je:$bdbjeVersion",
         bonecp            : "com.jolbox:bonecp:$bonecpVersion",
@@ -171,6 +173,7 @@ dependencies.libraries << [
                              "org.springframework:spring-context:$springVersion"],
         spymemcached      : "net.spy:spymemcached:$spymemcachedVersion",
         velocity          : "org.apache.velocity:velocity:$velocityVersion",
+        zookeeper         : "org.apache.zookeeper:zookeeper:$zookeeperVersion"
 ]
 
 // Tools dependencies

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/68b55fa9/extensions/entitystore-riak/src/main/java/org/apache/polygene/entitystore/riak/RiakEntityStoreMixin.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-riak/src/main/java/org/apache/polygene/entitystore/riak/RiakEntityStoreMixin.java b/extensions/entitystore-riak/src/main/java/org/apache/polygene/entitystore/riak/RiakEntityStoreMixin.java
index 39fd13a..7981318 100644
--- a/extensions/entitystore-riak/src/main/java/org/apache/polygene/entitystore/riak/RiakEntityStoreMixin.java
+++ b/extensions/entitystore-riak/src/main/java/org/apache/polygene/entitystore/riak/RiakEntityStoreMixin.java
@@ -282,7 +282,8 @@ public class RiakEntityStoreMixin implements ServiceActivation, MapEntityStore,
                             {
                                 super.close();
                                 EntityReference reference = mapChange.reference();
-                                Location location = new Location( namespace, reference.identity().toString() );
+                                String identity = reference.identity().toString();
+                                Location location = new Location( namespace, identity );
                                 FetchValue fetch = new FetchValue.Builder( location ).build();
                                 FetchValue.Response response = riakClient.execute( fetch );
                                 if( response.isNotFound() )

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/68b55fa9/extensions/entitystore-zookeeper/build.gradle
----------------------------------------------------------------------
diff --git a/extensions/entitystore-zookeeper/build.gradle b/extensions/entitystore-zookeeper/build.gradle
new file mode 100644
index 0000000..b8c6430
--- /dev/null
+++ b/extensions/entitystore-zookeeper/build.gradle
@@ -0,0 +1,41 @@
+/*
+ *  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.
+ *
+ *
+ */
+
+apply plugin: 'polygene-extension'
+
+description = "Apache Polygene™ Zookeeper EntityStore Extension. NOTE: Meant for configuration and other very light loads."
+
+jar { manifest { name = "Apache Polygene™ Extension - EntityStore - Zookeeper" } }
+
+dependencies {
+  api polygene.core.bootstrap
+
+  implementation polygene.library( 'locking' )
+  implementation polygene.library( 'constraints' )
+  implementation libraries.zookeeper
+
+  runtimeOnly polygene.core.runtime
+
+  testImplementation polygene.core.testsupport
+  testImplementation libraries.awaitility
+  testImplementation libraries.docker_junit
+
+  testRuntimeOnly libraries.logback
+}

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/68b55fa9/extensions/entitystore-zookeeper/dev-status.xml
----------------------------------------------------------------------
diff --git a/extensions/entitystore-zookeeper/dev-status.xml b/extensions/entitystore-zookeeper/dev-status.xml
new file mode 100644
index 0000000..c79727f
--- /dev/null
+++ b/extensions/entitystore-zookeeper/dev-status.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!--
+  ~  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.
+  ~
+  ~
+  -->
+<module xmlns="http://polygene.apache.org/schemas/2008/dev-status/1"
+        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:schemaLocation="http://polygene.apache.org/schemas/2008/dev-status/1
+        http://polygene.apache.org/schemas/2008/dev-status/1/dev-status.xsd">
+  <status>
+        <!--none,early,beta,stable,mature-->
+        <codebase>beta</codebase>
+
+        <!-- none, brief, good, complete -->
+        <documentation>brief</documentation>
+
+        <!-- none, some, good, complete -->
+        <unittests>good</unittests>
+    </status>
+    <licenses>
+        <license>ALv2</license>
+    </licenses>
+</module>

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/68b55fa9/extensions/entitystore-zookeeper/src/docs/es-zookeeper.txt
----------------------------------------------------------------------
diff --git a/extensions/entitystore-zookeeper/src/docs/es-zookeeper.txt b/extensions/entitystore-zookeeper/src/docs/es-zookeeper.txt
new file mode 100644
index 0000000..18253b9
--- /dev/null
+++ b/extensions/entitystore-zookeeper/src/docs/es-zookeeper.txt
@@ -0,0 +1,53 @@
+///////////////////////////////////////////////////////////////
+ * 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.
+///////////////////////////////////////////////////////////////
+
+[[extension-es-zookeeper, Zookeeper EntityStore]]
+= Zookeeper EntityStore =
+
+[devstatus]
+--------------
+source=extensions/entitystore-sqlkv/dev-status.xml
+--------------
+
+EntityStore service backed by a Zookeeper cluster. All entities are stored under a configurable ZNode, by default
+/polygene/store.
+
+Note that Zookeeper is not intended for heavy loads, and this implementation is primarily for Configurations and
+reference data that is primarily read-only in nature.
+
+include::../../build/docs/buildinfo/artifact.txt[]
+
+== Configuration ==
+
+Here are the available configuration properties:
+
+[snippet,java]
+----
+source=extensions/entitystore-zookeeper/src/main/java/org/apache/polygene/entitystore/zookeeper/ZookeeperEntityStoreConfiguration.java
+tag=config
+----
+
+Assembly is done using the provided Assembler:
+
+[snippet,java]
+----
+source=extensions/entitystore-zookeeper/src/test/java/org/apache/polygene/entitystore/zookeeper/ZookeeperEntityStoreTest.java
+tag=assembly
+----
+

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/68b55fa9/extensions/entitystore-zookeeper/src/main/java/org/apache/polygene/entitystore/zookeeper/ZookeeperEntityStoreConfiguration.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-zookeeper/src/main/java/org/apache/polygene/entitystore/zookeeper/ZookeeperEntityStoreConfiguration.java b/extensions/entitystore-zookeeper/src/main/java/org/apache/polygene/entitystore/zookeeper/ZookeeperEntityStoreConfiguration.java
new file mode 100644
index 0000000..f7ffdbf
--- /dev/null
+++ b/extensions/entitystore-zookeeper/src/main/java/org/apache/polygene/entitystore/zookeeper/ZookeeperEntityStoreConfiguration.java
@@ -0,0 +1,89 @@
+/*
+ *  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.
+ */
+package org.apache.polygene.entitystore.zookeeper;
+
+import java.util.List;
+import org.apache.polygene.api.common.Optional;
+import org.apache.polygene.api.common.UseDefaults;
+import org.apache.polygene.api.property.Property;
+
+/**
+ * Configuration for ZookeeperEntityStoreService.
+ */
+// START SNIPPET: config
+public interface ZookeeperEntityStoreConfiguration
+{
+    /**
+     * List of Zookeeper hosts
+     * <p>
+     * Each entry must contain an IP address / hostname followed by a column and the host's port.
+     * <p>
+     * Defaulted to 127.0.0.1:2181 if empty.
+     *
+     * @return List of Zookeeper hosts
+     */
+    @UseDefaults
+    Property<List<String>> hosts();
+
+    /**
+     * Path/Node in Zookeeper's namespace where Entities state will be stored.
+     * <p>
+     * Defaulted to "/polygene/store".
+     *
+     * @return The path of the the node where the entities will be stored.
+     */
+    @UseDefaults( "/polygene/store" )
+    Property<String> storageNode();
+
+    /** Timeout of Session in milliseconds
+     */
+    @UseDefaults( "10000" )
+    Property<Integer> sessionTimeout();
+
+    /**
+     * ACL to be used for new znodes.
+     * <p>
+     * Each String is in the format of;  PERM, SCHEME, ID
+     * </p>
+     * <p>
+     * where <strong>PERM</strong> is an integer by adding together
+     * <ul>
+     * <li>1 = <code>READ</code> </li>
+     * <li>2 = <code>WRITE</code> </li>
+     * <li>4 = <code>CREATE</code> </li>
+     * <li>8 = <code>DELETE</code> </li>
+     * <li>16 = <code>ADMIN</code> </li>
+     * </ul>
+     * or 31 for <code>ALL</code>, which is also the default value.
+     *
+     * </p>
+     *<p>
+     * <strong>SCHEME</strong> is the zookeeper ACL scheme, one of "world", "auth", ...(?)...
+     * <br/>
+     * Default: "world"
+     *</p>
+     * <p>
+     *     ID is the identity within the SCHEME. For "world" SCHEME, "anyone" is wildcard as can be expected.
+     *
+     *     Default: "anyone"
+     * </p>
+     */
+    @Optional
+    Property<List<String>> acls();
+}
+// END SNIPPET: config

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/68b55fa9/extensions/entitystore-zookeeper/src/main/java/org/apache/polygene/entitystore/zookeeper/ZookeeperEntityStoreMixin.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-zookeeper/src/main/java/org/apache/polygene/entitystore/zookeeper/ZookeeperEntityStoreMixin.java b/extensions/entitystore-zookeeper/src/main/java/org/apache/polygene/entitystore/zookeeper/ZookeeperEntityStoreMixin.java
new file mode 100644
index 0000000..59a0b5a
--- /dev/null
+++ b/extensions/entitystore-zookeeper/src/main/java/org/apache/polygene/entitystore/zookeeper/ZookeeperEntityStoreMixin.java
@@ -0,0 +1,336 @@
+/*
+ *  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.
+ */
+package org.apache.polygene.entitystore.zookeeper;
+
+import java.io.IOException;
+import java.io.Reader;
+import java.io.StringReader;
+import java.io.StringWriter;
+import java.io.Writer;
+import java.lang.reflect.UndeclaredThrowableException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Spliterators;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.stream.Stream;
+import java.util.stream.StreamSupport;
+import org.apache.polygene.api.common.Optional;
+import org.apache.polygene.api.configuration.Configuration;
+import org.apache.polygene.api.entity.EntityDescriptor;
+import org.apache.polygene.api.entity.EntityReference;
+import org.apache.polygene.api.injection.scope.Service;
+import org.apache.polygene.api.injection.scope.This;
+import org.apache.polygene.api.service.ServiceActivation;
+import org.apache.polygene.spi.entitystore.EntityNotFoundException;
+import org.apache.polygene.spi.entitystore.EntityStoreException;
+import org.apache.polygene.spi.entitystore.helpers.MapEntityStore;
+import org.apache.zookeeper.KeeperException;
+import org.apache.zookeeper.WatchedEvent;
+import org.apache.zookeeper.Watcher;
+import org.apache.zookeeper.ZooKeeper;
+import org.apache.zookeeper.data.ACL;
+import org.apache.zookeeper.data.Id;
+import org.apache.zookeeper.data.Stat;
+
+import static java.util.Spliterator.DISTINCT;
+import static java.util.Spliterator.IMMUTABLE;
+import static java.util.Spliterator.NONNULL;
+import static org.apache.zookeeper.CreateMode.PERSISTENT;
+import static org.apache.zookeeper.ZooDefs.Ids.ANYONE_ID_UNSAFE;
+import static org.apache.zookeeper.ZooDefs.Perms.ALL;
+
+/**
+ * Zookeeper implementation of MapEntityStore.
+ */
+public class ZookeeperEntityStoreMixin
+    implements ServiceActivation, MapEntityStore
+{
+    private static final String DEFAULT_HOSTPORT = "localhost:2181";
+    private static final byte[] EMPTY_DATA = new byte[ 0 ];
+
+    @Service
+    @Optional
+    private Watcher watcher;
+
+    @This
+    private Configuration<ZookeeperEntityStoreConfiguration> configuration;
+    private ZooKeeper zkClient;
+    private String storageNode;
+    private List<ACL> acl;
+
+    @Override
+    public void activateService()
+        throws Exception
+    {
+        // Load configuration
+        configuration.refresh();
+        ZookeeperEntityStoreConfiguration config = configuration.get();
+        setupStorageNode( config );
+
+        List<String> hosts = config.hosts().get();
+        if( hosts == null || hosts.size() == 0 )
+        {
+            hosts = Collections.singletonList( DEFAULT_HOSTPORT );
+        }
+        String hostPort = hosts.get( (int) ( Math.random() * hosts.size() ) );
+
+        int sessionTimeout = config.sessionTimeout().get();
+
+        zkClient = new ZooKeeper( hostPort, sessionTimeout, watcher == null ? new DummyWatcher() : watcher );
+        createStorageNodeIfNotExists( config );
+    }
+
+    private void setupStorageNode( ZookeeperEntityStoreConfiguration config )
+    {
+        storageNode = config.storageNode().get();
+        while( storageNode.startsWith( "//" ) )
+        {
+            storageNode = storageNode.substring( 1 );
+        }
+        while( storageNode.endsWith( "/" ) )
+        {
+            storageNode = storageNode.substring( 0, storageNode.length() - 1 );
+        }
+        if( !storageNode.startsWith( "/" ) )
+        {
+            storageNode = "/" + storageNode;
+        }
+    }
+
+    private void createStorageNodeIfNotExists( ZookeeperEntityStoreConfiguration config )
+        throws KeeperException, InterruptedException
+    {
+        acl = parseAcls( config.acls().get() );
+        String nodeName = config.storageNode().get();
+        String[] parts = nodeName.split( "/" );
+        String current = "";
+        for( String part : parts )
+        {
+            if( part.length() > 0 )
+            {
+                current = current + "/" + part;
+                Stat stat = zkClient.exists( current, false );
+                if( stat == null )
+                {
+                    zkClient.create( current, EMPTY_DATA, acl, PERSISTENT );
+                }
+            }
+        }
+    }
+
+    private List<ACL> parseAcls( List<String> acls )
+    {
+        List<ACL> result = new ArrayList<>();
+        if( acls == null || acls.size() == 0 )
+        {
+            result.add( new ACL( ALL, ANYONE_ID_UNSAFE ) );
+            return result;
+        }
+        acls.forEach( s -> {
+            String[] parts = s.split( "," );
+            int perms = Integer.valueOf( parts[ 0 ] );
+            String id = parts[ 2 ];
+            String scheme = parts[ 1 ];
+            result.add( new ACL( perms, new Id( scheme, id ) ) );
+        } );
+        return result;
+    }
+
+    @Override
+    public void passivateService()
+        throws Exception
+    {
+        zkClient.close();
+    }
+
+    @Override
+    public Reader get( EntityReference reference )
+    {
+        try
+        {
+            Stat stat = new Stat();
+            byte[] data = zkClient.getData( znode( reference ), false, stat );
+            if( data == null || stat.getDataLength() == 0 )
+            {
+                throw new EntityNotFoundException( reference );
+            }
+            return new StringReader( new String( data ) );
+        }
+        catch( KeeperException.NoNodeException e )
+        {
+            throw new EntityNotFoundException( reference );
+        }
+        catch( InterruptedException | KeeperException e )
+        {
+            throw new EntityStoreException( "Unable to get Entity " + reference.identity(), e );
+        }
+    }
+
+    @Override
+    public void applyChanges( MapChanges changes )
+    {
+        try
+        {
+            changes.visitMap( new MapChanger()
+            {
+                @Override
+                public Writer newEntity( EntityReference ref, EntityDescriptor entityDescriptor )
+                {
+                    return new StringWriter( 1000 )
+                    {
+                        @Override
+                        public void close()
+                            throws IOException
+                        {
+                            try
+                            {
+                                super.close();
+                                String znode = znode( ref );
+                                byte[] data = toString().getBytes();
+                                zkClient.create( znode, data, acl, PERSISTENT );
+                            }
+                            catch( InterruptedException | KeeperException e )
+                            {
+                                throw new EntityStoreException( "Unable to apply entity change: newEntity", e );
+                            }
+                        }
+                    };
+                }
+
+                @Override
+                public Writer updateEntity( MapChange mapChange )
+                {
+                    return new StringWriter( 1000 )
+                    {
+                        @Override
+                        public void close()
+                            throws IOException
+                        {
+                            try
+                            {
+                                super.close();
+                                EntityReference ref = mapChange.reference();
+                                String znode = znode( ref );
+                                Stat stat = zkClient.exists( znode, false );
+                                if( stat == null )
+                                {
+                                    throw new EntityNotFoundException( ref );
+                                }
+                                int version = stat.getVersion();
+                                zkClient.setData( znode, toString().getBytes(), version );
+                            }
+                            catch( InterruptedException | KeeperException e )
+                            {
+                                throw new EntityStoreException( "Unable to apply entity change: updateEntity", e );
+                            }
+                        }
+                    };
+                }
+
+                @Override
+                public void removeEntity( EntityReference ref, EntityDescriptor entityDescriptor )
+                {
+                    try
+                    {
+                        String znode = znode( ref );
+                        Stat stat = zkClient.exists( znode, false );
+                        int version = stat.getVersion();
+                        zkClient.delete( znode, version );
+                    }
+                    catch( InterruptedException | KeeperException e )
+                    {
+                        throw new EntityStoreException( "Unable to apply entity change: removeEntity", e );
+                    }
+                }
+            } );
+        }
+        catch( Exception ex )
+        {
+            throw new EntityStoreException( "Unable to apply entity changes.", ex );
+        }
+    }
+
+    private String znode( EntityReference ref )
+    {
+        return storageNode + '/' + ref.identity().toString();
+    }
+
+    @Override
+    public Stream<Reader> entityStates()
+    {
+        try
+        {
+            List<String> children = zkClient.getChildren( storageNode, false );
+            final ItemIterator iterator = new ItemIterator();
+            for( String child : children )
+            {
+                Stat stat = new Stat();
+                String path = storageNode + "/" + child;
+                byte[] data = zkClient.getData( path, false, stat );
+                if( data.length > 0 )
+                {
+                    String json = new String( data );
+                    iterator.queue.offer( new StringReader( json ) );
+                }
+            }
+            return StreamSupport.stream( Spliterators.spliterator( iterator, DISTINCT | NONNULL | IMMUTABLE, 1 ), false );
+        }
+        catch( KeeperException | InterruptedException e )
+        {
+            throw new EntityStoreException( "Unable to get entity states.", e );
+        }
+    }
+
+    private class ItemIterator
+        implements Iterator<Reader>
+    {
+        private final BlockingQueue<Reader> queue = new LinkedBlockingQueue<>();
+
+        @Override
+        public boolean hasNext()
+        {
+            return queue.size() > 0;
+        }
+
+        @Override
+        public Reader next()
+        {
+            try
+            {
+                return queue.take();
+            }
+            catch( InterruptedException e )
+            {
+                throw new UndeclaredThrowableException( e );
+            }
+        }
+    }
+
+    private class DummyWatcher
+        implements Watcher
+    {
+        @Override
+        public void process( WatchedEvent event )
+        {
+            // ignore all
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/68b55fa9/extensions/entitystore-zookeeper/src/main/java/org/apache/polygene/entitystore/zookeeper/ZookeeperEntityStoreService.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-zookeeper/src/main/java/org/apache/polygene/entitystore/zookeeper/ZookeeperEntityStoreService.java b/extensions/entitystore-zookeeper/src/main/java/org/apache/polygene/entitystore/zookeeper/ZookeeperEntityStoreService.java
new file mode 100644
index 0000000..80cb2a5
--- /dev/null
+++ b/extensions/entitystore-zookeeper/src/main/java/org/apache/polygene/entitystore/zookeeper/ZookeeperEntityStoreService.java
@@ -0,0 +1,52 @@
+/*
+ *  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.
+ *
+ *
+ */
+package org.apache.polygene.entitystore.zookeeper;
+
+import org.apache.polygene.api.concern.Concerns;
+import org.apache.polygene.api.configuration.Configuration;
+import org.apache.polygene.api.mixin.Mixins;
+import org.apache.polygene.api.service.ServiceActivation;
+import org.apache.polygene.library.locking.LockingAbstractComposite;
+import org.apache.polygene.spi.entitystore.ConcurrentModificationCheckConcern;
+import org.apache.polygene.spi.entitystore.EntityStateVersions;
+import org.apache.polygene.spi.entitystore.EntityStore;
+import org.apache.polygene.spi.entitystore.StateChangeNotificationConcern;
+import org.apache.polygene.spi.entitystore.helpers.JSONMapEntityStoreActivation;
+import org.apache.polygene.spi.entitystore.helpers.JSONMapEntityStoreMixin;
+import org.apache.polygene.spi.entitystore.helpers.MapEntityStoreActivation;
+import org.apache.polygene.spi.entitystore.helpers.MapEntityStoreMixin;
+
+/**
+ * Riak EntityStore service.
+ * <p>Can be used with Riak implementations of MapEntityStore.</p>
+ * <p>Based on {@link JSONMapEntityStoreMixin}</p>
+ */
+@Concerns( { StateChangeNotificationConcern.class, ConcurrentModificationCheckConcern.class } )
+@Mixins( { JSONMapEntityStoreMixin.class, MapEntityStoreMixin.class } )
+public interface ZookeeperEntityStoreService
+    extends EntityStore,
+            EntityStateVersions,
+            MapEntityStoreActivation,
+            JSONMapEntityStoreActivation,
+            ServiceActivation,
+            LockingAbstractComposite,
+            Configuration
+{
+}

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/68b55fa9/extensions/entitystore-zookeeper/src/main/java/org/apache/polygene/entitystore/zookeeper/assembly/ZookeeperEntityStoreAssembler.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-zookeeper/src/main/java/org/apache/polygene/entitystore/zookeeper/assembly/ZookeeperEntityStoreAssembler.java b/extensions/entitystore-zookeeper/src/main/java/org/apache/polygene/entitystore/zookeeper/assembly/ZookeeperEntityStoreAssembler.java
new file mode 100644
index 0000000..664513c
--- /dev/null
+++ b/extensions/entitystore-zookeeper/src/main/java/org/apache/polygene/entitystore/zookeeper/assembly/ZookeeperEntityStoreAssembler.java
@@ -0,0 +1,50 @@
+/*
+ *  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.
+ */
+package org.apache.polygene.entitystore.zookeeper.assembly;
+
+import org.apache.polygene.bootstrap.Assemblers;
+import org.apache.polygene.bootstrap.ModuleAssembly;
+import org.apache.polygene.bootstrap.ServiceDeclaration;
+import org.apache.polygene.entitystore.zookeeper.ZookeeperEntityStoreConfiguration;
+import org.apache.polygene.entitystore.zookeeper.ZookeeperEntityStoreMixin;
+import org.apache.polygene.entitystore.zookeeper.ZookeeperEntityStoreService;
+
+/**
+ * Zookeeper EntityStore assembly.
+ */
+public class ZookeeperEntityStoreAssembler
+    extends Assemblers.VisibilityIdentityConfig<ZookeeperEntityStoreAssembler>
+{
+    @Override
+    public void assemble( ModuleAssembly module )
+    {
+        super.assemble( module );
+        ServiceDeclaration service = module.services( ZookeeperEntityStoreService.class )
+                                           .withMixins( ZookeeperEntityStoreMixin.class )
+                                           .visibleIn( visibility() );
+        if( hasIdentity() )
+        {
+            service.identifiedBy( identity() );
+        }
+        if( hasConfig() )
+        {
+            configModule().entities( ZookeeperEntityStoreConfiguration.class )
+                          .visibleIn( configVisibility() );
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/68b55fa9/extensions/entitystore-zookeeper/src/main/java/org/apache/polygene/entitystore/zookeeper/package.html
----------------------------------------------------------------------
diff --git a/extensions/entitystore-zookeeper/src/main/java/org/apache/polygene/entitystore/zookeeper/package.html b/extensions/entitystore-zookeeper/src/main/java/org/apache/polygene/entitystore/zookeeper/package.html
new file mode 100644
index 0000000..142a770
--- /dev/null
+++ b/extensions/entitystore-zookeeper/src/main/java/org/apache/polygene/entitystore/zookeeper/package.html
@@ -0,0 +1,24 @@
+<!--
+  ~  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.
+  ~
+  ~
+  -->
+<html>
+    <body>
+        <h2>Zookeeper EntityStore.</h2>
+    </body>
+</html>

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/68b55fa9/extensions/entitystore-zookeeper/src/test/java/org/apache/polygene/entitystore/zookeeper/ZkUtil.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-zookeeper/src/test/java/org/apache/polygene/entitystore/zookeeper/ZkUtil.java b/extensions/entitystore-zookeeper/src/test/java/org/apache/polygene/entitystore/zookeeper/ZkUtil.java
new file mode 100644
index 0000000..8b08892
--- /dev/null
+++ b/extensions/entitystore-zookeeper/src/test/java/org/apache/polygene/entitystore/zookeeper/ZkUtil.java
@@ -0,0 +1,33 @@
+package org.apache.polygene.entitystore.zookeeper;
+
+import java.io.IOException;
+import java.util.List;
+import org.apache.zookeeper.KeeperException;
+import org.apache.zookeeper.ZooKeeper;
+import org.apache.zookeeper.data.Stat;
+
+public class ZkUtil
+{
+    static void cleanUp( String host, String znodeName )
+        throws KeeperException, InterruptedException, IOException
+    {
+        ZooKeeper zk = new ZooKeeper( host, 10000, event -> {
+        } );
+        delete( zk, znodeName );
+    }
+
+    private static void delete( ZooKeeper zk, String znodeName )
+        throws KeeperException, InterruptedException
+    {
+        Stat stat = zk.exists( znodeName, false );
+        if( stat != null )
+        {
+            List<String> children = zk.getChildren( znodeName, false );
+            for( String child : children )
+            {
+                delete( zk, znodeName + "/" + child );
+            }
+            zk.delete( znodeName, stat.getVersion() );
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/68b55fa9/extensions/entitystore-zookeeper/src/test/java/org/apache/polygene/entitystore/zookeeper/ZookeeperEntityStoreTest.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-zookeeper/src/test/java/org/apache/polygene/entitystore/zookeeper/ZookeeperEntityStoreTest.java b/extensions/entitystore-zookeeper/src/test/java/org/apache/polygene/entitystore/zookeeper/ZookeeperEntityStoreTest.java
new file mode 100644
index 0000000..bf5bc99
--- /dev/null
+++ b/extensions/entitystore-zookeeper/src/test/java/org/apache/polygene/entitystore/zookeeper/ZookeeperEntityStoreTest.java
@@ -0,0 +1,67 @@
+/*
+ *  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.
+ *
+ *
+ */
+package org.apache.polygene.entitystore.zookeeper;
+
+import org.apache.polygene.api.common.Visibility;
+import org.apache.polygene.bootstrap.AssemblyException;
+import org.apache.polygene.bootstrap.ModuleAssembly;
+import org.apache.polygene.entitystore.zookeeper.assembly.ZookeeperEntityStoreAssembler;
+import org.apache.polygene.test.EntityTestAssembler;
+import org.apache.polygene.test.TemporaryFolder;
+import org.apache.polygene.test.entity.AbstractEntityStoreTest;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.extension.ExtendWith;
+
+import static java.util.Collections.singletonList;
+
+@ExtendWith( TemporaryFolder.class )
+public class ZookeeperEntityStoreTest
+    extends AbstractEntityStoreTest
+{
+
+    static final String TEST_ZNODE_NAME = "/polygene/entitystore-test";
+
+    @Override
+    // START SNIPPET: assembly
+    public void assemble( ModuleAssembly module )
+        throws AssemblyException
+    {
+        // END SNIPPET: assembly
+        super.assemble( module );
+        ModuleAssembly config = module.layer().module( "config" );
+        new EntityTestAssembler().defaultServicesVisibleIn( Visibility.layer ).assemble( config );
+        // START SNIPPET: assembly
+        ZookeeperEntityStoreAssembler zkAssembler = new ZookeeperEntityStoreAssembler();
+        zkAssembler.withConfig( config, Visibility.layer ).assemble( module );
+        // END SNIPPET: assembly
+        ZookeeperEntityStoreConfiguration defaults = zkAssembler.configModule().forMixin( ZookeeperEntityStoreConfiguration.class ).declareDefaults();
+        defaults.hosts().set( singletonList( "localhost:2181" ) );
+        defaults.storageNode().set( TEST_ZNODE_NAME );
+        // START SNIPPET: assembly
+    }
+    // END SNIPPET: assembly
+
+    @AfterEach
+    void cleanUp()
+        throws Exception
+    {
+        ZkUtil.cleanUp( "localhost:2181", TEST_ZNODE_NAME );
+    }
+}

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/68b55fa9/extensions/entitystore-zookeeper/src/test/java/org/apache/polygene/entitystore/zookeeper/ZookeeperEntityStoreTestSuite.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-zookeeper/src/test/java/org/apache/polygene/entitystore/zookeeper/ZookeeperEntityStoreTestSuite.java b/extensions/entitystore-zookeeper/src/test/java/org/apache/polygene/entitystore/zookeeper/ZookeeperEntityStoreTestSuite.java
new file mode 100644
index 0000000..bf83f26
--- /dev/null
+++ b/extensions/entitystore-zookeeper/src/test/java/org/apache/polygene/entitystore/zookeeper/ZookeeperEntityStoreTestSuite.java
@@ -0,0 +1,62 @@
+/*
+ *  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.
+ *
+ *
+ */
+package org.apache.polygene.entitystore.zookeeper;
+
+import org.apache.polygene.api.common.Visibility;
+import org.apache.polygene.bootstrap.ModuleAssembly;
+import org.apache.polygene.entitystore.zookeeper.assembly.ZookeeperEntityStoreAssembler;
+import org.apache.polygene.test.TemporaryFolder;
+import org.apache.polygene.test.entity.model.EntityStoreTestSuite;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.extension.ExtendWith;
+
+import static java.util.Collections.singletonList;
+import static org.apache.polygene.entitystore.zookeeper.ZookeeperEntityStoreTest.TEST_ZNODE_NAME;
+
+@ExtendWith( TemporaryFolder.class )
+public class ZookeeperEntityStoreTestSuite
+    extends EntityStoreTestSuite
+{
+    @Override
+    protected void defineStorageModule( ModuleAssembly module )
+    {
+        module.defaultServices();
+        new ZookeeperEntityStoreAssembler()
+            .withConfig( configModule, Visibility.application )
+            .visibleIn( Visibility.application )
+            .assemble( module );
+    }
+
+    @Override
+    protected void defineConfigModule( ModuleAssembly module )
+    {
+        super.defineConfigModule( module );
+        ZookeeperEntityStoreConfiguration defaults = module.forMixin( ZookeeperEntityStoreConfiguration.class ).declareDefaults();
+        defaults.hosts().set( singletonList( "localhost:2181" ) );
+        defaults.storageNode().set( TEST_ZNODE_NAME );
+    }
+
+    @AfterEach
+    void cleanUp()
+        throws Exception
+    {
+        ZkUtil.cleanUp( "localhost:2181", TEST_ZNODE_NAME );
+    }
+}

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/68b55fa9/extensions/entitystore-zookeeper/src/test/java/org/apache/polygene/entitystore/zookeeper/ZookeeperEntityStoreWithCacheTest.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-zookeeper/src/test/java/org/apache/polygene/entitystore/zookeeper/ZookeeperEntityStoreWithCacheTest.java b/extensions/entitystore-zookeeper/src/test/java/org/apache/polygene/entitystore/zookeeper/ZookeeperEntityStoreWithCacheTest.java
new file mode 100644
index 0000000..1efaf05
--- /dev/null
+++ b/extensions/entitystore-zookeeper/src/test/java/org/apache/polygene/entitystore/zookeeper/ZookeeperEntityStoreWithCacheTest.java
@@ -0,0 +1,60 @@
+/*
+ *  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.
+ *
+ *
+ */
+package org.apache.polygene.entitystore.zookeeper;
+
+import org.apache.polygene.api.common.Visibility;
+import org.apache.polygene.bootstrap.AssemblyException;
+import org.apache.polygene.bootstrap.ModuleAssembly;
+import org.apache.polygene.entitystore.zookeeper.assembly.ZookeeperEntityStoreAssembler;
+import org.apache.polygene.test.EntityTestAssembler;
+import org.apache.polygene.test.TemporaryFolder;
+import org.apache.polygene.test.cache.AbstractEntityStoreWithCacheTest;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.extension.ExtendWith;
+
+import static java.util.Collections.singletonList;
+import static org.apache.polygene.entitystore.zookeeper.ZookeeperEntityStoreTest.TEST_ZNODE_NAME;
+
+public class ZookeeperEntityStoreWithCacheTest
+    extends AbstractEntityStoreWithCacheTest
+{
+    @Override
+    public void assemble( ModuleAssembly module )
+        throws AssemblyException
+    {
+        super.assemble( module );
+        ModuleAssembly config = module.layer().module( "config" );
+        new EntityTestAssembler().defaultServicesVisibleIn( Visibility.layer ).assemble( config );
+        ZookeeperEntityStoreAssembler zkAssembler = new ZookeeperEntityStoreAssembler();
+        zkAssembler.withConfig( config, Visibility.layer ).assemble( module );
+
+        ZookeeperEntityStoreConfiguration defaults = zkAssembler.configModule().forMixin( ZookeeperEntityStoreConfiguration.class ).declareDefaults();
+        defaults.hosts().set( singletonList( "localhost:2181" ) );
+        defaults.storageNode().set( TEST_ZNODE_NAME );
+    }
+
+    @AfterEach
+    void cleanUp()
+        throws Exception
+    {
+        ZkUtil.cleanUp( "localhost:2181", TEST_ZNODE_NAME );
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/68b55fa9/settings.gradle
----------------------------------------------------------------------
diff --git a/settings.gradle b/settings.gradle
index e410c6a..0f503e1 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -69,6 +69,7 @@ include 'core:api',
         'extensions:entitystore-riak',
         'extensions:entitystore-sql',
         'extensions:entitystore-sqlkv',
+        'extensions:entitystore-zookeeper',
         'extensions:indexing-elasticsearch',
         'extensions:indexing-rdf',
         'extensions:indexing-solr',


[08/13] polygene-java git commit: Nailing down the exact versions used in the Docker-supported tests.

Posted by ni...@apache.org.
Nailing down the exact versions used in the Docker-supported tests.


Project: http://git-wip-us.apache.org/repos/asf/polygene-java/repo
Commit: http://git-wip-us.apache.org/repos/asf/polygene-java/commit/2a643f50
Tree: http://git-wip-us.apache.org/repos/asf/polygene-java/tree/2a643f50
Diff: http://git-wip-us.apache.org/repos/asf/polygene-java/diff/2a643f50

Branch: refs/heads/develop
Commit: 2a643f5064c21b9d515f2eb9b09e85a62b09e156
Parents: 5b66241
Author: niclas <ni...@hedhman.org>
Authored: Sun Apr 29 15:17:50 2018 +0800
Committer: niclas <ni...@hedhman.org>
Committed: Sun Apr 29 15:17:50 2018 +0800

----------------------------------------------------------------------
 dependencies.gradle                                              | 4 +++-
 .../apache/polygene/cache/memcache/MemcacheCachePoolTest.java    | 2 +-
 .../polygene/entitystore/cassandra/CassandraEntityStoreTest.java | 2 +-
 .../entitystore/cassandra/CassandraEntityStoreTestSuite.java     | 2 +-
 .../org/apache/polygene/entitystore/jclouds/JCloudsS3Test.java   | 2 +-
 .../apache/polygene/entitystore/jclouds/JCloudsS3TestSuite.java  | 2 +-
 .../polygene/entitystore/mongodb/MongoDBEntityStoreTest.java     | 2 +-
 .../entitystore/mongodb/MongoDBEntityStoreTestSuite.java         | 2 +-
 .../entitystore/mongodb/MongoDBEntityStoreWithCacheTest.java     | 2 +-
 .../apache/polygene/entitystore/redis/RedisEntityStoreTest.java  | 2 +-
 .../polygene/entitystore/redis/RedisEntityStoreTestSuite.java    | 2 +-
 .../entitystore/redis/RedisEntityStoreWithCacheTest.java         | 2 +-
 .../apache/polygene/entitystore/riak/RiakEntityStoreTest.java    | 2 +-
 .../polygene/entitystore/riak/RiakEntityStoreTestSuite.java      | 2 +-
 .../polygene/entitystore/riak/RiakEntityStoreWithCacheTest.java  | 2 +-
 .../apache/polygene/entitystore/sql/MariaDbEntityStoreTest.java  | 2 +-
 .../polygene/entitystore/sql/MariaDbEntityStoreTestSuite.java    | 2 +-
 .../apache/polygene/entitystore/sql/MySQLEntityStoreTest.java    | 3 ++-
 .../polygene/entitystore/sql/MySQLEntityStoreTestSuite.java      | 3 ++-
 .../polygene/entitystore/sqlkv/MariaDbEntityStoreTest.java       | 2 +-
 .../polygene/entitystore/sqlkv/MariaDbEntityStoreTestSuite.java  | 2 +-
 .../apache/polygene/entitystore/sqlkv/MySQLEntityStoreTest.java  | 3 ++-
 .../polygene/entitystore/sqlkv/MySQLEntityStoreTestSuite.java    | 3 ++-
 .../polygene/entitystore/zookeeper/ZookeeperEntityStoreTest.java | 2 +-
 .../entitystore/zookeeper/ZookeeperEntityStoreTestSuite.java     | 2 +-
 .../entitystore/zookeeper/ZookeeperEntityStoreWithCacheTest.java | 2 +-
 26 files changed, 32 insertions(+), 26 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/polygene-java/blob/2a643f50/dependencies.gradle
----------------------------------------------------------------------
diff --git a/dependencies.gradle b/dependencies.gradle
index 6bf9405..bac7a6e 100644
--- a/dependencies.gradle
+++ b/dependencies.gradle
@@ -285,8 +285,10 @@ dependencies.dockerImagesVersions << [
         memcached: 'memcached:1.4.39-alpine',
         mariadb  : 'mariadb:10.1.21',
         mongo    : 'mongo:3.5.10',
+        mysql    : 'mysql:8.0.11',
         postgres : 'postgres:9.6.3-alpine',
         redis    : 'redis:4.0.0-alpine',
         riak     : 'basho/riak-kv:ubuntu-2.2.3',
-        s3server : 'scality/s3server:mem-bb2a38c0'
+        s3server : 'scality/s3server:mem-bb2a38c0',
+        zookeeper : 'zookeeper:3.4.11'
 ]

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/2a643f50/extensions/cache-memcache/src/test/java/org/apache/polygene/cache/memcache/MemcacheCachePoolTest.java
----------------------------------------------------------------------
diff --git a/extensions/cache-memcache/src/test/java/org/apache/polygene/cache/memcache/MemcacheCachePoolTest.java b/extensions/cache-memcache/src/test/java/org/apache/polygene/cache/memcache/MemcacheCachePoolTest.java
index bd0d2b8..28a7496 100644
--- a/extensions/cache-memcache/src/test/java/org/apache/polygene/cache/memcache/MemcacheCachePoolTest.java
+++ b/extensions/cache-memcache/src/test/java/org/apache/polygene/cache/memcache/MemcacheCachePoolTest.java
@@ -31,7 +31,7 @@ import org.apache.polygene.test.cache.AbstractCachePoolTest;
 /**
  * Memcache CachePool Test.
  */
-@Docker( image = "memcached",
+@Docker( image = "memcached:1.4.39-alpine",
          ports = @Port( exposed = 11211, inner = 11211 ),
          newForEachCase = false )
 public class MemcacheCachePoolTest

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/2a643f50/extensions/entitystore-cassandra/src/test/java/org/apache/polygene/entitystore/cassandra/CassandraEntityStoreTest.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-cassandra/src/test/java/org/apache/polygene/entitystore/cassandra/CassandraEntityStoreTest.java b/extensions/entitystore-cassandra/src/test/java/org/apache/polygene/entitystore/cassandra/CassandraEntityStoreTest.java
index 5785859..0c7ac72 100644
--- a/extensions/entitystore-cassandra/src/test/java/org/apache/polygene/entitystore/cassandra/CassandraEntityStoreTest.java
+++ b/extensions/entitystore-cassandra/src/test/java/org/apache/polygene/entitystore/cassandra/CassandraEntityStoreTest.java
@@ -35,7 +35,7 @@ import org.junit.jupiter.api.BeforeEach;
 /**
  * Test the CassandraEntityStoreService.
  */
-@Docker( image = "cassandra",
+@Docker( image = "cassandra:3.10",
          ports = @Port( exposed = 8801, inner = 9042),
          waitFor = @WaitFor( value = "Starting listening for CQL clients", timeoutInMillis = 60000),
          newForEachCase = false)

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/2a643f50/extensions/entitystore-cassandra/src/test/java/org/apache/polygene/entitystore/cassandra/CassandraEntityStoreTestSuite.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-cassandra/src/test/java/org/apache/polygene/entitystore/cassandra/CassandraEntityStoreTestSuite.java b/extensions/entitystore-cassandra/src/test/java/org/apache/polygene/entitystore/cassandra/CassandraEntityStoreTestSuite.java
index 2b62bf6..1ca6606 100644
--- a/extensions/entitystore-cassandra/src/test/java/org/apache/polygene/entitystore/cassandra/CassandraEntityStoreTestSuite.java
+++ b/extensions/entitystore-cassandra/src/test/java/org/apache/polygene/entitystore/cassandra/CassandraEntityStoreTestSuite.java
@@ -34,7 +34,7 @@ import org.junit.jupiter.api.AfterEach;
 /**
  * Test the CassandraEntityStoreService.
  */
-@Docker( image = "cassandra",
+@Docker( image = "cassandra:3.10",
          ports = @Port( exposed = 8801, inner = 9042),
          waitFor = @WaitFor( value = "Starting listening for CQL clients", timeoutInMillis = 60000),
          newForEachCase = false

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/2a643f50/extensions/entitystore-jclouds/src/test/java/org/apache/polygene/entitystore/jclouds/JCloudsS3Test.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-jclouds/src/test/java/org/apache/polygene/entitystore/jclouds/JCloudsS3Test.java b/extensions/entitystore-jclouds/src/test/java/org/apache/polygene/entitystore/jclouds/JCloudsS3Test.java
index 4a2dd6c..2d974f3 100644
--- a/extensions/entitystore-jclouds/src/test/java/org/apache/polygene/entitystore/jclouds/JCloudsS3Test.java
+++ b/extensions/entitystore-jclouds/src/test/java/org/apache/polygene/entitystore/jclouds/JCloudsS3Test.java
@@ -29,7 +29,7 @@ import org.apache.polygene.entitystore.jclouds.assembly.JCloudsEntityStoreAssemb
 import org.apache.polygene.test.EntityTestAssembler;
 import org.apache.polygene.test.entity.AbstractEntityStoreTest;
 
-@Docker( image = "scality/s3server",
+@Docker( image = "scality/s3server:mem-bb2a38c0",
          ports = @Port( exposed = 8801, inner = 8000 ),
          waitFor = @WaitFor( value = "server started", timeoutInMillis = 30000 ),
          environments = {

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/2a643f50/extensions/entitystore-jclouds/src/test/java/org/apache/polygene/entitystore/jclouds/JCloudsS3TestSuite.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-jclouds/src/test/java/org/apache/polygene/entitystore/jclouds/JCloudsS3TestSuite.java b/extensions/entitystore-jclouds/src/test/java/org/apache/polygene/entitystore/jclouds/JCloudsS3TestSuite.java
index 8591cde..b79d71e 100644
--- a/extensions/entitystore-jclouds/src/test/java/org/apache/polygene/entitystore/jclouds/JCloudsS3TestSuite.java
+++ b/extensions/entitystore-jclouds/src/test/java/org/apache/polygene/entitystore/jclouds/JCloudsS3TestSuite.java
@@ -28,7 +28,7 @@ import org.apache.polygene.bootstrap.ModuleAssembly;
 import org.apache.polygene.entitystore.jclouds.assembly.JCloudsEntityStoreAssembler;
 import org.apache.polygene.test.entity.model.EntityStoreTestSuite;
 
-@Docker( image = "s3server",
+@Docker( image = "scality/s3server:mem-bb2a38c0",
          ports = @Port( exposed = 8801, inner = 8000 ),
          waitFor = @WaitFor( value = "server started", timeoutInMillis = 30000 ),
          environments = {

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/2a643f50/extensions/entitystore-mongodb/src/test/java/org/apache/polygene/entitystore/mongodb/MongoDBEntityStoreTest.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-mongodb/src/test/java/org/apache/polygene/entitystore/mongodb/MongoDBEntityStoreTest.java b/extensions/entitystore-mongodb/src/test/java/org/apache/polygene/entitystore/mongodb/MongoDBEntityStoreTest.java
index 52de1e4..5a96813 100644
--- a/extensions/entitystore-mongodb/src/test/java/org/apache/polygene/entitystore/mongodb/MongoDBEntityStoreTest.java
+++ b/extensions/entitystore-mongodb/src/test/java/org/apache/polygene/entitystore/mongodb/MongoDBEntityStoreTest.java
@@ -35,7 +35,7 @@ import org.junit.jupiter.api.BeforeEach;
 /**
  * Test the MongoDBEntityStoreService.
  */
-@Docker( image = "mongo",
+@Docker( image = "mongo:3.5.10",
          ports = @Port( exposed = 8801, inner = 27017),
          newForEachCase = false
 )

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/2a643f50/extensions/entitystore-mongodb/src/test/java/org/apache/polygene/entitystore/mongodb/MongoDBEntityStoreTestSuite.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-mongodb/src/test/java/org/apache/polygene/entitystore/mongodb/MongoDBEntityStoreTestSuite.java b/extensions/entitystore-mongodb/src/test/java/org/apache/polygene/entitystore/mongodb/MongoDBEntityStoreTestSuite.java
index efe0547..451de6d 100644
--- a/extensions/entitystore-mongodb/src/test/java/org/apache/polygene/entitystore/mongodb/MongoDBEntityStoreTestSuite.java
+++ b/extensions/entitystore-mongodb/src/test/java/org/apache/polygene/entitystore/mongodb/MongoDBEntityStoreTestSuite.java
@@ -34,7 +34,7 @@ import org.junit.jupiter.api.BeforeEach;
 /**
  * Test the MongoDBEntityStoreService.
  */
-@Docker( image = "mongo",
+@Docker( image = "mongo:3.5.10",
          ports = @Port( exposed = 8801, inner = 27017),
          waitFor = @WaitFor( value = "MongoDB starting", timeoutInMillis = 30000),
          newForEachCase = false

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/2a643f50/extensions/entitystore-mongodb/src/test/java/org/apache/polygene/entitystore/mongodb/MongoDBEntityStoreWithCacheTest.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-mongodb/src/test/java/org/apache/polygene/entitystore/mongodb/MongoDBEntityStoreWithCacheTest.java b/extensions/entitystore-mongodb/src/test/java/org/apache/polygene/entitystore/mongodb/MongoDBEntityStoreWithCacheTest.java
index 81c6a5d..c79cd1a 100644
--- a/extensions/entitystore-mongodb/src/test/java/org/apache/polygene/entitystore/mongodb/MongoDBEntityStoreWithCacheTest.java
+++ b/extensions/entitystore-mongodb/src/test/java/org/apache/polygene/entitystore/mongodb/MongoDBEntityStoreWithCacheTest.java
@@ -34,7 +34,7 @@ import org.junit.jupiter.api.BeforeEach;
 /**
  * Test the MongoDBEntityStoreService usage with a CachePool.
  */
-@Docker( image = "mongo",
+@Docker( image = "mongo:3.5.10",
          ports = @Port( exposed = 8801, inner = 27017),
          newForEachCase = false
 )

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/2a643f50/extensions/entitystore-redis/src/test/java/org/apache/polygene/entitystore/redis/RedisEntityStoreTest.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-redis/src/test/java/org/apache/polygene/entitystore/redis/RedisEntityStoreTest.java b/extensions/entitystore-redis/src/test/java/org/apache/polygene/entitystore/redis/RedisEntityStoreTest.java
index ff4ba1a..35030c2 100644
--- a/extensions/entitystore-redis/src/test/java/org/apache/polygene/entitystore/redis/RedisEntityStoreTest.java
+++ b/extensions/entitystore-redis/src/test/java/org/apache/polygene/entitystore/redis/RedisEntityStoreTest.java
@@ -33,7 +33,7 @@ import org.junit.jupiter.api.BeforeEach;
 import redis.clients.jedis.Jedis;
 import redis.clients.jedis.JedisPool;
 
-@Docker( image = "redis",
+@Docker( image = "redis:4.0.0-alpine",
          ports = @Port( exposed = 8801, inner = 6379),
          newForEachCase = false
 )

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/2a643f50/extensions/entitystore-redis/src/test/java/org/apache/polygene/entitystore/redis/RedisEntityStoreTestSuite.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-redis/src/test/java/org/apache/polygene/entitystore/redis/RedisEntityStoreTestSuite.java b/extensions/entitystore-redis/src/test/java/org/apache/polygene/entitystore/redis/RedisEntityStoreTestSuite.java
index c3da811..0f09abb 100644
--- a/extensions/entitystore-redis/src/test/java/org/apache/polygene/entitystore/redis/RedisEntityStoreTestSuite.java
+++ b/extensions/entitystore-redis/src/test/java/org/apache/polygene/entitystore/redis/RedisEntityStoreTestSuite.java
@@ -32,7 +32,7 @@ import org.junit.jupiter.api.BeforeEach;
 import redis.clients.jedis.Jedis;
 import redis.clients.jedis.JedisPool;
 
-@Docker( image = "redis",
+@Docker( image = "redis:4.0.0-alpine",
          ports = @Port( exposed = 8801, inner = 6379),
          newForEachCase = false
 )

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/2a643f50/extensions/entitystore-redis/src/test/java/org/apache/polygene/entitystore/redis/RedisEntityStoreWithCacheTest.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-redis/src/test/java/org/apache/polygene/entitystore/redis/RedisEntityStoreWithCacheTest.java b/extensions/entitystore-redis/src/test/java/org/apache/polygene/entitystore/redis/RedisEntityStoreWithCacheTest.java
index 3ebc459..8e7ab88 100644
--- a/extensions/entitystore-redis/src/test/java/org/apache/polygene/entitystore/redis/RedisEntityStoreWithCacheTest.java
+++ b/extensions/entitystore-redis/src/test/java/org/apache/polygene/entitystore/redis/RedisEntityStoreWithCacheTest.java
@@ -32,7 +32,7 @@ import org.junit.jupiter.api.BeforeEach;
 import redis.clients.jedis.Jedis;
 import redis.clients.jedis.JedisPool;
 
-@Docker( image = "redis",
+@Docker( image = "redis:4.0.0-alpine",
          ports = @Port( exposed = 8801, inner = 6379),
          newForEachCase = false
 )

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/2a643f50/extensions/entitystore-riak/src/test/java/org/apache/polygene/entitystore/riak/RiakEntityStoreTest.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-riak/src/test/java/org/apache/polygene/entitystore/riak/RiakEntityStoreTest.java b/extensions/entitystore-riak/src/test/java/org/apache/polygene/entitystore/riak/RiakEntityStoreTest.java
index 03d75c8..25e0451 100644
--- a/extensions/entitystore-riak/src/test/java/org/apache/polygene/entitystore/riak/RiakEntityStoreTest.java
+++ b/extensions/entitystore-riak/src/test/java/org/apache/polygene/entitystore/riak/RiakEntityStoreTest.java
@@ -29,7 +29,7 @@ import org.apache.polygene.test.entity.AbstractEntityStoreTest;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
 
-@Docker( image = "riak",
+@Docker( image = "basho/riak-kv:ubuntu-2.2.3",
          ports = @Port( exposed = 8801, inner = 8087),
          waitFor = @WaitFor( value = "riak_auth_mods started on node", timeoutInMillis = 60000),
          newForEachCase = false

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/2a643f50/extensions/entitystore-riak/src/test/java/org/apache/polygene/entitystore/riak/RiakEntityStoreTestSuite.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-riak/src/test/java/org/apache/polygene/entitystore/riak/RiakEntityStoreTestSuite.java b/extensions/entitystore-riak/src/test/java/org/apache/polygene/entitystore/riak/RiakEntityStoreTestSuite.java
index b8330d1..471e964 100644
--- a/extensions/entitystore-riak/src/test/java/org/apache/polygene/entitystore/riak/RiakEntityStoreTestSuite.java
+++ b/extensions/entitystore-riak/src/test/java/org/apache/polygene/entitystore/riak/RiakEntityStoreTestSuite.java
@@ -29,7 +29,7 @@ import org.apache.polygene.test.entity.model.EntityStoreTestSuite;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
 
-@Docker( image = "riak",
+@Docker( image = "basho/riak-kv:ubuntu-2.2.3",
          ports = @Port( exposed = 8801, inner = 8087),
          waitFor = @WaitFor( value = "riak_auth_mods started on node", timeoutInMillis = 60000),
          newForEachCase = false

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/2a643f50/extensions/entitystore-riak/src/test/java/org/apache/polygene/entitystore/riak/RiakEntityStoreWithCacheTest.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-riak/src/test/java/org/apache/polygene/entitystore/riak/RiakEntityStoreWithCacheTest.java b/extensions/entitystore-riak/src/test/java/org/apache/polygene/entitystore/riak/RiakEntityStoreWithCacheTest.java
index 345fce0..f90dc17 100644
--- a/extensions/entitystore-riak/src/test/java/org/apache/polygene/entitystore/riak/RiakEntityStoreWithCacheTest.java
+++ b/extensions/entitystore-riak/src/test/java/org/apache/polygene/entitystore/riak/RiakEntityStoreWithCacheTest.java
@@ -32,7 +32,7 @@ import org.apache.polygene.test.cache.AbstractEntityStoreWithCacheTest;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
 
-@Docker( image = "riak",
+@Docker( image = "basho/riak-kv:ubuntu-2.2.3",
          ports = @Port( exposed = 8801, inner = 8087 ),
          waitFor = @WaitFor( value = "riak_auth_mods started on node", timeoutInMillis = 60000 ),
          newForEachCase = false

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/2a643f50/extensions/entitystore-sql/src/test/java/org/apache/polygene/entitystore/sql/MariaDbEntityStoreTest.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-sql/src/test/java/org/apache/polygene/entitystore/sql/MariaDbEntityStoreTest.java b/extensions/entitystore-sql/src/test/java/org/apache/polygene/entitystore/sql/MariaDbEntityStoreTest.java
index 6a3b125..7562dd6 100644
--- a/extensions/entitystore-sql/src/test/java/org/apache/polygene/entitystore/sql/MariaDbEntityStoreTest.java
+++ b/extensions/entitystore-sql/src/test/java/org/apache/polygene/entitystore/sql/MariaDbEntityStoreTest.java
@@ -37,7 +37,7 @@ import org.jooq.SQLDialect;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeAll;
 
-@Docker( image = "mariadb",
+@Docker( image = "mariadb:10.1.21",
          ports = @Port( exposed = 8801, inner = 3306 ),
          environments = {
              @Environment( key = "MYSQL_ROOT_PASSWORD", value = "" ),

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/2a643f50/extensions/entitystore-sql/src/test/java/org/apache/polygene/entitystore/sql/MariaDbEntityStoreTestSuite.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-sql/src/test/java/org/apache/polygene/entitystore/sql/MariaDbEntityStoreTestSuite.java b/extensions/entitystore-sql/src/test/java/org/apache/polygene/entitystore/sql/MariaDbEntityStoreTestSuite.java
index 44eeafa..865361e 100644
--- a/extensions/entitystore-sql/src/test/java/org/apache/polygene/entitystore/sql/MariaDbEntityStoreTestSuite.java
+++ b/extensions/entitystore-sql/src/test/java/org/apache/polygene/entitystore/sql/MariaDbEntityStoreTestSuite.java
@@ -35,7 +35,7 @@ import org.jooq.SQLDialect;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeAll;
 
-@Docker( image = "mariadb",
+@Docker( image = "mariadb:10.1.21",
          ports = @Port( exposed = 8801, inner = 3306 ),
          environments = {
              @Environment( key = "MYSQL_ROOT_PASSWORD", value = "" ),

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/2a643f50/extensions/entitystore-sql/src/test/java/org/apache/polygene/entitystore/sql/MySQLEntityStoreTest.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-sql/src/test/java/org/apache/polygene/entitystore/sql/MySQLEntityStoreTest.java b/extensions/entitystore-sql/src/test/java/org/apache/polygene/entitystore/sql/MySQLEntityStoreTest.java
index 5c1bc31..0baf331 100644
--- a/extensions/entitystore-sql/src/test/java/org/apache/polygene/entitystore/sql/MySQLEntityStoreTest.java
+++ b/extensions/entitystore-sql/src/test/java/org/apache/polygene/entitystore/sql/MySQLEntityStoreTest.java
@@ -37,7 +37,8 @@ import org.jooq.SQLDialect;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeAll;
 
-@Docker( image = "mysql", ports = @Port( exposed = 8801, inner = 3306 ),
+@Docker( image = "mysql:8.0.11",
+         ports = @Port( exposed = 8801, inner = 3306 ),
          environments = {
              @Environment( key = "MYSQL_ROOT_PASSWORD", value = "" ),
              @Environment( key = "MYSQL_ALLOW_EMPTY_PASSWORD", value = "yes" ),

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/2a643f50/extensions/entitystore-sql/src/test/java/org/apache/polygene/entitystore/sql/MySQLEntityStoreTestSuite.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-sql/src/test/java/org/apache/polygene/entitystore/sql/MySQLEntityStoreTestSuite.java b/extensions/entitystore-sql/src/test/java/org/apache/polygene/entitystore/sql/MySQLEntityStoreTestSuite.java
index 3426126..a2edb33 100644
--- a/extensions/entitystore-sql/src/test/java/org/apache/polygene/entitystore/sql/MySQLEntityStoreTestSuite.java
+++ b/extensions/entitystore-sql/src/test/java/org/apache/polygene/entitystore/sql/MySQLEntityStoreTestSuite.java
@@ -35,7 +35,8 @@ import org.jooq.SQLDialect;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeAll;
 
-@Docker( image = "mysql", ports = @Port( exposed = 8801, inner = 3306 ),
+@Docker( image = "mysql:8.0.11",
+         ports = @Port( exposed = 8801, inner = 3306 ),
          environments = {
              @Environment( key = "MYSQL_ROOT_PASSWORD", value = "" ),
              @Environment( key = "MYSQL_ALLOW_EMPTY_PASSWORD", value = "yes" ),

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/2a643f50/extensions/entitystore-sqlkv/src/test/java/org/apache/polygene/entitystore/sqlkv/MariaDbEntityStoreTest.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-sqlkv/src/test/java/org/apache/polygene/entitystore/sqlkv/MariaDbEntityStoreTest.java b/extensions/entitystore-sqlkv/src/test/java/org/apache/polygene/entitystore/sqlkv/MariaDbEntityStoreTest.java
index 66cdc52..e88305e 100644
--- a/extensions/entitystore-sqlkv/src/test/java/org/apache/polygene/entitystore/sqlkv/MariaDbEntityStoreTest.java
+++ b/extensions/entitystore-sqlkv/src/test/java/org/apache/polygene/entitystore/sqlkv/MariaDbEntityStoreTest.java
@@ -36,7 +36,7 @@ import org.jooq.SQLDialect;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.Disabled;
 
-@Docker( image = "mariadb",
+@Docker( image = "mariadb:10.1.21",
          ports = @Port( exposed = 8801, inner = 3306),
          environments = {
              @Environment( key = "MYSQL_ROOT_PASSWORD", value = ""),

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/2a643f50/extensions/entitystore-sqlkv/src/test/java/org/apache/polygene/entitystore/sqlkv/MariaDbEntityStoreTestSuite.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-sqlkv/src/test/java/org/apache/polygene/entitystore/sqlkv/MariaDbEntityStoreTestSuite.java b/extensions/entitystore-sqlkv/src/test/java/org/apache/polygene/entitystore/sqlkv/MariaDbEntityStoreTestSuite.java
index 128a6e0..f7e814c 100644
--- a/extensions/entitystore-sqlkv/src/test/java/org/apache/polygene/entitystore/sqlkv/MariaDbEntityStoreTestSuite.java
+++ b/extensions/entitystore-sqlkv/src/test/java/org/apache/polygene/entitystore/sqlkv/MariaDbEntityStoreTestSuite.java
@@ -34,7 +34,7 @@ import org.jooq.SQLDialect;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.Disabled;
 
-@Docker( image = "org.apache.polygene:org.apache.polygene.internal.docker-mariadb",
+@Docker( image = "mariadb:10.1.21",
          ports = @Port( exposed = 8801, inner = 3306),
          environments = {
              @Environment( key = "MYSQL_ROOT_PASSWORD", value = ""),

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/2a643f50/extensions/entitystore-sqlkv/src/test/java/org/apache/polygene/entitystore/sqlkv/MySQLEntityStoreTest.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-sqlkv/src/test/java/org/apache/polygene/entitystore/sqlkv/MySQLEntityStoreTest.java b/extensions/entitystore-sqlkv/src/test/java/org/apache/polygene/entitystore/sqlkv/MySQLEntityStoreTest.java
index dac8486..5df3ef0 100644
--- a/extensions/entitystore-sqlkv/src/test/java/org/apache/polygene/entitystore/sqlkv/MySQLEntityStoreTest.java
+++ b/extensions/entitystore-sqlkv/src/test/java/org/apache/polygene/entitystore/sqlkv/MySQLEntityStoreTest.java
@@ -36,7 +36,8 @@ import org.jooq.SQLDialect;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.Disabled;
 
-@Docker( image = "mysql", ports = @Port( exposed = 8801, inner = 3306),
+@Docker( image = "mysql:8.0.11",
+         ports = @Port( exposed = 8801, inner = 3306),
          environments = {
              @Environment( key = "MYSQL_ROOT_PASSWORD", value = ""),
              @Environment(key = "MYSQL_ALLOW_EMPTY_PASSWORD", value = "yes"),

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/2a643f50/extensions/entitystore-sqlkv/src/test/java/org/apache/polygene/entitystore/sqlkv/MySQLEntityStoreTestSuite.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-sqlkv/src/test/java/org/apache/polygene/entitystore/sqlkv/MySQLEntityStoreTestSuite.java b/extensions/entitystore-sqlkv/src/test/java/org/apache/polygene/entitystore/sqlkv/MySQLEntityStoreTestSuite.java
index 60efc37..8a99ab9 100644
--- a/extensions/entitystore-sqlkv/src/test/java/org/apache/polygene/entitystore/sqlkv/MySQLEntityStoreTestSuite.java
+++ b/extensions/entitystore-sqlkv/src/test/java/org/apache/polygene/entitystore/sqlkv/MySQLEntityStoreTestSuite.java
@@ -34,7 +34,8 @@ import org.jooq.SQLDialect;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.Disabled;
 
-@Docker( image = "mysql", ports = @Port( exposed = 8801, inner = 3306),
+@Docker( image = "mysql:8.0.11",
+         ports = @Port( exposed = 8801, inner = 3306),
          environments = {
              @Environment( key = "MYSQL_ROOT_PASSWORD", value = ""),
              @Environment(key = "MYSQL_ALLOW_EMPTY_PASSWORD", value = "yes"),

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/2a643f50/extensions/entitystore-zookeeper/src/test/java/org/apache/polygene/entitystore/zookeeper/ZookeeperEntityStoreTest.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-zookeeper/src/test/java/org/apache/polygene/entitystore/zookeeper/ZookeeperEntityStoreTest.java b/extensions/entitystore-zookeeper/src/test/java/org/apache/polygene/entitystore/zookeeper/ZookeeperEntityStoreTest.java
index 8ffc5e9..8c5fd78 100644
--- a/extensions/entitystore-zookeeper/src/test/java/org/apache/polygene/entitystore/zookeeper/ZookeeperEntityStoreTest.java
+++ b/extensions/entitystore-zookeeper/src/test/java/org/apache/polygene/entitystore/zookeeper/ZookeeperEntityStoreTest.java
@@ -35,7 +35,7 @@ import static java.lang.Thread.sleep;
 import static java.util.Collections.singletonList;
 
 
-@Docker( image = "zookeeper",
+@Docker( image = "zookeeper:3.4.11",
          ports = @Port( exposed = 32181, inner = 2181),
          newForEachCase = false
 )

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/2a643f50/extensions/entitystore-zookeeper/src/test/java/org/apache/polygene/entitystore/zookeeper/ZookeeperEntityStoreTestSuite.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-zookeeper/src/test/java/org/apache/polygene/entitystore/zookeeper/ZookeeperEntityStoreTestSuite.java b/extensions/entitystore-zookeeper/src/test/java/org/apache/polygene/entitystore/zookeeper/ZookeeperEntityStoreTestSuite.java
index 44b93d9..94c1f55 100644
--- a/extensions/entitystore-zookeeper/src/test/java/org/apache/polygene/entitystore/zookeeper/ZookeeperEntityStoreTestSuite.java
+++ b/extensions/entitystore-zookeeper/src/test/java/org/apache/polygene/entitystore/zookeeper/ZookeeperEntityStoreTestSuite.java
@@ -32,7 +32,7 @@ import org.junit.jupiter.api.extension.ExtendWith;
 import static java.util.Collections.singletonList;
 import static org.apache.polygene.entitystore.zookeeper.ZookeeperEntityStoreTest.TEST_ZNODE_NAME;
 
-@Docker( image = "zookeeper",
+@Docker( image = "zookeeper:3.4.11",
          ports = @Port( exposed = 32181, inner = 2181),
          newForEachCase = false
 )

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/2a643f50/extensions/entitystore-zookeeper/src/test/java/org/apache/polygene/entitystore/zookeeper/ZookeeperEntityStoreWithCacheTest.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-zookeeper/src/test/java/org/apache/polygene/entitystore/zookeeper/ZookeeperEntityStoreWithCacheTest.java b/extensions/entitystore-zookeeper/src/test/java/org/apache/polygene/entitystore/zookeeper/ZookeeperEntityStoreWithCacheTest.java
index d376187..3e027bc 100644
--- a/extensions/entitystore-zookeeper/src/test/java/org/apache/polygene/entitystore/zookeeper/ZookeeperEntityStoreWithCacheTest.java
+++ b/extensions/entitystore-zookeeper/src/test/java/org/apache/polygene/entitystore/zookeeper/ZookeeperEntityStoreWithCacheTest.java
@@ -34,7 +34,7 @@ import org.junit.jupiter.api.extension.ExtendWith;
 import static java.util.Collections.singletonList;
 import static org.apache.polygene.entitystore.zookeeper.ZookeeperEntityStoreTest.TEST_ZNODE_NAME;
 
-@Docker( image = "zookeeper",
+@Docker( image = "zookeeper:3.4.11",
          ports = @Port( exposed = 32181, inner = 2181),
          newForEachCase = false
 )


[13/13] polygene-java git commit: There is a limit on the VARCHAR size of about 800 characters, and I am uncertain how these are counted as we have UTF-8 encoding. 200 characters should be enough for identities.

Posted by ni...@apache.org.
There is a limit on the VARCHAR size of about 800 characters, and I am uncertain how these are counted as we have UTF-8 encoding. 200 characters should be enough for identities.


Project: http://git-wip-us.apache.org/repos/asf/polygene-java/repo
Commit: http://git-wip-us.apache.org/repos/asf/polygene-java/commit/42bc67f2
Tree: http://git-wip-us.apache.org/repos/asf/polygene-java/tree/42bc67f2
Diff: http://git-wip-us.apache.org/repos/asf/polygene-java/diff/42bc67f2

Branch: refs/heads/develop
Commit: 42bc67f2c2f3dce4a46cc00b098192857dcebe21
Parents: adc7bef
Author: niclas <ni...@hedhman.org>
Authored: Thu May 3 08:34:46 2018 +0800
Committer: niclas <ni...@hedhman.org>
Committed: Thu May 3 08:34:46 2018 +0800

----------------------------------------------------------------------
 .../src/main/java/org/apache/polygene/entitystore/sql/SqlType.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/polygene-java/blob/42bc67f2/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/SqlType.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/SqlType.java b/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/SqlType.java
index d072afd..6113a02 100644
--- a/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/SqlType.java
+++ b/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/SqlType.java
@@ -181,7 +181,7 @@ class SqlType
         {
             if( reference )
             {
-                return SQLDataType.VARCHAR.length(1000).nullable(false);
+                return SQLDataType.VARCHAR.length(200).nullable(false);
             }
             else
             {


[12/13] polygene-java git commit: Removing InstancePool and remaining implementations, as they are not used.

Posted by ni...@apache.org.
Removing InstancePool and remaining implementations, as they are not used.


Project: http://git-wip-us.apache.org/repos/asf/polygene-java/repo
Commit: http://git-wip-us.apache.org/repos/asf/polygene-java/commit/adc7befc
Tree: http://git-wip-us.apache.org/repos/asf/polygene-java/tree/adc7befc
Diff: http://git-wip-us.apache.org/repos/asf/polygene-java/diff/adc7befc

Branch: refs/heads/develop
Commit: adc7befce9f5b8e79d4b707811c27e8a9784e9c9
Parents: 393cf21
Author: niclas <ni...@hedhman.org>
Authored: Thu May 3 08:32:33 2018 +0800
Committer: niclas <ni...@hedhman.org>
Committed: Thu May 3 08:32:33 2018 +0800

----------------------------------------------------------------------
 .../runtime/composite/CompositeMethodModel.java |  2 -
 .../runtime/composite/InstancePool.java         | 30 ------------
 ...SynchronizedCompositeMethodInstancePool.java | 50 --------------------
 ...synchronizedCompositeMethodInstancePool.java | 50 --------------------
 4 files changed, 132 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/polygene-java/blob/adc7befc/core/runtime/src/main/java/org/apache/polygene/runtime/composite/CompositeMethodModel.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/polygene/runtime/composite/CompositeMethodModel.java b/core/runtime/src/main/java/org/apache/polygene/runtime/composite/CompositeMethodModel.java
index 1ed4cdd..3981ae6 100644
--- a/core/runtime/src/main/java/org/apache/polygene/runtime/composite/CompositeMethodModel.java
+++ b/core/runtime/src/main/java/org/apache/polygene/runtime/composite/CompositeMethodModel.java
@@ -56,7 +56,6 @@ public final class CompositeMethodModel
     private final AnnotatedElement annotations;
 
     // Context
-//    private final SynchronizedCompositeMethodInstancePool instancePool = new SynchronizedCompositeMethodInstancePool();
     private final ConcurrentLinkedQueue<CompositeMethodInstance> instancePool = new ConcurrentLinkedQueue<>();
     private final ConstraintsInstance constraintsInstance;
 
@@ -74,7 +73,6 @@ public final class CompositeMethodModel
         constraints = constraintsModel;
         constraintsInstance = constraints.newInstance();
         annotations = new CompositeMethodAnnotatedElement();
-//        instancePool = new SynchronizedCompositeMethodInstancePool();
     }
 
     // Model

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/adc7befc/core/runtime/src/main/java/org/apache/polygene/runtime/composite/InstancePool.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/polygene/runtime/composite/InstancePool.java b/core/runtime/src/main/java/org/apache/polygene/runtime/composite/InstancePool.java
deleted file mode 100644
index 0c6f1f0..0000000
--- a/core/runtime/src/main/java/org/apache/polygene/runtime/composite/InstancePool.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- *  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.
- *
- *
- */
-package org.apache.polygene.runtime.composite;
-
-/**
- * JAVADOC
- */
-public interface InstancePool<T>
-{
-    T obtainInstance();
-
-    void releaseInstance( T instance );
-}

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/adc7befc/core/runtime/src/main/java/org/apache/polygene/runtime/composite/SynchronizedCompositeMethodInstancePool.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/polygene/runtime/composite/SynchronizedCompositeMethodInstancePool.java b/core/runtime/src/main/java/org/apache/polygene/runtime/composite/SynchronizedCompositeMethodInstancePool.java
deleted file mode 100644
index 01025cf..0000000
--- a/core/runtime/src/main/java/org/apache/polygene/runtime/composite/SynchronizedCompositeMethodInstancePool.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- *  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.
- *
- *
- */
-
-package org.apache.polygene.runtime.composite;
-
-/**
- * Method instance pool that keeps a linked list. Uses synchronization
- * to ensure that instances are acquired and returned in a thread-safe
- * manner.
- */
-public final class SynchronizedCompositeMethodInstancePool
-    implements InstancePool<CompositeMethodInstance>
-{
-    private CompositeMethodInstance first = null;
-
-    @Override
-    public synchronized CompositeMethodInstance obtainInstance()
-    {
-        CompositeMethodInstance instance = first;
-        if( instance != null )
-        {
-            first = instance.getNext();
-        }
-        return instance;
-    }
-
-    @Override
-    public synchronized void releaseInstance( CompositeMethodInstance instance )
-    {
-        instance.setNext( first );
-        first = instance;
-    }
-}

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/adc7befc/core/runtime/src/main/java/org/apache/polygene/runtime/composite/UnsynchronizedCompositeMethodInstancePool.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/polygene/runtime/composite/UnsynchronizedCompositeMethodInstancePool.java b/core/runtime/src/main/java/org/apache/polygene/runtime/composite/UnsynchronizedCompositeMethodInstancePool.java
deleted file mode 100644
index 56bfce5..0000000
--- a/core/runtime/src/main/java/org/apache/polygene/runtime/composite/UnsynchronizedCompositeMethodInstancePool.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- *  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.
- *
- *
- */
-
-package org.apache.polygene.runtime.composite;
-
-/**
- * Method instance pool that keeps a linked list. Uses synchronization
- * to ensure that instances are acquired and returned in a thread-safe
- * manner.
- */
-public final class UnsynchronizedCompositeMethodInstancePool
-    implements InstancePool<CompositeMethodInstance>
-{
-    private CompositeMethodInstance first = null;
-
-    @Override
-    public CompositeMethodInstance obtainInstance()
-    {
-        CompositeMethodInstance instance = first;
-        if( instance != null )
-        {
-            first = instance.getNext();
-        }
-        return instance;
-    }
-
-    @Override
-    public void releaseInstance( CompositeMethodInstance instance )
-    {
-        instance.setNext( first );
-        first = instance;
-    }
-}
\ No newline at end of file


[04/13] polygene-java git commit: POLYGENE-304 : Added library-execution with 3 initial features.

Posted by ni...@apache.org.
POLYGENE-304 : Added library-execution with 3 initial features.


Project: http://git-wip-us.apache.org/repos/asf/polygene-java/repo
Commit: http://git-wip-us.apache.org/repos/asf/polygene-java/commit/db99803f
Tree: http://git-wip-us.apache.org/repos/asf/polygene-java/tree/db99803f
Diff: http://git-wip-us.apache.org/repos/asf/polygene-java/diff/db99803f

Branch: refs/heads/develop
Commit: db99803fe4a4dd698c4e5694345c1672561483a2
Parents: dcea137
Author: niclas <ni...@hedhman.org>
Authored: Thu Apr 26 12:57:59 2018 +0800
Committer: niclas <ni...@hedhman.org>
Committed: Thu Apr 26 12:57:59 2018 +0800

----------------------------------------------------------------------
 .../apache/polygene/api/concern/ConcernOf.java  |   4 +-
 libraries/execution/build.gradle                |  37 +++
 libraries/execution/dev-status.xml              |  38 +++
 libraries/execution/src/docs/execution.txt      |  68 ++++++
 .../polygene/library/execution/Retry.java       |  66 +++++
 .../library/execution/RetryConcern.java         |  78 ++++++
 .../assembly/ExecutionServiceAssembler.java     | 242 +++++++++++++++++++
 .../ScheduledExecutionServiceAssembler.java     | 140 +++++++++++
 .../library/execution/ExecutionServiceTest.java |  51 ++++
 .../polygene/library/execution/RetryTest.java   | 184 ++++++++++++++
 .../ScheduledExecutionServiceTest.java          |  46 ++++
 manual/src/docs/userguide/libraries.txt         |   4 +
 settings.gradle                                 |   1 +
 13 files changed, 957 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/polygene-java/blob/db99803f/core/api/src/main/java/org/apache/polygene/api/concern/ConcernOf.java
----------------------------------------------------------------------
diff --git a/core/api/src/main/java/org/apache/polygene/api/concern/ConcernOf.java b/core/api/src/main/java/org/apache/polygene/api/concern/ConcernOf.java
index e872308..01c90f7 100644
--- a/core/api/src/main/java/org/apache/polygene/api/concern/ConcernOf.java
+++ b/core/api/src/main/java/org/apache/polygene/api/concern/ConcernOf.java
@@ -40,7 +40,7 @@ public abstract class ConcernOf<T>
      * the next concern in the chain or the mixin
      * to be invoked.
      */
-    final
+    @SuppressWarnings( "ConstantConditions" )
     @ConcernFor
-    protected T next = null;
+    protected final T next = null;
 }

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/db99803f/libraries/execution/build.gradle
----------------------------------------------------------------------
diff --git a/libraries/execution/build.gradle b/libraries/execution/build.gradle
new file mode 100644
index 0000000..6863209
--- /dev/null
+++ b/libraries/execution/build.gradle
@@ -0,0 +1,37 @@
+/*
+ *  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.
+ *
+ *
+ */
+
+apply plugin: 'polygene-library'
+
+description = "Apache Polygene™ Execution Library provides common set of execution primitives and services."
+
+jar { manifest { name = "Apache Polygene™ Library - Constraints"}}
+
+dependencies {
+  api polygene.core.bootstrap
+
+  api libraries.commons_validator
+
+  runtimeOnly polygene.core.runtime
+
+  testImplementation polygene.core.testsupport
+
+  testRuntimeOnly libraries.logback
+}

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/db99803f/libraries/execution/dev-status.xml
----------------------------------------------------------------------
diff --git a/libraries/execution/dev-status.xml b/libraries/execution/dev-status.xml
new file mode 100644
index 0000000..8a476df
--- /dev/null
+++ b/libraries/execution/dev-status.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!--
+  ~  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.
+  ~
+  ~
+  -->
+<module xmlns="http://polygene.apache.org/schemas/2008/dev-status/1"
+        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:schemaLocation="http://polygene.apache.org/schemas/2008/dev-status/1
+        http://polygene.apache.org/schemas/2008/dev-status/1/dev-status.xsd">
+  <status>
+    <!--none,early,beta,stable,mature-->
+    <codebase>beta</codebase>
+
+    <!-- none, brief, good, complete -->
+    <documentation>good</documentation>
+
+    <!-- none, some, good, complete -->
+    <unittests>some</unittests>
+  </status>
+  <licenses>
+    <license>ALv2</license>
+  </licenses>
+</module>

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/db99803f/libraries/execution/src/docs/execution.txt
----------------------------------------------------------------------
diff --git a/libraries/execution/src/docs/execution.txt b/libraries/execution/src/docs/execution.txt
new file mode 100644
index 0000000..998c11d
--- /dev/null
+++ b/libraries/execution/src/docs/execution.txt
@@ -0,0 +1,68 @@
+///////////////////////////////////////////////////////////////
+ * 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.
+///////////////////////////////////////////////////////////////
+
+[[library-execution,Execution Library]]
+= Execution =
+
+== @Retry ==
+Any method can be annotated with the @Retry annotation, which means that if there is an exception thrown, then
+the method should be called again, for a max number of times.
+
+The value() defines how many times the method will be called, if retry is triggered by the on() and unless()
+parameters.
+
+The backoff() parameter is available to slow down the retries, which is useful for network operations or
+external systems that may still need more time to become available. The default is no backoff is deployed and retries
+are executed as fast as possible.
+
+The on() parameter defines which Throwable and subclasses should be considered for retrying the method call. The
+default is all Throwables.
+
+The unless() parameter negates the on() parameter, and if a subclass of any Throwable listed in unless() is thrown
+then the retry operation(s) will not take effect.
+
+== ExecutionService ==
+The =ExecutionService= is the =java.util.concurrent.ExecutorService= provided simply as a flexible assembler for
+configuration of it.
+
+=== Configuration Parameters ===
+The Configuration parameters are available in the =ExecutionServiceAssembler= via a fluent API (DSL), with the
+following methods
+
+[snippet,java]
+----
+source=libraries/execution/src/main/java/org/apache/polygene/library/execution/assembly/ExecutionServiceAssembler.java
+tag=configuration
+----
+
+
+== ScheduledExecutionService ==
+The =ScheduledExecutionService= is the =java.util.concurrent.ScheduledExecutorService= provided simply as a flexible
+assembler for configuration of it.
+
+
+=== Configuration Parameters ===
+The Configuration parameters are available in the =ScheduledExecutionService= via a fluent API (DSL), with the
+following methods
+
+[snippet,java]
+----
+source=libraries/execution/src/main/java/org/apache/polygene/library/execution/assembly/ScheduledExecutionService.java
+tag=configuration
+----

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/db99803f/libraries/execution/src/main/java/org/apache/polygene/library/execution/Retry.java
----------------------------------------------------------------------
diff --git a/libraries/execution/src/main/java/org/apache/polygene/library/execution/Retry.java b/libraries/execution/src/main/java/org/apache/polygene/library/execution/Retry.java
new file mode 100644
index 0000000..d283273
--- /dev/null
+++ b/libraries/execution/src/main/java/org/apache/polygene/library/execution/Retry.java
@@ -0,0 +1,66 @@
+package org.apache.polygene.library.execution;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.Inherited;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+/**
+ * &#64;Retry is a method annotation to automatically call the method again if an exception was thrown.
+ * <p>
+ * By default, the method will be called twice if any {@link java.lang.Throwable} is thrown. By setting
+ * the value, one can increase that number, and the {@link #on()} and {@link #unless()} parameters can
+ * be used to select which Throwable (incl its subtypes) the retry will happen on.
+ * </p>
+ * <p>
+ *     This can only be applied to idempotent methods, and keeping in mind the ordering of Concerns may
+ *     be very significant. E.g. If the {@link RetryConcern} is "around" the
+ *     {@link org.apache.polygene.api.unitofwork.concern.UnitOfWorkConcern} then depending on the parameters on
+ *     the {@link org.apache.polygene.api.unitofwork.concern.UnitOfWorkPropagation} will determine if the
+ *     method is still idempotent or not, in particular
+ *     {@link org.apache.polygene.api.unitofwork.concern.UnitOfWorkPropagation.Propagation#REQUIRES_NEW}. Furthermore,
+ *     {@link org.apache.polygene.api.unitofwork.concern.UnitOfWorkPropagation} has its own Retry mechanism independent
+ *     of this one.
+ * </p>
+ */
+@Retention( RUNTIME )
+@Target( METHOD )
+@Inherited
+@Documented
+public @interface Retry
+{
+    /**
+     * Number of times that the method should be called.
+     * <p>
+     *     This number must be 1 or greater, otherwise an {@link IllegalArgumentException} is thrown.
+     * </p>
+     */
+    int value() default 2;
+
+    /**
+     * List of Throwables that should trigger the Retry operation.
+     * <p>
+     * Default: All Throwables.
+     * </p>
+     */
+    Class<? extends Throwable>[] on() default { Throwable.class };
+
+    /**
+     * List of Throwables that should NOT trigger the Retry operation, even if they are subclasses found in the on() value
+     * <p>
+     * Default: none.
+     * </p>
+     */
+    Class<? extends Throwable>[] unless() default {};
+
+    /**
+     * Slowing down of retries.
+     * <p>
+     *     If the backoff is greater than 0 (default), there will be a successive backoff of retrying the call,
+     *     and starting with backoff() milliseconds, the sleep time between tries will double for each try.
+     */
+    int backoff() default 0;
+}

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/db99803f/libraries/execution/src/main/java/org/apache/polygene/library/execution/RetryConcern.java
----------------------------------------------------------------------
diff --git a/libraries/execution/src/main/java/org/apache/polygene/library/execution/RetryConcern.java b/libraries/execution/src/main/java/org/apache/polygene/library/execution/RetryConcern.java
new file mode 100644
index 0000000..0d995ae
--- /dev/null
+++ b/libraries/execution/src/main/java/org/apache/polygene/library/execution/RetryConcern.java
@@ -0,0 +1,78 @@
+package org.apache.polygene.library.execution;
+
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.stream.Collectors;
+import org.apache.polygene.api.common.AppliesTo;
+import org.apache.polygene.api.concern.ConcernOf;
+import org.apache.polygene.api.injection.scope.Invocation;
+
+import static org.apache.polygene.api.util.Classes.classHierarchy;
+
+@AppliesTo( Retry.class )
+public class RetryConcern extends ConcernOf<InvocationHandler>
+    implements InvocationHandler
+{
+    private final int retries;
+    private final HashSet<Class<? extends Throwable>> on;
+    private final HashSet<Object> unless;
+    private final int backoff;
+
+    @SuppressWarnings( "unchecked" )
+    public RetryConcern( @Invocation Retry annotation )
+    {
+        this.retries = annotation.value();
+        if( retries < 1 )
+        {
+            throw new IllegalArgumentException( "@Retry must have a positive value greater than zero." );
+        }
+        this.on = new HashSet<>();
+        List<Class<? extends Throwable>> on = Arrays.asList( annotation.on() );
+        this.on.addAll( on );
+
+        this.unless = new HashSet<>();
+        List<Class<? extends Throwable>> unless = Arrays.asList( annotation.unless() );
+        this.unless.addAll( unless );
+        this.backoff = annotation.backoff();
+    }
+
+    @Override
+    @SuppressWarnings( { "SuspiciousMethodCalls", "ConstantConditions" } )
+    public Object invoke( Object o, Method method, Object[] objects )
+        throws Throwable
+    {
+        int count = retries;
+        long sleep = backoff;
+        while( true )
+        {
+            try
+            {
+                return next.invoke( o, method, objects );
+            }
+            catch( Throwable e )
+            {
+                --count;
+                List<Class<?>> types = classHierarchy( e.getClass() ).collect( Collectors.toList() );
+                for( Class<?> type : types )
+                {
+                    if( this.unless.contains( type ) )
+                    {
+                        throw e;
+                    }
+                    if( count == 0 && this.on.contains( type ))
+                    {
+                        throw e;
+                    }
+                }
+                if( sleep > 0 )
+                {
+                    Thread.sleep( sleep );
+                    sleep = sleep * 2;
+                }
+            }
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/db99803f/libraries/execution/src/main/java/org/apache/polygene/library/execution/assembly/ExecutionServiceAssembler.java
----------------------------------------------------------------------
diff --git a/libraries/execution/src/main/java/org/apache/polygene/library/execution/assembly/ExecutionServiceAssembler.java b/libraries/execution/src/main/java/org/apache/polygene/library/execution/assembly/ExecutionServiceAssembler.java
new file mode 100644
index 0000000..22832ff
--- /dev/null
+++ b/libraries/execution/src/main/java/org/apache/polygene/library/execution/assembly/ExecutionServiceAssembler.java
@@ -0,0 +1,242 @@
+package org.apache.polygene.library.execution.assembly;
+
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.RejectedExecutionHandler;
+import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+import org.apache.polygene.api.service.ImportedServiceDescriptor;
+import org.apache.polygene.api.service.ServiceImporter;
+import org.apache.polygene.api.service.ServiceImporterException;
+import org.apache.polygene.bootstrap.Assembler;
+import org.apache.polygene.bootstrap.Assemblers;
+import org.apache.polygene.bootstrap.AssemblyException;
+import org.apache.polygene.bootstrap.ModuleAssembly;
+
+public class ExecutionServiceAssembler extends Assemblers.VisibilityIdentityConfig<ExecutionServiceAssembler>
+    implements Assembler
+{
+
+    private ThreadFactory factory;
+    private RejectedExecutionHandler rejectedExecutionHandler;
+    private int coreThreads = 3;
+    private int maxThreads = 10;
+    private int maxTasks = 1000;
+    private long time = 1000;
+    private TimeUnit unit = TimeUnit.MILLISECONDS;
+    private ThreadGroup group;
+    private BlockingQueue<Runnable> queue;
+
+    @Override
+    public void assemble( ModuleAssembly module )
+        throws AssemblyException
+    {
+        module.importedServices( ExecutorService.class )
+              .importedBy( ThreadPoolExecutorImporter.class )
+              .setMetaInfo( this )
+        ;
+    }
+
+    /**
+     * Number of core threads, i.e. threads that are not removed if idle, to be used.
+     *
+     * @param threads core threads to use
+     * @return Fluent API
+     */
+    // START SNIPPET: configuration
+    // Number of core threads, i.e. threads that are not removed if idle, to be used.
+    public ExecutionServiceAssembler withCoreThreads( int threads )
+    // END SNIPPET: configuration
+    {
+        this.coreThreads = threads;
+        return this;
+    }
+
+    /**
+     * Maximum number of threads to be used.
+     *
+     * @param threads max threads to use
+     * @return Fluent API
+     */
+    // START SNIPPET: configuration
+    // Maximum number of threads to be used.
+    public ExecutionServiceAssembler withMaxThreads( int threads )
+    // END SNIPPET: configuration
+    {
+        this.maxThreads = threads;
+        return this;
+    }
+
+    /**
+     * Provide a custom ThreadFactory.
+     * <p>
+     * If defined, the {@link #inThreadGroup(ThreadGroup)} parameter will be ignored.
+     * </p>
+     *
+     * @param factory The thread factory to use, when creating threads.
+     * @return Fluent API
+     */
+    // START SNIPPET: configuration
+    // Provide a custom ThreadFactory. If defined, the inThreadGroup parameter will be ignored.
+    public ExecutionServiceAssembler withThreadFactory( ThreadFactory factory )
+    // END SNIPPET: configuration
+    {
+        this.factory = factory;
+        return this;
+    }
+
+    /**
+     * Provide a custom {@link RejectedExecutionHandler}, or one of the pre-defined policies
+     *
+     * @param handler the custom {@link RejectedExecutionHandler} to use.
+     * @return Fluent API
+     */
+    // START SNIPPET: configuration
+    // Provide a custom RejectedExecutionHandler, or one of the pre-defined policies
+    public ExecutionServiceAssembler withRejectedExecutionHandler( RejectedExecutionHandler handler )
+    // END SNIPPET: configuration
+    {
+        this.rejectedExecutionHandler = handler;
+        return this;
+    }
+
+    /**
+     * Max number of entries in queue.
+     * <p>
+     * Blocking occurs if more submissions are given.
+     * </p>
+     * <p>
+     * If a custom queue is defined, then this parameter will be ignored.
+     * </p>
+     *
+     * @param maxTasks Max number of tasks that can be added to the queue before blocking occurs.
+     * @return Fluent API
+     * @see LinkedBlockingQueue which is backing the {@link ThreadPoolExecutor} if a custom one is not provided.
+     */
+    // START SNIPPET: configuration
+    // Max number of entries in queue. Blocking occurs if more submissions given
+    public ExecutionServiceAssembler withMaxQueueSize( int maxTasks )
+    // END SNIPPET: configuration
+    {
+        this.maxTasks = maxTasks;
+        return this;
+    }
+
+    /**
+     * Provide custom queue.
+     * <p>
+     * If a custom queue is defined, then the {@link #withMaxQueueSize(int)} parameter will be ignored.
+     * </p>
+     *
+     * @param queue The custom queue to use.
+     * @return Fluent API
+     */
+    // START SNIPPET: configuration
+    // Provide custom queue. If used, the withMaxQueueSize is ignored
+    public ExecutionServiceAssembler withQueue( BlockingQueue<Runnable> queue )
+    // END SNIPPET: configuration
+    {
+        this.queue = queue;
+        return this;
+    }
+
+    /**
+     * For how long the threads should be kept around idling before discarded
+     *
+     * @param time The time to keep alive
+     * @param unit The unit in which the 'time' argument is expressed.
+     * @return Fluent API
+     */
+    // START SNIPPET: configuration
+    // For how long the threads should be kept around idling before discarded
+    public ExecutionServiceAssembler withKeepAliveTime( int time, TimeUnit unit )
+    // END SNIPPET: configuration
+    {
+        this.time = time;
+        this.unit = unit;
+        return this;
+    }
+
+    /**
+     * Thread Group to create the threads in.
+     * <p>
+     * If a custom ThreadFactory is given, {@link #withThreadFactory(ThreadFactory)} then this parameter is ignored.
+     * </p>
+     *
+     * @param group The thread group that all threads should be placed in.
+     * @return Fluent API
+     */
+    // START SNIPPET: configuration
+    // Thread Group to create the threads in
+    public ExecutionServiceAssembler inThreadGroup( ThreadGroup group )
+    // END SNIPPET: configuration
+    {
+        this.group = group;
+        return this;
+    }
+
+    private static class ThreadPoolExecutorImporter
+        implements ServiceImporter
+    {
+        long count = 0;
+
+        @Override
+        public Object importService( ImportedServiceDescriptor serviceDescriptor )
+            throws ServiceImporterException
+        {
+            ExecutionServiceAssembler metaInfo = serviceDescriptor.metaInfo( ExecutionServiceAssembler.class );
+            ThreadGroup group;
+            if( metaInfo.group == null )
+            {
+                group = new ThreadGroup( "tg-" + metaInfo.identity() );
+            }
+            else
+            {
+                group = metaInfo.group;
+            }
+            ThreadFactory factory = metaInfo.factory;
+            if( factory == null )
+            {
+                factory = runnable -> new Thread( group, runnable, "t-" + count++ );
+            }
+            BlockingQueue<Runnable> queue;
+            if( metaInfo.queue == null )
+            {
+                queue = new LinkedBlockingQueue<>( metaInfo.maxTasks );
+            }
+            else
+            {
+                queue = metaInfo.queue;
+            }
+            if( metaInfo.rejectedExecutionHandler == null )
+            {
+                return new ThreadPoolExecutor( metaInfo.coreThreads,
+                                               metaInfo.maxThreads,
+                                               metaInfo.time,
+                                               metaInfo.unit,
+                                               queue,
+                                               factory
+                );
+            }
+            else
+            {
+                return new ThreadPoolExecutor( metaInfo.coreThreads,
+                                               metaInfo.maxThreads,
+                                               metaInfo.time,
+                                               metaInfo.unit,
+                                               queue,
+                                               factory,
+                                               metaInfo.rejectedExecutionHandler
+                );
+            }
+        }
+
+        @Override
+        public boolean isAvailable( Object instance )
+        {
+            return false;
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/db99803f/libraries/execution/src/main/java/org/apache/polygene/library/execution/assembly/ScheduledExecutionServiceAssembler.java
----------------------------------------------------------------------
diff --git a/libraries/execution/src/main/java/org/apache/polygene/library/execution/assembly/ScheduledExecutionServiceAssembler.java b/libraries/execution/src/main/java/org/apache/polygene/library/execution/assembly/ScheduledExecutionServiceAssembler.java
new file mode 100644
index 0000000..c76d2b0
--- /dev/null
+++ b/libraries/execution/src/main/java/org/apache/polygene/library/execution/assembly/ScheduledExecutionServiceAssembler.java
@@ -0,0 +1,140 @@
+package org.apache.polygene.library.execution.assembly;
+
+import java.util.concurrent.RejectedExecutionHandler;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledThreadPoolExecutor;
+import java.util.concurrent.ThreadFactory;
+import org.apache.polygene.api.service.ImportedServiceDescriptor;
+import org.apache.polygene.api.service.ServiceImporter;
+import org.apache.polygene.api.service.ServiceImporterException;
+import org.apache.polygene.bootstrap.Assembler;
+import org.apache.polygene.bootstrap.Assemblers;
+import org.apache.polygene.bootstrap.AssemblyException;
+import org.apache.polygene.bootstrap.ModuleAssembly;
+
+public class ScheduledExecutionServiceAssembler extends Assemblers.VisibilityIdentityConfig<ScheduledExecutionServiceAssembler>
+    implements Assembler
+{
+
+    private ThreadFactory factory;
+    private RejectedExecutionHandler rejectedExecutionHandler;
+    private int coreThreads = 3;
+    private ThreadGroup group;
+
+    @Override
+    public void assemble( ModuleAssembly module )
+        throws AssemblyException
+    {
+        module.importedServices( ScheduledExecutorService.class )
+              .importedBy( ThreadPoolExecutorImporter.class )
+              .setMetaInfo( this )
+        ;
+    }
+
+    /**
+     * Number of core threads, i.e. threads that are not removed if idle, to be used.
+     *
+     * @param threads core threads to use
+     * @return Fluent API
+     */
+    // START SNIPPET: configuration
+    // Number of core threads, i.e. threads that are not removed if idle, to be used.
+    public ScheduledExecutionServiceAssembler withCoreThreads( int threads )
+    // END SNIPPET: configuration
+    {
+        this.coreThreads = threads;
+        return this;
+    }
+
+    /**
+     * Provide a custom ThreadFactory.
+     * <p>
+     * If defined, the {@link #inThreadGroup(ThreadGroup)} parameter will be ignored.
+     * </p>
+     *
+     * @param factory The thread factory to use, when creating threads.
+     * @return Fluent API
+     */
+    // START SNIPPET: configuration
+    // Provide a custom ThreadFactory. If defined, the inThreadGroup parameter will be ignored.
+    public ScheduledExecutionServiceAssembler withThreadFactory( ThreadFactory factory )
+    // END SNIPPET: configuration
+    {
+        this.factory = factory;
+        return this;
+    }
+
+    /**
+     * Provide a custom {@link RejectedExecutionHandler}, or one of the pre-defined policies
+     *
+     * @param handler the custom {@link RejectedExecutionHandler} to use.
+     * @return Fluent API
+     */
+    // START SNIPPET: configuration
+    // Provide a custom RejectedExecutionHandler, or one of the pre-defined policies
+    public ScheduledExecutionServiceAssembler withRejectedExecutionHandler( RejectedExecutionHandler handler )
+    // END SNIPPET: configuration
+    {
+        this.rejectedExecutionHandler = handler;
+        return this;
+    }
+
+    /**
+     * Thread Group to create the threads in.
+     * <p>
+     * If a custom ThreadFactory is given, {@link #withThreadFactory(ThreadFactory)} then this parameter is ignored.
+     * </p>
+     *
+     * @param group The thread group that all threads should be placed in.
+     * @return Fluent API
+     */
+    // START SNIPPET: configuration
+    // Thread Group to create the threads in
+    public ScheduledExecutionServiceAssembler inThreadGroup( ThreadGroup group )
+    // END SNIPPET: configuration
+    {
+        this.group = group;
+        return this;
+    }
+
+    private static class ThreadPoolExecutorImporter
+        implements ServiceImporter
+    {
+        long count = 0;
+
+        @Override
+        public Object importService( ImportedServiceDescriptor serviceDescriptor )
+            throws ServiceImporterException
+        {
+            ScheduledExecutionServiceAssembler metaInfo = serviceDescriptor.metaInfo( ScheduledExecutionServiceAssembler.class );
+            ThreadGroup group;
+            if( metaInfo.group == null )
+            {
+                group = new ThreadGroup( "tg-" + metaInfo.identity() );
+            }
+            else
+            {
+                group = metaInfo.group;
+            }
+            ThreadFactory factory = metaInfo.factory;
+            if( factory == null )
+            {
+                factory = runnable -> new Thread( group, runnable, "t-" + count++ );
+            }
+            if( metaInfo.rejectedExecutionHandler == null )
+            {
+                return new ScheduledThreadPoolExecutor( metaInfo.coreThreads, factory );
+            }
+            else
+            {
+                return new ScheduledThreadPoolExecutor( metaInfo.coreThreads, factory, metaInfo.rejectedExecutionHandler );
+            }
+        }
+
+        @Override
+        public boolean isAvailable( Object instance )
+        {
+            return false;
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/db99803f/libraries/execution/src/test/java/org/apache/polygene/library/execution/ExecutionServiceTest.java
----------------------------------------------------------------------
diff --git a/libraries/execution/src/test/java/org/apache/polygene/library/execution/ExecutionServiceTest.java b/libraries/execution/src/test/java/org/apache/polygene/library/execution/ExecutionServiceTest.java
new file mode 100644
index 0000000..d39cc26
--- /dev/null
+++ b/libraries/execution/src/test/java/org/apache/polygene/library/execution/ExecutionServiceTest.java
@@ -0,0 +1,51 @@
+package org.apache.polygene.library.execution;
+
+import java.util.concurrent.CopyOnWriteArraySet;
+import java.util.concurrent.ExecutorService;
+import org.apache.polygene.bootstrap.AssemblyException;
+import org.apache.polygene.bootstrap.ModuleAssembly;
+import org.apache.polygene.library.execution.assembly.ExecutionServiceAssembler;
+import org.apache.polygene.test.AbstractPolygeneTest;
+import org.junit.jupiter.api.Test;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.core.IsEqual.equalTo;
+
+public class ExecutionServiceTest extends AbstractPolygeneTest
+{
+
+    private CopyOnWriteArraySet<Thread> threads = new CopyOnWriteArraySet<>();
+
+    @Override
+    public void assemble( ModuleAssembly module )
+        throws AssemblyException
+    {
+        new ExecutionServiceAssembler()
+            .withMaxThreads( 3 )
+            .assemble( module );
+    }
+
+    @Test
+    void givenMaxThreeThreadsWhenSubmittingManyTasksExpectToOnlySeeThreeThreads()
+        throws InterruptedException
+    {
+        ExecutorService underTest = serviceFinder.findService( ExecutorService.class ).get();
+        Runnable r = () -> {
+            threads.add( Thread.currentThread() );
+        };
+        underTest.submit( r );
+        underTest.submit( r );
+        underTest.submit( r );
+        underTest.submit( r );
+        underTest.submit( r );
+        underTest.submit( r );
+        underTest.submit( r );
+        underTest.submit( r );
+        underTest.submit( r );
+        underTest.submit( r );
+        underTest.submit( r );
+        Thread.sleep( 10 );
+        assertThat( threads.size(), equalTo( 3 ) );
+        underTest.shutdownNow();
+    }
+}

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/db99803f/libraries/execution/src/test/java/org/apache/polygene/library/execution/RetryTest.java
----------------------------------------------------------------------
diff --git a/libraries/execution/src/test/java/org/apache/polygene/library/execution/RetryTest.java b/libraries/execution/src/test/java/org/apache/polygene/library/execution/RetryTest.java
new file mode 100644
index 0000000..4ed6086
--- /dev/null
+++ b/libraries/execution/src/test/java/org/apache/polygene/library/execution/RetryTest.java
@@ -0,0 +1,184 @@
+package org.apache.polygene.library.execution;
+
+import org.apache.polygene.api.mixin.Mixins;
+import org.apache.polygene.bootstrap.AssemblyException;
+import org.apache.polygene.bootstrap.ModuleAssembly;
+import org.apache.polygene.test.AbstractPolygeneTest;
+import org.junit.jupiter.api.Test;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.greaterThan;
+import static org.hamcrest.Matchers.greaterThanOrEqualTo;
+import static org.hamcrest.Matchers.lessThan;
+import static org.hamcrest.core.IsEqual.equalTo;
+
+// TODO: These tests are extremely slow. Why is that? Could it be the streaming of exception class hierarchies?
+public class RetryTest extends AbstractPolygeneTest
+{
+    @Override
+    public void assemble( ModuleAssembly module )
+        throws AssemblyException
+    {
+        module.services( TestService.class ).withConcerns( RetryConcern.class ).instantiateOnStartup();
+    }
+
+    @Test
+    void givenMethodThrowingExceptionWhenCallingExpectFourCalls()
+    {
+        TestService underTest = serviceFinder.findService( TestService.class ).get();
+        long start = System.currentTimeMillis();
+        try
+        {
+            underTest.doWithRetry1();
+        }
+        catch( IllegalStateException e )
+        {
+            // expected after 4 calls
+        }
+        long end = System.currentTimeMillis();
+        assertThat( underTest.calledTimes(), equalTo(4));
+        assertThat( end-start, lessThan(20L));
+    }
+
+    @Test
+    void givenMethodThrowingExceptionWhenCallingExpectFiveCalls()
+    {
+        TestService underTest = serviceFinder.findService( TestService.class ).get();
+        long start = System.currentTimeMillis();
+        try
+        {
+            underTest.doWithRetry2();
+        }
+        catch( IllegalStateException e )
+        {
+            // expected after 4 calls
+        }
+        long end = System.currentTimeMillis();
+        assertThat( underTest.calledTimes(), equalTo(5));
+        assertThat( end-start, lessThan(20L));
+    }
+
+    @Test
+    void givenMethodThrowingExceptionWhenCallingExpectSixCalls()
+    {
+        TestService underTest = serviceFinder.findService( TestService.class ).get();
+        long start = System.currentTimeMillis();
+        try
+        {
+            underTest.doWithRetry3();
+        }
+        catch( IllegalStateException e )
+        {
+            // expected after 4 calls
+        }
+        long end = System.currentTimeMillis();
+        assertThat( underTest.calledTimes(), equalTo(6));
+        assertThat( end-start, lessThan(20L));
+    }
+
+    @Test
+    void givenMethodThrowingExceptionWhenCallingExpectOneTries()
+    {
+        TestService underTest = serviceFinder.findService( TestService.class ).get();
+        long start = System.currentTimeMillis();
+        try
+        {
+            underTest.doWithRetry4();
+        }
+        catch( IllegalStateException e )
+        {
+            // expected after 1 calls, since IllegalStateException is an "unless"
+        }
+        long end = System.currentTimeMillis();
+        assertThat( underTest.calledTimes(), equalTo(1));
+        assertThat( end-start, lessThan(20L));
+    }
+
+    @Test
+    void givenBackoffExceptionWhenCallingExpectSlowTries()
+    {
+        TestService underTest = serviceFinder.findService( TestService.class ).get();
+        long start = System.currentTimeMillis();
+        try
+        {
+            underTest.doWithRetry5();
+        }
+        catch( IllegalStateException e )
+        {
+            // expected after 1 calls, since IllegalStateException is an "unless"
+        }
+        long end = System.currentTimeMillis();
+        assertThat( underTest.calledTimes(), equalTo(3));
+        assertThat( end-start, greaterThanOrEqualTo( 300L));
+    }
+
+
+    @Mixins( TestMixin.class)
+    public interface TestService{
+
+        int calledTimes();
+
+        @Retry(4)
+        void doWithRetry1();
+
+        @Retry( value=5, on = IllegalStateException.class )
+        void doWithRetry2();
+
+        @Retry( value=6, on = IllegalStateException.class )
+        void doWithRetry3();
+
+        @Retry( value=7, unless = IllegalStateException.class )
+        void doWithRetry4();
+
+        @Retry( value = 3, backoff = 100 )
+        void doWithRetry5();
+    }
+
+    public class TestMixin
+        implements TestService
+    {
+
+        private int called = 0;
+
+        @Override
+        public int calledTimes()
+        {
+            return called;
+        }
+
+        @Override
+        public void doWithRetry1()
+        {
+            called++;
+            throw new IllegalStateException();
+        }
+
+        @Override
+        public void doWithRetry2()
+        {
+            called++;
+            throw new IllegalStateException();
+        }
+
+        @Override
+        public void doWithRetry3()
+        {
+            called++;
+            throw new IllegalStateException();
+        }
+
+        @Override
+        public void doWithRetry4()
+        {
+            called++;
+            throw new IllegalStateException();
+        }
+
+        @Override
+        public void doWithRetry5()
+        {
+            called++;
+            throw new IllegalStateException();
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/db99803f/libraries/execution/src/test/java/org/apache/polygene/library/execution/ScheduledExecutionServiceTest.java
----------------------------------------------------------------------
diff --git a/libraries/execution/src/test/java/org/apache/polygene/library/execution/ScheduledExecutionServiceTest.java b/libraries/execution/src/test/java/org/apache/polygene/library/execution/ScheduledExecutionServiceTest.java
new file mode 100644
index 0000000..83c9e12
--- /dev/null
+++ b/libraries/execution/src/test/java/org/apache/polygene/library/execution/ScheduledExecutionServiceTest.java
@@ -0,0 +1,46 @@
+package org.apache.polygene.library.execution;
+
+import java.util.concurrent.CopyOnWriteArraySet;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
+import org.apache.polygene.bootstrap.AssemblyException;
+import org.apache.polygene.bootstrap.ModuleAssembly;
+import org.apache.polygene.library.execution.assembly.ExecutionServiceAssembler;
+import org.apache.polygene.library.execution.assembly.ScheduledExecutionServiceAssembler;
+import org.apache.polygene.test.AbstractPolygeneTest;
+import org.junit.jupiter.api.Test;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.core.IsEqual.equalTo;
+
+public class ScheduledExecutionServiceTest extends AbstractPolygeneTest
+{
+
+    private volatile AtomicInteger executed = new AtomicInteger( 0 );
+
+    @Override
+    public void assemble( ModuleAssembly module )
+        throws AssemblyException
+    {
+        new ScheduledExecutionServiceAssembler()
+            .assemble( module );
+    }
+
+    @Test
+    void givenScheduleOfTenMillisWhenSubmittingTwoTasksFor105MillisExpect20Invocations()
+        throws InterruptedException
+    {
+        ScheduledExecutorService underTest = serviceFinder.findService( ScheduledExecutorService.class ).get();
+        Runnable r = () -> {
+            executed.incrementAndGet();
+        };
+        underTest.scheduleAtFixedRate( r, 10, 10, TimeUnit.MILLISECONDS );
+        underTest.scheduleAtFixedRate( r, 10, 10, TimeUnit.MILLISECONDS );
+        Thread.sleep( 105 );
+        assertThat( executed.intValue(), equalTo( 20 ) );
+        underTest.shutdownNow();
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/db99803f/manual/src/docs/userguide/libraries.txt
----------------------------------------------------------------------
diff --git a/manual/src/docs/userguide/libraries.txt b/manual/src/docs/userguide/libraries.txt
index b4bcce6..c07445c 100644
--- a/manual/src/docs/userguide/libraries.txt
+++ b/manual/src/docs/userguide/libraries.txt
@@ -47,6 +47,10 @@ include::../../../../libraries/constraints/src/docs/constraints.txt[]
 
 :leveloffset: 2
 
+include::../../../../libraries/execution/src/docs/execution.txt[]
+
+:leveloffset: 2
+
 include::../../../../libraries/fileconfig/src/docs/fileconfig.txt[]
 
 :leveloffset: 2

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/db99803f/settings.gradle
----------------------------------------------------------------------
diff --git a/settings.gradle b/settings.gradle
index 0f503e1..c0b9ed3 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -28,6 +28,7 @@ include 'core:api',
         'libraries:alarm',
         'libraries:circuitbreaker',
         'libraries:constraints',
+        'libraries:execution',
         'libraries:fileconfig',
         'libraries:http',
         'libraries:invocation-cache',


[03/13] polygene-java git commit: Adding a TODO item around invaliding caching, as Zookeeper is capable of doing that across clients, and perhaps other systems have or will have that as well.

Posted by ni...@apache.org.
Adding a TODO item around invaliding caching, as Zookeeper is capable of doing that across clients, and perhaps other systems have or will have that as well.


Project: http://git-wip-us.apache.org/repos/asf/polygene-java/repo
Commit: http://git-wip-us.apache.org/repos/asf/polygene-java/commit/dcea137d
Tree: http://git-wip-us.apache.org/repos/asf/polygene-java/tree/dcea137d
Diff: http://git-wip-us.apache.org/repos/asf/polygene-java/diff/dcea137d

Branch: refs/heads/develop
Commit: dcea137d1ec5901db2918c4f47c643587019eda0
Parents: 68b55fa
Author: niclas <ni...@hedhman.org>
Authored: Thu Apr 26 09:04:01 2018 +0800
Committer: niclas <ni...@hedhman.org>
Committed: Thu Apr 26 09:04:01 2018 +0800

----------------------------------------------------------------------
 .../entitystore/zookeeper/ZookeeperEntityStoreMixin.java | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/polygene-java/blob/dcea137d/extensions/entitystore-zookeeper/src/main/java/org/apache/polygene/entitystore/zookeeper/ZookeeperEntityStoreMixin.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-zookeeper/src/main/java/org/apache/polygene/entitystore/zookeeper/ZookeeperEntityStoreMixin.java b/extensions/entitystore-zookeeper/src/main/java/org/apache/polygene/entitystore/zookeeper/ZookeeperEntityStoreMixin.java
index 59a0b5a..fb97301 100644
--- a/extensions/entitystore-zookeeper/src/main/java/org/apache/polygene/entitystore/zookeeper/ZookeeperEntityStoreMixin.java
+++ b/extensions/entitystore-zookeeper/src/main/java/org/apache/polygene/entitystore/zookeeper/ZookeeperEntityStoreMixin.java
@@ -94,7 +94,7 @@ public class ZookeeperEntityStoreMixin
 
         int sessionTimeout = config.sessionTimeout().get();
 
-        zkClient = new ZooKeeper( hostPort, sessionTimeout, watcher == null ? new DummyWatcher() : watcher );
+        zkClient = new ZooKeeper( hostPort, sessionTimeout, watcher == null ? new EntityStoreWatcher() : watcher );
         createStorageNodeIfNotExists( config );
     }
 
@@ -324,9 +324,16 @@ public class ZookeeperEntityStoreMixin
         }
     }
 
-    private class DummyWatcher
+    private class EntityStoreWatcher
         implements Watcher
     {
+        // TODO: Invalidate cache?
+        // I (niclas) think that the only events that arrive here are create, delete, data changed and children changed
+        // So, the question is; Should we try to invalidate the cache (if present) for these changes? If so; How is that done?
+        //
+        // Additionally, that might raise the question of having cache invalidation interface in the EntityStore SPI, and
+        // by extension into the MapEntityStore SPI.
+
         @Override
         public void process( WatchedEvent event )
         {


[10/13] polygene-java git commit: Merge remote-tracking branch 'origin/tbml/invoke-issue' into develop

Posted by ni...@apache.org.
Merge remote-tracking branch 'origin/tbml/invoke-issue' into develop


Project: http://git-wip-us.apache.org/repos/asf/polygene-java/repo
Commit: http://git-wip-us.apache.org/repos/asf/polygene-java/commit/0cb52e74
Tree: http://git-wip-us.apache.org/repos/asf/polygene-java/tree/0cb52e74
Diff: http://git-wip-us.apache.org/repos/asf/polygene-java/diff/0cb52e74

Branch: refs/heads/develop
Commit: 0cb52e744b7ad63ef2c12ea7ff8d9608cfb8e80b
Parents: 2a643f5 fe8ed3e
Author: niclas <ni...@hedhman.org>
Authored: Thu May 3 07:50:29 2018 +0800
Committer: niclas <ni...@hedhman.org>
Committed: Thu May 3 07:50:29 2018 +0800

----------------------------------------------------------------------
 .../CompositeMethodInvocationTest.java          | 55 ++++++++++++++++++++
 1 file changed, 55 insertions(+)
----------------------------------------------------------------------



[07/13] polygene-java git commit: Fixing nitpicking details

Posted by ni...@apache.org.
Fixing nitpicking details


Project: http://git-wip-us.apache.org/repos/asf/polygene-java/repo
Commit: http://git-wip-us.apache.org/repos/asf/polygene-java/commit/5b662412
Tree: http://git-wip-us.apache.org/repos/asf/polygene-java/tree/5b662412
Diff: http://git-wip-us.apache.org/repos/asf/polygene-java/diff/5b662412

Branch: refs/heads/develop
Commit: 5b662412f07dd1dcb3472f09823e27c3212449b4
Parents: ca66f7e
Author: niclas <ni...@hedhman.org>
Authored: Sun Apr 29 14:40:22 2018 +0800
Committer: niclas <ni...@hedhman.org>
Committed: Sun Apr 29 14:40:22 2018 +0800

----------------------------------------------------------------------
 .../src/docs/what-is-composite-oriented-programming.txt          | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/polygene-java/blob/5b662412/tutorials/introduction/src/docs/what-is-composite-oriented-programming.txt
----------------------------------------------------------------------
diff --git a/tutorials/introduction/src/docs/what-is-composite-oriented-programming.txt b/tutorials/introduction/src/docs/what-is-composite-oriented-programming.txt
index ef7fa48..8029a2f 100644
--- a/tutorials/introduction/src/docs/what-is-composite-oriented-programming.txt
+++ b/tutorials/introduction/src/docs/what-is-composite-oriented-programming.txt
@@ -24,8 +24,8 @@ We found this very well written blog entry on the Internet, which very well desc
 Programming really is.
 
 The article uses C# and a "show by example" approach to explaining COP, and this shows clearly that COP is not
-Java specific, and although Polygene™ was (to our knowledge) first to introduce the name, it applies across languages and
-potentially deserves one or more languages on its own.
+Java specific, and although the founders of Qi4j (now Apache Polygene™) were (to our knowledge) the first to introduce
+the name, it applies across languages and potentially deserves one or more languages on its own.
 
 The article is re-published here, as allowed by the
 http://msdn.microsoft.com/en-us/windowsmobile/bb264332.aspx[Microsoft Permissive License]


[11/13] polygene-java git commit: POLYGENE-308 - Finally found the evasive concurrency bug. AtomicInstancePool was not thread-safe after all, and is replaced by using the ConcurrentLinkedQueue in standard library instead. No idea why this was not used in

Posted by ni...@apache.org.
POLYGENE-308 - Finally found the evasive concurrency bug. AtomicInstancePool was not thread-safe after all, and is replaced by using the ConcurrentLinkedQueue in standard library instead. No idea why this was not used in the first place, possibly to add "removal" feature in the future.


Project: http://git-wip-us.apache.org/repos/asf/polygene-java/repo
Commit: http://git-wip-us.apache.org/repos/asf/polygene-java/commit/393cf214
Tree: http://git-wip-us.apache.org/repos/asf/polygene-java/tree/393cf214
Diff: http://git-wip-us.apache.org/repos/asf/polygene-java/diff/393cf214

Branch: refs/heads/develop
Commit: 393cf214c92e3057788caf8fce29262534d3e5e2
Parents: 0cb52e7
Author: niclas <ni...@hedhman.org>
Authored: Thu May 3 08:21:39 2018 +0800
Committer: niclas <ni...@hedhman.org>
Committed: Thu May 3 08:21:39 2018 +0800

----------------------------------------------------------------------
 .../runtime/composite/AtomicInstancePool.java   | 59 --------------------
 .../runtime/composite/CompositeMethodModel.java |  7 ++-
 .../CompositeMethodInvocationTest.java          | 26 +++++++--
 3 files changed, 25 insertions(+), 67 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/polygene-java/blob/393cf214/core/runtime/src/main/java/org/apache/polygene/runtime/composite/AtomicInstancePool.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/polygene/runtime/composite/AtomicInstancePool.java b/core/runtime/src/main/java/org/apache/polygene/runtime/composite/AtomicInstancePool.java
deleted file mode 100644
index 95cd988..0000000
--- a/core/runtime/src/main/java/org/apache/polygene/runtime/composite/AtomicInstancePool.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- *  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.
- *
- *
- */
-
-package org.apache.polygene.runtime.composite;
-
-import java.util.concurrent.atomic.AtomicReference;
-
-/**
- * Method instance pool that keeps a linked list. Uses atomic reference
- * to ensure that instances are acquired and returned in a thread-safe
- * manner.
- */
-public final class AtomicInstancePool
-    implements InstancePool<CompositeMethodInstance>
-{
-    private final AtomicReference<CompositeMethodInstance> first = new AtomicReference<>();
-
-    @Override
-    public CompositeMethodInstance obtainInstance()
-    {
-        CompositeMethodInstance firstInstance;
-        do
-        {
-            firstInstance = first.get();
-        }
-        while( firstInstance != null && !first.compareAndSet( firstInstance, firstInstance.getNext() ) );
-
-        return firstInstance;
-    }
-
-    @Override
-    public void releaseInstance( CompositeMethodInstance compositeMethodInstance )
-    {
-        CompositeMethodInstance firstInstance;
-        do
-        {
-            firstInstance = first.get();
-            compositeMethodInstance.setNext( firstInstance );
-        }
-        while( !first.compareAndSet( firstInstance, compositeMethodInstance ) );
-    }
-}

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/393cf214/core/runtime/src/main/java/org/apache/polygene/runtime/composite/CompositeMethodModel.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/polygene/runtime/composite/CompositeMethodModel.java b/core/runtime/src/main/java/org/apache/polygene/runtime/composite/CompositeMethodModel.java
index ec6de3b..1ed4cdd 100644
--- a/core/runtime/src/main/java/org/apache/polygene/runtime/composite/CompositeMethodModel.java
+++ b/core/runtime/src/main/java/org/apache/polygene/runtime/composite/CompositeMethodModel.java
@@ -29,6 +29,7 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Objects;
+import java.util.concurrent.ConcurrentLinkedQueue;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 import org.apache.polygene.api.common.ConstructionException;
@@ -56,7 +57,7 @@ public final class CompositeMethodModel
 
     // Context
 //    private final SynchronizedCompositeMethodInstancePool instancePool = new SynchronizedCompositeMethodInstancePool();
-    private final AtomicInstancePool instancePool = new AtomicInstancePool();
+    private final ConcurrentLinkedQueue<CompositeMethodInstance> instancePool = new ConcurrentLinkedQueue<>();
     private final ConstraintsInstance constraintsInstance;
 
     public CompositeMethodModel( Method method,
@@ -111,13 +112,13 @@ public final class CompositeMethodModel
         }
         finally
         {
-            instancePool.releaseInstance( methodInstance );
+            instancePool.offer( methodInstance );
         }
     }
 
     private CompositeMethodInstance getInstance( ModuleDescriptor module )
     {
-        CompositeMethodInstance methodInstance = instancePool.obtainInstance();
+        CompositeMethodInstance methodInstance = instancePool.poll();
         if( methodInstance == null )
         {
             methodInstance = newCompositeMethodInstance( module );

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/393cf214/core/runtime/src/test/java/org/apache/polygene/runtime/composite/CompositeMethodInvocationTest.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/test/java/org/apache/polygene/runtime/composite/CompositeMethodInvocationTest.java b/core/runtime/src/test/java/org/apache/polygene/runtime/composite/CompositeMethodInvocationTest.java
index 44d4ea3..bfa2a7e 100644
--- a/core/runtime/src/test/java/org/apache/polygene/runtime/composite/CompositeMethodInvocationTest.java
+++ b/core/runtime/src/test/java/org/apache/polygene/runtime/composite/CompositeMethodInvocationTest.java
@@ -1,3 +1,20 @@
+/*
+ *  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.
+ */
 package org.apache.polygene.runtime.composite;
 
 import org.apache.polygene.api.injection.scope.Service;
@@ -6,21 +23,20 @@ import org.apache.polygene.api.service.ServiceComposite;
 import org.apache.polygene.bootstrap.AssemblyException;
 import org.apache.polygene.bootstrap.ModuleAssembly;
 import org.apache.polygene.test.AbstractPolygeneTest;
+import org.junit.jupiter.api.RepeatedTest;
 import org.junit.jupiter.api.Test;
 
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.concurrent.TimeUnit;
 
+/** Regression test POLYGENE-308
+ */
 public class CompositeMethodInvocationTest extends AbstractPolygeneTest {
 
     @Service
     MyService srv;
 
-    /**
-     * To correct, change instance pool type in CompositeMethodModel
-     * AtomicInstancePool -> SynchronizedCompositeMethodInstancePool
-     */
     @Test
     public void corruptedMethodInvocation() throws InterruptedException {
         srv.dummy(); // to avoid concurrent activation (it can have own issues)
@@ -33,7 +49,7 @@ public class CompositeMethodInvocationTest extends AbstractPolygeneTest {
                 }
             });
         }
-        exe.awaitTermination(10, TimeUnit.MINUTES);
+        exe.awaitTermination(30, TimeUnit.SECONDS);
     }
 
     @Override


[06/13] polygene-java git commit: Changed Assembler.assemble() to allow Exception to be thrown (instead of only AssemblyException), so one doesn't need to capture all kind of exceptions in one's Assembler just to re-throw as AssemblyException.

Posted by ni...@apache.org.
Changed Assembler.assemble() to allow Exception to be thrown (instead of only AssemblyException), so one doesn't need to capture all kind of exceptions in one's Assembler just to re-throw as AssemblyException.


Project: http://git-wip-us.apache.org/repos/asf/polygene-java/repo
Commit: http://git-wip-us.apache.org/repos/asf/polygene-java/commit/ca66f7e7
Tree: http://git-wip-us.apache.org/repos/asf/polygene-java/tree/ca66f7e7
Diff: http://git-wip-us.apache.org/repos/asf/polygene-java/diff/ca66f7e7

Branch: refs/heads/develop
Commit: ca66f7e7a9d60b05c5f2ab6a210bae26b5dcce41
Parents: db99803
Author: niclas <ni...@hedhman.org>
Authored: Sat Apr 28 16:18:29 2018 +0800
Committer: niclas <ni...@hedhman.org>
Committed: Sat Apr 28 16:18:30 2018 +0800

----------------------------------------------------------------------
 .../apache/polygene/api/common/MetaInfo.java    |  2 +-
 .../api/activation/ActivationEventsTest.java    |  3 --
 .../activation/PassivationExceptionTest.java    |  2 +-
 .../api/configuration/ConfigurationTest.java    |  1 -
 .../DeclareConfigurationDefaultsTest.java       |  1 -
 .../api/docsupport/ApplicationDocs.java         |  8 +----
 .../api/injection/scope/StateFieldTest.java     |  1 -
 .../api/metrics/DocumentationSupport.java       |  1 -
 .../decoratorMixin/DecoratorMixinTest.java      |  1 -
 .../polygene/api/object/ObjectBuilderTest.java  |  1 -
 .../api/property/PropertyErrorTest.java         |  1 -
 .../api/service/DocumentationSupport.java       |  1 -
 .../polygene/api/unitofwork/RemovalTest.java    |  3 --
 .../apache/polygene/bootstrap/Assembler.java    |  2 +-
 .../polygene/bootstrap/AssemblerCollection.java |  2 +-
 .../polygene/bootstrap/SingletonAssembler.java  |  1 +
 .../bootstrap/builder/ModuleDeclaration.java    | 21 ++++++++++++-
 .../ApplicationAssemblyFactoryImpl.java         | 17 ++++++++++-
 .../runtime/bootstrap/ModuleAssemblyImpl.java   | 32 ++++++++++++++++++--
 .../composite/InterfaceDefaultMethodsMixin.java |  2 +-
 .../polygene/api/common/OptionalTest.java       |  1 -
 .../polygene/api/common/PropertyErrorTest.java  |  1 -
 .../polygene/api/common/PropertyTypeTest.java   |  1 -
 .../apache/polygene/api/common/RemovalTest.java |  1 -
 .../polygene/api/common/ValueCompositeTest.java |  1 -
 .../composite/InterfaceDefaultMethodsTest.java  | 12 ++++----
 .../memory/MemoryEntityStoreTest.java           |  2 +-
 .../polygene/test/AbstractPolygeneBaseTest.java | 22 ++++++++++----
 .../polygene/test/AbstractPolygeneTest.java     |  1 +
 .../polygene/test/PolygeneUnitExtension.java    |  1 +
 .../cache/AbstractEntityStoreWithCacheTest.java |  1 +
 .../test/entity/AbstractEntityStoreTest.java    |  1 +
 .../metrics/AbstractPolygeneMetricsTest.java    |  1 +
 .../test/metrics/AbstractTimingCaptureTest.java |  1 +
 .../berkeleydb/BdbJeEntityStoreTest.java        |  2 +-
 .../cassandra/CassandraEntityStoreTest.java     |  5 +--
 .../entitystore/file/FileEntityStoreTest.java   |  4 +--
 .../file/FileEntityStoreWithCacheTest.java      |  2 +-
 .../entitystore/geode/GeodeEntityStoreTest.java |  2 +-
 .../geode/GeodeEntityStoreWithCacheTest.java    |  2 +-
 .../hazelcast/HazelcastEntityStoreTest.java     |  2 +-
 .../HazelcastEntityStoreWithCacheTest.java      |  2 +-
 .../jclouds/JCloudsFilesystemTest.java          |  4 +--
 .../entitystore/jclouds/JCloudsS3Test.java      | 10 ++++--
 .../jclouds/JCloudsTransientTest.java           |  4 +--
 .../jclouds/JCloudsWithCacheTest.java           |  2 +-
 .../entitystore/jdbm/JdbmEntityStoreTest.java   | 14 +++++----
 .../jdbm/JdbmEntityStoreWithCacheTest.java      |  5 ++-
 .../leveldb/JavaLevelDBEntityStoreTest.java     | 10 +++---
 .../LevelDBEntityStoreWithCacheTest.java        | 17 +++++------
 .../memory/MemoryEntityStoreTest.java           |  4 +--
 .../memory/MemoryEntityStoreWithCacheTest.java  |  5 ++-
 .../mongodb/MongoDBEntityStoreTest.java         |  2 +-
 .../MongoDBEntityStoreWithCacheTest.java        |  9 +++---
 .../preferences/PreferencesEntityStoreTest.java |  2 +-
 .../entitystore/redis/RedisEntityStoreTest.java |  4 +--
 .../redis/RedisEntityStoreWithCacheTest.java    |  2 +-
 .../entitystore/riak/RiakEntityStoreTest.java   |  1 +
 .../riak/RiakEntityStoreWithCacheTest.java      |  2 +-
 .../sql/DerbySQLEntityStoreTest.java            |  2 +-
 .../entitystore/sql/H2SQLEntityStoreTest.java   |  2 +-
 .../entitystore/sql/MariaDbEntityStoreTest.java |  2 +-
 .../entitystore/sql/MySQLEntityStoreTest.java   |  2 +-
 .../sql/PostgreSQLEntityStoreTest.java          |  2 +-
 .../entitystore/sql/SQLiteEntityStoreTest.java  |  2 +-
 .../entitystore/sql/SqlEntityStoreTest.java     |  2 +-
 .../sqlkv/DerbySQLEntityStoreTest.java          |  2 +-
 .../entitystore/sqlkv/H2SQLEntityStoreTest.java |  2 +-
 .../sqlkv/MariaDbEntityStoreTest.java           |  2 +-
 .../entitystore/sqlkv/MySQLEntityStoreTest.java |  2 +-
 .../sqlkv/PostgreSQLEntityStoreTest.java        |  2 +-
 .../sqlkv/SQLiteEntityStoreTest.java            |  2 +-
 extensions/entitystore-zookeeper/build.gradle   |  1 +
 .../polygene/entitystore/zookeeper/ZkUtil.java  | 19 ++++++++++++
 .../zookeeper/ZookeeperEntityStoreTest.java     | 19 ++++++++----
 .../ZookeeperEntityStoreTestSuite.java          | 11 +++++--
 .../ZookeeperEntityStoreWithCacheTest.java      | 18 ++++++++---
 .../polygene/index/rdf/RDFPerformanceTest.java  |  3 +-
 .../polygene/index/rdf/qi95/Qi95IssueTest.java  | 13 +++++++-
 79 files changed, 246 insertions(+), 132 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/polygene-java/blob/ca66f7e7/core/api/src/main/java/org/apache/polygene/api/common/MetaInfo.java
----------------------------------------------------------------------
diff --git a/core/api/src/main/java/org/apache/polygene/api/common/MetaInfo.java b/core/api/src/main/java/org/apache/polygene/api/common/MetaInfo.java
index c3f3a11..b0d1beb 100644
--- a/core/api/src/main/java/org/apache/polygene/api/common/MetaInfo.java
+++ b/core/api/src/main/java/org/apache/polygene/api/common/MetaInfo.java
@@ -50,7 +50,7 @@ import static org.apache.polygene.api.util.Classes.typesOf;
  * </p>
  * <pre><code>
  * public void assemble( ModuleAssembly module )
- *     throws AssemblyException
+ *     throws Exception
  * {
  *     Map&lt;String,String&gt; properties = ...;
  *     module.services( MyService.class ).setMetaInfo( properties );

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/ca66f7e7/core/api/src/test/java/org/apache/polygene/api/activation/ActivationEventsTest.java
----------------------------------------------------------------------
diff --git a/core/api/src/test/java/org/apache/polygene/api/activation/ActivationEventsTest.java b/core/api/src/test/java/org/apache/polygene/api/activation/ActivationEventsTest.java
index c9137b9..25364db 100644
--- a/core/api/src/test/java/org/apache/polygene/api/activation/ActivationEventsTest.java
+++ b/core/api/src/test/java/org/apache/polygene/api/activation/ActivationEventsTest.java
@@ -75,7 +75,6 @@ public class ActivationEventsTest
         {
             @Override
             public void assemble( ModuleAssembly module )
-                throws AssemblyException
             {
                 module.services( TestServiceComposite.class ).instantiateOnStartup();
             }
@@ -124,7 +123,6 @@ public class ActivationEventsTest
         {
             @Override
             public void assemble( ModuleAssembly module )
-                throws AssemblyException
             {
                 module.importedServices( TestService.class ).
                         setMetaInfo( new TestServiceInstance() ).
@@ -176,7 +174,6 @@ public class ActivationEventsTest
 
             @Override
             public void assemble( ModuleAssembly module )
-                    throws AssemblyException
             {
                 module.services( TestServiceComposite.class );
             }

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/ca66f7e7/core/api/src/test/java/org/apache/polygene/api/activation/PassivationExceptionTest.java
----------------------------------------------------------------------
diff --git a/core/api/src/test/java/org/apache/polygene/api/activation/PassivationExceptionTest.java b/core/api/src/test/java/org/apache/polygene/api/activation/PassivationExceptionTest.java
index ddd4d80..9b17d53 100644
--- a/core/api/src/test/java/org/apache/polygene/api/activation/PassivationExceptionTest.java
+++ b/core/api/src/test/java/org/apache/polygene/api/activation/PassivationExceptionTest.java
@@ -79,7 +79,7 @@ public class PassivationExceptionTest
 
     @Test
     public void testPassivationExceptionsAccrossStructure()
-        throws AssemblyException, ActivationException
+        throws ActivationException
     {
         ApplicationBuilder appBuilder = new ApplicationBuilder( "TestApplication" );
         appBuilder.withLayer( "Layer 1" ).withModule( "Module A" ).withAssembler(

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/ca66f7e7/core/api/src/test/java/org/apache/polygene/api/configuration/ConfigurationTest.java
----------------------------------------------------------------------
diff --git a/core/api/src/test/java/org/apache/polygene/api/configuration/ConfigurationTest.java b/core/api/src/test/java/org/apache/polygene/api/configuration/ConfigurationTest.java
index 186153d..cf3064b 100644
--- a/core/api/src/test/java/org/apache/polygene/api/configuration/ConfigurationTest.java
+++ b/core/api/src/test/java/org/apache/polygene/api/configuration/ConfigurationTest.java
@@ -38,7 +38,6 @@ public class ConfigurationTest extends AbstractPolygeneTest
 
     @Override
     public void assemble( ModuleAssembly module )
-        throws AssemblyException
     {
         module.services( MyService.class ).instantiateOnStartup();
         module.entities( MyConfig.class );

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/ca66f7e7/core/api/src/test/java/org/apache/polygene/api/configuration/DeclareConfigurationDefaultsTest.java
----------------------------------------------------------------------
diff --git a/core/api/src/test/java/org/apache/polygene/api/configuration/DeclareConfigurationDefaultsTest.java b/core/api/src/test/java/org/apache/polygene/api/configuration/DeclareConfigurationDefaultsTest.java
index 3d0ea17..45366c0 100644
--- a/core/api/src/test/java/org/apache/polygene/api/configuration/DeclareConfigurationDefaultsTest.java
+++ b/core/api/src/test/java/org/apache/polygene/api/configuration/DeclareConfigurationDefaultsTest.java
@@ -65,7 +65,6 @@ public class DeclareConfigurationDefaultsTest
     }
 
     public void assemble( ModuleAssembly module )
-        throws AssemblyException
     {
         module.services( FooServiceComposite.class ).identifiedBy( "bazar" );
         module.entities( FooConfigurationComposite.class );

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/ca66f7e7/core/api/src/test/java/org/apache/polygene/api/docsupport/ApplicationDocs.java
----------------------------------------------------------------------
diff --git a/core/api/src/test/java/org/apache/polygene/api/docsupport/ApplicationDocs.java b/core/api/src/test/java/org/apache/polygene/api/docsupport/ApplicationDocs.java
index de60c22..4a0131f 100644
--- a/core/api/src/test/java/org/apache/polygene/api/docsupport/ApplicationDocs.java
+++ b/core/api/src/test/java/org/apache/polygene/api/docsupport/ApplicationDocs.java
@@ -90,7 +90,6 @@ public class ApplicationDocs
     {
         @Override
         public void assemble( ModuleAssembly module )
-            throws AssemblyException
         {
 
         }
@@ -108,7 +107,6 @@ public class ApplicationDocs
     }
 
     private static ApplicationAssembly createAssembly( ApplicationAssemblyFactory factory )
-        throws AssemblyException
     {
         String applicationName = "Example Application";
         ApplicationAssembly app = factory.newApplicationAssembly();
@@ -142,9 +140,7 @@ public class ApplicationDocs
         return layer;
     }
 
-    private static LayerAssembly createInfrastructureLayer(
-        ApplicationAssembly application
-    )
+    private static LayerAssembly createInfrastructureLayer( ApplicationAssembly application )
         throws AssemblyException
     {
         LayerAssembly layer = application.layer( "Infrastructure Layer" );
@@ -230,7 +226,6 @@ public class ApplicationDocs
 
         @Override
         public void assemble( ModuleAssembly module )
-            throws AssemblyException
         {
         }
     }
@@ -244,7 +239,6 @@ public class ApplicationDocs
 
         @Override
         public void assemble( ModuleAssembly module )
-            throws AssemblyException
         {
         }
     }

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/ca66f7e7/core/api/src/test/java/org/apache/polygene/api/injection/scope/StateFieldTest.java
----------------------------------------------------------------------
diff --git a/core/api/src/test/java/org/apache/polygene/api/injection/scope/StateFieldTest.java b/core/api/src/test/java/org/apache/polygene/api/injection/scope/StateFieldTest.java
index 7e1c7eb..722fca8 100644
--- a/core/api/src/test/java/org/apache/polygene/api/injection/scope/StateFieldTest.java
+++ b/core/api/src/test/java/org/apache/polygene/api/injection/scope/StateFieldTest.java
@@ -45,7 +45,6 @@ public class StateFieldTest
     extends AbstractPolygeneTest
 {
     public void assemble( ModuleAssembly module )
-        throws AssemblyException
     {
         new EntityTestAssembler().assemble( module );
         module.entities( PersonEntity.class );

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/ca66f7e7/core/api/src/test/java/org/apache/polygene/api/metrics/DocumentationSupport.java
----------------------------------------------------------------------
diff --git a/core/api/src/test/java/org/apache/polygene/api/metrics/DocumentationSupport.java b/core/api/src/test/java/org/apache/polygene/api/metrics/DocumentationSupport.java
index aaaa052..63b8b57 100644
--- a/core/api/src/test/java/org/apache/polygene/api/metrics/DocumentationSupport.java
+++ b/core/api/src/test/java/org/apache/polygene/api/metrics/DocumentationSupport.java
@@ -147,7 +147,6 @@ public class DocumentationSupport
             // START SNIPPET: capture
             @Override
             public void assemble( ModuleAssembly module )
-                throws AssemblyException
             {
                 module.addServices( Router.class ).identifiedBy( "router1" ).withMixins( RouterAlgorithm1.class );
                 module.addServices( Router.class ).identifiedBy( "router2" ).withMixins( RouterAlgorithm2.class );

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/ca66f7e7/core/api/src/test/java/org/apache/polygene/api/mixin/decoratorMixin/DecoratorMixinTest.java
----------------------------------------------------------------------
diff --git a/core/api/src/test/java/org/apache/polygene/api/mixin/decoratorMixin/DecoratorMixinTest.java b/core/api/src/test/java/org/apache/polygene/api/mixin/decoratorMixin/DecoratorMixinTest.java
index a3276f4..2eed62f 100644
--- a/core/api/src/test/java/org/apache/polygene/api/mixin/decoratorMixin/DecoratorMixinTest.java
+++ b/core/api/src/test/java/org/apache/polygene/api/mixin/decoratorMixin/DecoratorMixinTest.java
@@ -35,7 +35,6 @@ public class DecoratorMixinTest extends AbstractPolygeneTest
     // START SNIPPET: assembly
     @Override
     public void assemble( ModuleAssembly module )
-        throws AssemblyException
     {
         module.transients( View1.class );
         module.transients( View2.class );

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/ca66f7e7/core/api/src/test/java/org/apache/polygene/api/object/ObjectBuilderTest.java
----------------------------------------------------------------------
diff --git a/core/api/src/test/java/org/apache/polygene/api/object/ObjectBuilderTest.java b/core/api/src/test/java/org/apache/polygene/api/object/ObjectBuilderTest.java
index 2b943fb..29ad294 100644
--- a/core/api/src/test/java/org/apache/polygene/api/object/ObjectBuilderTest.java
+++ b/core/api/src/test/java/org/apache/polygene/api/object/ObjectBuilderTest.java
@@ -36,7 +36,6 @@ public class ObjectBuilderTest
     extends AbstractPolygeneTest
 {
     public void assemble( ModuleAssembly module )
-        throws AssemblyException
     {
         module.objects( A.class, B.class, C.class, D.class );
     }

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/ca66f7e7/core/api/src/test/java/org/apache/polygene/api/property/PropertyErrorTest.java
----------------------------------------------------------------------
diff --git a/core/api/src/test/java/org/apache/polygene/api/property/PropertyErrorTest.java b/core/api/src/test/java/org/apache/polygene/api/property/PropertyErrorTest.java
index 59f8685..43c7b51 100644
--- a/core/api/src/test/java/org/apache/polygene/api/property/PropertyErrorTest.java
+++ b/core/api/src/test/java/org/apache/polygene/api/property/PropertyErrorTest.java
@@ -38,7 +38,6 @@ public class PropertyErrorTest
     extends AbstractPolygeneTest
 {
     public void assemble( ModuleAssembly module )
-        throws AssemblyException
     {
         new EntityTestAssembler().assemble( module );
         module.entities( PersonEntity.class );

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/ca66f7e7/core/api/src/test/java/org/apache/polygene/api/service/DocumentationSupport.java
----------------------------------------------------------------------
diff --git a/core/api/src/test/java/org/apache/polygene/api/service/DocumentationSupport.java b/core/api/src/test/java/org/apache/polygene/api/service/DocumentationSupport.java
index c612d0b..1f4615b 100644
--- a/core/api/src/test/java/org/apache/polygene/api/service/DocumentationSupport.java
+++ b/core/api/src/test/java/org/apache/polygene/api/service/DocumentationSupport.java
@@ -36,7 +36,6 @@ public class DocumentationSupport
     // START SNIPPET: instantiateOnStartup
     @Override
     public void assemble( ModuleAssembly module )
-        throws AssemblyException
     {
         ServiceDeclaration service = module.addServices( MyDemoService.class );
         // END SNIPPET: tag

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/ca66f7e7/core/api/src/test/java/org/apache/polygene/api/unitofwork/RemovalTest.java
----------------------------------------------------------------------
diff --git a/core/api/src/test/java/org/apache/polygene/api/unitofwork/RemovalTest.java b/core/api/src/test/java/org/apache/polygene/api/unitofwork/RemovalTest.java
index 42cb060..38bdccf 100644
--- a/core/api/src/test/java/org/apache/polygene/api/unitofwork/RemovalTest.java
+++ b/core/api/src/test/java/org/apache/polygene/api/unitofwork/RemovalTest.java
@@ -35,7 +35,6 @@ public class RemovalTest
     extends AbstractPolygeneTest
 {
     public void assemble( ModuleAssembly module )
-        throws AssemblyException
     {
         module.entities( TestEntity.class );
         module.entities( PidRegulator.class );
@@ -44,7 +43,6 @@ public class RemovalTest
 
     @Test
     public void givenEntityIsCreatedAndUnitOfWorkIsNotCompletedWhenEntityIsRemoveThenSuccessfulRemoval()
-        throws Exception
     {
         UnitOfWork uow = unitOfWorkFactory.newUnitOfWork();
         try
@@ -63,7 +61,6 @@ public class RemovalTest
 
     @Test
     public void givenStandardPidRegulatorWhenNoChangeInInputExpectOutputToGoTowardsMinimum()
-        throws Exception
     {
         UnitOfWork uow = unitOfWorkFactory.newUnitOfWork();
         PidRegulator regulator = null;

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/ca66f7e7/core/bootstrap/src/main/java/org/apache/polygene/bootstrap/Assembler.java
----------------------------------------------------------------------
diff --git a/core/bootstrap/src/main/java/org/apache/polygene/bootstrap/Assembler.java b/core/bootstrap/src/main/java/org/apache/polygene/bootstrap/Assembler.java
index 9e0ecd3..eabbe39 100644
--- a/core/bootstrap/src/main/java/org/apache/polygene/bootstrap/Assembler.java
+++ b/core/bootstrap/src/main/java/org/apache/polygene/bootstrap/Assembler.java
@@ -47,5 +47,5 @@ public interface Assembler
      * @throws AssemblyException thrown if the assembler tries to do something illegal
      */
     void assemble( ModuleAssembly module )
-        throws AssemblyException;
+        throws Exception;
 }

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/ca66f7e7/core/bootstrap/src/main/java/org/apache/polygene/bootstrap/AssemblerCollection.java
----------------------------------------------------------------------
diff --git a/core/bootstrap/src/main/java/org/apache/polygene/bootstrap/AssemblerCollection.java b/core/bootstrap/src/main/java/org/apache/polygene/bootstrap/AssemblerCollection.java
index 8bee7cb..6924844 100644
--- a/core/bootstrap/src/main/java/org/apache/polygene/bootstrap/AssemblerCollection.java
+++ b/core/bootstrap/src/main/java/org/apache/polygene/bootstrap/AssemblerCollection.java
@@ -66,7 +66,7 @@ public final class AssemblerCollection
 
     @Override
     public void assemble( ModuleAssembly module )
-        throws AssemblyException
+        throws Exception
     {
         for( Assembler assembler : assemblers )
         {

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/ca66f7e7/core/bootstrap/src/main/java/org/apache/polygene/bootstrap/SingletonAssembler.java
----------------------------------------------------------------------
diff --git a/core/bootstrap/src/main/java/org/apache/polygene/bootstrap/SingletonAssembler.java b/core/bootstrap/src/main/java/org/apache/polygene/bootstrap/SingletonAssembler.java
index 7016795..796c211 100644
--- a/core/bootstrap/src/main/java/org/apache/polygene/bootstrap/SingletonAssembler.java
+++ b/core/bootstrap/src/main/java/org/apache/polygene/bootstrap/SingletonAssembler.java
@@ -172,6 +172,7 @@ public class SingletonAssembler
 
     @Override
     public void assemble( ModuleAssembly module )
+        throws Exception
     {
         if( assemble != null )
         {

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/ca66f7e7/core/bootstrap/src/main/java/org/apache/polygene/bootstrap/builder/ModuleDeclaration.java
----------------------------------------------------------------------
diff --git a/core/bootstrap/src/main/java/org/apache/polygene/bootstrap/builder/ModuleDeclaration.java b/core/bootstrap/src/main/java/org/apache/polygene/bootstrap/builder/ModuleDeclaration.java
index 95f2810..9a57f7d 100644
--- a/core/bootstrap/src/main/java/org/apache/polygene/bootstrap/builder/ModuleDeclaration.java
+++ b/core/bootstrap/src/main/java/org/apache/polygene/bootstrap/builder/ModuleDeclaration.java
@@ -20,10 +20,13 @@
 package org.apache.polygene.bootstrap.builder;
 
 import java.util.ArrayList;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 import java.util.stream.StreamSupport;
 import org.apache.polygene.bootstrap.Assembler;
 import org.apache.polygene.bootstrap.AssemblyException;
+import org.apache.polygene.bootstrap.AssemblyReportException;
 import org.apache.polygene.bootstrap.LayerAssembly;
 import org.apache.polygene.bootstrap.ModuleAssembly;
 
@@ -46,6 +49,7 @@ public class ModuleDeclaration
 
     /**
      * Declare Assembler.
+     *
      * @param assembler Assembler instance
      * @return This Module declaration
      */
@@ -57,6 +61,7 @@ public class ModuleDeclaration
 
     /**
      * Declare Assembler.
+     *
      * @param classname Assembler class name
      * @return This Module declaration
      * @throws AssemblyException if unable to load class, not an Assembler or unable to instanciate
@@ -70,6 +75,7 @@ public class ModuleDeclaration
 
     /**
      * Declare Assembler.
+     *
      * @param assemblerClass Assembler class
      * @return This Module declaration
      * @throws AssemblyException not an Assembler or if unable to instanciate
@@ -86,6 +92,7 @@ public class ModuleDeclaration
      * Declare Assemblers.
      * <p>Declare several Assemblers from an Iterable of Class objects.</p>
      * <p>Typically used along {@link org.apache.polygene.bootstrap.ClassScanner}.</p>
+     *
      * @param assemblerClasses Assembler classes
      * @return This Module declaration
      * @throws AssemblyException if one of the Class is not an Assembler or unable to instantiate
@@ -117,9 +124,21 @@ public class ModuleDeclaration
 
     void initialize()
     {
+        Set<Throwable> problems = new HashSet<>();
         for( Assembler assembler : assemblers )
         {
-            assembler.assemble( module );
+            try
+            {
+                assembler.assemble( module );
+            }
+            catch( Exception e )
+            {
+                problems.add( e );
+            }
+        }
+        if( problems.size() > 0 )
+        {
+            throw new AssemblyReportException( problems );
         }
     }
 

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/ca66f7e7/core/runtime/src/main/java/org/apache/polygene/runtime/bootstrap/ApplicationAssemblyFactoryImpl.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/polygene/runtime/bootstrap/ApplicationAssemblyFactoryImpl.java b/core/runtime/src/main/java/org/apache/polygene/runtime/bootstrap/ApplicationAssemblyFactoryImpl.java
index d55ffd3..3bbac29 100644
--- a/core/runtime/src/main/java/org/apache/polygene/runtime/bootstrap/ApplicationAssemblyFactoryImpl.java
+++ b/core/runtime/src/main/java/org/apache/polygene/runtime/bootstrap/ApplicationAssemblyFactoryImpl.java
@@ -20,9 +20,12 @@
 
 package org.apache.polygene.runtime.bootstrap;
 
+import java.util.HashSet;
+import java.util.Set;
 import org.apache.polygene.bootstrap.ApplicationAssembly;
 import org.apache.polygene.bootstrap.ApplicationAssemblyFactory;
 import org.apache.polygene.bootstrap.Assembler;
+import org.apache.polygene.bootstrap.AssemblyReportException;
 import org.apache.polygene.bootstrap.LayerAssembly;
 import org.apache.polygene.bootstrap.ModuleAssembly;
 
@@ -45,6 +48,7 @@ public final class ApplicationAssemblyFactoryImpl
 
         // Build all layers bottom-up
         LayerAssembly below = null;
+        Set<Throwable> problems = new HashSet<>();
         for( int layer = assemblers.length - 1; layer >= 0; layer-- )
         {
             // Create Layer
@@ -56,7 +60,14 @@ public final class ApplicationAssemblyFactoryImpl
                 for( Assembler assembler : assemblers[ layer ][ module ] )
                 {
                     // Register Assembler
-                    assembler.assemble( moduleAssembly );
+                    try
+                    {
+                        assembler.assemble( moduleAssembly );
+                    }
+                    catch( Exception e )
+                    {
+                        problems.add( e );
+                    }
                 }
             }
             if( below != null )
@@ -65,6 +76,10 @@ public final class ApplicationAssemblyFactoryImpl
             }
             below = layerAssembly;
         }
+        if( problems.size() > 0 )
+        {
+            throw new AssemblyReportException( problems );
+        }
         return applicationAssembly;
     }
 

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/ca66f7e7/core/runtime/src/main/java/org/apache/polygene/runtime/bootstrap/ModuleAssemblyImpl.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/polygene/runtime/bootstrap/ModuleAssemblyImpl.java b/core/runtime/src/main/java/org/apache/polygene/runtime/bootstrap/ModuleAssemblyImpl.java
index d4cfa29..2d43e78 100644
--- a/core/runtime/src/main/java/org/apache/polygene/runtime/bootstrap/ModuleAssemblyImpl.java
+++ b/core/runtime/src/main/java/org/apache/polygene/runtime/bootstrap/ModuleAssemblyImpl.java
@@ -180,15 +180,29 @@ final class ModuleAssemblyImpl
     @Override
     public ServiceDeclaration defaultServices()
     {
+        Set<Throwable> problems = new HashSet<>();
         Class[] assembledServicesTypes = DEFAULT_ASSEMBLERS
             .entrySet()
             .stream()
             .filter(
                 entry -> serviceAssemblies.stream().noneMatch(
                     serviceAssembly -> serviceAssembly.hasType( entry.getKey() ) ) )
-            .peek( entry -> entry.getValue().assemble( this ) )
+            .peek( entry -> {
+                try
+                {
+                    entry.getValue().assemble( this );
+                }
+                catch( Exception e )
+                {
+                    problems.add( e );
+                }
+            } )
             .map( Map.Entry::getKey )
             .toArray( Class[]::new );
+        if( problems.size() > 0 )
+        {
+            throw new AssemblyReportException( problems );
+        }
         return services( assembledServicesTypes );
     }
 
@@ -693,13 +707,27 @@ final class ModuleAssemblyImpl
 
     private void addRequiredAssemblers()
     {
+        Set<Throwable> problems = new HashSet<>( );
         REQUIRED_ASSEMBLERS
             .entrySet()
             .stream()
             .filter(
                 entry -> serviceAssemblies.stream().noneMatch(
                     serviceAssembly -> serviceAssembly.hasType( entry.getKey() ) ) )
-            .forEach( entry -> entry.getValue().assemble( this ) );
+            .forEach( entry -> {
+                try
+                {
+                    entry.getValue().assemble( this );
+                }
+                catch( Exception e )
+                {
+                    problems.add( e );
+                }
+            } );
+        if( problems.size() > 0 )
+        {
+            throw new AssemblyReportException( problems );
+        }
     }
 
     private Identity generateId(Stream<Class<?>> serviceTypes)

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/ca66f7e7/core/runtime/src/main/java/org/apache/polygene/runtime/composite/InterfaceDefaultMethodsMixin.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/polygene/runtime/composite/InterfaceDefaultMethodsMixin.java b/core/runtime/src/main/java/org/apache/polygene/runtime/composite/InterfaceDefaultMethodsMixin.java
index 938cde8..835f74b 100644
--- a/core/runtime/src/main/java/org/apache/polygene/runtime/composite/InterfaceDefaultMethodsMixin.java
+++ b/core/runtime/src/main/java/org/apache/polygene/runtime/composite/InterfaceDefaultMethodsMixin.java
@@ -36,7 +36,7 @@ import static org.apache.polygene.api.util.AccessibleObjects.accessible;
 public class InterfaceDefaultMethodsMixin
     implements InvocationHandler
 {
-    // TODO (niclas): We have one instance of this class per mixin, so it seems a bit wasteful to have a ConcurrentHashMap. Maybe a small array 3 elements, which is changed to a Map is run out of space? Tricky concurrency on that, so leave it for later (a.k.a. will forget about it)
+    // TODO (niclas): We have one instance of this class per mixin, so it seems a bit wasteful to have a ConcurrentHashMap. Maybe a small array 3 elements, which is changed to a Map if run out of space? Tricky concurrency on that, so leave it for later (a.k.a. will forget about it)
     private final ConcurrentMap<Method, MethodCallHandler> methodHandleCache = new ConcurrentHashMap<>();
 
     @This

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/ca66f7e7/core/runtime/src/test/java/org/apache/polygene/api/common/OptionalTest.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/test/java/org/apache/polygene/api/common/OptionalTest.java b/core/runtime/src/test/java/org/apache/polygene/api/common/OptionalTest.java
index 3ff597a..30c4adf 100644
--- a/core/runtime/src/test/java/org/apache/polygene/api/common/OptionalTest.java
+++ b/core/runtime/src/test/java/org/apache/polygene/api/common/OptionalTest.java
@@ -45,7 +45,6 @@ import static org.junit.jupiter.api.Assertions.assertThrows;
 public class OptionalTest extends AbstractPolygeneTest
 {
     public void assemble( ModuleAssembly module )
-        throws AssemblyException
     {
         module.transients( TestComposite.class );
         module.transients( TestComposite2.class );

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/ca66f7e7/core/runtime/src/test/java/org/apache/polygene/api/common/PropertyErrorTest.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/test/java/org/apache/polygene/api/common/PropertyErrorTest.java b/core/runtime/src/test/java/org/apache/polygene/api/common/PropertyErrorTest.java
index 3ccf070..d96ce05 100644
--- a/core/runtime/src/test/java/org/apache/polygene/api/common/PropertyErrorTest.java
+++ b/core/runtime/src/test/java/org/apache/polygene/api/common/PropertyErrorTest.java
@@ -39,7 +39,6 @@ public class PropertyErrorTest
     extends AbstractPolygeneTest
 {
     public void assemble( ModuleAssembly module )
-        throws AssemblyException
     {
         new EntityTestAssembler().assemble( module );
         module.entities( PersonEntity.class );

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/ca66f7e7/core/runtime/src/test/java/org/apache/polygene/api/common/PropertyTypeTest.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/test/java/org/apache/polygene/api/common/PropertyTypeTest.java b/core/runtime/src/test/java/org/apache/polygene/api/common/PropertyTypeTest.java
index 791563b..1f3c5fb 100644
--- a/core/runtime/src/test/java/org/apache/polygene/api/common/PropertyTypeTest.java
+++ b/core/runtime/src/test/java/org/apache/polygene/api/common/PropertyTypeTest.java
@@ -44,7 +44,6 @@ public class PropertyTypeTest
     extends AbstractPolygeneTest
 {
     public void assemble( ModuleAssembly module )
-        throws AssemblyException
     {
         new EntityTestAssembler().assemble( module );
         module.entities( PersonEntity.class );

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/ca66f7e7/core/runtime/src/test/java/org/apache/polygene/api/common/RemovalTest.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/test/java/org/apache/polygene/api/common/RemovalTest.java b/core/runtime/src/test/java/org/apache/polygene/api/common/RemovalTest.java
index 3b9adc1..d8f3d13 100644
--- a/core/runtime/src/test/java/org/apache/polygene/api/common/RemovalTest.java
+++ b/core/runtime/src/test/java/org/apache/polygene/api/common/RemovalTest.java
@@ -36,7 +36,6 @@ public class RemovalTest
     extends AbstractPolygeneTest
 {
     public void assemble( ModuleAssembly module )
-        throws AssemblyException
     {
         module.entities( TestEntity.class );
         module.entities( PidRegulator.class );

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/ca66f7e7/core/runtime/src/test/java/org/apache/polygene/api/common/ValueCompositeTest.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/test/java/org/apache/polygene/api/common/ValueCompositeTest.java b/core/runtime/src/test/java/org/apache/polygene/api/common/ValueCompositeTest.java
index cf01570..4a80271 100644
--- a/core/runtime/src/test/java/org/apache/polygene/api/common/ValueCompositeTest.java
+++ b/core/runtime/src/test/java/org/apache/polygene/api/common/ValueCompositeTest.java
@@ -49,7 +49,6 @@ public class ValueCompositeTest
 {
 
     public void assemble( ModuleAssembly module )
-        throws AssemblyException
     {
         module.values( SomeValue.class, AnotherValue.class );
         module.entities( SomeEntity.class );

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/ca66f7e7/core/runtime/src/test/java/org/apache/polygene/runtime/composite/InterfaceDefaultMethodsTest.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/test/java/org/apache/polygene/runtime/composite/InterfaceDefaultMethodsTest.java b/core/runtime/src/test/java/org/apache/polygene/runtime/composite/InterfaceDefaultMethodsTest.java
index f8f150b..76a469a 100644
--- a/core/runtime/src/test/java/org/apache/polygene/runtime/composite/InterfaceDefaultMethodsTest.java
+++ b/core/runtime/src/test/java/org/apache/polygene/runtime/composite/InterfaceDefaultMethodsTest.java
@@ -45,12 +45,12 @@ import static org.hamcrest.Matchers.equalTo;
  */
 public class InterfaceDefaultMethodsTest extends AbstractPolygeneTest
 {
-    @BeforeAll
-    public static void assumeJavaVersionIs8()
-    {
-        assumeJavaVersion( 8 );
-    }
-
+//    @BeforeAll
+//    public static void assumeJavaVersionIs8()
+//    {
+//        assumeJavaVersion( 8 );
+//    }
+//
     public interface DefaultMethods
     {
         @UseDefaults( "Hello" )

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/ca66f7e7/core/runtime/src/test/java/org/apache/polygene/test/performance/entitystore/memory/MemoryEntityStoreTest.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/test/java/org/apache/polygene/test/performance/entitystore/memory/MemoryEntityStoreTest.java b/core/runtime/src/test/java/org/apache/polygene/test/performance/entitystore/memory/MemoryEntityStoreTest.java
index 2036424..7615bbc 100644
--- a/core/runtime/src/test/java/org/apache/polygene/test/performance/entitystore/memory/MemoryEntityStoreTest.java
+++ b/core/runtime/src/test/java/org/apache/polygene/test/performance/entitystore/memory/MemoryEntityStoreTest.java
@@ -37,7 +37,7 @@ public class MemoryEntityStoreTest
 {
     @Override
     public void assemble( ModuleAssembly module )
-        throws AssemblyException
+        throws Exception
     {
         super.assemble( module );
 

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/ca66f7e7/core/testsupport/src/main/java/org/apache/polygene/test/AbstractPolygeneBaseTest.java
----------------------------------------------------------------------
diff --git a/core/testsupport/src/main/java/org/apache/polygene/test/AbstractPolygeneBaseTest.java b/core/testsupport/src/main/java/org/apache/polygene/test/AbstractPolygeneBaseTest.java
index e3ce0ca..8af2adf 100644
--- a/core/testsupport/src/main/java/org/apache/polygene/test/AbstractPolygeneBaseTest.java
+++ b/core/testsupport/src/main/java/org/apache/polygene/test/AbstractPolygeneBaseTest.java
@@ -19,12 +19,14 @@
  */
 package org.apache.polygene.test;
 
+import java.util.Collections;
 import org.apache.polygene.api.PolygeneAPI;
 import org.apache.polygene.api.structure.Application;
 import org.apache.polygene.api.structure.ApplicationDescriptor;
 import org.apache.polygene.bootstrap.ApplicationAssembler;
 import org.apache.polygene.bootstrap.ApplicationAssembly;
 import org.apache.polygene.bootstrap.AssemblyException;
+import org.apache.polygene.bootstrap.AssemblyReportException;
 import org.apache.polygene.bootstrap.Energy4Java;
 import org.apache.polygene.spi.PolygeneSPI;
 import org.junit.jupiter.api.AfterEach;
@@ -56,15 +58,15 @@ public abstract class AbstractPolygeneBaseTest
         application.activate();
     }
 
-    /** Called by the superclass for the test to define the entire application, every layer, every module and all
+    /**
+     * Called by the superclass for the test to define the entire application, every layer, every module and all
      * the contents of each module.
      *
      * @param applicationAssembly the {@link org.apache.polygene.bootstrap.ApplicationAssembly} to be populated.
-     *
      * @throws AssemblyException on invalid assembly
      */
     protected abstract void defineApplication( ApplicationAssembly applicationAssembly )
-        throws AssemblyException;
+        throws Exception;
 
     protected Application newApplicationInstance( ApplicationDescriptor applicationModel )
     {
@@ -78,7 +80,14 @@ public abstract class AbstractPolygeneBaseTest
         {
             ApplicationAssembly applicationAssembly = applicationFactory.newApplicationAssembly();
             applicationAssembly.setMode( Application.Mode.test );
-            defineApplication( applicationAssembly );
+            try
+            {
+                defineApplication( applicationAssembly );
+            }
+            catch( Exception e )
+            {
+                throw new AssemblyReportException( Collections.singleton( e ) );
+            }
             return applicationAssembly;
         };
 
@@ -98,8 +107,8 @@ public abstract class AbstractPolygeneBaseTest
      * <p>
      * Override this method to catch valid failures to place into satisfiedBy suites.
      * </p>
-     * @param exception the exception thrown.
      *
+     * @param exception the exception thrown.
      * @throws org.apache.polygene.bootstrap.AssemblyException The default implementation of this method will simply re-throw the exception.
      */
     protected void assemblyException( AssemblyException exception )
@@ -121,7 +130,8 @@ public abstract class AbstractPolygeneBaseTest
             try
             {
                 application.passivate();
-            } catch( Exception e )
+            }
+            catch( Exception e )
             {
                 throw new RuntimeException( "Unable to shut down test harness cleanly.", e );
             }

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/ca66f7e7/core/testsupport/src/main/java/org/apache/polygene/test/AbstractPolygeneTest.java
----------------------------------------------------------------------
diff --git a/core/testsupport/src/main/java/org/apache/polygene/test/AbstractPolygeneTest.java b/core/testsupport/src/main/java/org/apache/polygene/test/AbstractPolygeneTest.java
index ded4f4a..89945e9 100644
--- a/core/testsupport/src/main/java/org/apache/polygene/test/AbstractPolygeneTest.java
+++ b/core/testsupport/src/main/java/org/apache/polygene/test/AbstractPolygeneTest.java
@@ -80,6 +80,7 @@ public abstract class AbstractPolygeneTest extends AbstractPolygeneBaseTest
 
     @Override
     protected void defineApplication( ApplicationAssembly applicationAssembly )
+        throws Exception
     {
         LayerAssembly layer = applicationAssembly.layer( "Layer 1" );
         ModuleAssembly module = layer.module( "Module 1" );

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/ca66f7e7/core/testsupport/src/main/java/org/apache/polygene/test/PolygeneUnitExtension.java
----------------------------------------------------------------------
diff --git a/core/testsupport/src/main/java/org/apache/polygene/test/PolygeneUnitExtension.java b/core/testsupport/src/main/java/org/apache/polygene/test/PolygeneUnitExtension.java
index e5c71b4..e085d52 100644
--- a/core/testsupport/src/main/java/org/apache/polygene/test/PolygeneUnitExtension.java
+++ b/core/testsupport/src/main/java/org/apache/polygene/test/PolygeneUnitExtension.java
@@ -85,6 +85,7 @@ public class PolygeneUnitExtension
         {
             @Override
             public void assemble( ModuleAssembly module )
+                throws Exception
             {
                 super.assemble( module );
                 module.objects( context.getRequiredTestClass() );

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/ca66f7e7/core/testsupport/src/main/java/org/apache/polygene/test/cache/AbstractEntityStoreWithCacheTest.java
----------------------------------------------------------------------
diff --git a/core/testsupport/src/main/java/org/apache/polygene/test/cache/AbstractEntityStoreWithCacheTest.java b/core/testsupport/src/main/java/org/apache/polygene/test/cache/AbstractEntityStoreWithCacheTest.java
index 341fd2c..1c354ac 100644
--- a/core/testsupport/src/main/java/org/apache/polygene/test/cache/AbstractEntityStoreWithCacheTest.java
+++ b/core/testsupport/src/main/java/org/apache/polygene/test/cache/AbstractEntityStoreWithCacheTest.java
@@ -42,6 +42,7 @@ public abstract class AbstractEntityStoreWithCacheTest
 
     @Override
     public void assemble( ModuleAssembly module )
+        throws Exception
     {
         super.assemble( module );
         assembleCachePool( module );

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/ca66f7e7/core/testsupport/src/main/java/org/apache/polygene/test/entity/AbstractEntityStoreTest.java
----------------------------------------------------------------------
diff --git a/core/testsupport/src/main/java/org/apache/polygene/test/entity/AbstractEntityStoreTest.java b/core/testsupport/src/main/java/org/apache/polygene/test/entity/AbstractEntityStoreTest.java
index 0b67ded..099a98e 100644
--- a/core/testsupport/src/main/java/org/apache/polygene/test/entity/AbstractEntityStoreTest.java
+++ b/core/testsupport/src/main/java/org/apache/polygene/test/entity/AbstractEntityStoreTest.java
@@ -82,6 +82,7 @@ public abstract class AbstractEntityStoreTest
 
     @Override
     public void assemble( ModuleAssembly module )
+        throws Exception
     {
         module.entities( TestEntity.class );
         module.values( TestValue.class, TestValue2.class, TjabbaValue.class );

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/ca66f7e7/core/testsupport/src/main/java/org/apache/polygene/test/metrics/AbstractPolygeneMetricsTest.java
----------------------------------------------------------------------
diff --git a/core/testsupport/src/main/java/org/apache/polygene/test/metrics/AbstractPolygeneMetricsTest.java b/core/testsupport/src/main/java/org/apache/polygene/test/metrics/AbstractPolygeneMetricsTest.java
index 2e21e79..2c6c326 100644
--- a/core/testsupport/src/main/java/org/apache/polygene/test/metrics/AbstractPolygeneMetricsTest.java
+++ b/core/testsupport/src/main/java/org/apache/polygene/test/metrics/AbstractPolygeneMetricsTest.java
@@ -180,6 +180,7 @@ public abstract class AbstractPolygeneMetricsTest extends AbstractPolygeneBaseTe
 
     @Override
     protected final void defineApplication( ApplicationAssembly app )
+        throws Exception
     {
         app.setName( "app" );
 

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/ca66f7e7/core/testsupport/src/main/java/org/apache/polygene/test/metrics/AbstractTimingCaptureTest.java
----------------------------------------------------------------------
diff --git a/core/testsupport/src/main/java/org/apache/polygene/test/metrics/AbstractTimingCaptureTest.java b/core/testsupport/src/main/java/org/apache/polygene/test/metrics/AbstractTimingCaptureTest.java
index db4405b..83f04b3 100644
--- a/core/testsupport/src/main/java/org/apache/polygene/test/metrics/AbstractTimingCaptureTest.java
+++ b/core/testsupport/src/main/java/org/apache/polygene/test/metrics/AbstractTimingCaptureTest.java
@@ -40,6 +40,7 @@ public abstract class AbstractTimingCaptureTest extends AbstractPolygeneTest
 
     @Override
     public void assemble( ModuleAssembly module )
+        throws Exception
     {
         module.layer().application().setName( "SomeApplication" );
         module.transients( Country1.class );

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/ca66f7e7/extensions/entitystore-berkeleydb/src/test/java/org/apache/polygene/entitystore/berkeleydb/BdbJeEntityStoreTest.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-berkeleydb/src/test/java/org/apache/polygene/entitystore/berkeleydb/BdbJeEntityStoreTest.java b/extensions/entitystore-berkeleydb/src/test/java/org/apache/polygene/entitystore/berkeleydb/BdbJeEntityStoreTest.java
index 7dbcb3d..ccdc1b0 100644
--- a/extensions/entitystore-berkeleydb/src/test/java/org/apache/polygene/entitystore/berkeleydb/BdbJeEntityStoreTest.java
+++ b/extensions/entitystore-berkeleydb/src/test/java/org/apache/polygene/entitystore/berkeleydb/BdbJeEntityStoreTest.java
@@ -39,7 +39,7 @@ public class BdbJeEntityStoreTest
 
     @Override
     public void assemble( ModuleAssembly module )
-        throws AssemblyException
+        throws Exception
     {
         super.assemble( module );
 

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/ca66f7e7/extensions/entitystore-cassandra/src/test/java/org/apache/polygene/entitystore/cassandra/CassandraEntityStoreTest.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-cassandra/src/test/java/org/apache/polygene/entitystore/cassandra/CassandraEntityStoreTest.java b/extensions/entitystore-cassandra/src/test/java/org/apache/polygene/entitystore/cassandra/CassandraEntityStoreTest.java
index 8ab161e..5785859 100644
--- a/extensions/entitystore-cassandra/src/test/java/org/apache/polygene/entitystore/cassandra/CassandraEntityStoreTest.java
+++ b/extensions/entitystore-cassandra/src/test/java/org/apache/polygene/entitystore/cassandra/CassandraEntityStoreTest.java
@@ -45,7 +45,7 @@ public class CassandraEntityStoreTest
     @Override
     // START SNIPPET: assembly
     public void assemble( ModuleAssembly module )
-        throws AssemblyException
+        throws Exception
     {
         // END SNIPPET: assembly
         super.assemble( module );
@@ -63,7 +63,8 @@ public class CassandraEntityStoreTest
         CassandraEntityStoreConfiguration cassandraDefaults = config.forMixin( CassandraEntityStoreConfiguration.class ).declareDefaults();
         String host = "localhost";
         int port = 8801;
-        System.out.println("Cassandra: " + host + ":" + port);
+        // TODO: Logging system output here.
+//        System.out.println("Cassandra: " + host + ":" + port);
         cassandraDefaults.hostnames().set( host + ':' + port );
         cassandraDefaults.createIfMissing().set( true );
         // START SNIPPET: assembly

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/ca66f7e7/extensions/entitystore-file/src/test/java/org/apache/polygene/entitystore/file/FileEntityStoreTest.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-file/src/test/java/org/apache/polygene/entitystore/file/FileEntityStoreTest.java b/extensions/entitystore-file/src/test/java/org/apache/polygene/entitystore/file/FileEntityStoreTest.java
index 97c0c0d..a9e2a7c 100644
--- a/extensions/entitystore-file/src/test/java/org/apache/polygene/entitystore/file/FileEntityStoreTest.java
+++ b/extensions/entitystore-file/src/test/java/org/apache/polygene/entitystore/file/FileEntityStoreTest.java
@@ -39,10 +39,9 @@ public class FileEntityStoreTest
     @Override
     // START SNIPPET: assembly
     public void assemble( ModuleAssembly module )
-        throws AssemblyException
+        throws Exception
     {
         // END SNIPPET: assembly
-        super.assemble( module );
         new FileConfigurationAssembler()
             .withOverride( new FileConfigurationOverride().withConventionalRoot( tmpDir.getRoot() ) )
             .assemble( module );
@@ -50,6 +49,7 @@ public class FileEntityStoreTest
         new EntityTestAssembler().defaultServicesVisibleIn( Visibility.layer ).assemble( config );
         // START SNIPPET: assembly
         new FileEntityStoreAssembler().withConfig( config, Visibility.layer ).assemble( module );
+        super.assemble( module );
     }
     // END SNIPPET: assembly
 }

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/ca66f7e7/extensions/entitystore-file/src/test/java/org/apache/polygene/entitystore/file/FileEntityStoreWithCacheTest.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-file/src/test/java/org/apache/polygene/entitystore/file/FileEntityStoreWithCacheTest.java b/extensions/entitystore-file/src/test/java/org/apache/polygene/entitystore/file/FileEntityStoreWithCacheTest.java
index d887994..e05dd73 100644
--- a/extensions/entitystore-file/src/test/java/org/apache/polygene/entitystore/file/FileEntityStoreWithCacheTest.java
+++ b/extensions/entitystore-file/src/test/java/org/apache/polygene/entitystore/file/FileEntityStoreWithCacheTest.java
@@ -38,7 +38,7 @@ public class FileEntityStoreWithCacheTest
 
     @Override
     public void assemble( ModuleAssembly module )
-        throws AssemblyException
+        throws Exception
     {
         super.assemble( module );
         new FileConfigurationAssembler()

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/ca66f7e7/extensions/entitystore-geode/src/test/java/org/apache/polygene/entitystore/geode/GeodeEntityStoreTest.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-geode/src/test/java/org/apache/polygene/entitystore/geode/GeodeEntityStoreTest.java b/extensions/entitystore-geode/src/test/java/org/apache/polygene/entitystore/geode/GeodeEntityStoreTest.java
index efd4dc1..c4b1833 100644
--- a/extensions/entitystore-geode/src/test/java/org/apache/polygene/entitystore/geode/GeodeEntityStoreTest.java
+++ b/extensions/entitystore-geode/src/test/java/org/apache/polygene/entitystore/geode/GeodeEntityStoreTest.java
@@ -32,7 +32,7 @@ public class GeodeEntityStoreTest
     @Override
     // START SNIPPET: assembly
     public void assemble( ModuleAssembly module )
-        throws AssemblyException
+        throws Exception
     {
         // END SNIPPET: assembly
         super.assemble( module );

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/ca66f7e7/extensions/entitystore-geode/src/test/java/org/apache/polygene/entitystore/geode/GeodeEntityStoreWithCacheTest.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-geode/src/test/java/org/apache/polygene/entitystore/geode/GeodeEntityStoreWithCacheTest.java b/extensions/entitystore-geode/src/test/java/org/apache/polygene/entitystore/geode/GeodeEntityStoreWithCacheTest.java
index eed1c87..1281a3b 100644
--- a/extensions/entitystore-geode/src/test/java/org/apache/polygene/entitystore/geode/GeodeEntityStoreWithCacheTest.java
+++ b/extensions/entitystore-geode/src/test/java/org/apache/polygene/entitystore/geode/GeodeEntityStoreWithCacheTest.java
@@ -31,7 +31,7 @@ public class GeodeEntityStoreWithCacheTest
 {
     @Override
     public void assemble( ModuleAssembly module )
-            throws AssemblyException
+            throws Exception
     {
         super.assemble( module );
         ModuleAssembly config = module.layer().module( "config" );

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/ca66f7e7/extensions/entitystore-hazelcast/src/test/java/org/apache/polygene/entitystore/hazelcast/HazelcastEntityStoreTest.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-hazelcast/src/test/java/org/apache/polygene/entitystore/hazelcast/HazelcastEntityStoreTest.java b/extensions/entitystore-hazelcast/src/test/java/org/apache/polygene/entitystore/hazelcast/HazelcastEntityStoreTest.java
index 3492d5e..b836f49 100644
--- a/extensions/entitystore-hazelcast/src/test/java/org/apache/polygene/entitystore/hazelcast/HazelcastEntityStoreTest.java
+++ b/extensions/entitystore-hazelcast/src/test/java/org/apache/polygene/entitystore/hazelcast/HazelcastEntityStoreTest.java
@@ -36,7 +36,7 @@ public class HazelcastEntityStoreTest
     @Override
     // START SNIPPET: assembly
     public void assemble( ModuleAssembly module )
-        throws AssemblyException
+        throws Exception
     {
         // END SNIPPET: assembly
         super.assemble( module );

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/ca66f7e7/extensions/entitystore-hazelcast/src/test/java/org/apache/polygene/entitystore/hazelcast/HazelcastEntityStoreWithCacheTest.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-hazelcast/src/test/java/org/apache/polygene/entitystore/hazelcast/HazelcastEntityStoreWithCacheTest.java b/extensions/entitystore-hazelcast/src/test/java/org/apache/polygene/entitystore/hazelcast/HazelcastEntityStoreWithCacheTest.java
index d9c76ec..58c5f19 100644
--- a/extensions/entitystore-hazelcast/src/test/java/org/apache/polygene/entitystore/hazelcast/HazelcastEntityStoreWithCacheTest.java
+++ b/extensions/entitystore-hazelcast/src/test/java/org/apache/polygene/entitystore/hazelcast/HazelcastEntityStoreWithCacheTest.java
@@ -31,7 +31,7 @@ public class HazelcastEntityStoreWithCacheTest
 {
     @Override
     public void assemble( ModuleAssembly module )
-        throws AssemblyException
+        throws Exception
     {
         super.assemble( module );
         ModuleAssembly config = module.layer().module( "config" );

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/ca66f7e7/extensions/entitystore-jclouds/src/test/java/org/apache/polygene/entitystore/jclouds/JCloudsFilesystemTest.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-jclouds/src/test/java/org/apache/polygene/entitystore/jclouds/JCloudsFilesystemTest.java b/extensions/entitystore-jclouds/src/test/java/org/apache/polygene/entitystore/jclouds/JCloudsFilesystemTest.java
index 157acba..334ca18 100644
--- a/extensions/entitystore-jclouds/src/test/java/org/apache/polygene/entitystore/jclouds/JCloudsFilesystemTest.java
+++ b/extensions/entitystore-jclouds/src/test/java/org/apache/polygene/entitystore/jclouds/JCloudsFilesystemTest.java
@@ -31,13 +31,13 @@ import org.jclouds.filesystem.reference.FilesystemConstants;
 import org.junit.jupiter.api.extension.ExtendWith;
 
 @ExtendWith( TemporaryFolder.class )
-public class JCloudsFilesystemTest
-    extends AbstractEntityStoreTest
+public class JCloudsFilesystemTest extends AbstractEntityStoreTest
 {
     private TemporaryFolder tmpDir;
 
     @Override
     public void assemble( ModuleAssembly module )
+        throws Exception
     {
         super.assemble( module );
         ModuleAssembly config = module.layer().module( "config" );

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/ca66f7e7/extensions/entitystore-jclouds/src/test/java/org/apache/polygene/entitystore/jclouds/JCloudsS3Test.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-jclouds/src/test/java/org/apache/polygene/entitystore/jclouds/JCloudsS3Test.java b/extensions/entitystore-jclouds/src/test/java/org/apache/polygene/entitystore/jclouds/JCloudsS3Test.java
index 664acdb..4a2dd6c 100644
--- a/extensions/entitystore-jclouds/src/test/java/org/apache/polygene/entitystore/jclouds/JCloudsS3Test.java
+++ b/extensions/entitystore-jclouds/src/test/java/org/apache/polygene/entitystore/jclouds/JCloudsS3Test.java
@@ -29,9 +29,9 @@ import org.apache.polygene.entitystore.jclouds.assembly.JCloudsEntityStoreAssemb
 import org.apache.polygene.test.EntityTestAssembler;
 import org.apache.polygene.test.entity.AbstractEntityStoreTest;
 
-@Docker( image = "s3server",
-         ports = @Port( exposed = 8801, inner = 8000),
-         waitFor = @WaitFor( value = "server started", timeoutInMillis = 30000),
+@Docker( image = "scality/s3server",
+         ports = @Port( exposed = 8801, inner = 8000 ),
+         waitFor = @WaitFor( value = "server started", timeoutInMillis = 30000 ),
          environments = {
              @Environment( key = "SCALITY_ACCESS_KEY_ID", value = "dummyIdentifier" ),
              @Environment( key = "SCALITY_SECRET_ACCESS_KEY", value = "dummyCredential" )
@@ -40,10 +40,14 @@ import org.apache.polygene.test.entity.AbstractEntityStoreTest;
 )
 public class JCloudsS3Test extends AbstractEntityStoreTest
 {
+    static long time = 240000;
 
     @Override
     public void assemble( ModuleAssembly module )
+        throws Exception
     {
+        Thread.sleep( time );
+        time = 0;
         super.assemble( module );
         ModuleAssembly config = module.layer().module( "config" );
         new EntityTestAssembler().defaultServicesVisibleIn( Visibility.layer ).assemble( config );

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/ca66f7e7/extensions/entitystore-jclouds/src/test/java/org/apache/polygene/entitystore/jclouds/JCloudsTransientTest.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-jclouds/src/test/java/org/apache/polygene/entitystore/jclouds/JCloudsTransientTest.java b/extensions/entitystore-jclouds/src/test/java/org/apache/polygene/entitystore/jclouds/JCloudsTransientTest.java
index c47b2e1..3f2f04d 100644
--- a/extensions/entitystore-jclouds/src/test/java/org/apache/polygene/entitystore/jclouds/JCloudsTransientTest.java
+++ b/extensions/entitystore-jclouds/src/test/java/org/apache/polygene/entitystore/jclouds/JCloudsTransientTest.java
@@ -26,11 +26,11 @@ import org.apache.polygene.entitystore.jclouds.assembly.JCloudsEntityStoreAssemb
 import org.apache.polygene.test.EntityTestAssembler;
 import org.apache.polygene.test.entity.AbstractEntityStoreTest;
 
-public class JCloudsTransientTest
-        extends AbstractEntityStoreTest
+public class JCloudsTransientTest extends AbstractEntityStoreTest
 {
     @Override
     public void assemble( ModuleAssembly module )
+        throws Exception
     {
         super.assemble( module );
         ModuleAssembly config = module.layer().module( "config" );

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/ca66f7e7/extensions/entitystore-jclouds/src/test/java/org/apache/polygene/entitystore/jclouds/JCloudsWithCacheTest.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-jclouds/src/test/java/org/apache/polygene/entitystore/jclouds/JCloudsWithCacheTest.java b/extensions/entitystore-jclouds/src/test/java/org/apache/polygene/entitystore/jclouds/JCloudsWithCacheTest.java
index 30ae92b..2d8dfcd 100644
--- a/extensions/entitystore-jclouds/src/test/java/org/apache/polygene/entitystore/jclouds/JCloudsWithCacheTest.java
+++ b/extensions/entitystore-jclouds/src/test/java/org/apache/polygene/entitystore/jclouds/JCloudsWithCacheTest.java
@@ -31,7 +31,7 @@ public class JCloudsWithCacheTest
 {
     @Override
     public void assemble( ModuleAssembly module )
-        throws AssemblyException
+        throws Exception
     {
         super.assemble( module );
         ModuleAssembly config = module.layer().module( "config" );

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/ca66f7e7/extensions/entitystore-jdbm/src/test/java/org/apache/polygene/entitystore/jdbm/JdbmEntityStoreTest.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-jdbm/src/test/java/org/apache/polygene/entitystore/jdbm/JdbmEntityStoreTest.java b/extensions/entitystore-jdbm/src/test/java/org/apache/polygene/entitystore/jdbm/JdbmEntityStoreTest.java
index 466a776..61729fe 100644
--- a/extensions/entitystore-jdbm/src/test/java/org/apache/polygene/entitystore/jdbm/JdbmEntityStoreTest.java
+++ b/extensions/entitystore-jdbm/src/test/java/org/apache/polygene/entitystore/jdbm/JdbmEntityStoreTest.java
@@ -31,23 +31,25 @@ import org.apache.polygene.test.entity.AbstractEntityStoreTest;
 import org.junit.jupiter.api.extension.ExtendWith;
 
 @ExtendWith( TemporaryFolder.class )
-public class JdbmEntityStoreTest
-    extends AbstractEntityStoreTest
+public class JdbmEntityStoreTest extends AbstractEntityStoreTest
 {
     private TemporaryFolder tmpDir;
 
     @Override
     public void assemble( ModuleAssembly module )
-        throws AssemblyException
+        throws Exception
     {
-        super.assemble( module );
-
         ModuleAssembly config = module.layer().module( "config" );
-        new EntityTestAssembler().defaultServicesVisibleIn( Visibility.layer ).assemble( config );
+        new EntityTestAssembler()
+            .defaultServicesVisibleIn( Visibility.layer )
+            .assemble( config );
 
         new FileConfigurationAssembler()
             .withOverride( new FileConfigurationOverride().withConventionalRoot( tmpDir.getRoot() ) )
             .assemble( module );
+
         new JdbmEntityStoreAssembler().withConfig( config, Visibility.layer ).assemble( module );
+
+        super.assemble( module );
     }
 }

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/ca66f7e7/extensions/entitystore-jdbm/src/test/java/org/apache/polygene/entitystore/jdbm/JdbmEntityStoreWithCacheTest.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-jdbm/src/test/java/org/apache/polygene/entitystore/jdbm/JdbmEntityStoreWithCacheTest.java b/extensions/entitystore-jdbm/src/test/java/org/apache/polygene/entitystore/jdbm/JdbmEntityStoreWithCacheTest.java
index ed71509..3a39f67 100644
--- a/extensions/entitystore-jdbm/src/test/java/org/apache/polygene/entitystore/jdbm/JdbmEntityStoreWithCacheTest.java
+++ b/extensions/entitystore-jdbm/src/test/java/org/apache/polygene/entitystore/jdbm/JdbmEntityStoreWithCacheTest.java
@@ -31,14 +31,13 @@ import org.apache.polygene.test.cache.AbstractEntityStoreWithCacheTest;
 import org.junit.jupiter.api.extension.ExtendWith;
 
 @ExtendWith( TemporaryFolder.class )
-public class JdbmEntityStoreWithCacheTest
-    extends AbstractEntityStoreWithCacheTest
+public class JdbmEntityStoreWithCacheTest extends AbstractEntityStoreWithCacheTest
 {
     private TemporaryFolder tmpDir;
 
     @Override
     public void assemble( ModuleAssembly module )
-        throws AssemblyException
+        throws Exception
     {
         super.assemble( module );
 

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/ca66f7e7/extensions/entitystore-leveldb/src/test/java/org/apache/polygene/entitystore/leveldb/JavaLevelDBEntityStoreTest.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-leveldb/src/test/java/org/apache/polygene/entitystore/leveldb/JavaLevelDBEntityStoreTest.java b/extensions/entitystore-leveldb/src/test/java/org/apache/polygene/entitystore/leveldb/JavaLevelDBEntityStoreTest.java
index 762e7dc..738bedc 100644
--- a/extensions/entitystore-leveldb/src/test/java/org/apache/polygene/entitystore/leveldb/JavaLevelDBEntityStoreTest.java
+++ b/extensions/entitystore-leveldb/src/test/java/org/apache/polygene/entitystore/leveldb/JavaLevelDBEntityStoreTest.java
@@ -31,20 +31,22 @@ import org.apache.polygene.test.entity.AbstractEntityStoreTest;
 import org.junit.jupiter.api.extension.ExtendWith;
 
 @ExtendWith( TemporaryFolder.class )
-public class JavaLevelDBEntityStoreTest
-    extends AbstractEntityStoreTest
+public class JavaLevelDBEntityStoreTest extends AbstractEntityStoreTest
 {
     private TemporaryFolder tmpDir;
 
     @Override
     // START SNIPPET: assembly
     public void assemble( ModuleAssembly module )
-        throws AssemblyException
+        throws Exception
     {
         // END SNIPPET: assembly
         super.assemble( module );
         ModuleAssembly config = module.layer().module( "config" );
-        new EntityTestAssembler().defaultServicesVisibleIn( Visibility.layer ).assemble( config );
+
+        new EntityTestAssembler()
+            .defaultServicesVisibleIn( Visibility.layer )
+            .assemble( config );
 
         new FileConfigurationAssembler()
             .withOverride( new FileConfigurationOverride().withConventionalRoot( tmpDir.getRoot() ) )

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/ca66f7e7/extensions/entitystore-leveldb/src/test/java/org/apache/polygene/entitystore/leveldb/LevelDBEntityStoreWithCacheTest.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-leveldb/src/test/java/org/apache/polygene/entitystore/leveldb/LevelDBEntityStoreWithCacheTest.java b/extensions/entitystore-leveldb/src/test/java/org/apache/polygene/entitystore/leveldb/LevelDBEntityStoreWithCacheTest.java
index fb54981..f331115 100644
--- a/extensions/entitystore-leveldb/src/test/java/org/apache/polygene/entitystore/leveldb/LevelDBEntityStoreWithCacheTest.java
+++ b/extensions/entitystore-leveldb/src/test/java/org/apache/polygene/entitystore/leveldb/LevelDBEntityStoreWithCacheTest.java
@@ -20,7 +20,6 @@
 package org.apache.polygene.entitystore.leveldb;
 
 import org.apache.polygene.api.common.Visibility;
-import org.apache.polygene.bootstrap.AssemblyException;
 import org.apache.polygene.bootstrap.ModuleAssembly;
 import org.apache.polygene.entitystore.leveldb.assembly.LevelDBEntityStoreAssembler;
 import org.apache.polygene.library.fileconfig.FileConfigurationAssembler;
@@ -31,26 +30,26 @@ import org.apache.polygene.test.cache.AbstractEntityStoreWithCacheTest;
 import org.junit.jupiter.api.extension.ExtendWith;
 
 @ExtendWith( TemporaryFolder.class )
-public class LevelDBEntityStoreWithCacheTest
-    extends AbstractEntityStoreWithCacheTest
+public class LevelDBEntityStoreWithCacheTest extends AbstractEntityStoreWithCacheTest
 {
     private TemporaryFolder tmpDir;
 
     @Override
     public void assemble( ModuleAssembly module )
-        throws AssemblyException
+        throws Exception
     {
         super.assemble( module );
         ModuleAssembly config = module.layer().module( "config" );
-        new EntityTestAssembler().defaultServicesVisibleIn( Visibility.layer ).assemble( config );
+        new EntityTestAssembler()
+            .defaultServicesVisibleIn( Visibility.layer )
+            .assemble( config );
 
         new FileConfigurationAssembler()
             .withOverride( new FileConfigurationOverride().withConventionalRoot( tmpDir.getRoot() ) )
             .assemble( module );
 
-        new LevelDBEntityStoreAssembler().
-                                             withConfig( config, Visibility.layer ).
-                                             identifiedBy( "java-leveldb-entitystore" ).
-                                             assemble( module );
+        new LevelDBEntityStoreAssembler().withConfig( config, Visibility.layer )
+                                         .identifiedBy( "java-leveldb-entitystore" )
+                                         .assemble( module );
     }
 }

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/ca66f7e7/extensions/entitystore-memory/src/test/java/org/apache/polygene/entitystore/memory/MemoryEntityStoreTest.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-memory/src/test/java/org/apache/polygene/entitystore/memory/MemoryEntityStoreTest.java b/extensions/entitystore-memory/src/test/java/org/apache/polygene/entitystore/memory/MemoryEntityStoreTest.java
index 5c1c08a..6d41aa4 100644
--- a/extensions/entitystore-memory/src/test/java/org/apache/polygene/entitystore/memory/MemoryEntityStoreTest.java
+++ b/extensions/entitystore-memory/src/test/java/org/apache/polygene/entitystore/memory/MemoryEntityStoreTest.java
@@ -23,12 +23,12 @@ import org.apache.polygene.bootstrap.ModuleAssembly;
 import org.apache.polygene.entitystore.memory.assembly.MemoryEntityStoreAssembler;
 import org.apache.polygene.test.entity.AbstractEntityStoreTest;
 
-public class MemoryEntityStoreTest
-    extends AbstractEntityStoreTest
+public class MemoryEntityStoreTest extends AbstractEntityStoreTest
 {
     // START SNIPPET: assembly
     @Override
     public void assemble( ModuleAssembly module )
+        throws Exception
     {
         new MemoryEntityStoreAssembler().assemble( module );
         // END SNIPPET: assembly

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/ca66f7e7/extensions/entitystore-memory/src/test/java/org/apache/polygene/entitystore/memory/MemoryEntityStoreWithCacheTest.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-memory/src/test/java/org/apache/polygene/entitystore/memory/MemoryEntityStoreWithCacheTest.java b/extensions/entitystore-memory/src/test/java/org/apache/polygene/entitystore/memory/MemoryEntityStoreWithCacheTest.java
index 3d51b2c..9d51be6 100644
--- a/extensions/entitystore-memory/src/test/java/org/apache/polygene/entitystore/memory/MemoryEntityStoreWithCacheTest.java
+++ b/extensions/entitystore-memory/src/test/java/org/apache/polygene/entitystore/memory/MemoryEntityStoreWithCacheTest.java
@@ -24,12 +24,11 @@ import org.apache.polygene.bootstrap.ModuleAssembly;
 import org.apache.polygene.entitystore.memory.assembly.MemoryEntityStoreAssembler;
 import org.apache.polygene.test.cache.AbstractEntityStoreWithCacheTest;
 
-public class MemoryEntityStoreWithCacheTest
-    extends AbstractEntityStoreWithCacheTest
+public class MemoryEntityStoreWithCacheTest extends AbstractEntityStoreWithCacheTest
 {
     @Override
     public void assemble( ModuleAssembly module )
-        throws AssemblyException
+        throws Exception
     {
         super.assemble( module );
         new MemoryEntityStoreAssembler().assemble( module );

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/ca66f7e7/extensions/entitystore-mongodb/src/test/java/org/apache/polygene/entitystore/mongodb/MongoDBEntityStoreTest.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-mongodb/src/test/java/org/apache/polygene/entitystore/mongodb/MongoDBEntityStoreTest.java b/extensions/entitystore-mongodb/src/test/java/org/apache/polygene/entitystore/mongodb/MongoDBEntityStoreTest.java
index 6dfb295..52de1e4 100644
--- a/extensions/entitystore-mongodb/src/test/java/org/apache/polygene/entitystore/mongodb/MongoDBEntityStoreTest.java
+++ b/extensions/entitystore-mongodb/src/test/java/org/apache/polygene/entitystore/mongodb/MongoDBEntityStoreTest.java
@@ -44,7 +44,7 @@ public class MongoDBEntityStoreTest extends AbstractEntityStoreTest
     @Override
     // START SNIPPET: assembly
     public void assemble( ModuleAssembly module )
-        throws AssemblyException
+        throws Exception
     {
         // END SNIPPET: assembly
         super.assemble( module );

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/ca66f7e7/extensions/entitystore-mongodb/src/test/java/org/apache/polygene/entitystore/mongodb/MongoDBEntityStoreWithCacheTest.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-mongodb/src/test/java/org/apache/polygene/entitystore/mongodb/MongoDBEntityStoreWithCacheTest.java b/extensions/entitystore-mongodb/src/test/java/org/apache/polygene/entitystore/mongodb/MongoDBEntityStoreWithCacheTest.java
index 3a257ef..81c6a5d 100644
--- a/extensions/entitystore-mongodb/src/test/java/org/apache/polygene/entitystore/mongodb/MongoDBEntityStoreWithCacheTest.java
+++ b/extensions/entitystore-mongodb/src/test/java/org/apache/polygene/entitystore/mongodb/MongoDBEntityStoreWithCacheTest.java
@@ -38,16 +38,13 @@ import org.junit.jupiter.api.BeforeEach;
          ports = @Port( exposed = 8801, inner = 27017),
          newForEachCase = false
 )
-public class MongoDBEntityStoreWithCacheTest
-    extends AbstractEntityStoreWithCacheTest
+public class MongoDBEntityStoreWithCacheTest extends AbstractEntityStoreWithCacheTest
 {
 
     @Override
     public void assemble( ModuleAssembly module )
-        throws AssemblyException
+        throws Exception
     {
-        super.assemble( module );
-
         ModuleAssembly config = module.layer().module( "config" );
         new EntityTestAssembler().defaultServicesVisibleIn( Visibility.layer ).assemble( config );
 
@@ -59,6 +56,8 @@ public class MongoDBEntityStoreWithCacheTest
         mongoConfig.collection().set( "polygene:test:entities" );
         mongoConfig.hostname().set( "localhost" );
         mongoConfig.port().set( 8801 );
+
+        super.assemble( module );
     }
 
     private Mongo mongo;

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/ca66f7e7/extensions/entitystore-preferences/src/test/java/org/apache/polygene/entitystore/preferences/PreferencesEntityStoreTest.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-preferences/src/test/java/org/apache/polygene/entitystore/preferences/PreferencesEntityStoreTest.java b/extensions/entitystore-preferences/src/test/java/org/apache/polygene/entitystore/preferences/PreferencesEntityStoreTest.java
index 9be919e..e195f29 100644
--- a/extensions/entitystore-preferences/src/test/java/org/apache/polygene/entitystore/preferences/PreferencesEntityStoreTest.java
+++ b/extensions/entitystore-preferences/src/test/java/org/apache/polygene/entitystore/preferences/PreferencesEntityStoreTest.java
@@ -34,7 +34,7 @@ public class PreferencesEntityStoreTest
 
     @Override
     public void assemble( ModuleAssembly module )
-        throws AssemblyException
+        throws Exception
     {
         module.layer().application().setName( "PreferencesTest" );
 

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/ca66f7e7/extensions/entitystore-redis/src/test/java/org/apache/polygene/entitystore/redis/RedisEntityStoreTest.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-redis/src/test/java/org/apache/polygene/entitystore/redis/RedisEntityStoreTest.java b/extensions/entitystore-redis/src/test/java/org/apache/polygene/entitystore/redis/RedisEntityStoreTest.java
index b80cde4..ff4ba1a 100644
--- a/extensions/entitystore-redis/src/test/java/org/apache/polygene/entitystore/redis/RedisEntityStoreTest.java
+++ b/extensions/entitystore-redis/src/test/java/org/apache/polygene/entitystore/redis/RedisEntityStoreTest.java
@@ -43,10 +43,9 @@ public class RedisEntityStoreTest
     @Override
     // START SNIPPET: assembly
     public void assemble( ModuleAssembly module )
-        throws AssemblyException
+        throws Exception
     {
         // END SNIPPET: assembly
-        super.assemble( module );
         ModuleAssembly config = module.layer().module( "config" );
         new EntityTestAssembler().defaultServicesVisibleIn( Visibility.layer ).assemble( config );
         // START SNIPPET: assembly
@@ -56,6 +55,7 @@ public class RedisEntityStoreTest
                                                           .declareDefaults();
         redisConfig.host().set( "localhost" );
         redisConfig.port().set( 8801 );
+        super.assemble( module );
         // START SNIPPET: assembly
     }
     // END SNIPPET: assembly

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/ca66f7e7/extensions/entitystore-redis/src/test/java/org/apache/polygene/entitystore/redis/RedisEntityStoreWithCacheTest.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-redis/src/test/java/org/apache/polygene/entitystore/redis/RedisEntityStoreWithCacheTest.java b/extensions/entitystore-redis/src/test/java/org/apache/polygene/entitystore/redis/RedisEntityStoreWithCacheTest.java
index 38a05b5..3ebc459 100644
--- a/extensions/entitystore-redis/src/test/java/org/apache/polygene/entitystore/redis/RedisEntityStoreWithCacheTest.java
+++ b/extensions/entitystore-redis/src/test/java/org/apache/polygene/entitystore/redis/RedisEntityStoreWithCacheTest.java
@@ -41,7 +41,7 @@ public class RedisEntityStoreWithCacheTest
 {
     @Override
     public void assemble( ModuleAssembly module )
-        throws AssemblyException
+        throws Exception
     {
         super.assemble( module );
         ModuleAssembly config = module.layer().module( "config" );

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/ca66f7e7/extensions/entitystore-riak/src/test/java/org/apache/polygene/entitystore/riak/RiakEntityStoreTest.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-riak/src/test/java/org/apache/polygene/entitystore/riak/RiakEntityStoreTest.java b/extensions/entitystore-riak/src/test/java/org/apache/polygene/entitystore/riak/RiakEntityStoreTest.java
index c3b2acf..03d75c8 100644
--- a/extensions/entitystore-riak/src/test/java/org/apache/polygene/entitystore/riak/RiakEntityStoreTest.java
+++ b/extensions/entitystore-riak/src/test/java/org/apache/polygene/entitystore/riak/RiakEntityStoreTest.java
@@ -57,6 +57,7 @@ public class RiakEntityStoreTest extends AbstractEntityStoreTest
     @Override
     // START SNIPPET: assembly
     public void assemble( ModuleAssembly module )
+        throws Exception
     {
         // END SNIPPET: assembly
         super.assemble( module );

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/ca66f7e7/extensions/entitystore-riak/src/test/java/org/apache/polygene/entitystore/riak/RiakEntityStoreWithCacheTest.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-riak/src/test/java/org/apache/polygene/entitystore/riak/RiakEntityStoreWithCacheTest.java b/extensions/entitystore-riak/src/test/java/org/apache/polygene/entitystore/riak/RiakEntityStoreWithCacheTest.java
index 22d0317..345fce0 100644
--- a/extensions/entitystore-riak/src/test/java/org/apache/polygene/entitystore/riak/RiakEntityStoreWithCacheTest.java
+++ b/extensions/entitystore-riak/src/test/java/org/apache/polygene/entitystore/riak/RiakEntityStoreWithCacheTest.java
@@ -60,7 +60,7 @@ public class RiakEntityStoreWithCacheTest extends AbstractEntityStoreWithCacheTe
 
     @Override
     public void assemble( ModuleAssembly module )
-        throws AssemblyException
+        throws Exception
     {
         super.assemble( module );
         ModuleAssembly config = module.layer().module( "config" );

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/ca66f7e7/extensions/entitystore-sql/src/test/java/org/apache/polygene/entitystore/sql/DerbySQLEntityStoreTest.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-sql/src/test/java/org/apache/polygene/entitystore/sql/DerbySQLEntityStoreTest.java b/extensions/entitystore-sql/src/test/java/org/apache/polygene/entitystore/sql/DerbySQLEntityStoreTest.java
index ea404f0..8e9b4c9 100644
--- a/extensions/entitystore-sql/src/test/java/org/apache/polygene/entitystore/sql/DerbySQLEntityStoreTest.java
+++ b/extensions/entitystore-sql/src/test/java/org/apache/polygene/entitystore/sql/DerbySQLEntityStoreTest.java
@@ -36,7 +36,7 @@ public class DerbySQLEntityStoreTest
     @Override
     // START SNIPPET: assembly
     public void assemble( ModuleAssembly module )
-        throws AssemblyException
+        throws Exception
     {
         // END SNIPPET: assembly
         super.assemble( module );

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/ca66f7e7/extensions/entitystore-sql/src/test/java/org/apache/polygene/entitystore/sql/H2SQLEntityStoreTest.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-sql/src/test/java/org/apache/polygene/entitystore/sql/H2SQLEntityStoreTest.java b/extensions/entitystore-sql/src/test/java/org/apache/polygene/entitystore/sql/H2SQLEntityStoreTest.java
index 51c1afd..5c4effa 100644
--- a/extensions/entitystore-sql/src/test/java/org/apache/polygene/entitystore/sql/H2SQLEntityStoreTest.java
+++ b/extensions/entitystore-sql/src/test/java/org/apache/polygene/entitystore/sql/H2SQLEntityStoreTest.java
@@ -36,7 +36,7 @@ public class H2SQLEntityStoreTest
     @Override
     // START SNIPPET: assembly
     public void assemble( ModuleAssembly module )
-        throws AssemblyException
+        throws Exception
     {
         // END SNIPPET: assembly
         super.assemble( module );

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/ca66f7e7/extensions/entitystore-sql/src/test/java/org/apache/polygene/entitystore/sql/MariaDbEntityStoreTest.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-sql/src/test/java/org/apache/polygene/entitystore/sql/MariaDbEntityStoreTest.java b/extensions/entitystore-sql/src/test/java/org/apache/polygene/entitystore/sql/MariaDbEntityStoreTest.java
index 663aeec..6a3b125 100644
--- a/extensions/entitystore-sql/src/test/java/org/apache/polygene/entitystore/sql/MariaDbEntityStoreTest.java
+++ b/extensions/entitystore-sql/src/test/java/org/apache/polygene/entitystore/sql/MariaDbEntityStoreTest.java
@@ -66,7 +66,7 @@ public class MariaDbEntityStoreTest extends AbstractEntityStoreTest
     @Override
     // START SNIPPET: assembly
     public void assemble( ModuleAssembly module )
-        throws AssemblyException
+        throws Exception
     {
         // END SNIPPET: assembly
         super.assemble( module );

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/ca66f7e7/extensions/entitystore-sql/src/test/java/org/apache/polygene/entitystore/sql/MySQLEntityStoreTest.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-sql/src/test/java/org/apache/polygene/entitystore/sql/MySQLEntityStoreTest.java b/extensions/entitystore-sql/src/test/java/org/apache/polygene/entitystore/sql/MySQLEntityStoreTest.java
index 1a76c4b..5c1bc31 100644
--- a/extensions/entitystore-sql/src/test/java/org/apache/polygene/entitystore/sql/MySQLEntityStoreTest.java
+++ b/extensions/entitystore-sql/src/test/java/org/apache/polygene/entitystore/sql/MySQLEntityStoreTest.java
@@ -65,7 +65,7 @@ public class MySQLEntityStoreTest
     @Override
     // START SNIPPET: assembly
     public void assemble( ModuleAssembly module )
-        throws AssemblyException
+        throws Exception
     {
         // END SNIPPET: assembly
         super.assemble( module );

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/ca66f7e7/extensions/entitystore-sql/src/test/java/org/apache/polygene/entitystore/sql/PostgreSQLEntityStoreTest.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-sql/src/test/java/org/apache/polygene/entitystore/sql/PostgreSQLEntityStoreTest.java b/extensions/entitystore-sql/src/test/java/org/apache/polygene/entitystore/sql/PostgreSQLEntityStoreTest.java
index cd21471..d9da82f 100644
--- a/extensions/entitystore-sql/src/test/java/org/apache/polygene/entitystore/sql/PostgreSQLEntityStoreTest.java
+++ b/extensions/entitystore-sql/src/test/java/org/apache/polygene/entitystore/sql/PostgreSQLEntityStoreTest.java
@@ -50,7 +50,7 @@ public class PostgreSQLEntityStoreTest
     @Override
     // START SNIPPET: assembly
     public void assemble( ModuleAssembly module )
-        throws AssemblyException
+        throws Exception
     {
         // END SNIPPET: assembly
         delay();

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/ca66f7e7/extensions/entitystore-sql/src/test/java/org/apache/polygene/entitystore/sql/SQLiteEntityStoreTest.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-sql/src/test/java/org/apache/polygene/entitystore/sql/SQLiteEntityStoreTest.java b/extensions/entitystore-sql/src/test/java/org/apache/polygene/entitystore/sql/SQLiteEntityStoreTest.java
index a1de998..82f5992 100644
--- a/extensions/entitystore-sql/src/test/java/org/apache/polygene/entitystore/sql/SQLiteEntityStoreTest.java
+++ b/extensions/entitystore-sql/src/test/java/org/apache/polygene/entitystore/sql/SQLiteEntityStoreTest.java
@@ -44,7 +44,7 @@ public class SQLiteEntityStoreTest extends AbstractEntityStoreTest
     @Override
     // START SNIPPET: assembly
     public void assemble( ModuleAssembly module )
-        throws AssemblyException
+        throws Exception
     {
         // END SNIPPET: assembly
         super.assemble( module );

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/ca66f7e7/extensions/entitystore-sql/src/test/java/org/apache/polygene/entitystore/sql/SqlEntityStoreTest.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-sql/src/test/java/org/apache/polygene/entitystore/sql/SqlEntityStoreTest.java b/extensions/entitystore-sql/src/test/java/org/apache/polygene/entitystore/sql/SqlEntityStoreTest.java
index c3d2a19..02ec62b 100644
--- a/extensions/entitystore-sql/src/test/java/org/apache/polygene/entitystore/sql/SqlEntityStoreTest.java
+++ b/extensions/entitystore-sql/src/test/java/org/apache/polygene/entitystore/sql/SqlEntityStoreTest.java
@@ -41,7 +41,7 @@ public class SqlEntityStoreTest extends AbstractEntityStoreTest
     @Override
     // START SNIPPET: assembly
     public void assemble( ModuleAssembly module )
-        throws AssemblyException
+        throws Exception
     {
         // END SNIPPET: assembly
         super.assemble( module );


[05/13] polygene-java git commit: Changed Assembler.assemble() to allow Exception to be thrown (instead of only AssemblyException), so one doesn't need to capture all kind of exceptions in one's Assembler just to re-throw as AssemblyException.

Posted by ni...@apache.org.
http://git-wip-us.apache.org/repos/asf/polygene-java/blob/ca66f7e7/extensions/entitystore-sqlkv/src/test/java/org/apache/polygene/entitystore/sqlkv/DerbySQLEntityStoreTest.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-sqlkv/src/test/java/org/apache/polygene/entitystore/sqlkv/DerbySQLEntityStoreTest.java b/extensions/entitystore-sqlkv/src/test/java/org/apache/polygene/entitystore/sqlkv/DerbySQLEntityStoreTest.java
index 0bd6716..72e1bf6 100644
--- a/extensions/entitystore-sqlkv/src/test/java/org/apache/polygene/entitystore/sqlkv/DerbySQLEntityStoreTest.java
+++ b/extensions/entitystore-sqlkv/src/test/java/org/apache/polygene/entitystore/sqlkv/DerbySQLEntityStoreTest.java
@@ -35,7 +35,7 @@ public class DerbySQLEntityStoreTest extends AbstractEntityStoreTest
     @Override
     // START SNIPPET: assembly
     public void assemble( ModuleAssembly module )
-        throws AssemblyException
+        throws Exception
     {
         // END SNIPPET: assembly
         super.assemble( module );

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/ca66f7e7/extensions/entitystore-sqlkv/src/test/java/org/apache/polygene/entitystore/sqlkv/H2SQLEntityStoreTest.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-sqlkv/src/test/java/org/apache/polygene/entitystore/sqlkv/H2SQLEntityStoreTest.java b/extensions/entitystore-sqlkv/src/test/java/org/apache/polygene/entitystore/sqlkv/H2SQLEntityStoreTest.java
index 46a66e3..4f61f00 100644
--- a/extensions/entitystore-sqlkv/src/test/java/org/apache/polygene/entitystore/sqlkv/H2SQLEntityStoreTest.java
+++ b/extensions/entitystore-sqlkv/src/test/java/org/apache/polygene/entitystore/sqlkv/H2SQLEntityStoreTest.java
@@ -35,7 +35,7 @@ public class H2SQLEntityStoreTest extends AbstractEntityStoreTest
     @Override
     // START SNIPPET: assembly
     public void assemble( ModuleAssembly module )
-        throws AssemblyException
+        throws Exception
     {
         // END SNIPPET: assembly
         super.assemble( module );

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/ca66f7e7/extensions/entitystore-sqlkv/src/test/java/org/apache/polygene/entitystore/sqlkv/MariaDbEntityStoreTest.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-sqlkv/src/test/java/org/apache/polygene/entitystore/sqlkv/MariaDbEntityStoreTest.java b/extensions/entitystore-sqlkv/src/test/java/org/apache/polygene/entitystore/sqlkv/MariaDbEntityStoreTest.java
index 1f82735..66cdc52 100644
--- a/extensions/entitystore-sqlkv/src/test/java/org/apache/polygene/entitystore/sqlkv/MariaDbEntityStoreTest.java
+++ b/extensions/entitystore-sqlkv/src/test/java/org/apache/polygene/entitystore/sqlkv/MariaDbEntityStoreTest.java
@@ -51,7 +51,7 @@ public class MariaDbEntityStoreTest extends AbstractEntityStoreTest
     @Override
     // START SNIPPET: assembly
     public void assemble( ModuleAssembly module )
-        throws AssemblyException
+        throws Exception
     {
         // END SNIPPET: assembly
         super.assemble( module );

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/ca66f7e7/extensions/entitystore-sqlkv/src/test/java/org/apache/polygene/entitystore/sqlkv/MySQLEntityStoreTest.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-sqlkv/src/test/java/org/apache/polygene/entitystore/sqlkv/MySQLEntityStoreTest.java b/extensions/entitystore-sqlkv/src/test/java/org/apache/polygene/entitystore/sqlkv/MySQLEntityStoreTest.java
index 66417c8..dac8486 100644
--- a/extensions/entitystore-sqlkv/src/test/java/org/apache/polygene/entitystore/sqlkv/MySQLEntityStoreTest.java
+++ b/extensions/entitystore-sqlkv/src/test/java/org/apache/polygene/entitystore/sqlkv/MySQLEntityStoreTest.java
@@ -50,7 +50,7 @@ public class MySQLEntityStoreTest extends AbstractEntityStoreTest
     @Override
     // START SNIPPET: assembly
     public void assemble( ModuleAssembly module )
-        throws AssemblyException
+        throws Exception
     {
         // END SNIPPET: assembly
         super.assemble( module );

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/ca66f7e7/extensions/entitystore-sqlkv/src/test/java/org/apache/polygene/entitystore/sqlkv/PostgreSQLEntityStoreTest.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-sqlkv/src/test/java/org/apache/polygene/entitystore/sqlkv/PostgreSQLEntityStoreTest.java b/extensions/entitystore-sqlkv/src/test/java/org/apache/polygene/entitystore/sqlkv/PostgreSQLEntityStoreTest.java
index 0c6aa81..cf6acac 100644
--- a/extensions/entitystore-sqlkv/src/test/java/org/apache/polygene/entitystore/sqlkv/PostgreSQLEntityStoreTest.java
+++ b/extensions/entitystore-sqlkv/src/test/java/org/apache/polygene/entitystore/sqlkv/PostgreSQLEntityStoreTest.java
@@ -44,7 +44,7 @@ public class PostgreSQLEntityStoreTest extends AbstractEntityStoreTest
     @Override
     // START SNIPPET: assembly
     public void assemble( ModuleAssembly module )
-        throws AssemblyException
+        throws Exception
     {
         // END SNIPPET: assembly
         delay();

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/ca66f7e7/extensions/entitystore-sqlkv/src/test/java/org/apache/polygene/entitystore/sqlkv/SQLiteEntityStoreTest.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-sqlkv/src/test/java/org/apache/polygene/entitystore/sqlkv/SQLiteEntityStoreTest.java b/extensions/entitystore-sqlkv/src/test/java/org/apache/polygene/entitystore/sqlkv/SQLiteEntityStoreTest.java
index a0e12fe..ab31d88 100644
--- a/extensions/entitystore-sqlkv/src/test/java/org/apache/polygene/entitystore/sqlkv/SQLiteEntityStoreTest.java
+++ b/extensions/entitystore-sqlkv/src/test/java/org/apache/polygene/entitystore/sqlkv/SQLiteEntityStoreTest.java
@@ -44,7 +44,7 @@ public class SQLiteEntityStoreTest extends AbstractEntityStoreTest
     @Override
     // START SNIPPET: assembly
     public void assemble( ModuleAssembly module )
-        throws AssemblyException
+        throws Exception
     {
         // END SNIPPET: assembly
         super.assemble( module );

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/ca66f7e7/extensions/entitystore-zookeeper/build.gradle
----------------------------------------------------------------------
diff --git a/extensions/entitystore-zookeeper/build.gradle b/extensions/entitystore-zookeeper/build.gradle
index b8c6430..8e6ea6f 100644
--- a/extensions/entitystore-zookeeper/build.gradle
+++ b/extensions/entitystore-zookeeper/build.gradle
@@ -29,6 +29,7 @@ dependencies {
 
   implementation polygene.library( 'locking' )
   implementation polygene.library( 'constraints' )
+  implementation polygene.library( 'execution' )
   implementation libraries.zookeeper
 
   runtimeOnly polygene.core.runtime

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/ca66f7e7/extensions/entitystore-zookeeper/src/test/java/org/apache/polygene/entitystore/zookeeper/ZkUtil.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-zookeeper/src/test/java/org/apache/polygene/entitystore/zookeeper/ZkUtil.java b/extensions/entitystore-zookeeper/src/test/java/org/apache/polygene/entitystore/zookeeper/ZkUtil.java
index 8b08892..bc98550 100644
--- a/extensions/entitystore-zookeeper/src/test/java/org/apache/polygene/entitystore/zookeeper/ZkUtil.java
+++ b/extensions/entitystore-zookeeper/src/test/java/org/apache/polygene/entitystore/zookeeper/ZkUtil.java
@@ -1,3 +1,22 @@
+/*
+ *  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.
+ *
+ *
+ */
 package org.apache.polygene.entitystore.zookeeper;
 
 import java.io.IOException;

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/ca66f7e7/extensions/entitystore-zookeeper/src/test/java/org/apache/polygene/entitystore/zookeeper/ZookeeperEntityStoreTest.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-zookeeper/src/test/java/org/apache/polygene/entitystore/zookeeper/ZookeeperEntityStoreTest.java b/extensions/entitystore-zookeeper/src/test/java/org/apache/polygene/entitystore/zookeeper/ZookeeperEntityStoreTest.java
index bf5bc99..8ffc5e9 100644
--- a/extensions/entitystore-zookeeper/src/test/java/org/apache/polygene/entitystore/zookeeper/ZookeeperEntityStoreTest.java
+++ b/extensions/entitystore-zookeeper/src/test/java/org/apache/polygene/entitystore/zookeeper/ZookeeperEntityStoreTest.java
@@ -19,6 +19,8 @@
  */
 package org.apache.polygene.entitystore.zookeeper;
 
+import com.github.junit5docker.Docker;
+import com.github.junit5docker.Port;
 import org.apache.polygene.api.common.Visibility;
 import org.apache.polygene.bootstrap.AssemblyException;
 import org.apache.polygene.bootstrap.ModuleAssembly;
@@ -29,11 +31,15 @@ import org.apache.polygene.test.entity.AbstractEntityStoreTest;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.extension.ExtendWith;
 
+import static java.lang.Thread.sleep;
 import static java.util.Collections.singletonList;
 
-@ExtendWith( TemporaryFolder.class )
-public class ZookeeperEntityStoreTest
-    extends AbstractEntityStoreTest
+
+@Docker( image = "zookeeper",
+         ports = @Port( exposed = 32181, inner = 2181),
+         newForEachCase = false
+)
+public class ZookeeperEntityStoreTest extends AbstractEntityStoreTest
 {
 
     static final String TEST_ZNODE_NAME = "/polygene/entitystore-test";
@@ -41,9 +47,10 @@ public class ZookeeperEntityStoreTest
     @Override
     // START SNIPPET: assembly
     public void assemble( ModuleAssembly module )
-        throws AssemblyException
+        throws Exception
     {
         // END SNIPPET: assembly
+        sleep(1000);
         super.assemble( module );
         ModuleAssembly config = module.layer().module( "config" );
         new EntityTestAssembler().defaultServicesVisibleIn( Visibility.layer ).assemble( config );
@@ -52,7 +59,7 @@ public class ZookeeperEntityStoreTest
         zkAssembler.withConfig( config, Visibility.layer ).assemble( module );
         // END SNIPPET: assembly
         ZookeeperEntityStoreConfiguration defaults = zkAssembler.configModule().forMixin( ZookeeperEntityStoreConfiguration.class ).declareDefaults();
-        defaults.hosts().set( singletonList( "localhost:2181" ) );
+        defaults.hosts().set( singletonList( "localhost:32181" ) );
         defaults.storageNode().set( TEST_ZNODE_NAME );
         // START SNIPPET: assembly
     }
@@ -62,6 +69,6 @@ public class ZookeeperEntityStoreTest
     void cleanUp()
         throws Exception
     {
-        ZkUtil.cleanUp( "localhost:2181", TEST_ZNODE_NAME );
+        ZkUtil.cleanUp( "localhost:32181", TEST_ZNODE_NAME );
     }
 }

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/ca66f7e7/extensions/entitystore-zookeeper/src/test/java/org/apache/polygene/entitystore/zookeeper/ZookeeperEntityStoreTestSuite.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-zookeeper/src/test/java/org/apache/polygene/entitystore/zookeeper/ZookeeperEntityStoreTestSuite.java b/extensions/entitystore-zookeeper/src/test/java/org/apache/polygene/entitystore/zookeeper/ZookeeperEntityStoreTestSuite.java
index bf83f26..44b93d9 100644
--- a/extensions/entitystore-zookeeper/src/test/java/org/apache/polygene/entitystore/zookeeper/ZookeeperEntityStoreTestSuite.java
+++ b/extensions/entitystore-zookeeper/src/test/java/org/apache/polygene/entitystore/zookeeper/ZookeeperEntityStoreTestSuite.java
@@ -19,6 +19,8 @@
  */
 package org.apache.polygene.entitystore.zookeeper;
 
+import com.github.junit5docker.Docker;
+import com.github.junit5docker.Port;
 import org.apache.polygene.api.common.Visibility;
 import org.apache.polygene.bootstrap.ModuleAssembly;
 import org.apache.polygene.entitystore.zookeeper.assembly.ZookeeperEntityStoreAssembler;
@@ -30,7 +32,10 @@ import org.junit.jupiter.api.extension.ExtendWith;
 import static java.util.Collections.singletonList;
 import static org.apache.polygene.entitystore.zookeeper.ZookeeperEntityStoreTest.TEST_ZNODE_NAME;
 
-@ExtendWith( TemporaryFolder.class )
+@Docker( image = "zookeeper",
+         ports = @Port( exposed = 32181, inner = 2181),
+         newForEachCase = false
+)
 public class ZookeeperEntityStoreTestSuite
     extends EntityStoreTestSuite
 {
@@ -49,7 +54,7 @@ public class ZookeeperEntityStoreTestSuite
     {
         super.defineConfigModule( module );
         ZookeeperEntityStoreConfiguration defaults = module.forMixin( ZookeeperEntityStoreConfiguration.class ).declareDefaults();
-        defaults.hosts().set( singletonList( "localhost:2181" ) );
+        defaults.hosts().set( singletonList( "localhost:32181" ) );
         defaults.storageNode().set( TEST_ZNODE_NAME );
     }
 
@@ -57,6 +62,6 @@ public class ZookeeperEntityStoreTestSuite
     void cleanUp()
         throws Exception
     {
-        ZkUtil.cleanUp( "localhost:2181", TEST_ZNODE_NAME );
+        ZkUtil.cleanUp( "localhost:32181", TEST_ZNODE_NAME );
     }
 }

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/ca66f7e7/extensions/entitystore-zookeeper/src/test/java/org/apache/polygene/entitystore/zookeeper/ZookeeperEntityStoreWithCacheTest.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-zookeeper/src/test/java/org/apache/polygene/entitystore/zookeeper/ZookeeperEntityStoreWithCacheTest.java b/extensions/entitystore-zookeeper/src/test/java/org/apache/polygene/entitystore/zookeeper/ZookeeperEntityStoreWithCacheTest.java
index 1efaf05..d376187 100644
--- a/extensions/entitystore-zookeeper/src/test/java/org/apache/polygene/entitystore/zookeeper/ZookeeperEntityStoreWithCacheTest.java
+++ b/extensions/entitystore-zookeeper/src/test/java/org/apache/polygene/entitystore/zookeeper/ZookeeperEntityStoreWithCacheTest.java
@@ -19,6 +19,8 @@
  */
 package org.apache.polygene.entitystore.zookeeper;
 
+import com.github.junit5docker.Docker;
+import com.github.junit5docker.Port;
 import org.apache.polygene.api.common.Visibility;
 import org.apache.polygene.bootstrap.AssemblyException;
 import org.apache.polygene.bootstrap.ModuleAssembly;
@@ -32,29 +34,37 @@ import org.junit.jupiter.api.extension.ExtendWith;
 import static java.util.Collections.singletonList;
 import static org.apache.polygene.entitystore.zookeeper.ZookeeperEntityStoreTest.TEST_ZNODE_NAME;
 
+@Docker( image = "zookeeper",
+         ports = @Port( exposed = 32181, inner = 2181),
+         newForEachCase = false
+)
 public class ZookeeperEntityStoreWithCacheTest
     extends AbstractEntityStoreWithCacheTest
 {
     @Override
     public void assemble( ModuleAssembly module )
-        throws AssemblyException
+        throws Exception
     {
         super.assemble( module );
+
         ModuleAssembly config = module.layer().module( "config" );
-        new EntityTestAssembler().defaultServicesVisibleIn( Visibility.layer ).assemble( config );
+
         ZookeeperEntityStoreAssembler zkAssembler = new ZookeeperEntityStoreAssembler();
         zkAssembler.withConfig( config, Visibility.layer ).assemble( module );
 
         ZookeeperEntityStoreConfiguration defaults = zkAssembler.configModule().forMixin( ZookeeperEntityStoreConfiguration.class ).declareDefaults();
-        defaults.hosts().set( singletonList( "localhost:2181" ) );
+        defaults.hosts().set( singletonList( "localhost:32181" ) );
         defaults.storageNode().set( TEST_ZNODE_NAME );
+
+        new EntityTestAssembler().defaultServicesVisibleIn( Visibility.layer ).assemble( config );
+
     }
 
     @AfterEach
     void cleanUp()
         throws Exception
     {
-        ZkUtil.cleanUp( "localhost:2181", TEST_ZNODE_NAME );
+        ZkUtil.cleanUp( "localhost:32181", TEST_ZNODE_NAME );
     }
 
 }

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/ca66f7e7/extensions/indexing-rdf/src/test/java/org/apache/polygene/index/rdf/RDFPerformanceTest.java
----------------------------------------------------------------------
diff --git a/extensions/indexing-rdf/src/test/java/org/apache/polygene/index/rdf/RDFPerformanceTest.java b/extensions/indexing-rdf/src/test/java/org/apache/polygene/index/rdf/RDFPerformanceTest.java
index dff5ade..8b8b0f1 100644
--- a/extensions/indexing-rdf/src/test/java/org/apache/polygene/index/rdf/RDFPerformanceTest.java
+++ b/extensions/indexing-rdf/src/test/java/org/apache/polygene/index/rdf/RDFPerformanceTest.java
@@ -72,7 +72,8 @@ public class RDFPerformanceTest extends AbstractPolygeneTest
     }
 
     @Override
-    public void assemble( ModuleAssembly module ) throws AssemblyException
+    public void assemble( ModuleAssembly module )
+        throws Exception
     {
         new FileConfigurationAssembler()
             .withOverride( new FileConfigurationOverride().withConventionalRoot( tmpDir.getRoot() ) )

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/ca66f7e7/extensions/indexing-rdf/src/test/java/org/apache/polygene/index/rdf/qi95/Qi95IssueTest.java
----------------------------------------------------------------------
diff --git a/extensions/indexing-rdf/src/test/java/org/apache/polygene/index/rdf/qi95/Qi95IssueTest.java b/extensions/indexing-rdf/src/test/java/org/apache/polygene/index/rdf/qi95/Qi95IssueTest.java
index f1155bb..e694404 100644
--- a/extensions/indexing-rdf/src/test/java/org/apache/polygene/index/rdf/qi95/Qi95IssueTest.java
+++ b/extensions/indexing-rdf/src/test/java/org/apache/polygene/index/rdf/qi95/Qi95IssueTest.java
@@ -262,7 +262,18 @@ public class Qi95IssueTest
     private ModuleAssembly addModule( LayerAssembly layerAssembly, String name, Assembler assembler )
     {
         ModuleAssembly moduleAssembly = layerAssembly.module( name );
-        assembler.assemble( moduleAssembly );
+        try
+        {
+            assembler.assemble( moduleAssembly );
+        }
+        catch( RuntimeException e )
+        {
+            throw e;
+        }
+        catch( Exception e )
+        {
+            throw new AssemblyException( "Unable to assemble module " + name + " in layer " + layerAssembly.name() );
+        }
         return moduleAssembly;
     }