blob: 894008c133296a2b76427a4e759c6e96d2abda56 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.openjpa.persistence.meta;
import javax.persistence.metamodel.EmbeddableType;
import javax.persistence.metamodel.EntityType;
import javax.persistence.metamodel.IdentifiableType;
import javax.persistence.metamodel.MappedSuperclassType;
import javax.persistence.metamodel.Type;
import org.apache.openjpa.lib.util.Localizer;
import org.apache.openjpa.meta.ClassMetaData;
/**
* Persistent Type according to JPA 2.0.
* <br>
* JPA 2.0 defines a type system for persistent objects to decorate a core Java type system
* with persistence-relevant properties such as persistent identity, independently persistence
* capable etc.
* <br>
* Implemented as a thin adapter to OpenJPA metadata system. Mostly immutable.
*
* @author Pinaki Poddar
*
* @since 2.0.0
*
*/
public class Types {
protected static Localizer _loc = Localizer.forPackage(Types.class);
/**
* Mirrors a Java class.
*
* @param <X> Java class
*/
static abstract class BaseType<X> implements Type<X> {
public final Class<X> cls;
protected BaseType(Class<X> cls) {
this.cls = cls;
}
public final Class<X> getJavaType() {
return cls;
}
public String toString() {
return cls.getName();
}
}
/**
* Basic non-relational types of a persistent attribute such as <code>long</code> or
* <code>java.util.Date</code>.
*
* @author Pinaki Poddar
*
* @param <X> represented Java type.
*/
public static class Basic<X> extends BaseType<X> implements Type<X> {
public Basic(Class<X> cls) {
super(cls);
}
public PersistenceType getPersistenceType() {
return PersistenceType.BASIC;
}
}
/**
* Represents an abstract persistent type that has a persistent identity.
*
* @author Pinaki Poddar
*
* @param <X>
*/
public static abstract class Identifiable<X> extends AbstractManagedType<X>
implements IdentifiableType<X> {
public Identifiable(ClassMetaData meta, MetamodelImpl model) {
super(meta, model);
}
/**
* Whether or not the identifiable type has a version attribute.
* @return boolean indicating whether or not the identifiable
* type has a version attribute
*/
public boolean hasVersionAttribute() {
return meta.getVersionField() != null;
}
/**
* Return the identifiable type that corresponds to the most
* specific mapped superclass or entity extended by the entity
* or mapped superclass.
* @return super type of identifiable type or null if no such super type
*/
public IdentifiableType<? super X> getSupertype() {
ClassMetaData superMeta = meta.getPCSuperclassMetaData();
if (superMeta == null)
return null;
return (IdentifiableType<? super X>) model.managedType(superMeta.getDescribedType());
}
public boolean hasIdAttribute() {
return meta.getIdentityType() == ClassMetaData.ID_APPLICATION;
}
/**
* Whether or not the identifiable type uses an attribute to represents its persistent identity.
* Returns true for a simple or embedded identifier.
* Returns false for an classes that use separate identifier class for its persistent identity.
*
* @return boolean indicating whether or not the identifiable
* type represents its persistent identity via a single identifier attribute.
*/
public boolean hasSingleIdAttribute() {
return meta.getPrimaryKeyFields().length == 1;
}
/**
* Return the type that represents the type of the id.
* @return type of identifier
*/
public Type<?> getIdType() {
Class<?> idType = hasSingleIdAttribute()
? meta.getPrimaryKeyFields()[0].getDeclaredType() : meta.getObjectIdType();
return model.getType(idType);
}
}
/**
* An embedded, not independently identifiable type.
*
* @author Pinaki Poddar
*
* @param <X> the represented Java type.
*/
public static class Embeddable<X> extends AbstractManagedType<X>
implements EmbeddableType<X> {
public Embeddable(ClassMetaData meta, MetamodelImpl model) {
super(meta, model);
}
public PersistenceType getPersistenceType() {
return PersistenceType.EMBEDDABLE;
}
}
/**
* A abstract, independently identifiable persistent type.
*
* @author Pinaki Poddar
*
* @param <X> the represented Java type.
*/
public static class MappedSuper<X> extends Identifiable<X> implements
MappedSuperclassType<X> {
public MappedSuper(ClassMetaData meta, MetamodelImpl model) {
super(meta, model);
}
public PersistenceType getPersistenceType() {
return PersistenceType.MAPPED_SUPERCLASS;
}
}
/**
* An entity type that is independently identifiable.
*
* @author Pinaki Poddar
*
* @param <X> the represented Java type.
*/
public static class Entity<X> extends Identifiable<X>
implements EntityType<X> {
public Entity(ClassMetaData meta, MetamodelImpl model) {
super(meta, model);
}
public PersistenceType getPersistenceType() {
return PersistenceType.ENTITY;
}
public String getName() {
return meta.getTypeAlias();
}
/**
* Return the bindable type of the represented object.
* @return bindable type
*/
public BindableType getBindableType() {
return BindableType.ENTITY_TYPE;
}
/**
* Return the Java type of the represented object.
* If the bindable type of the object is PLURAL_ATTRIBUTE,
* the Java element type is returned. If the bindable type is
* SINGULAR_ATTRIBUTE or ENTITY_TYPE, the Java type of the
* represented entity or attribute is returned.
* @return Java type
*/
public Class<X> getBindableJavaType() {
return getJavaType();
}
}
/**
* A pseudo managed type used to represent keys of a java.util.Map as a
* pseudo attribute.
**/
public static class PseudoEntity<X> extends AbstractManagedType<X> {
protected PseudoEntity(Class<X> cls, MetamodelImpl model) {
super(cls, model);
}
public javax.persistence.metamodel.Type.PersistenceType getPersistenceType() {
return PersistenceType.ENTITY;
}
}
}