blob: 83eccdd31e240c69a11100f943a52ae5704c6bb9 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010-2013 Oracle. 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:
* dclarke - EclipseLink 2.3 - MySports Demo Bug 344608
******************************************************************************/
package eclipselink.example.mysports.admin.services;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.EntityManager;
import org.eclipse.persistence.Version;
import org.eclipse.persistence.annotations.MultitenantType;
import org.eclipse.persistence.annotations.TenantTableDiscriminatorType;
import org.eclipse.persistence.internal.jpa.metadata.accessors.classes.EmbeddableAccessor;
import org.eclipse.persistence.internal.jpa.metadata.accessors.classes.EntityAccessor;
import org.eclipse.persistence.internal.jpa.metadata.accessors.classes.MappedSuperclassAccessor;
import org.eclipse.persistence.internal.jpa.metadata.accessors.classes.XMLAttributes;
import org.eclipse.persistence.internal.jpa.metadata.accessors.mappings.BasicAccessor;
import org.eclipse.persistence.internal.jpa.metadata.columns.ColumnMetadata;
import org.eclipse.persistence.internal.jpa.metadata.columns.TenantDiscriminatorColumnMetadata;
import org.eclipse.persistence.internal.jpa.metadata.multitenant.MultitenantMetadata;
import org.eclipse.persistence.internal.jpa.metadata.multitenant.TenantTableDiscriminatorMetadata;
import org.eclipse.persistence.internal.jpa.metadata.xml.XMLEntityMappings;
import org.eclipse.persistence.internal.jpa.metadata.xml.XMLEntityMappingsWriter;
import eclipselink.example.mysports.admin.model.Extension;
import eclipselink.example.mysports.admin.model.HostedLeague;
/**
* Load the {@link Extension} from the database and generate the ORM and OXM
* mapping files for the extensions.
*
* @author dclarke
* @since EclipseLink 2.3.0
*/
public class MappingsLoader {
private static final String MODEL_PACKAGE = "eclipselink.example.mysports.application.model";
public static XMLEntityMappings getXMLEntityMappings(EntityManager em, String leagueId) {
HostedLeague league = em.find(HostedLeague.class, leagueId);
if (league == null) {
throw new IllegalArgumentException("Unknown League: " + leagueId);
}
return getXMLEntityMappings(league);
}
public static XMLEntityMappings getXMLEntityMappings(HostedLeague league) {
XMLEntityMappings mappings = new XMLEntityMappings();
mappings.setVersion(Version.getVersion());
mappings.setEntities(new ArrayList<EntityAccessor>());
mappings.setEmbeddables(new ArrayList<EmbeddableAccessor>());
mappings.setMappedSuperclasses(new ArrayList<MappedSuperclassAccessor>());
mappings.setPackage(MODEL_PACKAGE);
addEntity(league, "Division", mappings);
addEntity(league, "Team", mappings);
addEntity(league, "Player", mappings);
return mappings;
}
public static String getORMapping(EntityManager em, String leagueId) {
XMLEntityMappings mappings = getXMLEntityMappings(em, leagueId);
StringWriter writer = new StringWriter();
XMLEntityMappingsWriter.write(mappings, writer);
return writer.toString();
}
public static void addEntity(HostedLeague league, String entityType, XMLEntityMappings mappings) {
EntityAccessor accessor = new EntityAccessor();
accessor.setClassName(entityType);
mappings.getEntities().add(accessor);
switch (league.getDataIsolation()) {
case ROW:
// Add @Multitenant(SINGLE_TABLE)
MultitenantMetadata multitenant = new MultitenantMetadata();
multitenant.setType(MultitenantType.SINGLE_TABLE.name());
List<TenantDiscriminatorColumnMetadata> tenantDiscriminatorColumns = new ArrayList<TenantDiscriminatorColumnMetadata>(1);
TenantDiscriminatorColumnMetadata tenantDiscColumn = new TenantDiscriminatorColumnMetadata();
tenantDiscColumn.setName("LEAGUE_ID");
tenantDiscColumn.setContextProperty("league");
tenantDiscColumn.setLength(5);
tenantDiscriminatorColumns.add(tenantDiscColumn);
multitenant.setTenantDiscriminatorColumns(tenantDiscriminatorColumns);
accessor.setMultitenant(multitenant);
break;
case TABLE:
// Add @Multitenant(TABLE_PER_TENANT) with
// @TenenatTableDisciminator(SUFFIX)
multitenant = new MultitenantMetadata();
multitenant.setType(MultitenantType.TABLE_PER_TENANT.name());
TenantTableDiscriminatorMetadata tenantTableDiscriminator = new TenantTableDiscriminatorMetadata();
tenantTableDiscriminator.setType(TenantTableDiscriminatorType.SUFFIX.name());
tenantTableDiscriminator.setContextProperty("league");
multitenant.setTenantTableDiscriminator(tenantTableDiscriminator);
accessor.setMultitenant(multitenant);
break;
case SCHEMA:
// Add @Multitenant(TABLE_PER_TENANT) with
// @TenenatTableDisciminator(SCHEMA)
multitenant = new MultitenantMetadata();
multitenant.setType(MultitenantType.TABLE_PER_TENANT.name());
tenantTableDiscriminator = new TenantTableDiscriminatorMetadata();
tenantTableDiscriminator.setType(TenantTableDiscriminatorType.SCHEMA.name());
tenantTableDiscriminator.setContextProperty("league");
multitenant.setTenantTableDiscriminator(tenantTableDiscriminator);
accessor.setMultitenant(multitenant);
break;
// TODO
case DATABASE:
throw new RuntimeException("DataIsolation.DATABASE::NOT YET SUPPORTED");
}
if (league != null) {
for (Extension ext : league.getExtensions(entityType)) {
BasicAccessor allergies = new BasicAccessor();
allergies.setName(ext.getName());
allergies.setAttributeType(ext.getJavaType());
allergies.setAccess("VIRTUAL");
ColumnMetadata column = new ColumnMetadata();
column.setName(ext.getColumnName());
allergies.setColumn(column);
if (accessor.getAttributes() == null) {
accessor.setAttributes(new XMLAttributes());
}
if (accessor.getAttributes().getBasics() == null) {
accessor.getAttributes().setBasics(new ArrayList<BasicAccessor>());
}
accessor.getAttributes().getBasics().add(allergies);
}
}
}
}