in jpa-container/src/main/java/org/apache/aries/jpa/container/impl/AriesEntityManagerFactoryBuilder.java [205:275]
private Map<String, Object> processProperties(Map<String, Object> props) {
Map<String, Object> processed = new HashMap<String, Object>();
Properties punitProps = persistenceUnit.getProperties();
for(String key : punitProps.stringPropertyNames()) {
processed.put(key, punitProps.get(key));
}
if(props != null) {
processed.putAll(props);
}
String newDriver = (String) processed.get(JAVAX_PERSISTENCE_JDBC_DRIVER);
synchronized (this) {
if(newDriver != null) {
if(driver == null) {
driver = newDriver;
} else if (!newDriver.equals(driver)) {
throw new IllegalArgumentException("Cannot rebind to a different database driver, as per the JPA service specification");
}
}
}
boolean dataSourceProvided = false;
// Handle overridden datasources in a provider agnostic way
// This isn't necessary for EclipseLink, but Hibernate and
// OpenJPA both need some extra help.
Object o = processed.get(JAVAX_PERSISTENCE_JTA_DATASOURCE);
if (o instanceof DataSource) {
persistenceUnit.setJtaDataSource((DataSource) o);
processed.remove(JAVAX_PERSISTENCE_JTA_DATASOURCE);
dataSourceProvided = true;
}
o = processed.get(JAVAX_PERSISTENCE_NON_JTA_DATASOURCE);
if (o instanceof DataSource) {
persistenceUnit.setNonJtaDataSource((DataSource) o);
processed.remove(JAVAX_PERSISTENCE_NON_JTA_DATASOURCE);
dataSourceProvided = true;
} else {
o = processed.get(JAVAX_PERSISTENCE_DATASOURCE);
if (o != null && o instanceof DataSource) {
persistenceUnit.setNonJtaDataSource((DataSource) o);
processed.remove(JAVAX_PERSISTENCE_DATASOURCE);
dataSourceProvided = true;
}
}
o = processed.get(JAVAX_PERSISTENCE_TX_TYPE);
if (o instanceof PersistenceUnitTransactionType) {
persistenceUnit.setTransactionType((PersistenceUnitTransactionType) o);
} else if (o instanceof String) {
persistenceUnit.setTransactionType(PersistenceUnitTransactionType.valueOf((String) o));
} else {
LOGGER.debug("No transaction type set in config, restoring the original value {}", originalTxType);
persistenceUnit.setTransactionType(originalTxType);
}
// This Aries extension is used to communicate the actual transaction type to clients
processed.put(PersistenceUnitTransactionType.class.getName(), persistenceUnit.getTransactionType());
synchronized (this) {
// Either they provide a datasource, or we're already provided and using a tracker
complete = dataSourceProvided || (complete && tracker != null);
}
return processed;
}