001    package crisp.wbwiki.client;
002    
003    import com.google.gwt.user.client.rpc.AsyncCallback;
004    
005    public class ClientStateManager {
006            /** The last page version loaded from the server */
007            private Page lastLoadedPage = null;
008            private final WikiServiceAsync wikiService;
009            private static boolean loggingEnabled = true;
010            
011            
012            public ClientStateManager(final WikiServiceAsync wikiService) {
013                    this.wikiService = wikiService;
014            }
015    
016            public void synchronizeWithServer(final WikiGui gui) {
017                    String currentContent = gui.getCurrentContent();
018                    
019                    final Integer lastLoadedVersion;
020                    final String contentToSendToServer;
021                    if (lastLoadedPage == null) {
022                            lastLoadedVersion = null;
023                            contentToSendToServer = null;
024                    } else {
025                            lastLoadedVersion = new Integer(lastLoadedPage.getVersion());
026                            if (lastLoadedPage.getContent().equals(currentContent)) {
027                                    contentToSendToServer = null;
028                            } else {
029                                    log(gui, "Content has changed!\nold: '" + lastLoadedPage.getContent() + "'\nnew: '" + currentContent + "'");
030                                    contentToSendToServer = currentContent;
031                            }
032                    }
033                    log(gui, "Calling synchronize(" + lastLoadedVersion + ", " + contentToSendToServer + ")");
034                    wikiService.synchronize(
035                                    lastLoadedVersion, 
036                                    contentToSendToServer, 
037                                    new AsyncCallback() {
038                                            public void onFailure(Throwable err) {
039                                                    //TODO error handling
040                                                    err.printStackTrace();
041                                            }
042                                            public void onSuccess(Object response) {
043                                                    Page updatedPage = (Page) response;
044                                                    log(gui, "Received response: " + updatedPage);
045                                                    if (updatedPage == null) {
046                                                            //The server didn't feel any need to give me an updated page                                                    
047                                                            if (contentToSendToServer == null) {
048                                                                    //I didn't send any content to the server,
049                                                                    //so nothing has changed by me or anybody else.
050                                                                    //So we do nothing.
051                                                            } else {
052                                                                    //Nothing has changed on the server side,
053                                                                    //but I sent new content so the version number was updated.
054                                                                    lastLoadedPage = new Page(
055                                                                                    lastLoadedPage.getVersion() + 1,
056                                                                                    contentToSendToServer
057                                                                                    );
058                                                            }       
059                                                    } else {
060                                                            //I received an updated page from the server,
061                                                            //so someone else has been changing the page!
062                                                            //Need to update my state.
063                                                            lastLoadedPage = updatedPage;
064                                                            gui.setCurrentContent(updatedPage.getContent());
065                                                    }
066                                            }                       
067                                    }
068                    );
069            }
070    
071            void log(WikiGui gui, String logEntry) {
072                    if (loggingEnabled) {
073                            gui.log(logEntry);
074                    }
075            }
076    
077    }