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.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.google.appengine.api.datastore.KeyFactory;
import com.google.appengine.api.users.UserServiceFactory;
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.JPABookVersion;
import com.iambookmaster.server.beans.JPAClob;
import com.iambookmaster.server.beans.JPAUser;
import com.iambookmaster.server.dao.BooksDAO;
import com.iambookmaster.server.dao.DAO;
public class WebPublishServlet extends PublishServlet {
private static final long serialVersionUID = 1L;
private static final Logger log = Logger.getLogger(WebPublishServlet.class.getName());
protected void startPublishing(PersistenceManager em, PublishTaskListener listener, String operation, long time, HttpServletRequest req, HttpServletResponse resp) throws LogicException,TimeoutException,IOException {
JPAUser user = getUser(req,resp);
//no errors in the model
AppConstants appConstants = LocalMessages.getInstance(AppConstants.class, LocalMessages.getLocale(req,resp));
AppMessages appMessages = LocalMessages.getInstance(AppMessages.class, LocalMessages.getLocale(req,resp));
Object object = getBookOrVersionAndValidate(null, em, UserServiceFactory.getUserService(), req, resp,appConstants);
String modelXML;
JPABook book;
PublishTask task;
BooksDAO bookDAO = DAO.getBookDAO();
if (object instanceof JPABook) {
book = (JPABook) object;
task = new PublishTask(book,appConstants,appMessages);
modelXML = bookDAO.getCLOB(em, book, JPAClob.TYPE_MODEL);
} else if (object instanceof JPABookVersion) {
JPABookVersion version = (JPABookVersion) object;
task = new PublishTask(version,LocalMessages.getLocale(req,resp));
book = DAO.getBookDAO().findBook(em, version.getBook());
modelXML = bookDAO.getCLOB(em, version, JPAClob.TYPE_MODEL);
} else {
//error
replyError("Unknown object: "+object,req,resp);
return;
}
if (book != null && book.isLocked()) {
//this book is locked
throw new LogicException(appConstants.serverBookIsLocked());
}
ModelPersist model = getModel(modelXML,req, resp, appConstants, appMessages);
log.log(Level.INFO,"Publish book '"+model.getSettings().getBookTitle()+"' id="+KeyFactory.keyToString(book.getId())+", externalId="+model.getGameId()+", user="+user.getEmail());
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(book.getId()));
}
@Override
protected void success(HttpServletRequest req, HttpServletResponse resp, String bookKey) throws IOException {
//for web-page
String url = resp.encodeRedirectURL(req.getRequestURL().substring(0,req.getRequestURL().lastIndexOf("/"))+"/main.jsp");
resp.sendRedirect(url);
}
protected void replyError(String error, String errorDescription, HttpServletRequest req, HttpServletResponse resp) throws IOException {
resp.setCharacterEncoding("UTF-8");
resp.sendError(HttpServletResponse.SC_BAD_REQUEST,error+'\n'+errorDescription);
}
protected void replyError(String error, HttpServletRequest req, HttpServletResponse resp) throws IOException {
resp.setCharacterEncoding("UTF-8");
resp.sendError(HttpServletResponse.SC_BAD_REQUEST,error);
}
}