package com.orientechnologies.orient.object.jpa;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.FlushModeType;
import javax.persistence.LockModeType;
import javax.persistence.Query;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.metamodel.Metamodel;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import com.orientechnologies.orient.core.id.ORecordId;
import com.orientechnologies.orient.core.metadata.schema.OClass;
import com.orientechnologies.orient.object.db.OObjectDatabaseTx;
/**
* @author Sergey Bespalov
*
*/
public class OJPAObjectDatabaseTxEntityManager implements EntityManager
{
/** the log used by this class. */
private static Logger logger = Logger.getLogger(OJPAPersistenceProvider.class.getName());
private final EntityManagerFactory emFactory;
private final OObjectDatabaseTx database;
private final EntityTransaction transaction;
private final OJPAProperties properties;
private FlushModeType flushMode = FlushModeType.AUTO;
public OJPAObjectDatabaseTxEntityManager(OObjectDatabaseTx database,
EntityManagerFactory entityManagerFactory,
OJPAProperties properties)
{
this.properties = properties;
this.emFactory = entityManagerFactory;
this.database = database;
this.transaction = new OJPAEntityTransaction(database);
if (logger.isLoggable(Level.INFO))
{
logger.fine("EntityManager created for persistence unit : " + entityManagerFactory.toString());
}
}
@Override
public void persist(Object entity)
{
database.save(entity);
}
@Override
public <T> T merge(T entity)
{
throw new UnsupportedOperationException("merge");
}
@Override
public void remove(Object entity)
{
database.delete(entity);
}
@Override
@SuppressWarnings("unchecked")
public <T> T find(Class<T> entityClass,
Object primaryKey)
{
final ORecordId rid;
if (primaryKey instanceof ORecordId)
{
rid = (ORecordId) primaryKey;
}
else if (primaryKey instanceof String)
{
rid = new ORecordId((String) primaryKey);
}
else if (primaryKey instanceof Number)
{
// COMPOSE THE RID
OClass cls = database.getMetadata().getSchema().getClass(entityClass);
if (cls == null)
{
throw new IllegalArgumentException("Class '" + entityClass + "' is not configured in the database");
}
rid = new ORecordId(cls.getDefaultClusterId(), ((Number) primaryKey).longValue());
}
else
{
throw new IllegalArgumentException(
"PrimaryKey '" + primaryKey + "' type (" + primaryKey.getClass() + ") is not supported");
}
return (T) database.load(rid);
}
@Override
public <T> T getReference(Class<T> entityClass,
Object primaryKey)
{
throw new UnsupportedOperationException("merge");
}
@Override
public void flush()
{
if (flushMode == FlushModeType.COMMIT)
{
database.commit();
if (logger.isLoggable(Level.FINEST))
{
logger.fine("EntityManager flushed. " + toString());
}
}
}
@Override
public FlushModeType getFlushMode()
{
return flushMode;
}
@Override
public void setFlushMode(FlushModeType flushMode)
{
this.flushMode = flushMode;
}
@Override
public void lock(Object entity,
LockModeType lockMode)
{
throw new UnsupportedOperationException("lock");
}
@Override
public void refresh(Object entity)
{
database.load(entity);
if (logger.isLoggable(Level.FINEST))
{
logger.fine("EntityManager refreshed. " + toString());
}
}
@Override
public void clear()
{
if (flushMode == FlushModeType.COMMIT)
{
database.rollback();
if (logger.isLoggable(Level.FINEST))
{
logger.fine("EntityManager cleared. " + toString());
}
}
}
@Override
public boolean contains(Object entity)
{
return database.isManaged(entity);
}
@Override
public Query createQuery(String qlString)
{
throw new UnsupportedOperationException("createQuery");
}
@Override
public Query createNamedQuery(String name)
{
throw new UnsupportedOperationException("createNamedQuery");
}
@Override
public Query createNativeQuery(String sqlString)
{
throw new UnsupportedOperationException("createNativeQuery");
}
@Override
@SuppressWarnings("rawtypes")
public Query createNativeQuery(String sqlString,
Class resultClass)
{
throw new UnsupportedOperationException("createNativeQuery");
}
@Override
public Query createNativeQuery(String sqlString,
String resultSetMapping)
{
throw new UnsupportedOperationException("createNativeQuery");
}
@Override
public void joinTransaction()
{
throw new UnsupportedOperationException("joinTransaction");
}
@Override
public <T> T find(Class<T> entityClass,
Object primaryKey,
Map<String, Object> properties)
{
throw new UnsupportedOperationException("find(Class<T>, LockModeType, Map<String, Object>)");
}
@Override
public <T> T find(Class<T> entityClass,
Object primaryKey,
LockModeType lockMode)
{
throw new UnsupportedOperationException("find(Class<T>, Object, LockModeType");
}
@Override
public <T> T find(Class<T> entityClass,
Object primaryKey,
LockModeType lockMode,
Map<String, Object> properties)
{
throw new UnsupportedOperationException("find(Class<T>, Object, LockModeType, Map<String, Object>)");
}
@Override
public void lock(Object entity,
LockModeType lockMode,
Map<String, Object> properties)
{
throw new UnsupportedOperationException("lock");
}
@Override
public void refresh(Object entity,
Map<String, Object> properties)
{
throw new UnsupportedOperationException("refresh");
}
@Override
public void refresh(Object entity,
LockModeType lockMode)
{
throw new UnsupportedOperationException("refresh");
}
@Override
public void refresh(Object entity,
LockModeType lockMode,
Map<String, Object> properties)
{
throw new UnsupportedOperationException("refresh");
}
@Override
public void detach(Object entity)
{
throw new UnsupportedOperationException("detach");
}
@Override
public LockModeType getLockMode(Object entity)
{
throw new UnsupportedOperationException("getLockMode");
}
@Override
public void setProperty(String propertyName,
Object value)
{
throw new UnsupportedOperationException("setProperty");
}
@Override
public Map<String, Object> getProperties()
{
return properties.getUnmodifiableProperties();
}
@Override
public <T> TypedQuery<T> createQuery(CriteriaQuery<T> criteriaQuery)
{
throw new UnsupportedOperationException("createQuery");
}
@Override
public <T> TypedQuery<T> createQuery(String qlString,
Class<T> resultClass)
{
throw new UnsupportedOperationException("createQuery");
}
@Override
public <T> TypedQuery<T> createNamedQuery(String name,
Class<T> resultClass)
{
throw new UnsupportedOperationException("createNamedQuery");
}
@Override
public <T> T unwrap(Class<T> cls)
{
throw new UnsupportedOperationException("unwrap");
}
@Override
public EntityManagerFactory getEntityManagerFactory()
{
return emFactory;
}
@Override
public CriteriaBuilder getCriteriaBuilder()
{
throw new UnsupportedOperationException("getCriteriaBuilder");
}
@Override
public Metamodel getMetamodel()
{
throw new UnsupportedOperationException("getMetamodel");
}
@Override
public Object getDelegate()
{
return database;
}
@Override
public EntityTransaction getTransaction()
{
return transaction;
}
@Override
public void close()
{
database.close();
if (logger.isLoggable(Level.INFO))
{
logger.fine("EntityManager closed. " + toString());
}
}
@Override
public boolean isOpen()
{
return !database.isClosed();
}
@Override
public String toString()
{
return "EntityManager for User@Database:" + database.getUser() + "@" + database.getURL() + ", "
+ super.toString();
}
}