package cz.cvut.fel.adaptiverestfulapi.data.persistence; import cz.cvut.fel.adaptiverestfulapi.core.HttpContext; import cz.cvut.fel.adaptiverestfulapi.data.DataException; import cz.cvut.fel.adaptiverestfulapi.data.NotFoundException; import cz.cvut.fel.adaptiverestfulapi.meta.configuration.Configuration; import cz.cvut.fel.adaptiverestfulapi.meta.model.Attribute; import cz.cvut.fel.adaptiverestfulapi.meta.model.Entity; import javax.persistence.EntityManager; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class PutHandler extends cz.cvut.fel.adaptiverestfulapi.data.PutHandler { protected EntityManager manager; public PutHandler(EntityManager manager) { this.manager = manager; } @Override protected HttpContext put(Entity entity, HttpContext context, Configuration configuration) throws DataException { Attribute primary = entity.getPrimary(); Object identifier = context.getRouter().getIdentifier(primary.getAttributeType()); Object current = this.manager.find(entity.getEntityClass(), identifier); if (current == null) { throw new NotFoundException(entity.getName(), identifier.toString()); } Object object = context.getContent(); if (object == null) { throw new DataException("Object for POST is null."); } this.ensureIdentifier(entity, identifier, object); Object result = this.update(entity, identifier, object); context.setContent(result); return context; } protected Object update(Entity entity, Object identifier, Object object) throws DataException { this.manager.getTransaction().begin(); this.manager.merge(object); this.manager.flush(); this.manager.clear(); this.manager.getTransaction().commit(); return this.manager.find(entity.getEntityClass(), identifier); } private void ensureIdentifier(Entity entity, Object identifier, Object object) throws DataException { Attribute primary = entity.getPrimary(); Method setter = primary.getSetter(); try { setter.invoke(object, identifier); } catch (IllegalAccessException e) { throw new DataException(e); } catch (InvocationTargetException e) { throw new DataException(e); } } }