* @param propertyReplacer
* @return
* @throws XMLStreamException
*/
private static PersistenceUnitMetadata parsePU(XMLStreamReader reader, Version version, final PropertyReplacer propertyReplacer) throws XMLStreamException {
PersistenceUnitMetadata pu = new PersistenceUnitMetadataImpl();
List<String> classes = new ArrayList<String>(1);
List<String> jarFiles = new ArrayList<String>(1);
List<String> mappingFiles = new ArrayList<String>(1);
Properties properties = new Properties();
// set defaults
pu.setTransactionType(PersistenceUnitTransactionType.JTA);
pu.setValidationMode(ValidationMode.AUTO);
pu.setSharedCacheMode(SharedCacheMode.UNSPECIFIED);
pu.setPersistenceProviderClassName(Configuration.PROVIDER_CLASS_DEFAULT);
if (version.equals(Version.JPA_1_0)) {
pu.setPersistenceXMLSchemaVersion("1.0");
} else if (version.equals(Version.JPA_2_0)) {
pu.setPersistenceXMLSchemaVersion("2.0");
} else {
pu.setPersistenceXMLSchemaVersion("2.1");
}
final int count = reader.getAttributeCount();
for (int i = 0; i < count; i++) {
final String value = reader.getAttributeValue(i);
if (traceEnabled) {
JPA_LOGGER.tracef("parse persistence.xml: attribute value(%d) = %s", i, value);
}
final String attributeNamespace = reader.getAttributeNamespace(i);
if (attributeNamespace != null && !attributeNamespace.isEmpty()) {
continue;
}
final Attribute attribute = Attribute.forName(reader.getAttributeLocalName(i));
switch (attribute) {
case NAME:
pu.setPersistenceUnitName(value);
break;
case TRANSACTIONTYPE:
if (value.equalsIgnoreCase("RESOURCE_LOCAL"))
pu.setTransactionType(PersistenceUnitTransactionType.RESOURCE_LOCAL);
break;
default:
throw unexpectedAttribute(reader, i);
}
}
// until the ending PERSISTENCEUNIT tag
while (reader.hasNext() && reader.nextTag() != END_ELEMENT) {
final Element element = Element.forName(reader.getLocalName());
if (traceEnabled) {
JPA_LOGGER.tracef("parse persistence.xml: element=%s", element.getLocalName());
}
switch (element) {
case CLASS:
classes.add(getElement(reader, propertyReplacer));
break;
case DESCRIPTION:
final String description = getElement(reader, propertyReplacer);
break;
case EXCLUDEUNLISTEDCLASSES:
String text = getElement(reader, propertyReplacer);
if (text == null || text.isEmpty()) {
//the spec has examples where an empty
//exclude-unlisted-classes element has the same
//effect as setting it to true
pu.setExcludeUnlistedClasses(true);
} else {
pu.setExcludeUnlistedClasses(Boolean.valueOf(text));
}
break;
case JARFILE:
String file = getElement(reader, propertyReplacer);
jarFiles.add(file);
break;
case JTADATASOURCE:
pu.setJtaDataSourceName(getElement(reader, propertyReplacer));
break;
case NONJTADATASOURCE:
pu.setNonJtaDataSourceName(getElement(reader, propertyReplacer));
break;
case MAPPINGFILE:
mappingFiles.add(getElement(reader, propertyReplacer));
break;
case PROPERTIES:
parseProperties(reader, properties, propertyReplacer);
break;
case PROVIDER:
pu.setPersistenceProviderClassName(getElement(reader, propertyReplacer));
break;
case SHAREDCACHEMODE:
String cm = getElement(reader, propertyReplacer);
pu.setSharedCacheMode(SharedCacheMode.valueOf(cm));
break;
case VALIDATIONMODE:
String validationMode = getElement(reader, propertyReplacer);
pu.setValidationMode(ValidationMode.valueOf(validationMode));
break;
default:
throw unexpectedElement(reader);
}
}
if (traceEnabled) {
JPA_LOGGER.trace("parse persistence.xml: reached ending persistence-unit tag");
}
pu.setManagedClassNames(classes);
pu.setJarFiles(jarFiles);
pu.setMappingFiles(mappingFiles);
pu.setProperties(properties);
return pu;
}