package com.breezejs.hib;
import javax.ws.rs.core.Response;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.jboss.logging.Logger;
import com.breezejs.save.ContextProvider;
import com.breezejs.save.SaveResult;
import com.breezejs.util.Json;
/**
* Class to receive JSON save bundles and save them to Hibernate
* @author Steve
*
*/
public class SaveService {
public static final Logger log = Logger.getLogger(SaveService.class);
private SessionFactory sessionFactory;
private Metadata metadata;
public SaveService(SessionFactory sessionFactory, Metadata metadata) {
this.sessionFactory = sessionFactory;
this.metadata = metadata;
}
/**
* Save the changes and return a response indicated the updated entities
* or errors
* @param source
* @return
*/
public Response saveChanges(String source) {
log.debugv("saveChanges", "source={0}", source);
Response response;
Session session = sessionFactory.openSession();
try {
ContextProvider context = new HibernateContext(session, metadata);
SaveResult sr = context.saveChanges(source);
String json = Json.toJson(sr);
log.debugv("saveChanges: SaveResult={0}", json);
if (sr.hasErrors()) {
response = Response.status(Response.Status.FORBIDDEN).entity(json).build();
} else {
response = Response.ok(json).build();
}
}
catch (Exception e) {
log.errorv(e, "saveChanges: source={0}", source);
String json = Json.toJson(e);
response = Response.serverError().entity(json).build();
}
finally {
session.close();
}
return response;
}
/**
* For debugging
*/
public static void main(String[] args) throws Exception {
SaveService ss = new SaveService(StaticConfigurator.getSessionFactory(), StaticConfigurator.getMetadata());
// String saveBundle = "{'entities':[{'customerID':'04fa5e78-f2cb-d74d-a7de-083ee17b6ad2','rowVersion':3,'customerID_OLD':'ALFKI','companyName':'Alfreds Futterkiste','contactName':'Maria K. Anders','contactTitle':'Sales Representativ','address':'Obere Str. 57','city':'Berlin','region':'Ost','postalCode':'12209','country':'Germany','phone':'030-0074321','fax':'030-0076545','entityAspect':{'entityTypeName':'Customer:#northwind.model','defaultResourceName':'Customers','entityState':'Modified','originalValuesMap':{'contactTitle':'Sales Representative','rowVersion':2},'autoGeneratedKey':{'propertyName':'customerID','autoGeneratedKeyType':'KeyGenerator'}}}],'saveOptions':{}}";
// String saveBundle = "{'entities':[{'customerID':'857b40ea-21a3-ba4a-bcd8-af44d3d37418','rowVersion':3,'customerID_OLD':'BERGS','companyName':'Berglunds snabbk�p','contactName':'Error Message?','contactTitle':'Order Administrator','address':'Berguvsv�gen 8','city':'Lule�','region':null,'postalCode':'S-958 22','country':'Sweden','phone':'0921-12 34 65','fax':'0921-12 34 67','entityAspect':{'entityTypeName':'Customer:#northwind.model','defaultResourceName':'Customers','entityState':'Modified','originalValuesMap':{'contactName':'Error message','rowVersion':10},'autoGeneratedKey':{'propertyName':'customerID','autoGeneratedKeyType':'KeyGenerator'}}}],'saveOptions':{}}";
String saveBundle = "{ 'entities': [ { 'rowVersion': 0, 'orderID': -1, 'productID': 1, 'unitPrice': 0, 'quantity': 5, 'discount': 0, 'entityAspect': { 'entityTypeName': 'OrderDetail:#northwind.model', 'defaultResourceName': 'OrderDetails', 'entityState': 'Added', 'originalValuesMap': { }, 'autoGeneratedKey': null } }, { 'orderID': -1, 'rowVersion': 0, 'customerID': '785efa04-cbf2-4dd7-a7de-083ee17b6ad2', 'employeeID': 1, 'orderDate': null, 'requiredDate': null, 'shippedDate': null, 'freight': null, 'shipName': 'Test 2014-01-16T20:50:50.942Z', 'shipAddress': null, 'shipCity': null, 'shipRegion': null, 'shipPostalCode': null, 'shipCountry': null, 'entityAspect': { 'entityTypeName': 'Order:#northwind.model', 'defaultResourceName': 'Orders', 'entityState': 'Added', 'originalValuesMap': { }, 'autoGeneratedKey': { 'propertyName': 'orderID', 'autoGeneratedKeyType': 'Identity' } } } ], 'saveOptions': { } }";
Response response = ss.saveChanges(saveBundle);
SaveService.log.info(response);
SaveService.log.info(response.getEntity());
}
}