// Copyright 2011, 2014 The Apache Software Foundation | |
// | |
// Licensed under the Apache License, Version 2.0 (the "License"); | |
// you may not use this file except in compliance with the License. | |
// You may obtain a copy of the License at | |
// | |
// 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.apache.tapestry5.internal.jpa; | |
import org.apache.tapestry5.ioc.internal.util.CollectionFactory; | |
import org.apache.tapestry5.jpa.TapestryPersistenceUnitInfo; | |
import org.xml.sax.Attributes; | |
import org.xml.sax.ContentHandler; | |
import org.xml.sax.Locator; | |
import org.xml.sax.SAXException; | |
import javax.persistence.SharedCacheMode; | |
import javax.persistence.ValidationMode; | |
import javax.persistence.spi.PersistenceUnitTransactionType; | |
import java.util.Arrays; | |
import java.util.Collections; | |
import java.util.List; | |
import java.util.Set; | |
public class PersistenceContentHandler implements ContentHandler | |
{ | |
private static final List<String> NAMESPACE_URIS = Arrays.asList( | |
new String[]{"http://java.sun.com/xml/ns/persistence", "http://xmlns.jcp.org/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_VERSION = "value"; | |
private static final String ATTRIBUTE_TRANSACTION_TYPE = "transaction-type"; | |
private final List<TapestryPersistenceUnitInfo> persistenceUnits = CollectionFactory.newList(); | |
private PersistenceUnitInfoImpl persistenceUnitInfo; | |
private StringBuilder characters; | |
public List<TapestryPersistenceUnitInfo> getPersistenceUnits() | |
{ | |
return persistenceUnits; | |
} | |
@Override | |
public void setDocumentLocator(final Locator locator) | |
{ | |
} | |
@Override | |
public void startDocument() throws SAXException | |
{ | |
} | |
@Override | |
public void endDocument() throws SAXException | |
{ | |
} | |
@Override | |
public void startPrefixMapping(final String prefix, final String uri) throws SAXException | |
{ | |
} | |
@Override | |
public void endPrefixMapping(final String prefix) throws SAXException | |
{ | |
} | |
@Override | |
public void startElement(final String namespaceURI, final String localName, final String qName, | |
final Attributes atts) throws SAXException | |
{ | |
if (NAMESPACE_URIS.contains(namespaceURI)) | |
{ | |
if (ELEMENT_PERSISTENCE_UNIT.equals(localName)) | |
{ | |
persistenceUnitInfo = new PersistenceUnitInfoImpl(atts.getValue(ATTRIBUTE_NAME)); | |
persistenceUnitInfo | |
.setPersistenceXMLSchemaVersion(atts.getValue(ATTRIBUTE_VERSION)); | |
final String transactionType = atts.getValue(ATTRIBUTE_TRANSACTION_TYPE); | |
if (transactionType != null) | |
{ | |
persistenceUnitInfo.transactionType(PersistenceUnitTransactionType | |
.valueOf(transactionType)); | |
} | |
} else if (ELEMENT_PROPERTY.equals(localName)) | |
{ | |
final String name = atts.getValue(ATTRIBUTE_NAME); | |
final String value = atts.getValue(ATTRIBUTE_VALUE); | |
persistenceUnitInfo.getProperties().setProperty(name, value); | |
} | |
} | |
} | |
@Override | |
public void endElement(final String namespaceURI, final String localName, final String qName) | |
throws SAXException | |
{ | |
final String string = characters.toString().trim(); | |
characters = null; | |
if (NAMESPACE_URIS.contains(namespaceURI)) | |
{ | |
if (ELEMENT_PROVIDER.equals(localName)) | |
{ | |
persistenceUnitInfo.persistenceProviderClassName(string); | |
} | |
else if (ELEMENT_CLASS.equals(localName)) | |
{ | |
persistenceUnitInfo.addManagedClassName(string); | |
} | |
else if (ELEMENT_CACHING.equals(localName)) | |
{ | |
persistenceUnitInfo.sharedCacheMode(toEnum(SharedCacheMode.class, string)); | |
} | |
else if (ELEMENT_VALIDATION_MODE.equals(localName)) | |
{ | |
persistenceUnitInfo.validationMode(toEnum(ValidationMode.class, string)); | |
} | |
else if (ELEMENT_MAPPING_FILE.equals(localName)) | |
{ | |
persistenceUnitInfo.addMappingFileName(string); | |
} | |
else if (ELEMENT_JAR_FILE.equals(localName)) | |
{ | |
persistenceUnitInfo.addJarFileUrl(string); | |
} | |
else if (ELEMENT_NON_JTA_DATA_SOURCE.equals(localName)) | |
{ | |
persistenceUnitInfo.nonJtaDataSource(string); | |
} | |
else if (ELEMENT_JTA_DATA_SOURCE.equals(localName)) | |
{ | |
persistenceUnitInfo.jtaDataSource(string); | |
} | |
else if (ELEMENT_PERSISTENCE_UNIT.equals(localName)) | |
{ | |
if (persistenceUnitInfo != null) | |
{ | |
persistenceUnits.add(persistenceUnitInfo); | |
persistenceUnitInfo = null; | |
} | |
} else if (ELEMENT_EXCLUDE_UNLISTED_CLASSES.equals(localName)) | |
{ | |
persistenceUnitInfo.excludeUnlistedClasses(Boolean.valueOf(string)); | |
} | |
} | |
} | |
@Override | |
public void characters(final char[] ch, final int start, final int length) throws SAXException | |
{ | |
final String s = new String(ch, start, length); | |
if (characters == null) | |
{ | |
characters = new StringBuilder(s); | |
} else | |
{ | |
characters.append(s); | |
} | |
} | |
@Override | |
public void ignorableWhitespace(final char[] ch, final int start, final int length) | |
throws SAXException | |
{ | |
} | |
@Override | |
public void processingInstruction(final String target, final String data) throws SAXException | |
{ | |
} | |
@Override | |
public void skippedEntity(final String name) throws SAXException | |
{ | |
} | |
private <T extends Enum<T>> T toEnum(final Class<T> enumType, final String value) | |
{ | |
return Enum.valueOf(enumType, value); | |
} | |
} |