blob: d490230a500e0e4419b02beebe9d1e327dfcfef5 [file] [log] [blame]
/*
* Copyright (c) 1998, 2020 Oracle and/or its affiliates. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0,
* or the Eclipse Distribution License v. 1.0 which is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
*/
// Contributors:
// Oracle - initial API and implementation from Oracle TopLink
// 06/16/2009-2.0 Guy Pelletier
// - 277039: JPA 2.0 Cache Usage Settings
package org.eclipse.persistence.internal.jpa.deployment.xml.parser;
import java.util.Vector;
import jakarta.persistence.spi.PersistenceUnitTransactionType;
import org.eclipse.persistence.internal.jpa.deployment.SEPersistenceUnitInfo;
import org.eclipse.persistence.internal.jpa.jdbc.DataSourceImpl;
import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;
public class PersistenceContentHandler implements ContentHandler {
private static final String NS_URI = "https://jakarta.ee/xml/ns/persistence";
private static final String NAMESPACE_URI = "http://xmlns.jcp.org/xml/ns/persistence";
private static final String NAMESPACE_URI_OLD = "http://java.sun.com/xml/ns/persistence";
private static final String ELEMENT_PERSISTENCE_UNIT = "persistence-unit";
private static final String ELEMENT_PROVIDER = "provider";
private static final String ELEMENT_JTA_DATA_SOURCE = "jta-data-source";
private static final String ELEMENT_NON_JTA_DATA_SOURCE = "non-jta-data-source";
private static final String ELEMENT_MAPPING_FILE = "mapping-file";
private static final String ELEMENT_JAR_FILE = "jar-file";
private static final String ELEMENT_CLASS = "class";
private static final String ELEMENT_EXCLUDE_UNLISTED_CLASSES = "exclude-unlisted-classes";
private static final String ELEMENT_CACHING = "shared-cache-mode";
private static final String ELEMENT_VALIDATION_MODE = "validation-mode";
private static final String ELEMENT_PROPERTY = "property";
private static final String ATTRIBUTE_NAME = "name";
private static final String ATTRIBUTE_VALUE = "value";
private static final String ATTRIBUTE_TRANSACTION_TYPE = "transaction-type";
private SEPersistenceUnitInfo persistenceUnitInfo;
private Vector<SEPersistenceUnitInfo> persistenceUnits;
private StringBuffer stringBuffer;
private boolean readCharacters = false;
public PersistenceContentHandler() {
super();
stringBuffer = new StringBuffer();
persistenceUnits = new Vector();
}
public Vector<SEPersistenceUnitInfo> getPersistenceUnits() {
return persistenceUnits;
}
@Override
public void setDocumentLocator(Locator locator) {
}
@Override
public void startDocument() throws SAXException {
}
@Override
public void endDocument() throws SAXException {
}
@Override
public void startPrefixMapping(String prefix, String uri) throws SAXException {
}
@Override
public void endPrefixMapping(String prefix) throws SAXException {
}
@Override
public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException {
if (NS_URI.equals(namespaceURI) || NAMESPACE_URI.equals(namespaceURI) || NAMESPACE_URI_OLD.equals(namespaceURI)) {
if (ELEMENT_PERSISTENCE_UNIT.equals(localName)) {
persistenceUnitInfo = new SEPersistenceUnitInfo();
persistenceUnitInfo.setPersistenceUnitName(atts.getValue(ATTRIBUTE_NAME));
String transactionType = atts.getValue(ATTRIBUTE_TRANSACTION_TYPE);
if(transactionType != null) {
persistenceUnitInfo.setTransactionType(PersistenceUnitTransactionType.valueOf(transactionType));
}
return;
} else if (ELEMENT_PROPERTY.equals(localName)) {
String name = atts.getValue(ATTRIBUTE_NAME);
String value = atts.getValue(ATTRIBUTE_VALUE);
persistenceUnitInfo.getProperties().setProperty(name, value);
} else if (ELEMENT_PROVIDER.equals(localName)) {
readCharacters = true;
return;
} else if (ELEMENT_JTA_DATA_SOURCE.equals(localName)) {
readCharacters = true;
return;
} else if (ELEMENT_NON_JTA_DATA_SOURCE.equals(localName)) {
readCharacters = true;
return;
} else if (ELEMENT_MAPPING_FILE.equals(localName)) {
readCharacters = true;
return;
} else if (ELEMENT_JAR_FILE.equals(localName)) {
readCharacters = true;
return;
} else if (ELEMENT_EXCLUDE_UNLISTED_CLASSES.equals(localName)) {
readCharacters = true;
return;
} else if (ELEMENT_CACHING.equals(localName)) {
readCharacters = true;
return;
} else if (ELEMENT_VALIDATION_MODE.equals(localName)) {
readCharacters = true;
return;
} else if (ELEMENT_CLASS.equals(localName)) {
readCharacters = true;
return;
}
}
}
@Override
public void endElement(String namespaceURI, String localName, String qName) throws SAXException {
String string = stringBuffer.toString().trim();
stringBuffer.delete(0, stringBuffer.length());
readCharacters = false;
if (NS_URI.equals(namespaceURI) || NAMESPACE_URI.equals(namespaceURI) || NAMESPACE_URI_OLD.equals(namespaceURI)) {
if (ELEMENT_PROVIDER.equals(localName)) {
persistenceUnitInfo.setPersistenceProviderClassName(string);
return;
} else if (ELEMENT_JTA_DATA_SOURCE.equals(localName)) {
persistenceUnitInfo.setJtaDataSource(
// Create a dummy DataSource that will
// throw an exception on access
new DataSourceImpl(string, null, null, null));
return;
} else if (ELEMENT_NON_JTA_DATA_SOURCE.equals(localName)) {
persistenceUnitInfo.setNonJtaDataSource(
// Create a dummy DataSource that will
// throw an exception on access
new DataSourceImpl(string, null, null, null));
return;
} else if (ELEMENT_MAPPING_FILE.equals(localName)) {
persistenceUnitInfo.getMappingFileNames().add(string);
return;
} else if (ELEMENT_JAR_FILE.equals(localName)) {
persistenceUnitInfo.getJarFiles().add(string);
return;
} else if (ELEMENT_CLASS.equals(localName)) {
persistenceUnitInfo.getManagedClassNames().add(string);
return;
} else if (ELEMENT_EXCLUDE_UNLISTED_CLASSES.equals(localName)) {
if (string.equals("true") || string.equals("1") || string.equals("")){
// default <exclude-unlisted-classes/> to true as well (an empty string)
persistenceUnitInfo.setExcludeUnlistedClasses(true);
} else {
persistenceUnitInfo.setExcludeUnlistedClasses(false);
}
return;
} else if (ELEMENT_CACHING.equals(localName)) {
persistenceUnitInfo.setSharedCacheMode(string);
} else if (ELEMENT_VALIDATION_MODE.equals(localName)) {
persistenceUnitInfo.setValidationMode(string);
} else if (ELEMENT_PERSISTENCE_UNIT.equals(localName)) {
if (persistenceUnitInfo != null){
persistenceUnits.add(persistenceUnitInfo);
persistenceUnitInfo = null;
}
}
}
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
if (readCharacters) {
stringBuffer.append(ch, start, length);
}
}
@Override
public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException {
}
@Override
public void processingInstruction(String target, String data) throws SAXException {
}
@Override
public void skippedEntity(String name) throws SAXException {
}
}