You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@deltaspike.apache.org by jo...@apache.org on 2016/06/07 00:57:55 UTC
deltaspike git commit: DELTASPIKE-1165 Added support for Streams
within a repository. Added logic to handle Optional and Stream for delegate
queries. New Java 8 test module for testing with Java 8 features.
Repository: deltaspike
Updated Branches:
refs/heads/master 42a7ddf01 -> 1054cd83c
DELTASPIKE-1165 Added support for Streams within a repository. Added logic to handle Optional and Stream for delegate queries. New Java 8 test module for testing with Java 8 features.
Project: http://git-wip-us.apache.org/repos/asf/deltaspike/repo
Commit: http://git-wip-us.apache.org/repos/asf/deltaspike/commit/1054cd83
Tree: http://git-wip-us.apache.org/repos/asf/deltaspike/tree/1054cd83
Diff: http://git-wip-us.apache.org/repos/asf/deltaspike/diff/1054cd83
Branch: refs/heads/master
Commit: 1054cd83c64e016245304b9965f3495fceb48f14
Parents: 42a7ddf
Author: John D. Ament <jo...@apache.org>
Authored: Sun Jun 5 00:43:24 2016 -0400
Committer: John D. Ament <jo...@apache.org>
Committed: Mon Jun 6 20:57:23 2016 -0400
----------------------------------------------------------------------
.../deltaspike/core/util/OptionalUtil.java | 5 +-
.../apache/deltaspike/core/util/StreamUtil.java | 77 ++++++
.../deltaspike/core/util/ClassUtilsTest.java | 64 +++++
.../deltaspike/core/util/StreamUtilTest.java | 61 +++++
.../data/impl/builder/DelegateQueryBuilder.java | 17 +-
.../builder/result/QueryProcessorFactory.java | 19 ++
.../impl/handler/EntityRepositoryHandler.java | 14 +
deltaspike/modules/data/pom.xml | 9 +
deltaspike/modules/data/test-java8/pom.xml | 257 +++++++++++++++++++
.../data/test/java8/entity/Simple.java | 139 ++++++++++
.../data/test/java8/repo/SimpleRepository.java | 38 +++
.../data/test/java8/repo/SimpleRepository2.java | 34 +++
.../data/test/java8/test/Java8Test.java | 150 +++++++++++
.../test/java8/util/EntityManagerProducer.java | 30 +++
.../data/test/java8/util/TestDeployments.java | 62 +++++
.../resources-glassfish/test-persistence.xml | 30 +++
.../test/resources-openejb/test-persistence.xml | 31 +++
.../resources-weblogic/test-persistence.xml | 31 +++
.../test/resources-wildfly/test-persistence.xml | 28 ++
documentation/src/main/asciidoc/data.adoc | 23 ++
20 files changed, 1116 insertions(+), 3 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/deltaspike/blob/1054cd83/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/util/OptionalUtil.java
----------------------------------------------------------------------
diff --git a/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/util/OptionalUtil.java b/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/util/OptionalUtil.java
index ada1ef2..c906af4 100644
--- a/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/util/OptionalUtil.java
+++ b/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/util/OptionalUtil.java
@@ -30,7 +30,8 @@ public abstract class OptionalUtil
private static Class<?> optionalClass;
private static Method optionalMethod;
- static {
+ static
+ {
try
{
optionalClass = Class.forName("java.util.Optional");
@@ -51,7 +52,7 @@ public abstract class OptionalUtil
public static boolean isOptionalReturned(Method method)
{
- return optionalSupported && method.getReturnType().isAssignableFrom(optionalClass);
+ return optionalSupported && optionalClass.isAssignableFrom(method.getReturnType());
}
public static Object wrap(Object input)
http://git-wip-us.apache.org/repos/asf/deltaspike/blob/1054cd83/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/util/StreamUtil.java
----------------------------------------------------------------------
diff --git a/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/util/StreamUtil.java b/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/util/StreamUtil.java
new file mode 100644
index 0000000..97314ae
--- /dev/null
+++ b/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/util/StreamUtil.java
@@ -0,0 +1,77 @@
+/*
+ * 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.deltaspike.core.util;
+
+import javax.enterprise.inject.Typed;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.Collection;
+
+@Typed()
+public abstract class StreamUtil
+{
+ private static boolean streamSupported = true;
+ private static Class<?> streamClass;
+ private static Method streamMethod;
+
+ static
+ {
+ try
+ {
+ streamClass = Class.forName("java.util.stream.Stream");
+ streamMethod = Collection.class.getMethod("stream");
+ }
+ catch (Exception e)
+ {
+ streamSupported = false;
+ streamClass = null;
+ streamMethod = null;
+ }
+ }
+
+ public static boolean isStreamSupported()
+ {
+ return streamSupported;
+ }
+
+ public static boolean isStreamReturned(Method method)
+ {
+ return isStreamSupported() && streamClass.isAssignableFrom(method.getReturnType());
+ }
+
+ public static Object wrap(Object input)
+ {
+ if (!isStreamSupported() || input == null)
+ {
+ return input;
+ }
+ try
+ {
+ return streamMethod.invoke(input);
+ }
+ catch (IllegalAccessException e)
+ {
+ }
+ catch (InvocationTargetException e)
+ {
+ }
+ return null;
+ }
+}
http://git-wip-us.apache.org/repos/asf/deltaspike/blob/1054cd83/deltaspike/core/api/src/test/java/org/apache/deltaspike/core/util/ClassUtilsTest.java
----------------------------------------------------------------------
diff --git a/deltaspike/core/api/src/test/java/org/apache/deltaspike/core/util/ClassUtilsTest.java b/deltaspike/core/api/src/test/java/org/apache/deltaspike/core/util/ClassUtilsTest.java
new file mode 100644
index 0000000..5f288a1
--- /dev/null
+++ b/deltaspike/core/api/src/test/java/org/apache/deltaspike/core/util/ClassUtilsTest.java
@@ -0,0 +1,64 @@
+/*
+ * 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.deltaspike.core.util;
+
+import junit.framework.Assert;
+import org.junit.Test;
+
+import java.lang.reflect.Method;
+import java.util.Collection;
+import java.util.List;
+
+public class ClassUtilsTest
+{
+ @Test
+ public void shouldNotRetrieveMethodBasedOnSameReturnType() throws Exception
+ {
+ Method m = InnerTwo.class.getMethod("getCollection");
+ Method method = ClassUtils.extractPossiblyGenericMethod(InnerOne.class, m);
+ Assert.assertEquals(InnerOne.class.getMethod("getCollection"), method);
+ }
+
+ @Test
+ public void shouldRetrieveMethodBasedOnCastableType() throws Exception
+ {
+ Method m = InnerThree.class.getMethod("getCollection");
+ Method method = ClassUtils.extractPossiblyGenericMethod(InnerOne.class, m);
+ Assert.assertEquals(InnerOne.class.getMethod("getCollection"), method);
+ }
+
+ private static class InnerOne {
+ public List<Integer> getCollection() {
+ return null;
+ }
+ }
+
+ private static class InnerTwo {
+ public Collection<Integer> getCollection() {
+ return null;
+ }
+ }
+
+ private static class InnerThree {
+ public Object getCollection() {
+ return null;
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/deltaspike/blob/1054cd83/deltaspike/core/api/src/test/java/org/apache/deltaspike/core/util/StreamUtilTest.java
----------------------------------------------------------------------
diff --git a/deltaspike/core/api/src/test/java/org/apache/deltaspike/core/util/StreamUtilTest.java b/deltaspike/core/api/src/test/java/org/apache/deltaspike/core/util/StreamUtilTest.java
new file mode 100644
index 0000000..8c49f9d
--- /dev/null
+++ b/deltaspike/core/api/src/test/java/org/apache/deltaspike/core/util/StreamUtilTest.java
@@ -0,0 +1,61 @@
+/*
+ * 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.deltaspike.core.util;
+
+import org.junit.Assert;
+import org.junit.Assume;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Arrays;
+
+public class StreamUtilTest
+{
+ @Before
+ public void isEnabled()
+ {
+ Assume.assumeTrue(StreamUtil.isStreamSupported());
+ }
+
+ @Test
+ public void shouldIdentifyStreamReturnType() throws Exception
+ {
+ Method empty = ArrayList.class.getMethod("stream");
+ Assert.assertTrue(StreamUtil.isStreamReturned(empty));
+ }
+
+ @Test
+ public void shouldReturnEmptyWhenGivenNull() throws Exception
+ {
+ Object wrapped = StreamUtil.wrap(null);
+ Assert.assertNull(wrapped);
+ }
+
+ @Test
+ public void shouldReturnAStreamWhenGivenACollection() throws Exception
+ {
+ Object wrapped = StreamUtil.wrap(Arrays.asList("a","b"));
+ Class<?> streamClass = Class.forName("java.util.stream.Stream");
+ Assert.assertTrue(streamClass.isAssignableFrom(wrapped.getClass()));
+ }
+
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/deltaspike/blob/1054cd83/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/builder/DelegateQueryBuilder.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/builder/DelegateQueryBuilder.java b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/builder/DelegateQueryBuilder.java
index c97dc14..87218b3 100644
--- a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/builder/DelegateQueryBuilder.java
+++ b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/builder/DelegateQueryBuilder.java
@@ -20,6 +20,7 @@ package org.apache.deltaspike.data.impl.builder;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
+import java.util.Collection;
import java.util.Set;
import javax.enterprise.context.ApplicationScoped;
@@ -32,6 +33,8 @@ import javax.persistence.PersistenceException;
import org.apache.deltaspike.core.api.provider.BeanProvider;
import org.apache.deltaspike.core.util.ClassUtils;
+import org.apache.deltaspike.core.util.OptionalUtil;
+import org.apache.deltaspike.core.util.StreamUtil;
import org.apache.deltaspike.data.api.QueryInvocationException;
import org.apache.deltaspike.data.impl.handler.CdiQueryInvocationContext;
import org.apache.deltaspike.data.impl.meta.MethodType;
@@ -54,7 +57,19 @@ public class DelegateQueryBuilder extends QueryBuilder
DelegateQueryHandler delegate = selectDelegate(context);
if (delegate != null)
{
- return invoke(delegate, context);
+ Object result = invoke(delegate, context);
+ if (result instanceof Collection && StreamUtil.isStreamReturned(context.getMethod()))
+ {
+ return StreamUtil.wrap(result);
+ }
+ else if (OptionalUtil.isOptionalReturned(context.getMethod()))
+ {
+ return OptionalUtil.wrap(result);
+ }
+ else
+ {
+ return result;
+ }
}
}
catch (PersistenceException e)
http://git-wip-us.apache.org/repos/asf/deltaspike/blob/1054cd83/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/builder/result/QueryProcessorFactory.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/builder/result/QueryProcessorFactory.java b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/builder/result/QueryProcessorFactory.java
index 470cbfe..9a72dca 100644
--- a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/builder/result/QueryProcessorFactory.java
+++ b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/builder/result/QueryProcessorFactory.java
@@ -25,6 +25,7 @@ import javax.persistence.NoResultException;
import javax.persistence.Query;
import org.apache.deltaspike.core.util.OptionalUtil;
+import org.apache.deltaspike.core.util.StreamUtil;
import org.apache.deltaspike.data.api.Modifying;
import org.apache.deltaspike.data.api.QueryResult;
import org.apache.deltaspike.data.api.SingleResultType;
@@ -69,6 +70,10 @@ public final class QueryProcessorFactory
{
return new ListQueryProcessor();
}
+ if (streams())
+ {
+ return new StreamQueryProcessor();
+ }
if (isModifying())
{
return new ExecuteUpdateQueryProcessor(returns(Void.TYPE));
@@ -89,6 +94,11 @@ public final class QueryProcessorFactory
return method.getReturnType().isAssignableFrom(clazz);
}
+ private boolean streams()
+ {
+ return StreamUtil.isStreamReturned(method);
+ }
+
private static final class ListQueryProcessor implements QueryProcessor
{
@Override
@@ -107,6 +117,15 @@ public final class QueryProcessorFactory
}
}
+ private static final class StreamQueryProcessor implements QueryProcessor
+ {
+ @Override
+ public Object executeQuery(Query query, CdiQueryInvocationContext context)
+ {
+ return StreamUtil.wrap(query.getResultList());
+ }
+ }
+
private static final class SingleResultQueryProcessor implements QueryProcessor
{
@Override
http://git-wip-us.apache.org/repos/asf/deltaspike/blob/1054cd83/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/EntityRepositoryHandler.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/EntityRepositoryHandler.java b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/EntityRepositoryHandler.java
index 46e496a..2c731f8 100755
--- a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/EntityRepositoryHandler.java
+++ b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/EntityRepositoryHandler.java
@@ -18,6 +18,7 @@
*/
package org.apache.deltaspike.data.impl.handler;
+import org.apache.deltaspike.core.util.OptionalUtil;
import org.apache.deltaspike.data.api.EntityRepository;
import org.apache.deltaspike.data.api.Query;
import org.apache.deltaspike.data.impl.builder.QueryBuilder;
@@ -120,6 +121,19 @@ public class EntityRepositoryHandler<E, PK extends Serializable>
}
}
+ public Object findOptional(PK primaryKey)
+ {
+ Object found = null;
+ try
+ {
+ found = findBy(primaryKey);
+ }
+ catch (Exception e)
+ {
+ }
+ return OptionalUtil.wrap(found);
+ }
+
@Override
public List<E> findBy(E example, SingularAttribute<E, ?>... attributes)
{
http://git-wip-us.apache.org/repos/asf/deltaspike/blob/1054cd83/deltaspike/modules/data/pom.xml
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/pom.xml b/deltaspike/modules/data/pom.xml
index 7c92b5e..be1cc86 100755
--- a/deltaspike/modules/data/pom.xml
+++ b/deltaspike/modules/data/pom.xml
@@ -66,6 +66,15 @@
<module>test-ee7</module>
</modules>
</profile>
+ <profile>
+ <id>java8.tests</id>
+ <activation>
+ <jdk>1.8</jdk>
+ </activation>
+ <modules>
+ <module>test-java8</module>
+ </modules>
+ </profile>
</profiles>
</project>
http://git-wip-us.apache.org/repos/asf/deltaspike/blob/1054cd83/deltaspike/modules/data/test-java8/pom.xml
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/test-java8/pom.xml b/deltaspike/modules/data/test-java8/pom.xml
new file mode 100644
index 0000000..996ca18
--- /dev/null
+++ b/deltaspike/modules/data/test-java8/pom.xml
@@ -0,0 +1,257 @@
+<?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.
+ -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <parent>
+ <artifactId>data-module-project</artifactId>
+ <groupId>org.apache.deltaspike.modules</groupId>
+ <version>1.7.0-SNAPSHOT</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+
+ <artifactId>deltaspike-data-module-test-java8</artifactId>
+ <packaging>jar</packaging>
+
+ <name>Apache DeltaSpike Data-Module Tests with Java 8</name>
+
+ <properties>
+ <deploy.skip>true</deploy.skip>
+ </properties>
+ <build>
+ <pluginManagement>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-surefire-plugin</artifactId>
+ <configuration>
+ <argLine>-Xms128m -Xmx1024m -XX:MaxPermSize=256m</argLine>
+ </configuration>
+ </plugin>
+ </plugins>
+ </pluginManagement>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-deploy-plugin</artifactId>
+ <configuration>
+ <skip>${deploy.skip}</skip> <!-- we don't deploy our test-modules upstream -->
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.bsc.maven</groupId>
+ <artifactId>maven-processor-plugin</artifactId>
+ <version>2.0.7</version>
+ <executions>
+ <execution>
+ <id>process-test</id>
+ <goals>
+ <goal>process-test</goal>
+ </goals>
+ <phase>generate-test-sources</phase>
+ </execution>
+ </executions>
+ <configuration>
+ <processors>
+ <processor>org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor</processor>
+ </processors>
+ </configuration>
+ <dependencies>
+ <!-- this part of Hibernate is Apache License 2.0, thus O.K. for us. -->
+ <dependency>
+ <groupId>org.hibernate</groupId>
+ <artifactId>hibernate-jpamodelgen</artifactId>
+ <version>1.2.0.Final</version>
+ </dependency>
+ </dependencies>
+ </plugin>
+ </plugins>
+ </build>
+
+ <dependencies>
+
+ <dependency>
+ <groupId>org.apache.geronimo.specs</groupId>
+ <artifactId>geronimo-jpa_2.1_spec</artifactId>
+ <version>1.0-alpha-1</version>
+ <scope>provided</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.geronimo.specs</groupId>
+ <artifactId>geronimo-jta_1.2_spec</artifactId>
+ <version>1.0-alpha-1</version>
+ <scope>provided</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.deltaspike.modules</groupId>
+ <artifactId>deltaspike-data-module-api</artifactId>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.deltaspike.modules</groupId>
+ <artifactId>deltaspike-data-module-impl</artifactId>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.deltaspike.core</groupId>
+ <artifactId>deltaspike-core-impl</artifactId>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.deltaspike.modules</groupId>
+ <artifactId>deltaspike-partial-bean-module-impl</artifactId>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.deltaspike.modules</groupId>
+ <artifactId>deltaspike-jpa-module-impl</artifactId>
+ <scope>test</scope>
+ </dependency>
+
+ <!-- Tests -->
+
+ <dependency>
+ <groupId>org.jboss.shrinkwrap.resolver</groupId>
+ <artifactId>shrinkwrap-resolver-impl-maven</artifactId>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.jboss.shrinkwrap.descriptors</groupId>
+ <artifactId>shrinkwrap-descriptors-impl-javaee</artifactId>
+ <scope>test</scope>
+ </dependency>
+
+ </dependencies>
+
+ <profiles>
+ <profile>
+ <id>wildfly-build-managed</id>
+ <build>
+ <testResources>
+ <testResource>
+ <directory>src/test/resources</directory>
+ </testResource>
+ <testResource>
+ <directory>src/test/resources-wildfly</directory>
+ </testResource>
+ </testResources>
+ </build>
+ </profile>
+ <profile>
+ <id>wildfly-managed</id>
+ <build>
+ <testResources>
+ <testResource>
+ <directory>src/test/resources</directory>
+ </testResource>
+ <testResource>
+ <directory>src/test/resources-wildfly</directory>
+ </testResource>
+ </testResources>
+ </build>
+ </profile>
+ <profile>
+ <id>wildfly-remote</id>
+ <build>
+ <testResources>
+ <testResource>
+ <directory>src/test/resources</directory>
+ </testResource>
+ <testResource>
+ <directory>src/test/resources-wildfly</directory>
+ </testResource>
+ </testResources>
+ </build>
+ </profile>
+ <profile>
+ <id>tomee-build-managed</id>
+ <build>
+ <testResources>
+ <testResource>
+ <directory>src/test/resources</directory>
+ </testResource>
+ <testResource>
+ <directory>src/test/resources-openejb</directory>
+ </testResource>
+ </testResources>
+ </build>
+ </profile>
+ <profile>
+ <id>tomee7-build-managed</id>
+ <build>
+ <testResources>
+ <testResource>
+ <directory>src/test/resources</directory>
+ </testResource>
+ <testResource>
+ <directory>src/test/resources-openejb</directory>
+ </testResource>
+ </testResources>
+ </build>
+ </profile>
+ <profile>
+ <id>glassfish-build-managed-4</id>
+ <build>
+ <testResources>
+ <testResource>
+ <directory>src/test/resources</directory>
+ </testResource>
+ <testResource>
+ <directory>src/test/resources-glassfish</directory>
+ </testResource>
+ </testResources>
+ </build>
+ </profile>
+ <profile>
+ <id>wls-remote-12c</id>
+ <build>
+ <testResources>
+ <testResource>
+ <directory>src/test/resources</directory>
+ </testResource>
+ <testResource>
+ <directory>src/test/resources-weblogic</directory>
+ </testResource>
+ </testResources>
+ </build>
+ </profile>
+ <profile>
+ <id>wls-managed-12c</id>
+ <build>
+ <testResources>
+ <testResource>
+ <directory>src/test/resources</directory>
+ </testResource>
+ <testResource>
+ <directory>src/test/resources-weblogic</directory>
+ </testResource>
+ </testResources>
+ </build>
+ </profile>
+ </profiles>
+</project>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/deltaspike/blob/1054cd83/deltaspike/modules/data/test-java8/src/test/java/org/apache/deltaspike/data/test/java8/entity/Simple.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/test-java8/src/test/java/org/apache/deltaspike/data/test/java8/entity/Simple.java b/deltaspike/modules/data/test-java8/src/test/java/org/apache/deltaspike/data/test/java8/entity/Simple.java
new file mode 100644
index 0000000..b262ce2
--- /dev/null
+++ b/deltaspike/modules/data/test-java8/src/test/java/org/apache/deltaspike/data/test/java8/entity/Simple.java
@@ -0,0 +1,139 @@
+/*
+ * 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.deltaspike.data.test.java8.entity;
+
+import java.util.Date;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.NamedQueries;
+import javax.persistence.NamedQuery;
+import javax.persistence.Table;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
+
+@Entity
+@NamedQueries({
+ @NamedQuery(name = Simple.BY_NAME_LIKE,
+ query = "select e from Simple e where e.name like ?1"),
+ @NamedQuery(name = Simple.BY_NAME_ENABLED,
+ query = "select s from Simple s where s.name = ?1 and s.enabled = ?2 order by s.id asc"),
+ @NamedQuery(name = Simple.BY_ID,
+ query = "select s from Simple s where s.id = :id and s.enabled = :enabled")
+})
+@Table(name = "SIMPLE_TABLE")
+public class Simple
+{
+ public static final String BY_NAME_LIKE = "simple.byNameLike";
+ public static final String BY_NAME_ENABLED = "simple.byNameAndEnabled";
+ public static final String BY_ID = "simple.byId";
+
+ private static final long serialVersionUID = 1L;
+
+ @Id
+ @GeneratedValue
+ private Long id;
+
+ private String name;
+ private String camelCase;
+ private Boolean enabled = Boolean.TRUE;
+ private Integer counter = Integer.valueOf(0);
+ @Temporal(TemporalType.TIMESTAMP)
+ private Date temporal;
+
+ protected Simple()
+ {
+ }
+
+ public Simple(String name)
+ {
+ this.name = name;
+ }
+
+ public Long getId()
+ {
+ return id;
+ }
+
+ public void setId(Long id)
+ {
+ this.id = id;
+ }
+
+ public String getName()
+ {
+ return name;
+ }
+
+ public void setName(String name)
+ {
+ this.name = name;
+ }
+
+ public Boolean getEnabled()
+ {
+ return enabled;
+ }
+
+ public void setEnabled(Boolean enabled)
+ {
+ this.enabled = enabled;
+ }
+
+ public Integer getCounter()
+ {
+ return counter;
+ }
+
+ public void setCounter(Integer counter)
+ {
+ this.counter = counter;
+ }
+
+ public String getCamelCase()
+ {
+ return camelCase;
+ }
+
+ public void setCamelCase(String camelCase)
+ {
+ this.camelCase = camelCase;
+ }
+
+ public Date getTemporal()
+ {
+ return temporal;
+ }
+
+ public void setTemporal(Date temporal)
+ {
+ this.temporal = temporal;
+ }
+
+ @Override
+ public String toString()
+ {
+ return "Simple [id=" + id + ", name=" + name + ", camelCase=" + camelCase + ", enabled=" + enabled
+ + ", counter=" + counter + ", temporal=" + temporal + "]";
+ }
+
+}
+
http://git-wip-us.apache.org/repos/asf/deltaspike/blob/1054cd83/deltaspike/modules/data/test-java8/src/test/java/org/apache/deltaspike/data/test/java8/repo/SimpleRepository.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/test-java8/src/test/java/org/apache/deltaspike/data/test/java8/repo/SimpleRepository.java b/deltaspike/modules/data/test-java8/src/test/java/org/apache/deltaspike/data/test/java8/repo/SimpleRepository.java
new file mode 100644
index 0000000..e2e61ef
--- /dev/null
+++ b/deltaspike/modules/data/test-java8/src/test/java/org/apache/deltaspike/data/test/java8/repo/SimpleRepository.java
@@ -0,0 +1,38 @@
+/*
+ * 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.deltaspike.data.test.java8.repo;
+
+import org.apache.deltaspike.data.api.Repository;
+import org.apache.deltaspike.data.test.java8.entity.Simple;
+
+import java.util.Optional;
+import java.util.stream.Stream;
+
+@Repository(forEntity = Simple.class)
+public interface SimpleRepository
+{
+ Stream<Simple> findByName(String name);
+
+ Optional<Simple> findOptional(Long id);
+
+ Stream<Simple> findAll();
+
+ Optional<Simple> findBy(Long id);
+}
http://git-wip-us.apache.org/repos/asf/deltaspike/blob/1054cd83/deltaspike/modules/data/test-java8/src/test/java/org/apache/deltaspike/data/test/java8/repo/SimpleRepository2.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/test-java8/src/test/java/org/apache/deltaspike/data/test/java8/repo/SimpleRepository2.java b/deltaspike/modules/data/test-java8/src/test/java/org/apache/deltaspike/data/test/java8/repo/SimpleRepository2.java
new file mode 100644
index 0000000..3878ce2
--- /dev/null
+++ b/deltaspike/modules/data/test-java8/src/test/java/org/apache/deltaspike/data/test/java8/repo/SimpleRepository2.java
@@ -0,0 +1,34 @@
+/*
+ * 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.deltaspike.data.test.java8.repo;
+
+import org.apache.deltaspike.data.api.Query;
+import org.apache.deltaspike.data.api.Repository;
+import org.apache.deltaspike.data.api.SingleResultType;
+import org.apache.deltaspike.data.test.java8.entity.Simple;
+
+import java.util.Optional;
+
+@Repository(forEntity = Simple.class)
+public interface SimpleRepository2
+{
+ @Query(singleResult = SingleResultType.ANY)
+ Optional<Simple> findByName(String name);
+}
http://git-wip-us.apache.org/repos/asf/deltaspike/blob/1054cd83/deltaspike/modules/data/test-java8/src/test/java/org/apache/deltaspike/data/test/java8/test/Java8Test.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/test-java8/src/test/java/org/apache/deltaspike/data/test/java8/test/Java8Test.java b/deltaspike/modules/data/test-java8/src/test/java/org/apache/deltaspike/data/test/java8/test/Java8Test.java
new file mode 100644
index 0000000..20925c1
--- /dev/null
+++ b/deltaspike/modules/data/test-java8/src/test/java/org/apache/deltaspike/data/test/java8/test/Java8Test.java
@@ -0,0 +1,150 @@
+/*
+ * 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.deltaspike.data.test.java8.test;
+
+import org.apache.deltaspike.data.test.java8.entity.Simple;
+import org.apache.deltaspike.data.test.java8.repo.SimpleRepository;
+import org.apache.deltaspike.data.test.java8.repo.SimpleRepository2;
+import org.apache.deltaspike.test.category.WebProfileCategory;
+import org.jboss.arquillian.container.test.api.Deployment;
+import org.jboss.arquillian.junit.Arquillian;
+import org.jboss.shrinkwrap.api.Archive;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+import org.junit.runner.RunWith;
+
+import javax.annotation.Resource;
+import javax.inject.Inject;
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import javax.transaction.UserTransaction;
+
+import java.util.Optional;
+import java.util.stream.Stream;
+
+import static java.util.Collections.emptyList;
+import static java.util.stream.Collectors.toList;
+import static org.apache.deltaspike.data.test.java8.util.TestDeployments.initDeployment;
+
+@Category(WebProfileCategory.class)
+@RunWith(Arquillian.class)
+public class Java8Test
+{
+ @Deployment
+ public static Archive<?> deployment()
+ {
+ return initDeployment()
+ .addClasses(Java8Test.class, Simple.class, SimpleRepository.class, SimpleRepository2.class);
+ }
+
+ @Inject
+ private SimpleRepository simpleRepository;
+
+ @Inject
+ private SimpleRepository2 simpleRepository2;
+
+ @PersistenceContext
+ private EntityManager entityManager;
+
+ @Resource
+ private UserTransaction ut;
+
+ @Before
+ public void setupTX() throws Exception
+ {
+ ut.begin();
+ }
+
+ @After
+ public void rollbackTX() throws Exception
+ {
+ ut.rollback();
+ }
+
+ @Test
+ public void shouldFindOptionalSimple() throws Exception
+ {
+ Simple s = new Simple("something");
+ entityManager.persist(s);
+
+ Optional<Simple> found = simpleRepository.findOptional(s.getId());
+
+ Assert.assertTrue(found.isPresent());
+ }
+
+ @Test
+ public void shouldNotFindOptionalSimpleForMissing() throws Exception
+ {
+ Optional<Simple> found = simpleRepository.findBy(-1L);
+
+ Assert.assertFalse(found.isPresent());
+ }
+
+ @Test
+ public void shouldFindStreamOfSimples()
+ {
+ String name = "something";
+ Simple s = new Simple(name);
+ entityManager.persist(s);
+
+ Stream<Simple> found = simpleRepository.findByName(name);
+
+ Assert.assertEquals(1, found.count());
+ }
+
+ @Test
+ public void shouldFindEmptyStream()
+ {
+ String name = "something";
+ Simple s = new Simple(name);
+ entityManager.persist(s);
+
+ Stream<Simple> found = simpleRepository.findByName("some other name");
+
+ Assert.assertEquals(emptyList(), found.collect(toList()));
+ }
+
+ @Test
+ public void shouldFindAllAsStream()
+ {
+ String name = "something";
+ Simple s = new Simple(name);
+ entityManager.persist(s);
+
+ Stream<Simple> found = simpleRepository.findAll();
+
+ Assert.assertEquals(1, found.count());
+ }
+
+ @Test
+ public void shouldFindByNameOptional()
+ {
+ String name = "jim";
+ entityManager.persist(new Simple(name));
+ entityManager.persist(new Simple(name));
+
+ Optional<Simple> found = simpleRepository2.findByName(name);
+
+ Assert.assertTrue(found.isPresent());
+ }
+}
http://git-wip-us.apache.org/repos/asf/deltaspike/blob/1054cd83/deltaspike/modules/data/test-java8/src/test/java/org/apache/deltaspike/data/test/java8/util/EntityManagerProducer.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/test-java8/src/test/java/org/apache/deltaspike/data/test/java8/util/EntityManagerProducer.java b/deltaspike/modules/data/test-java8/src/test/java/org/apache/deltaspike/data/test/java8/util/EntityManagerProducer.java
new file mode 100644
index 0000000..dc0a2fe
--- /dev/null
+++ b/deltaspike/modules/data/test-java8/src/test/java/org/apache/deltaspike/data/test/java8/util/EntityManagerProducer.java
@@ -0,0 +1,30 @@
+/*
+ * 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.deltaspike.data.test.java8.util;
+
+import javax.enterprise.inject.Produces;
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+
+public class EntityManagerProducer {
+ @PersistenceContext
+ @Produces
+ private EntityManager entityManager;
+}
http://git-wip-us.apache.org/repos/asf/deltaspike/blob/1054cd83/deltaspike/modules/data/test-java8/src/test/java/org/apache/deltaspike/data/test/java8/util/TestDeployments.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/test-java8/src/test/java/org/apache/deltaspike/data/test/java8/util/TestDeployments.java b/deltaspike/modules/data/test-java8/src/test/java/org/apache/deltaspike/data/test/java8/util/TestDeployments.java
new file mode 100644
index 0000000..24003ff
--- /dev/null
+++ b/deltaspike/modules/data/test-java8/src/test/java/org/apache/deltaspike/data/test/java8/util/TestDeployments.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.deltaspike.data.test.java8.util;
+
+import org.jboss.shrinkwrap.api.ShrinkWrap;
+import org.jboss.shrinkwrap.api.asset.EmptyAsset;
+import org.jboss.shrinkwrap.api.spec.WebArchive;
+import org.jboss.shrinkwrap.resolver.api.maven.Maven;
+
+import java.io.File;
+
+public class TestDeployments
+{
+ /**
+ * Create a basic deployment with dependencies, beans.xml and persistence descriptor.
+ *
+ * @return Basic web archive.
+ */
+ public static WebArchive initDeployment()
+ {
+ WebArchive archive = ShrinkWrap
+ .create(WebArchive.class, "test.war")
+ .addAsLibraries(getDeltaSpikeDataWithDependencies())
+ .addClasses(EntityManagerProducer.class)
+ .addAsWebInfResource("test-persistence.xml", "classes/META-INF/persistence.xml")
+ .addAsWebInfResource(EmptyAsset.INSTANCE, "beans.xml");
+
+ return archive;
+ }
+
+ private static File[] getDeltaSpikeDataWithDependencies()
+ {
+ return Maven.resolver().loadPomFromFile("pom.xml").resolve(
+ "org.apache.deltaspike.core:deltaspike-core-api",
+ "org.apache.deltaspike.core:deltaspike-core-impl",
+ "org.apache.deltaspike.modules:deltaspike-partial-bean-module-api",
+ "org.apache.deltaspike.modules:deltaspike-partial-bean-module-impl",
+ "org.apache.deltaspike.modules:deltaspike-jpa-module-api",
+ "org.apache.deltaspike.modules:deltaspike-jpa-module-impl",
+ "org.apache.deltaspike.modules:deltaspike-data-module-api",
+ "org.apache.deltaspike.modules:deltaspike-data-module-impl")
+ .withTransitivity()
+ .asFile();
+ }
+}
http://git-wip-us.apache.org/repos/asf/deltaspike/blob/1054cd83/deltaspike/modules/data/test-java8/src/test/resources-glassfish/test-persistence.xml
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/test-java8/src/test/resources-glassfish/test-persistence.xml b/deltaspike/modules/data/test-java8/src/test/resources-glassfish/test-persistence.xml
new file mode 100644
index 0000000..64744d4
--- /dev/null
+++ b/deltaspike/modules/data/test-java8/src/test/resources-glassfish/test-persistence.xml
@@ -0,0 +1,30 @@
+<?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.
+ -->
+<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
+ <persistence-unit name="test">
+ <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
+ <jta-data-source>jdbc/__default</jta-data-source>
+ <properties>
+ <property name="eclipselink.ddl-generation" value="drop-and-create-tables"/>
+ <property name="eclipselink.logging.level" value="FINE"/>
+ <property name="eclipselink.logging.parameters" value="true" />
+ </properties>
+ </persistence-unit>
+</persistence>
http://git-wip-us.apache.org/repos/asf/deltaspike/blob/1054cd83/deltaspike/modules/data/test-java8/src/test/resources-openejb/test-persistence.xml
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/test-java8/src/test/resources-openejb/test-persistence.xml b/deltaspike/modules/data/test-java8/src/test/resources-openejb/test-persistence.xml
new file mode 100644
index 0000000..828e4a3
--- /dev/null
+++ b/deltaspike/modules/data/test-java8/src/test/resources-openejb/test-persistence.xml
@@ -0,0 +1,31 @@
+<?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.
+ -->
+<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
+ <persistence-unit name="test">
+ <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
+ <jta-data-source>testDatabase</jta-data-source>
+ <properties>
+ <property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema(ForeignKeys=true)"/>
+ <property name="openjpa.Log" value="DefaultLevel=WARN, SQL=TRACE"/>
+ <property name="openjpa.jdbc.DBDictionary" value="hsql(SimulateLocking=true)"/>
+ <property name="openejb.jpa.init-entitymanager" value="true" />
+ </properties>
+ </persistence-unit>
+</persistence>
http://git-wip-us.apache.org/repos/asf/deltaspike/blob/1054cd83/deltaspike/modules/data/test-java8/src/test/resources-weblogic/test-persistence.xml
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/test-java8/src/test/resources-weblogic/test-persistence.xml b/deltaspike/modules/data/test-java8/src/test/resources-weblogic/test-persistence.xml
new file mode 100644
index 0000000..26fd8bf
--- /dev/null
+++ b/deltaspike/modules/data/test-java8/src/test/resources-weblogic/test-persistence.xml
@@ -0,0 +1,31 @@
+<?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.
+ -->
+<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence">
+ <persistence-unit name="test">
+ <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
+ <jta-data-source>TestDS</jta-data-source>
+ <properties>
+ <property name="eclipselink.ddl-generation" value="drop-and-create-tables"/>
+ <property name="eclipselink.logging.level" value="FINE"/>
+ <property name="eclipselink.logging.parameters" value="true" />
+ <property name="eclipselink.deploy-on-startup" value="true" />
+ </properties>
+ </persistence-unit>
+</persistence>
http://git-wip-us.apache.org/repos/asf/deltaspike/blob/1054cd83/deltaspike/modules/data/test-java8/src/test/resources-wildfly/test-persistence.xml
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/test-java8/src/test/resources-wildfly/test-persistence.xml b/deltaspike/modules/data/test-java8/src/test/resources-wildfly/test-persistence.xml
new file mode 100644
index 0000000..170def0
--- /dev/null
+++ b/deltaspike/modules/data/test-java8/src/test/resources-wildfly/test-persistence.xml
@@ -0,0 +1,28 @@
+<?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.
+ -->
+<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
+ <persistence-unit name="test">
+ <jta-data-source>java:jboss/datasources/ExampleDS</jta-data-source>
+ <properties>
+ <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
+ </properties>
+ </persistence-unit>
+</persistence>
http://git-wip-us.apache.org/repos/asf/deltaspike/blob/1054cd83/documentation/src/main/asciidoc/data.adoc
----------------------------------------------------------------------
diff --git a/documentation/src/main/asciidoc/data.adoc b/documentation/src/main/asciidoc/data.adoc
index 045d6fd..c68be3a 100644
--- a/documentation/src/main/asciidoc/data.adoc
+++ b/documentation/src/main/asciidoc/data.adoc
@@ -901,6 +901,29 @@ annotations, the `singleResult` attribute can be overridden with the
This option will not throw an exception.
+=== Java 8 Semantics
+
+Repositories support returning instances of `java.util.Optional` and `java.util.stream.Stream` for any method.
+
+[source,java]
+-----------------------------------------------------------------------
+@Repository(forEntity = Person.class)
+public interface PersonRepository
+{
+
+ Optional<Person> findBySsn(String ssn);
+
+ Stream<Person> findByLocation(String location);
+
+}
+-----------------------------------------------------------------------
+
+Queries returning `Optional<T>` will behave like `SingleResultType.OPTIONAL`, if the data is present, return the single
+result, otherwise return `Optional.empty()`. You can override this by using `SingleResultType.ANY` which takes the first
+result of the list, or else `empty()`.
+
+Queries returning `Stream<T>` act as a simple wrapper for `query.getResultList().stream()` to give back the results.
+
== Transactions
If you call any method expression, `@Query`-annotated method or a method