package at.intelligentminds.service;
import java.io.UnsupportedEncodingException;
import java.util.Date;
import java.util.List;
import javax.ws.rs.FormParam;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.xml.bind.DatatypeConverter;
import org.glassfish.jersey.internal.util.Base64;
import org.hibernate.Criteria;
import org.hibernate.Transaction;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Disjunction;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Projection;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import org.hibernate.transform.AliasToBeanResultTransformer;
import org.json.JSONArray;
import org.json.JSONObject;
import com.mysql.jdbc.util.Base64Decoder;
import at.intelligentminds.service.model.HibernateSupport;
import at.intelligentminds.service.model.Message;
import at.intelligentminds.service.model.User;
@Path("/messageservice")
public class MessageService {
private String toBase64(String ori){
try {
return DatatypeConverter.printBase64Binary(ori.getBytes("UTF-8"));
}
catch (UnsupportedEncodingException e) {
e.printStackTrace();
return "";
}
}
private String fromBase64(String ori){
try{
return new String(DatatypeConverter.parseBase64Binary(ori));
}catch(Exception e){
return ori;
}
}
@POST
@Path("/createmessage")
@Produces(MediaType.TEXT_PLAIN)
public Boolean createMessage(@FormParam("senderEmail") String senderEmail,
@FormParam("receiverEmail") String receiverEmail, @FormParam("text") String text,
@FormParam("authtoken") String authtoken) {
if (!new LoginService().validate(authtoken)) {
return false;
}
Transaction tx = HibernateSupport.getSession().getTransaction();
try {
tx.begin();
User sender = (User) HibernateSupport.getSession().get(User.class, senderEmail);
User receiver = (User) HibernateSupport.getSession().get(User.class, receiverEmail);
tx.commit();
if (sender == null || receiver == null || text == null) {
return false;
}
Message message = new Message();
message.setText(toBase64(text));
message.setUserByUserReceiverId(receiver);
message.setUserByUserSenderId(sender);
message.setCreatonDate(new Date());
tx = HibernateSupport.getSession().beginTransaction();
boolean success = HibernateSupport.persist(message);
tx.commit();
return success;
}
catch (Exception e) {
e.printStackTrace();
tx.rollback();
}
return false;
}
@POST
@Path("/retrievemessages")
@Produces(MediaType.TEXT_PLAIN)
public String retrieveMessage(@FormParam("senderEmail") String senderEmail,
@FormParam("receiverEmail") String receiverEmail, @FormParam("authtoken") String authtoken) {
if (!new LoginService().validate(authtoken)) {
return "[]";
}
Transaction tx = HibernateSupport.getSession().getTransaction();
tx.begin();
User sender = (User) HibernateSupport.getSession().get(User.class, senderEmail);
User receiver = (User) HibernateSupport.getSession().get(User.class, receiverEmail);
if (sender == null || receiver == null) {
tx.commit();
return "[]";
}
Criterion c_sender_email = Restrictions.eq("userByUserSenderId", sender);
Criterion c_receiver_email = Restrictions.eq("userByUserReceiverId", receiver);
Criterion c_sender_email2 = Restrictions.eq("userByUserSenderId", receiver);
Criterion c_receiver_email2 = Restrictions.eq("userByUserReceiverId", sender);
Disjunction or_sender_email = Restrictions.disjunction();
Disjunction or_receiver_email = Restrictions.disjunction();
or_sender_email.add(c_sender_email);
or_sender_email.add(c_sender_email2);
or_receiver_email.add(c_receiver_email);
or_receiver_email.add(c_receiver_email2);
Criterion final_email = Restrictions.and(or_sender_email, or_receiver_email);
Criteria criteria = HibernateSupport.getSession().createCriteria(Message.class, "message");
criteria.add(final_email);
criteria.addOrder(Order.asc("creatonDate"));
criteria.createAlias("message.userByUserSenderId", "userByUserSenderId");
criteria.createAlias("message.userByUserReceiverId", "userByUserReceiverId");
criteria.setProjection(Projections.projectionList()
.add(Projections.property("text"), "text")
.add(Projections.property("creatonDate"), "creatonDate")
.add(Projections.property("userByUserReceiverId.email"), "email")
.add(Projections.property("userByUserSenderId.email"), "email"));
JSONArray array = new JSONArray();
try {
List res = criteria.list();
tx.commit();
for(int i = 0; i < res.size(); i++) {
Object [] messageValues = (Object [])res.get(i);
JSONObject message = new JSONObject();
message.put("text", fromBase64((String)messageValues[0]));
message.put("creatonDate", messageValues[1]);
message.put("receiverEmail", messageValues[2]);
message.put("senderEmail", messageValues[3]);
array.put(message);
}
}
catch (Exception e) {
e.printStackTrace();
tx.rollback();
}
return array.toString();
}
@GET
@Produces(MediaType.TEXT_HTML)
public String get() {
return "These are not the droids you are looking for.";
}
}