Java tutorial
/******************************************************************************* * Copyright (c) 2010, 2012 Tasktop Technologies * Copyright (c) 2010, 2011 SpringSource, a division of VMware * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Tasktop Technologies - initial API and implementation ******************************************************************************/ package com.tasktop.c2c.server.wiki.web.ui.client.presenter; import java.util.ArrayList; import java.util.Collection; import java.util.Date; import java.util.List; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.json.client.JSONNumber; import com.google.gwt.json.client.JSONObject; import com.google.gwt.json.client.JSONParser; import com.google.gwt.json.client.JSONString; import com.google.gwt.json.client.JSONValue; import com.google.gwt.place.shared.Place; import com.google.gwt.user.client.ui.FormPanel.SubmitCompleteEvent; import com.google.gwt.user.client.ui.FormPanel.SubmitCompleteHandler; import com.google.gwt.user.client.ui.HasEnabled; import com.google.gwt.user.client.ui.Widget; import com.tasktop.c2c.server.common.profile.web.client.AuthenticationHelper; import com.tasktop.c2c.server.common.profile.web.client.ProfileGinjector; import com.tasktop.c2c.server.common.web.client.event.ClearCacheEvent; import com.tasktop.c2c.server.common.web.client.notification.Message; import com.tasktop.c2c.server.common.web.client.notification.OperationMessage; import com.tasktop.c2c.server.common.web.client.presenter.AsyncCallbackSupport; import com.tasktop.c2c.server.common.web.client.presenter.SplittableActivity; import com.tasktop.c2c.server.wiki.domain.Attachment; import com.tasktop.c2c.server.wiki.domain.Page; import com.tasktop.c2c.server.wiki.domain.Page.GroupAccess; import com.tasktop.c2c.server.wiki.web.ui.client.place.ProjectWikiEditPagePlace; import com.tasktop.c2c.server.wiki.web.ui.client.place.ProjectWikiHomePlace; import com.tasktop.c2c.server.wiki.web.ui.client.place.ProjectWikiViewPagePlace; import com.tasktop.c2c.server.wiki.web.ui.client.view.EditWikiPageView; import com.tasktop.c2c.server.wiki.web.ui.shared.action.CreatePageAction; import com.tasktop.c2c.server.wiki.web.ui.shared.action.CreatePageResult; import com.tasktop.c2c.server.wiki.web.ui.shared.action.ListAttachmentsAction; import com.tasktop.c2c.server.wiki.web.ui.shared.action.ListAttachmentsResult; import com.tasktop.c2c.server.wiki.web.ui.shared.action.UpdatePageAction; import com.tasktop.c2c.server.wiki.web.ui.shared.action.UpdatePageResult; public class EditWikiPagePresenter extends AbstractWikiPresenter implements SplittableActivity { private final EditWikiPageDisplay view; private Page page; boolean isUser; boolean isAdmin; public EditWikiPagePresenter(final EditWikiPageDisplay view) { super(view.getWidget()); this.view = view; view.addCancelClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { doCancel(); } }); view.addSaveClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { doSave(view.getPage()); } }); view.addAttachmentSubmitCompleteHandler(new SubmitCompleteHandler() { @Override public void onSubmitComplete(SubmitCompleteEvent event) { attachmentsSubmitted(event); } }); view.addChangeMarkupClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { doChangeMarkup(view.getPage()); } }); } public EditWikiPagePresenter() { this(new EditWikiPageView()); } public interface EditWikiPageDisplay { Widget getWidget(); void setPage(Page page); void setAttachments(List<Attachment> attachments); Page getPage(); void addSaveClickHandler(ClickHandler clickHandler); void addCancelClickHandler(ClickHandler clickHandler); void addAttachmentSubmitCompleteHandler(SubmitCompleteHandler handler); void setAvailableAccessSettings(Collection<GroupAccess> availableAccessSettings); String getAttachmentFileName(); void clearAttachementForm(); void setProjectIdentifier(String projectIdentifier); void setMarkupLanguage(String markupLanguage); void setCurrentMarkupPreference(String markupLanguage); /** * @return */ boolean isDirty(); void setChangeMarkupPanelVisible(boolean visible); void addChangeMarkupClickHandler(ClickHandler clickHandler); String getMarkupPreference(); /** * @return */ HasEnabled getSaveHasEnabled(); } public void setPlace(Place p) { ProjectWikiEditPagePlace place = (ProjectWikiEditPagePlace) p; projectIdentifier = place.getProjectId(); setAdmin(AuthenticationHelper.isAdmin(projectIdentifier)); setUser(AuthenticationHelper.isCommitter(projectIdentifier)); String path = place.getPath(); if (!place.isNew()) { setPath(path); setPage(place.getPage()); } else { Page newPage = new Page(); newPage.setPath(path); newPage.setEditAccess(GroupAccess.ALL); newPage.setDeleteAccess(GroupAccess.ALL); newPage.setMarkupLanguage(place.getMarkupLanguage()); setPage(newPage); } List<GroupAccess> availableAccessSettings = new ArrayList<Page.GroupAccess>(); availableAccessSettings.add(GroupAccess.ALL); if (isUser) { availableAccessSettings.add(GroupAccess.MEMBER_AND_OWNERS); } if (isAdmin) { availableAccessSettings.add(GroupAccess.OWNERS); } view.setAvailableAccessSettings(availableAccessSettings); view.setPage(page); view.setAttachments(place.getAttachements()); view.setProjectIdentifier(projectIdentifier); view.setMarkupLanguage(page.getMarkupLanguage()); view.setCurrentMarkupPreference(place.getMarkupLanguage()); if (page.getMarkupLanguage().equals(place.getMarkupLanguage())) { view.setChangeMarkupPanelVisible(false); } else { view.setChangeMarkupPanelVisible(true); } } public void setPath(String path) { this.page = null; } public void setPage(Page page) { this.page = page; } @Override protected void bind() { } private void attachmentsSubmitted(SubmitCompleteEvent event) { JSONValue value = JSONParser.parseLenient(event.getResults()); JSONValue uploadResultValue = value.isObject().get("uploadResult"); JSONObject uploadResult = uploadResultValue == null ? null : value.isObject().get("uploadResult").isObject(); if (uploadResult != null) { // get updated modification stamp and list of attachments JSONObject updatedPage = uploadResult.get("page") == null ? null : uploadResult.get("page").isObject(); if (updatedPage != null) { JSONNumber number = updatedPage.get("modificationDate") == null ? null : updatedPage.get("modificationDate").isNumber(); if (number != null) { page.setModificationDate(new Date(new Long(number.toString()))); } } ProfileGinjector.get.instance().getNotifier().displayMessage(Message .createSuccessMessage(super.wikiMessages.attachmentUploaded(view.getAttachmentFileName()))); getEventBus().fireEvent(new ClearCacheEvent()); view.clearAttachementForm(); // Ideally we would simply update with the results for the json content. fetchAttachments(); } else { String message = super.commonProfileMessages.unexpectedServerResponse(); JSONValue errorValue = value.isObject().get("error"); JSONObject errorObject = errorValue == null ? null : errorValue.isObject(); if (errorObject != null) { JSONString errorMessage = errorObject.get("message").isString(); if (errorMessage != null) { message = errorMessage.stringValue(); } } ProfileGinjector.get.instance().getNotifier().displayMessage(Message.createErrorMessage(message)); } } private void fetchAttachments() { getDispatchService().execute(new ListAttachmentsAction(projectIdentifier, page.getId()), new AsyncCallbackSupport<ListAttachmentsResult>() { @Override protected void success(ListAttachmentsResult result) { view.setAttachments(result.get()); } }); } protected void doCancel() { if (page != null && page.getId() != null) { ProjectWikiViewPagePlace.createPlaceForPage(projectIdentifier, page.getPath()).go(); } else { ProjectWikiHomePlace.createDefaultPlace(getProjectIdentifier()).go(); } } protected void doSave(Page page) { if (page.getId() == null) { getDispatchService().execute(new CreatePageAction(getProjectIdentifier(), page), new AsyncCallbackSupport<CreatePageResult>( new OperationMessage(super.wikiMessages.creatingPage()), null, view.getSaveHasEnabled()) { @Override protected void success(CreatePageResult result) { Page savedPage = result.get(); ProjectWikiViewPagePlace place = ProjectWikiViewPagePlace .createPlaceForPage(getProjectIdentifier(), savedPage.getPath()); place.displayOnArrival(Message.createSuccessMessage(wikiMessages.pageCreated())); place.go(); } }); } else { getDispatchService().execute(new UpdatePageAction(getProjectIdentifier(), page), new AsyncCallbackSupport<UpdatePageResult>( new OperationMessage(super.wikiMessages.savingPage()), null, view.getSaveHasEnabled()) { @Override protected void success(UpdatePageResult result) { Page savedPage = result.get(); ProjectWikiViewPagePlace place = ProjectWikiViewPagePlace .createPlaceForPage(getProjectIdentifier(), savedPage.getPath()); place.displayOnArrival(Message.createSuccessMessage(wikiMessages.pageSaved())); place.go(); } }); } } protected void doChangeMarkup(Page page) { page.setMarkupLanguage(view.getMarkupPreference()); getDispatchService().execute(new UpdatePageAction(getProjectIdentifier(), page), new AsyncCallbackSupport<UpdatePageResult>( new OperationMessage(super.wikiMessages.updatingPage())) { @Override protected void success(UpdatePageResult result) { Page savedPage = result.get(); ProjectWikiViewPagePlace place = ProjectWikiViewPagePlace .createPlaceForPage(getProjectIdentifier(), savedPage.getPath()); place.displayOnArrival(Message.createSuccessMessage(wikiMessages.pageUpdated())); place.go(); } }); } /** * @param isAdmin * the isAdmin to set */ public void setAdmin(boolean isAdmin) { this.isAdmin = isAdmin; } /** * @param isUser * the isUser to set */ public void setUser(boolean isUser) { this.isUser = isUser; } @Override public String mayStop() { if (view.isDirty()) { return super.wikiMessages.unsavedChangesMessage(); } return null; } }