package com.iambookmaster.server;
import java.io.Serializable;
import javax.jdo.PersistenceManager;
import com.google.appengine.api.datastore.Key;
import com.iambookmaster.client.beans.Paragraph;
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;
import com.iambookmaster.server.logic.ServerBookCreator;
import com.iambookmaster.server.logic.ServerBookCreatorListener;
import com.iambookmaster.server.logic.ServerModelValidator;
import com.iambookmaster.server.logic.ServerModelValidatorListener;
public class PublishTask implements Serializable {
private static final long serialVersionUID = 1L;
private static final int TASK_RECREATE = 0;
private static final int TASK_CREATE = 1;
private int task=0;
private ModelPersist model;
private ServerModelValidator validator;
private ServerBookCreator bookCreator;
private ServerModelValidatorListener validatorListener;
private ServerBookCreatorListener bookCreatorListener;
private PublishTaskListener taskListener;
private final AppConstants appConstants;
private final AppMessages appMessages;
private Key bookKey;
public Key getBookKey() {
return bookKey;
}
public PublishTask(JPABook book,AppConstants appConstants,AppMessages appMessages) {
if (book != null) {
bookKey = book.getId();
}
this.appConstants = appConstants;
this.appMessages = appMessages;
}
public PublishTask(JPABookVersion version,String locale) {
if (version != null) {
bookKey = version.getBook();
}
appConstants = LocalMessages.getInstance(AppConstants.class, locale);
appMessages = LocalMessages.getInstance(AppMessages.class, locale);
}
public void continueTask(JPAUser user, PersistenceManager em, PublishTaskListener listener) throws TimeoutException,LogicException {
this.taskListener = listener;
if (validator != null) {
if (validator.continueValidation(validatorListener)==false) {
throw new LogicException(validator.getErrors());
}
successulValidataion(user,em);
} else {
//bookCreator can be interrupted only during creation
bookCreator.continueCreation(bookCreatorListener);
BooksDAO booksDAO = DAO.getBookDAO();
JPABook book = booksDAO.findBook(em, bookKey);
book = booksDAO.mergeBook(em,model,book,true);
publishBook(em,book);
}
}
private void successulValidataion(JPAUser user, PersistenceManager em) throws LogicException,TimeoutException {
BooksDAO booksDAO = DAO.getBookDAO();
JPABook book;
if (bookKey==null) {
//new book
book = booksDAO.mergeBook(em,model,user,true);
bookKey = book.getId();
} else {
book = booksDAO.findBook(em, bookKey);
if (book==null) {
throw new LogicException(appConstants.serverUnknownBook());
}
//TODO check for locked book or locked user
}
book = booksDAO.mergeBook(em,model,book,true);
bookCreator = new ServerBookCreator(model,appConstants,appMessages);
bookCreatorListener = new ServerBookCreatorListener() {
public boolean checkTimiout() {
return taskListener.checkTimeout();
}
};
if (task==TASK_CREATE) {
//generate numbers for book
bookCreator.create(bookCreatorListener);
//book is ready, save and publish
booksDAO.mergeBook(em, model, book, true);
publishBook(em,book);
} else {
//book is ready, publish
publishBook(em,book);
}
}
/**
* This method is called when current model is generated and validated
* so from now Text, HTML or other version of book can be created
* @param em
* @param book
*/
private void publishBook(PersistenceManager em, JPABook book) throws LogicException{
//step 1 - validate numbers
Paragraph[] paragraphs = bookCreator.recreationValidate();
//step 2 - generate
BooksDAO booksDAO = DAO.getBookDAO();
String text = bookCreator.getText(paragraphs);
booksDAO.setCLOB(em, book, JPAClob.TYPE_TEXT, text);
text = bookCreator.getHTML(paragraphs);
booksDAO.setCLOB(em, book, JPAClob.TYPE_HTML, text);
text = bookCreator.getURQ(paragraphs);
booksDAO.setCLOB(em, book, JPAClob.TYPE_URQ, text);
}
public void recreate(ModelPersist model, JPAUser user, PersistenceManager em, PublishTaskListener listener) throws TimeoutException,LogicException{
validate(TASK_RECREATE,model,user,em,listener);
}
public void create(ModelPersist model, JPAUser user, PersistenceManager em, PublishTaskListener listener) throws TimeoutException,LogicException {
validate(TASK_CREATE,model,user,em,listener);
}
private void validate(int task, ModelPersist model, JPAUser user, PersistenceManager em, PublishTaskListener listener) throws TimeoutException,LogicException {
this.model = model;
this.task = task;
this.taskListener = listener;
validatorListener = new ServerModelValidatorListener() {
public boolean checkTimeout() {
return taskListener.checkTimeout();
}
};
validator = new ServerModelValidator(model,appConstants,appMessages);
if (validator.validate(validatorListener)==false) {
throw new LogicException(validator.getErrors());
}
successulValidataion(user,em);
}
}