package com.project.website.canvas.server;
import com.google.code.twig.ObjectDatastore;
import com.google.code.twig.annotation.AnnotationObjectDatastore;
import com.google.gwt.user.server.rpc.RemoteServiceServlet;
import com.project.shared.utils.RandomUtils;
import com.project.website.canvas.shared.contracts.CanvasService;
import com.project.website.canvas.shared.data.CanvasPage;
/**
* The server side implementation of the RPC service.
*/
@SuppressWarnings("serial")
public class CanvasServiceImpl extends RemoteServiceServlet implements CanvasService {
@Override
public CanvasPage savePage(CanvasPage page) throws AccessDeniedException {
//HttpAuthentication.isLoggedIn(this.getThreadLocalRequest(), this.getThreadLocalResponse());
ObjectDatastore datastore = new AnnotationObjectDatastore();
// String serverInfo = getServletContext().getServerInfo();
// String userAgent = getThreadLocalRequest().getHeader("User-Agent");
// Get existing elements
//HashMap<Long, ElementData> removedElems = new HashMap<Long, ElementData>();
// HashSet<Long> elemIds = new HashSet<Long>();
// for (ElementData elem : page.elements) {
// elemIds.add(elem.id);
// }
if (null == page.id) {
page.key = RandomUtils.randomString(CanvasService.CANVAS_PAGE_SAVE_KEY_LENGTH);
}
else {
CanvasPage existingPage = datastore.load(CanvasPage.class, page.id);
if (false == existingPage.key.equals(page.key)) {
// Can't save, key is wrong.
throw new AccessDeniedException("Can't save page - invalid key");
}
// for (ElementData elem : existingPage.elements) {
// if (elemIds.contains(elem.id)) {
// continue;
// }
// removedElems.put(elem.id, elem);
// }
// TODO: deal with the removed elements.
// we have to check if any other page is still using them.
}
datastore.store(page);
return this.loadPageFromDataStore(page.id);
}
@Override
public CanvasPage getPage(long id) {
CanvasPage page = loadPageFromDataStore(id);
page.key = null;
return page;
}
private CanvasPage loadPageFromDataStore(long id) {
ObjectDatastore datastore = new AnnotationObjectDatastore();
CanvasPage page = datastore.load(CanvasPage.class, id);
return page;
}
}