/*******************************************************************************
* 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:
* 08/10/2009-2.0 Guy Pelletier
* - 267391: JPA 2.0 implement/extend/use an APT tooling library for MetaModel API canonical classes
* 03/06/2013-2.5 Guy Pelletier
* - 267391: JPA 2.1 Functionality for Java EE 7 (JSR-338)
******************************************************************************/
package org.eclipse.persistence.internal.jpa.modelgen.objects;
import org.eclipse.persistence.internal.jpa.deployment.SEPersistenceUnitInfo;
import org.eclipse.persistence.internal.jpa.deployment.SEPersistenceUnitProperty;
import org.eclipse.persistence.internal.jpa.modelgen.objects.PersistenceXML;
import org.eclipse.persistence.oxm.NamespaceResolver;
import org.eclipse.persistence.oxm.XMLContext;
import org.eclipse.persistence.oxm.XMLDescriptor;
import org.eclipse.persistence.oxm.mappings.XMLCompositeCollectionMapping;
import org.eclipse.persistence.oxm.mappings.XMLCompositeDirectCollectionMapping;
import org.eclipse.persistence.oxm.mappings.XMLDirectMapping;
import org.eclipse.persistence.sessions.Project;
/**
* A mapping project used to read JPA 2.0 metadata (persistence.xml and its
* persistence units) through OX mappings.
*
* @author Guy Pelletier, Doug Clarke
* @since EclipseLink 1.2
*/
public class PersistenceXMLMappings {
/**
* INTERNAL:
*/
private static XMLDescriptor buildPersistenceXMLDescriptor(NamespaceResolver resolver) {
XMLDescriptor descriptor = new XMLDescriptor();
descriptor.setNamespaceResolver(resolver);
descriptor.setJavaClass(PersistenceXML.class);
descriptor.setDefaultRootElement("persistence");
XMLCompositeCollectionMapping puMapping = new XMLCompositeCollectionMapping();
puMapping.setAttributeName("persistenceUnitInfos");
puMapping.setReferenceClass(SEPersistenceUnitInfo.class);
puMapping.setXPath("persistence-unit");
descriptor.addMapping(puMapping);
return descriptor;
}
/**
* INTERNAL:
*/
private static XMLDescriptor buildPUInfoDescriptor(NamespaceResolver resolver) {
XMLDescriptor descriptor = new XMLDescriptor();
descriptor.setNamespaceResolver(resolver);
descriptor.setJavaClass(SEPersistenceUnitInfo.class);
descriptor.addDirectMapping("persistenceUnitName", "@name");
// For the canonical model generation we don't exclude the unlisted
// classes unless explicitly set by the user.
XMLDirectMapping mapping = new XMLDirectMapping();
mapping.setAttributeName("excludeUnlistedClasses");
mapping.setXPath("exclude-unlisted-classes/text()");
mapping.setNullValue(false);
descriptor.addMapping(mapping);
XMLCompositeDirectCollectionMapping classesMapping = new XMLCompositeDirectCollectionMapping();
classesMapping.setAttributeName("managedClassNames");
classesMapping.setXPath("class/text()");
descriptor.addMapping(classesMapping);
XMLCompositeDirectCollectionMapping mappingFilesMapping = new XMLCompositeDirectCollectionMapping();
mappingFilesMapping.setAttributeName("mappingFiles");
mappingFilesMapping.setXPath("mapping-file/text()");
descriptor.addMapping(mappingFilesMapping);
XMLCompositeCollectionMapping persistenceUnitPropertiesMapping = new XMLCompositeCollectionMapping();
persistenceUnitPropertiesMapping.setAttributeName("persistenceUnitProperties");
persistenceUnitPropertiesMapping.setGetMethodName("getPersistenceUnitProperties");
persistenceUnitPropertiesMapping.setSetMethodName("setPersistenceUnitProperties");
persistenceUnitPropertiesMapping.setReferenceClass(SEPersistenceUnitProperty.class);
persistenceUnitPropertiesMapping.setXPath("properties/property");
descriptor.addMapping(persistenceUnitPropertiesMapping);
return descriptor;
}
/**
* INTERNAL:
*/
private static XMLDescriptor buildPUPropertyDescriptor(NamespaceResolver resolver) {
XMLDescriptor descriptor = new XMLDescriptor();
descriptor.setNamespaceResolver(resolver);
descriptor.setJavaClass(SEPersistenceUnitProperty.class);
descriptor.addDirectMapping("name", "@name");
descriptor.addDirectMapping("value", "@value");
return descriptor;
}
/**
* INTERNAL:
*/
public static XMLContext createXML2_0Context() {
return createXMLContext("http://java.sun.com/xml/ns/persistence");
}
/**
* INTERNAL:
*/
public static XMLContext createXML2_1Context() {
return createXMLContext("http://xmlns.jcp.org/xml/ns/persistence");
}
/**
* INTERNAL:
*/
protected static XMLContext createXMLContext(String namespaceURI) {
Project project = new Project();
NamespaceResolver resolver = new NamespaceResolver();
resolver.setDefaultNamespaceURI(namespaceURI);
project.addDescriptor(buildPersistenceXMLDescriptor(resolver));
project.addDescriptor(buildPUInfoDescriptor(resolver));
project.addDescriptor(buildPUPropertyDescriptor(resolver));
return new XMLContext(project);
}
}