Author: rmannibucau
Date: Thu Oct 2 13:13:36 2014
New Revision: 1628966
URL: http://svn.apache.org/r1628966
Log:
TOMEE-1372 JtaManaged shouldn't be mandatory to be able to use a datasource
with jpa
Modified:
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java
Modified:
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java
URL:
http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java?rev=1628966&r1=1628965&r2=1628966&view=diff
==============================================================================
---
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java
(original)
+++
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java
Thu Oct 2 13:13:36 2014
@@ -102,6 +102,8 @@ import java.util.Set;
import java.util.TreeMap;
import java.util.TreeSet;
+import static java.util.Arrays.asList;
+
public class AutoConfig implements DynamicDeployer, JndiConstants {
public static final String ORIGIN_ANNOTATION = "Annotation";
@@ -1358,11 +1360,43 @@ public class AutoConfig implements Dynam
final String prefix = app.getModuleId() + "/";
String jtaDataSourceId = null;
- if (!resourceLocal) {
+ String nonJtaDataSourceId = null;
+
+ // first try exact matching without JtaManaged which is not
mandatory actually (custom DS + JTADataSourceWrapperFactory)
+ final String jtaWithJavaAndSlash =
replaceJavaAndSlash(unit.getJtaDataSource());
+ for (final String potentialName : asList(prefix +
jtaWithJavaAndSlash, jtaWithJavaAndSlash)) {
+ final ResourceInfo jtaInfo =
configFactory.getResourceInfo(potentialName);
+ if (jtaInfo != null) {
+ if
(!"false".equalsIgnoreCase(jtaInfo.properties.getProperty("JtaManaged")) //
don't test true since it can be missing
+ && (jtaInfo.types.contains("DataSource") ||
jtaInfo.types.contains(DataSource.class.getName()))) {
+ jtaDataSourceId = jtaInfo.id;
+ break;
+ } else {
+ logger.warning("Found matching datasource: " +
jtaInfo.id + " but this one is not a JTA datasource");
+ }
+ }
+ }
+
+ final String nonJtaWithJavaAndSlash =
replaceJavaAndSlash(unit.getNonJtaDataSource());
+ for (final String potentialName : asList(prefix +
nonJtaWithJavaAndSlash, nonJtaWithJavaAndSlash)) {
+ final ResourceInfo info =
configFactory.getResourceInfo(potentialName);
+ if (info != null) {
+ if
(!"true".equalsIgnoreCase(info.properties.getProperty("JtaManaged"))
+ && (info.types.contains("DataSource") ||
info.types.contains(DataSource.class.getName()))) {
+ nonJtaDataSourceId = info.id;
+ break;
+ } else {
+ logger.warning("Found matching datasource: " + info.id
+ " but this one is a JTA datasource");
+ }
+ }
+ }
+
+ // then that's ok to force configuration
+ if (jtaDataSourceId == null && !resourceLocal) {
required.put("JtaManaged", "true");
- jtaDataSourceId = findResourceId(prefix +
replaceJavaAndSlash(unit.getJtaDataSource()), "DataSource", required, null);
+ jtaDataSourceId = findResourceId(prefix + jtaWithJavaAndSlash,
"DataSource", required, null);
if (jtaDataSourceId == null) { // test with
javax.sql.DataSource before DataSource since RA can register resources without
our shortcut
- jtaDataSourceId =
findResourceId(replaceJavaAndSlash(unit.getJtaDataSource()),
"javax.sql.DataSource", required, null);
+ jtaDataSourceId = findResourceId(jtaWithJavaAndSlash,
"javax.sql.DataSource", required, null);
}
/* this shouldn't be mandatory anymore since our DataSource
has as alias javax.sql.DataSource
if (jtaDataSourceId == null) {
@@ -1371,10 +1405,12 @@ public class AutoConfig implements Dynam
*/
}
- required.put("JtaManaged", "false");
- String nonJtaDataSourceId = findResourceId(prefix +
replaceJavaAndSlash(unit.getNonJtaDataSource()), "DataSource", required, null);
if (nonJtaDataSourceId == null) {
- nonJtaDataSourceId =
findResourceId(replaceJavaAndSlash(unit.getNonJtaDataSource()), "DataSource",
required, null);
+ required.put("JtaManaged", "false");
+ nonJtaDataSourceId = findResourceId(prefix +
nonJtaWithJavaAndSlash, "DataSource", required, null);
+ if (nonJtaDataSourceId == null) {
+ nonJtaDataSourceId =
findResourceId(nonJtaWithJavaAndSlash, "DataSource", required, null);
+ }
}
if ((jtaDataSourceId != null || resourceLocal) &&
nonJtaDataSourceId != null) {
@@ -1429,8 +1465,8 @@ public class AutoConfig implements Dynam
//
required.put("JtaManaged", ServiceUtils.ANY);
- final String possibleJta =
findResourceId(replaceJavaAndSlash(unit.getJtaDataSource()), "DataSource",
required, null);
- final String possibleNonJta =
findResourceId(replaceJavaAndSlash(unit.getNonJtaDataSource()), "DataSource",
required, null);
+ final String possibleJta = findResourceId(jtaWithJavaAndSlash,
"DataSource", required, null);
+ final String possibleNonJta =
findResourceId(nonJtaWithJavaAndSlash, "DataSource", required, null);
if (possibleJta != null && possibleJta.equals(possibleNonJta)) {
final ResourceInfo dataSource =
configFactory.getResourceInfo(possibleJta);
@@ -2287,7 +2323,8 @@ public class AutoConfig implements Dynam
for (final Resource r : appModule.getResources()) {
final String type = r.getType();
if (type != null) {
- for (final String t : type.trim().split(",")) {
+ final String[] types = type.trim().split(",");
+ for (final String t : types) {
List<String> ids = resourceIdsByType.get(t);
if (ids == null) {
ids = new ArrayList<String>();