package org.xcolab.view.pages.contestmanagement.wrappers;
import org.xcolab.client.contents.ContentsClient;
import org.xcolab.client.contents.exceptions.ContentNotFoundException;
import org.xcolab.client.contents.pojo.ContentArticle;
import org.xcolab.client.contents.pojo.ContentArticleVersion;
import org.xcolab.client.contents.pojo.ContentFolder;
import org.xcolab.client.contest.ContestClientUtil;
import org.xcolab.client.contest.pojo.Contest;
import org.xcolab.client.contest.pojo.ContestType;
import org.xcolab.util.exceptions.ReferenceResolutionException;
import org.xcolab.view.pages.contestmanagement.beans.ContestResourcesBean;
import java.io.UnsupportedEncodingException;
import java.text.ParseException;
public class WikiPageWrapper {
private final Contest contest;
private final Long loggedInUserId;
private ContentArticle contentArticle;
private ContentArticleVersion contentArticleVersion;
public WikiPageWrapper(Contest contest, Long loggedInUserId) {
this.contest = contest;
this.loggedInUserId = loggedInUserId;
initWikiPage();
}
private void initWikiPage() {
if (contest.getResourceArticleId() != null && contest.getResourceArticleId() > 0) {
try {
contentArticle = ContentsClient
.getContentArticle(contest.getResourceArticleId());
contentArticleVersion =
ContentsClient
.getContentArticleVersion(contentArticle.getMaxVersionId());
} catch (ContentNotFoundException e) {
throw ReferenceResolutionException
.toObject(ContentArticle.class, contest.getResourceArticleId())
.fromObject(Contest.class, contest.getContestPK());
}
} else {
contentArticleVersion = new ContentArticleVersion();
contentArticleVersion.setFolderId(ContentFolder.RESOURCE_FOLDER_ID);
contentArticleVersion.setAuthorId(loggedInUserId);
contentArticleVersion.setTitle(contest.getContestShortName());
contentArticleVersion.setContent("");
contentArticleVersion = ContentsClient
.createContentArticleVersion(contentArticleVersion);
try {
contentArticle = ContentsClient.getContentArticle(
contentArticleVersion.getContentArticleId());
final long resourceArticleId = contentArticle.getContentArticleId();
contest.setResourceArticleId(resourceArticleId);
ContestClientUtil.updateContest(contest);
} catch (ContentNotFoundException e) {
throw new IllegalStateException(
"Could not retrieve ContentArticle after creation: " + contentArticle);
}
}
}
public static void updateContestWiki(Contest contest) {
try {
if (contest.getResourceArticleId() != null) {
final ContentArticleVersion resourceArticleVersion = ContentsClient
.getLatestContentArticleVersion(contest.getResourceArticleId());
resourceArticleVersion.setTitle(contest.getContestShortName());
ContentsClient.updateContentArticleVersion(resourceArticleVersion);
}
} catch (ContentNotFoundException ignored) {
}
}
public ContestResourcesBean getContestResourcesBean() {
final ContestType contestType =
ContestClientUtil.getContestType(contest.getContestTypeId());
ContestResourcesBean contestResourcesBean = new ContestResourcesBean(contestType);
String resourcesContent = contentArticleVersion.getContent();
contestResourcesBean.fillSectionsWithContent(resourcesContent);
return contestResourcesBean;
}
public void updateWikiPage(ContestResourcesBean updatedContestResourcesBean)
throws UnsupportedEncodingException, ParseException {
updatedContestResourcesBean.fillOverviewSectionContent(contest);
String updatedResourcesContent = updatedContestResourcesBean.getSectionsAsHtml();
if (!contentArticleVersion.getContent().equals(updatedResourcesContent)) {
contentArticleVersion.setTitle(contest.getContestShortName());
contentArticleVersion.setContent(updatedResourcesContent);
contentArticleVersion.setContentArticleId(contentArticle.getContentArticleId());
contentArticleVersion.setAuthorId(loggedInUserId);
ContentsClient.updateContentArticleVersion(contentArticleVersion);
}
}
}