package com.iambookmaster.server; import java.io.IOException; import java.util.logging.Level; import java.util.logging.Logger; import javax.jdo.PersistenceManager; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.google.appengine.api.datastore.KeyFactory; import com.iambookmaster.client.ServerExchangePanel; import com.iambookmaster.client.editor.ModelPersist; import com.iambookmaster.client.exceptions.TimeoutException; import com.iambookmaster.client.locale.AppConstants; import com.iambookmaster.client.locale.AppMessages; import com.iambookmaster.server.beans.JPABook; import com.iambookmaster.server.beans.JPAUser; import com.iambookmaster.server.dao.DAO; public class PublishServlet extends LoadModelServlet { private static final long serialVersionUID = 1L; private static final Logger log = Logger.getLogger(PublishServlet.class.getName()); protected static final String PUBLISH_TASK = "com.iambookmaster.server.PublishServlet"; protected long timeoutLimit=20*1000; public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { perform(req,resp); } protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { perform(req,resp); } protected void perform(HttpServletRequest req, HttpServletResponse resp)throws IOException { final long time = System.currentTimeMillis(); req.setCharacterEncoding("UTF-8"); String operation = req.getParameter(ServerExchangePanel.FIELD_OPERATION); AppConstants appConstants = LocalMessages.getInstance(AppConstants.class, LocalMessages.getLocale(req,resp)); AppMessages appMessages = LocalMessages.getInstance(AppMessages.class, LocalMessages.getLocale(req,resp)); try { PersistenceManager em = TransactionInViewFilter.getEM(req); PublishTaskListener listener = new PublishTaskListener() { public boolean checkTimeout() { return System.currentTimeMillis()-time > timeoutLimit; } }; if (operation==null) { PublishTask publishTask = (PublishTask)req.getSession().getAttribute(PUBLISH_TASK); if (publishTask==null) { throw new LogicException("Operation is not set"); } else { //continue publishing, just to be sure - check for login JPAUser user = getUser(req,resp); publishTask.continueTask(user,em,listener); success(req,resp,KeyFactory.keyToString(publishTask.getBookKey())); } } else { startPublishing(em,listener,operation,time,req,resp,appConstants,appMessages); } } catch (TimeoutException e) { resp.setContentType("text/html; charset=UTF-8"); resp.getWriter().println("<html><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"/>"); resp.getWriter().println("<title>I am Book Master</title>"); resp.getWriter().println("<script language='javascript'>function onloadEvent() {"); resp.getWriter().print("window.location.href='"); resp.getWriter().print(req.getRequestURI()); resp.getWriter().print("';}"); resp.getWriter().println("</script></head><body onload=\"onloadEvent();\">Processing, do not close browser..."); resp.getWriter().println("</body></html>"); resp.flushBuffer(); } catch (LogicException e) { replyError("Errors were detected",e.getMessage(),req,resp); } catch (Exception e) { e.printStackTrace(); log.log(Level.SEVERE,e.getMessage()); replyError(e,req,resp); } } protected void startPublishing(PersistenceManager em, PublishTaskListener listener, String operation, long time, HttpServletRequest req, HttpServletResponse resp,AppConstants appConstants,AppMessages appMessages) throws LogicException,TimeoutException,IOException { JPAUser user = getUser(req,resp); //no errors in the model ModelPersist model = getModelFromRequest(em, user, req, resp,appConstants,appMessages); if (model==null) { return; } JPABook book = DAO.getBookDAO().findBook(em, user,model); if (book != null && book.isLocked()) { //this book is locked throw new LogicException("This Book is locked. You cannot change it."); } PublishTask task = new PublishTask(book,appConstants,appMessages); if (ServerExchangePanel.OPERATION_RE_EXPORT.equals(operation)) { req.getSession().setAttribute(PUBLISH_TASK,task); task.recreate(model,user,em,listener); } else if (ServerExchangePanel.OPERATION_CREATE.equals(operation)) { req.getSession().setAttribute(PUBLISH_TASK,task); task.create(model,user,em,listener); } else { replyError("Unknown operation",req,resp); return; } success(req,resp,KeyFactory.keyToString(task.getBookKey())); } protected void success(HttpServletRequest req, HttpServletResponse resp, String bookKey) throws IOException { //for Editor // String url = resp.encodeRedirectURL(req.getRequestURL().substring(0,req.getRequestURL().lastIndexOf("/"))+"/main.jsp"); log.log(Level.INFO,"Success publiching, key="+bookKey); replyLoad(bookKey,null, req, resp); } }