package org.raidenjpa.spec; import java.lang.reflect.Method; import java.util.Collection; import java.util.List; import java.util.Map; import javax.persistence.Entity; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.EntityTransaction; import javax.persistence.FlushModeType; import javax.persistence.LockModeType; import javax.persistence.ManyToOne; import javax.persistence.OneToMany; import javax.persistence.Query; import javax.persistence.TypedQuery; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.metamodel.Metamodel; import org.raiden.exception.NotYetImplementedException; import org.raidenjpa.db.InMemoryDB; import org.raidenjpa.reflection.ReflectionUtil; import org.raidenjpa.spec.criteria.RaidenCriteriaBuilder; import org.raidenjpa.spec.criteria.RaidenCriteriaQuery; import org.raidenjpa.util.BadSmell; public class RaidenEntityManager implements EntityManager { @Override public void persist(Object entity) { // TODO Auto-generated method stub } @BadSmell("This one could be expensive") @Override public <T> T merge(T entity) { List<String> fields = ReflectionUtil.getBeanFields(entity); for (String field : fields) { Object attrObject = ReflectionUtil.getBeanField(entity, field); if (attrObject == null) { continue; } Method method = ReflectionUtil.getMethodByName(entity.getClass(), ReflectionUtil.toMethodName("get", field)); if (attrObject instanceof Collection) { OneToMany oneToMany = method.getAnnotation(OneToMany.class); if (oneToMany == null || oneToMany.cascade() == null) { continue; } for (Object obj : ((Collection<?>) attrObject)) { if (obj.getClass().isAnnotationPresent(Entity.class)) { merge(obj); } } } else { ManyToOne manyToOne = method.getAnnotation(ManyToOne.class); if (manyToOne != null && manyToOne.cascade().length != 0) { merge(attrObject); } } } return InMemoryDB.me().put(entity); } @Override public void remove(Object entity) { if (entity == null) { throw new IllegalArgumentException(); } Object id = ReflectionUtil.getBeanId(entity); if (find(entity.getClass(), id) == null) { throw new IllegalArgumentException(); } InMemoryDB.me().remove(entity.getClass(), id); } @Override public <T> T find(Class<T> entityClass, Object primaryKey) { return InMemoryDB.me().get(entityClass, primaryKey); } @Override public <T> T find(Class<T> entityClass, Object primaryKey, Map<String, Object> properties) { // TODO Auto-generated method stub return null; } @Override public <T> T find(Class<T> entityClass, Object primaryKey, LockModeType lockMode) { // TODO Auto-generated method stub return null; } @Override public <T> T find(Class<T> entityClass, Object primaryKey, LockModeType lockMode, Map<String, Object> properties) { // TODO Auto-generated method stub return null; } @Override public <T> T getReference(Class<T> entityClass, Object primaryKey) { // TODO Auto-generated method stub return null; } @Override public void flush() { // TODO Auto-generated method stub } @Override public void setFlushMode(FlushModeType flushMode) { // TODO Auto-generated method stub } @Override public FlushModeType getFlushMode() { // TODO Auto-generated method stub return null; } @Override public void lock(Object entity, LockModeType lockMode) { // TODO Auto-generated method stub } @Override public void lock(Object entity, LockModeType lockMode, Map<String, Object> properties) { // TODO Auto-generated method stub } @Override public void refresh(Object entity) { // TODO Auto-generated method stub } @Override public void refresh(Object entity, Map<String, Object> properties) { // TODO Auto-generated method stub } @Override public void refresh(Object entity, LockModeType lockMode) { // TODO Auto-generated method stub } @Override public void refresh(Object entity, LockModeType lockMode, Map<String, Object> properties) { // TODO Auto-generated method stub } @Override public void clear() { // TODO Auto-generated method stub } @Override public void detach(Object entity) { // TODO Auto-generated method stub } @Override public boolean contains(Object entity) { // TODO Auto-generated method stub return false; } @Override public LockModeType getLockMode(Object entity) { // TODO Auto-generated method stub return null; } @Override public void setProperty(String propertyName, Object value) { // TODO Auto-generated method stub } @Override public Map<String, Object> getProperties() { // TODO Auto-generated method stub return null; } @Override public Query createQuery(String jpql) { return new RaidenQuery(jpql); } @Override public <T> TypedQuery<T> createQuery(String qlString, Class<T> resultClass) { return new RaidenTypedQuery<T>(createQuery(qlString)); } @Override public <T> TypedQuery<T> createQuery(CriteriaQuery<T> criteriaQuery) { RaidenCriteriaQuery<T> raidenCriteriaQuery = (RaidenCriteriaQuery<T>) criteriaQuery; return new RaidenTypedQuery<T>(createQuery(raidenCriteriaQuery.toJpql())); } @Override public Query createNamedQuery(String name) { // TODO Auto-generated method stub return null; } @Override public <T> TypedQuery<T> createNamedQuery(String name, Class<T> resultClass) { // TODO Auto-generated method stub return null; } @Override public Query createNativeQuery(String sql) { throw new NotYetImplementedException(); } @SuppressWarnings("rawtypes") @Override public Query createNativeQuery(String sqlString, Class resultClass) { // TODO Auto-generated method stub return null; } @Override public Query createNativeQuery(String sqlString, String resultSetMapping) { // TODO Auto-generated method stub return null; } @Override public void joinTransaction() { // TODO Auto-generated method stub } @Override public <T> T unwrap(Class<T> cls) { // TODO Auto-generated method stub return null; } @Override public Object getDelegate() { // TODO Auto-generated method stub return null; } @Override public void close() { // TODO Auto-generated method stub } @Override public boolean isOpen() { // TODO Auto-generated method stub return false; } public EntityTransaction getTransaction() { return new RaidenEntityTransction(); } @Override public EntityManagerFactory getEntityManagerFactory() { // TODO Auto-generated method stub return null; } @Override public CriteriaBuilder getCriteriaBuilder() { return new RaidenCriteriaBuilder(); } @Override public Metamodel getMetamodel() { // TODO Auto-generated method stub return null; } }