/*******************************************************************************
* Copyright (c) 1998, 2015 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 v1.0 and Eclipse Distribution License v. 1.0
* which accompanies this distribution.
* The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
* and the Eclipse Distribution License is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* 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 javax.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 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;
}
public void setDocumentLocator(Locator locator) {
}
public void startDocument() throws SAXException {
}
public void endDocument() throws SAXException {
}
public void startPrefixMapping(String prefix, String uri) throws SAXException {
}
public void endPrefixMapping(String prefix) throws SAXException {
}
public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException {
if (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;
}
}
}
public void endElement(String namespaceURI, String localName, String qName) throws SAXException {
String string = stringBuffer.toString().trim();
stringBuffer.delete(0, stringBuffer.length());
readCharacters = false;
if (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;
}
}
}
}
public void characters(char[] ch, int start, int length) throws SAXException {
if (readCharacters) {
stringBuffer.append(ch, start, length);
}
}
public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException {
}
public void processingInstruction(String target, String data) throws SAXException {
}
public void skippedEntity(String name) throws SAXException {
}
}