* @param reader
* @return
* @throws XMLStreamException
*/
private static PersistenceUnitMetadata parsePU(XMLStreamReader reader, Version version) throws XMLStreamException {
PersistenceUnitMetadata pu = new PersistenceUnitMetadata();
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("org.hibernate.ejb.HibernatePersistence"); // TODO: move to domain.xml?
if (version.equals(Version.JPA_1_0)) {
pu.setPersistenceXMLSchemaVersion("1.0");
} else {
pu.setPersistenceXMLSchemaVersion("2.0");
}
final int count = reader.getAttributeCount();
for (int i = 0; i < count; i++) {
final String value = reader.getAttributeValue(i);
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());
switch (element) {
case CLASS:
classes.add(reader.getElementText());
break;
case DESCRIPTION:
final String description = reader.getElementText();
break;
case EXCLUDEUNLISTEDCLASSES:
String text = reader.getElementText();
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 = reader.getElementText();
jarfiles.add(file);
break;
case JTADATASOURCE:
pu.setJtaDataSourceName(reader.getElementText());
break;
case NONJTADATASOURCE:
pu.setNonJtaDataSourceName(reader.getElementText());
break;
case MAPPINGFILE:
mappingFiles.add(reader.getElementText());
break;
case PROPERTIES:
parseProperties(reader, properties);
break;
case PROVIDER:
pu.setPersistenceProviderClassName(reader.getElementText());
break;
case SHAREDCACHEMODE:
String cm = reader.getElementText();
pu.setSharedCacheMode(SharedCacheMode.valueOf(cm));
break;
case VALIDATIONMODE:
String validationMode = reader.getElementText();
pu.setValidationMode(ValidationMode.valueOf(validationMode));
break;
default:
throw unexpectedElement(reader);
}
}
pu.setManagedClassNames(classes);
pu.setJarFiles(jarfiles);
pu.setMappingFiles(mappingFiles);
pu.setProperties(properties);
return pu;
}