/*
* Copyright 2015 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.kie.server.services.jbpm.jpa;
import java.io.InputStream;
import javax.naming.InitialContext;
import javax.persistence.spi.PersistenceUnitInfo;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
public class PersistenceUnitInfoLoader {
enum PersistenceXml {
TAG_PERSISTENCE("persistence"),
TAG_PERSISTENCE_UNIT("persistence-unit"),
TAG_PROPERTIES("properties"),
TAG_PROPERTY("property"),
TAG_NON_JTA_DATA_SOURCE("non-jta-data-source"),
TAG_JTA_DATA_SOURCE("jta-data-source"),
TAG_CLASS("class"),
TAG_MAPPING_FILE("mapping-file"),
TAG_JAR_FILE("jar-file"),
TAG_EXCLUDE_UNLISTED_CLASSES("exclude-unlisted-classes"),
TAG_VALIDATION_MODE("validation-mode"),
TAG_SHARED_CACHE_MODE("shared-cache-mode"),
TAG_PROVIDER("provider"),
TAG_UNKNOWN("unknown"),
ATTR_UNIT_NAME("name"),
ATTR_TRANSACTION_TYPE("transaction-type"),
ATTR_SCHEMA_VERSION("version");
private final String name;
PersistenceXml(String name) {
this.name = name;
}
public static PersistenceXml parse(String aName) {
try {
return valueOf("TAG_" + aName.replace('-', '_').toUpperCase());
} catch (IllegalArgumentException e) {
return TAG_UNKNOWN;
}
}
@Override
public String toString() {
return name;
}
}
public static PersistenceUnitInfo load(InputStream inputStream, InitialContext initialContext, ClassLoader classLoader) throws XMLStreamException {
PersistenceUnitInfoImpl persistenceUnitInfo = new PersistenceUnitInfoImpl(initialContext, classLoader);
StringBuffer tagContent = new StringBuffer();
XMLInputFactory factory = XMLInputFactory.newInstance();
XMLStreamReader reader = factory.createXMLStreamReader(inputStream);
PersistenceXml tag = PersistenceXml.TAG_UNKNOWN;
while (reader.hasNext()) {
int event = reader.next();
switch (event) {
case XMLStreamConstants.START_ELEMENT:
tag = PersistenceXml.parse(reader.getLocalName());
switch (tag) {
case TAG_PERSISTENCE:
String schemaVersion = reader.getAttributeValue("", PersistenceXml.ATTR_SCHEMA_VERSION.toString());
persistenceUnitInfo.setPersistenceXMLSchemaVersion(schemaVersion);
break;
case TAG_PERSISTENCE_UNIT:
String unitName = reader.getAttributeValue("", PersistenceXml.ATTR_UNIT_NAME.toString());
String transactionType = reader.getAttributeValue("", PersistenceXml.ATTR_TRANSACTION_TYPE.toString());
persistenceUnitInfo.setPersistenceUnitName(unitName);
persistenceUnitInfo.setTransactionType(transactionType);
break;
case TAG_EXCLUDE_UNLISTED_CLASSES:
persistenceUnitInfo.setExcludeUnlistedClasses(true);
break;
case TAG_PROPERTY:
persistenceUnitInfo.addProperty(reader.getAttributeValue("", "name"), reader.getAttributeValue("", "value"));
break;
default:
}
break;
case XMLStreamConstants.CHARACTERS:
if (!tag.equals(PersistenceXml.TAG_UNKNOWN)) {
tagContent.append(reader.getText());
}
break;
case XMLStreamConstants.END_ELEMENT:
String s = tagContent.toString().trim();
tagContent = new StringBuffer();
if (s.isEmpty()) {
break;
}
switch (tag) {
case TAG_PROVIDER:
persistenceUnitInfo.setPersistenceProviderClassName(s);
break;
case TAG_JTA_DATA_SOURCE:
persistenceUnitInfo.setJtaDataSource(s);
break;
case TAG_NON_JTA_DATA_SOURCE:
persistenceUnitInfo.setNonJtaDataSource(s);
break;
case TAG_MAPPING_FILE:
persistenceUnitInfo.addMappingFile(s);
break;
case TAG_JAR_FILE:
persistenceUnitInfo.addJarFileUrl(s);
break;
case TAG_CLASS:
persistenceUnitInfo.addManagedClassName(s);
break;
case TAG_EXCLUDE_UNLISTED_CLASSES:
persistenceUnitInfo.setExcludeUnlistedClasses(Boolean.parseBoolean(s));
break;
case TAG_SHARED_CACHE_MODE:
persistenceUnitInfo.setSharedCacheMode(s);
break;
case TAG_VALIDATION_MODE:
persistenceUnitInfo.setValidationMode(s);
break;
default:
}
break;
}
}
return persistenceUnitInfo;
}
public static Boolean isValidPersistenceKey(String propertyName) {
if (propertyName.startsWith("hibernate.") || propertyName.startsWith("javax.persistence")) {
return true;
}
return false;
}
}