blob: eccfd574a280c275a8d2837f93ec461f14a0c5c1 [file] [log] [blame]
// 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);
}
}