/*
*
* * Copyright 2014 Orient Technologies LTD (info(at)orientechnologies.com)
* *
* * 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.
* *
* * For more information: http://www.orientechnologies.com
*
*/
package com.orientechnologies.orient.object.jpa;
import com.orientechnologies.orient.core.id.ORecordId;
import com.orientechnologies.orient.core.metadata.schema.OClass;
import com.orientechnologies.orient.object.db.OObjectDatabaseTx;
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;
public class OJPAEntityManager 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;
OJPAEntityManager(EntityManagerFactory entityManagerFactory, OJPAProperties properties) {
this.properties = properties;
this.emFactory = entityManagerFactory;
this.database = new OObjectDatabaseTx(properties.getURL());
database.open(properties.getUser(), properties.getPassword());
if (properties.isEntityClasses()) {
database.getEntityManager().registerEntityClasses(properties.getEntityClasses());
}
transaction = new OJPAEntityTransaction(database);
if (logger.isLoggable(Level.INFO)) {
logger.info("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.info("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.info("EntityManager refreshed. " + toString());
}
}
@Override
public void clear() {
if (flushMode == FlushModeType.COMMIT) {
database.rollback();
if (logger.isLoggable(Level.FINEST)) {
logger.info("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.info("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();
}
}