private Map processProperties()

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;
	}