mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-08-14 17:58:59 +00:00
ALF-10109 Convert the last two wiki webscripts to be Java backed, using the new Service
git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@30144 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
@@ -1,80 +0,0 @@
|
|||||||
/**
|
|
||||||
* A collection of general functions used across most wiki scripts.
|
|
||||||
*/
|
|
||||||
const DEFAULT_PAGE_CONTENT = "This is a new page. It has no content";
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Takes an array of template parameter arguments
|
|
||||||
* and returns an object keyed on parameter name.
|
|
||||||
*/
|
|
||||||
function getTemplateArgs(params)
|
|
||||||
{
|
|
||||||
var p = {};
|
|
||||||
|
|
||||||
var param;
|
|
||||||
for (var i=0; i < params.length; i++)
|
|
||||||
{
|
|
||||||
param = params[i];
|
|
||||||
p[param] = url.templateArgs[param];
|
|
||||||
}
|
|
||||||
|
|
||||||
return p;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Format and return error object */
|
|
||||||
function jsonError(errorString)
|
|
||||||
{
|
|
||||||
status.setCode(status.STATUS_BAD_REQUEST, errorString);
|
|
||||||
}
|
|
||||||
|
|
||||||
// NOTE: may need a custom content type for a wiki entry
|
|
||||||
function createWikiPage(name, folder, options)
|
|
||||||
{
|
|
||||||
var page = folder.createFile(name);
|
|
||||||
if (options)
|
|
||||||
{
|
|
||||||
if (options.content)
|
|
||||||
{
|
|
||||||
page.content = options.content;
|
|
||||||
page.mimetype = "text/html";
|
|
||||||
}
|
|
||||||
|
|
||||||
if (options.versionable)
|
|
||||||
{
|
|
||||||
page.addAspect("cm:versionable");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Initialise tags to empty array
|
|
||||||
page.tags = [];
|
|
||||||
|
|
||||||
// Set cm:title
|
|
||||||
page.properties["cm:title"] = new String(name).replace(/_/g, " ");
|
|
||||||
page.save();
|
|
||||||
|
|
||||||
return page;
|
|
||||||
}
|
|
||||||
|
|
||||||
function getWikiContainer(site)
|
|
||||||
{
|
|
||||||
var wiki;
|
|
||||||
|
|
||||||
if (site.hasContainer("wiki"))
|
|
||||||
{
|
|
||||||
wiki = site.getContainer("wiki");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
wiki = site.createContainer("wiki");
|
|
||||||
}
|
|
||||||
|
|
||||||
if(wiki != null)
|
|
||||||
{
|
|
||||||
if (!wiki.isTagScope)
|
|
||||||
{
|
|
||||||
wiki.isTagScope = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return wiki;
|
|
||||||
}
|
|
@@ -1,77 +0,0 @@
|
|||||||
<import resource="classpath:/alfresco/templates/webscripts/org/alfresco/slingshot/wiki/lib/wiki.lib.js">
|
|
||||||
/**
|
|
||||||
* Renames a wiki page. Updates the name of the current page
|
|
||||||
* and creates a link with the previous name that points to the page;
|
|
||||||
* this is done so that all references to the old page will still work.
|
|
||||||
*
|
|
||||||
* @method POST
|
|
||||||
* @param uri {string} /slingshot/wiki/page/{siteid}/{pageTitle}
|
|
||||||
*/
|
|
||||||
model.result = main();
|
|
||||||
|
|
||||||
function main()
|
|
||||||
{
|
|
||||||
if (json.isNull("name"))
|
|
||||||
{
|
|
||||||
return jsonError("No new name property specified");
|
|
||||||
}
|
|
||||||
// Remove any whitespace and replace with "_"
|
|
||||||
var newName = new String(json.get("name"));
|
|
||||||
newName = newName.replace(/\s+/g, "_");
|
|
||||||
|
|
||||||
var params = getTemplateArgs(["siteId", "pageTitle"]);
|
|
||||||
|
|
||||||
// Get the site
|
|
||||||
var site = siteService.getSite(params.siteId);
|
|
||||||
if (site === null)
|
|
||||||
{
|
|
||||||
return jsonError("Could not find site: " + params.siteId);
|
|
||||||
}
|
|
||||||
|
|
||||||
var wiki = getWikiContainer(site);
|
|
||||||
if (wiki === null)
|
|
||||||
{
|
|
||||||
return jsonError("Could not locate wiki");
|
|
||||||
}
|
|
||||||
|
|
||||||
var page = wiki.childByNamePath(params.pageTitle);
|
|
||||||
if (!page)
|
|
||||||
{
|
|
||||||
return jsonError("Could not find specified page.");
|
|
||||||
}
|
|
||||||
|
|
||||||
var existing = wiki.childByNamePath(newName);
|
|
||||||
{
|
|
||||||
if (existing)
|
|
||||||
{
|
|
||||||
status.setCode(status.STATUS_CONFLICT, "Duplicate name.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Finally, now we can do what we are supposed to do
|
|
||||||
var currentName = new String(page.name);
|
|
||||||
|
|
||||||
page.name = newName;
|
|
||||||
page.properties["cm:title"] = new String(newName).replace(/_/g, " ");
|
|
||||||
page.save();
|
|
||||||
|
|
||||||
var placeholder = createWikiPage(currentName, wiki,
|
|
||||||
{
|
|
||||||
content: msg.get("page-moved") + " [[" + newName + "|" + msg.get("page-moved-here") + "]]."
|
|
||||||
});
|
|
||||||
|
|
||||||
var data =
|
|
||||||
{
|
|
||||||
title: newName.replace(/_/g, " "),
|
|
||||||
page: json.get("page") + "?title=" + newName,
|
|
||||||
custom0: currentName.replace(/_/g, " ")
|
|
||||||
}
|
|
||||||
|
|
||||||
activities.postActivity("org.alfresco.wiki.page-renamed", params.siteId, "wiki", jsonUtils.toJSONString(data));
|
|
||||||
|
|
||||||
return (
|
|
||||||
{
|
|
||||||
name: newName // Return the new name to the client
|
|
||||||
});
|
|
||||||
}
|
|
@@ -1,10 +1,10 @@
|
|||||||
<#assign page = result.page>
|
<#assign page = result.page>
|
||||||
<#escape x as jsonUtils.encodeJSONString(x)>
|
<#escape x as jsonUtils.encodeJSONString(x)>
|
||||||
{
|
{
|
||||||
"name": "${page.name}",
|
"name": "${page.systemName}",
|
||||||
"title": "<#if page.properties.title?exists>${page.properties.title}<#else>${page.name?replace("_", " ")}</#if>",
|
"title": "${page.title}",
|
||||||
"pagetext": "${page.content}",
|
"pagetext": "${page.contents}",
|
||||||
<#assign tags><#list result.tags as tag>"${tag}"<#if tag_has_next>,</#if></#list></#assign>
|
<#assign tags><#list page.tags as tag>"${tag}"<#if tag_has_next>,</#if></#list></#assign>
|
||||||
"tags": <#noescape>[${tags}]</#noescape>
|
"tags": <#noescape>[${tags}]</#noescape>
|
||||||
}
|
}
|
||||||
</#escape>
|
</#escape>
|
||||||
|
@@ -1,189 +0,0 @@
|
|||||||
<import resource="classpath:/alfresco/templates/webscripts/org/alfresco/slingshot/wiki/lib/wiki.lib.js">
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Update specified wiki page.
|
|
||||||
*
|
|
||||||
* @method PUT
|
|
||||||
* @param uri {string} /slingshot/wiki/page/{siteid}/{pageTitle}
|
|
||||||
*/
|
|
||||||
function getTemplateParams()
|
|
||||||
{
|
|
||||||
// Grab the URI parameters
|
|
||||||
var siteId = "" + url.templateArgs.siteId;
|
|
||||||
var pageTitle = "" + url.templateArgs.pageTitle;
|
|
||||||
|
|
||||||
if (siteId === null || siteId.length === 0)
|
|
||||||
{
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pageTitle === null || pageTitle.length === 0)
|
|
||||||
{
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
|
||||||
{
|
|
||||||
"siteId": siteId,
|
|
||||||
"pageTitle": pageTitle
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function update()
|
|
||||||
{
|
|
||||||
var params = getTemplateArgs(["siteId", "pageTitle"]);
|
|
||||||
if (params === null)
|
|
||||||
{
|
|
||||||
return jsonError("No parameters supplied");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get the site
|
|
||||||
var site = siteService.getSite(params.siteId);
|
|
||||||
if (site === null)
|
|
||||||
{
|
|
||||||
return jsonError("Could not find site: " + siteId);
|
|
||||||
}
|
|
||||||
|
|
||||||
var wiki = getWikiContainer(site);
|
|
||||||
if (wiki === null)
|
|
||||||
{
|
|
||||||
return jsonError("Could not locate wiki container");
|
|
||||||
}
|
|
||||||
|
|
||||||
var page = wiki.childByNamePath(params.pageTitle), activityType;
|
|
||||||
// Create the page if it doesn't exist
|
|
||||||
if (page === null)
|
|
||||||
{
|
|
||||||
page = createWikiPage(params.pageTitle, wiki,
|
|
||||||
{
|
|
||||||
content: json.get("pagecontent"),
|
|
||||||
versionable: true
|
|
||||||
});
|
|
||||||
|
|
||||||
activityType = "org.alfresco.wiki.page-created";
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Check the version of the page being submitted against the version now in the repo, or a forced save
|
|
||||||
if (pageVersionMatchesSubmitted(page) || json.has("forceSave"))
|
|
||||||
{
|
|
||||||
// Create a new revision of the page
|
|
||||||
var workingCopy = page.checkout();
|
|
||||||
workingCopy.content = json.get("pagecontent");
|
|
||||||
workingCopy.checkin();
|
|
||||||
page.save();
|
|
||||||
|
|
||||||
activityType = "org.alfresco.wiki.page-edited";
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
status.setCode(status.STATUS_CONFLICT, "Repository version is newer.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var data =
|
|
||||||
{
|
|
||||||
title: params.pageTitle.replace(/_/g, " "),
|
|
||||||
page: json.get("page") + "?title=" + params.pageTitle
|
|
||||||
}
|
|
||||||
// Log activity
|
|
||||||
activities.postActivity(activityType, params.siteId, "wiki", jsonUtils.toJSONString(data));
|
|
||||||
|
|
||||||
if (!json.isNull("tags"))
|
|
||||||
{
|
|
||||||
var tags = Array(json.get("tags"));
|
|
||||||
if (tags)
|
|
||||||
{
|
|
||||||
// This is so unnecessary!
|
|
||||||
// A much cleaner approach would be to just pass in the tags as a space separated
|
|
||||||
// string and call the (native) method split
|
|
||||||
var tags = [];
|
|
||||||
var tmp = json.get("tags");
|
|
||||||
for (var x = 0, xx = tmp.length(); x < xx; x++)
|
|
||||||
{
|
|
||||||
tags.push(tmp.get(x));
|
|
||||||
}
|
|
||||||
page.tags = tags;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
page.tags = []; // reset
|
|
||||||
}
|
|
||||||
page.save();
|
|
||||||
}
|
|
||||||
|
|
||||||
// NOTE: for now we return the raw page content and do the transformation
|
|
||||||
// of any wiki markup on the client. This is because the edit view needs to display
|
|
||||||
// the raw content (for editing) whereas the page view needs to display the rendered content.
|
|
||||||
return (
|
|
||||||
{
|
|
||||||
page: page,
|
|
||||||
tags: page.tags
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Checks whether the current repository version is newer than a submitted version number.
|
|
||||||
* Returns:
|
|
||||||
* false if currentVersion is older than repoVersion
|
|
||||||
* true otherwise
|
|
||||||
*/
|
|
||||||
function pageVersionMatchesSubmitted(page)
|
|
||||||
{
|
|
||||||
var currentVersion = "0",
|
|
||||||
repoVersion = "0";
|
|
||||||
|
|
||||||
if (json.has("currentVersion"))
|
|
||||||
{
|
|
||||||
currentVersion = json.get("currentVersion");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (page.hasAspect("cm:versionable"))
|
|
||||||
{
|
|
||||||
repoVersion = getLatestVersion(page.versionHistory);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
page.addAspect("cm:versionable");
|
|
||||||
page.save();
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return (sortByLabel(
|
|
||||||
{
|
|
||||||
label: repoVersion
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: currentVersion
|
|
||||||
}) != -1);
|
|
||||||
}
|
|
||||||
|
|
||||||
function sortByLabel(version1, version2)
|
|
||||||
{
|
|
||||||
if ((version1.label.indexOf(".") == -1) || (version2.label.indexOf(".") == -1))
|
|
||||||
{
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
var major1 = new Number(version1.label.substring(0, version1.label.indexOf(".")));
|
|
||||||
var major2 = new Number(version2.label.substring(0, version2.label.indexOf(".")));
|
|
||||||
if (major1 - 0 == major2 - 0)
|
|
||||||
{
|
|
||||||
var minor1 = new Number(version1.label.substring(version1.label.indexOf(".")+1));
|
|
||||||
var minor2 = new Number(version2.label.substring(version2.label.indexOf(".")+1));
|
|
||||||
return (minor1 < minor2) ? 1 : (minor1 > minor2) ? -1 : 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return (major1 < major2) ? 1 : -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function getLatestVersion(versionHistory)
|
|
||||||
{
|
|
||||||
versionHistory.sort(sortByLabel);
|
|
||||||
return versionHistory[0].label;
|
|
||||||
}
|
|
||||||
|
|
||||||
model.result = update();
|
|
@@ -1585,6 +1585,19 @@
|
|||||||
<property name="versionService" ref="VersionService" />
|
<property name="versionService" ref="VersionService" />
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
|
<!-- Creates and Edits wiki pages -->
|
||||||
|
<bean id="webscript.org.alfresco.slingshot.wiki.page.put"
|
||||||
|
class="org.alfresco.repo.web.scripts.wiki.WikiPagePut"
|
||||||
|
parent="abstractWikiWebScript">
|
||||||
|
<property name="versionService" ref="VersionService" />
|
||||||
|
</bean>
|
||||||
|
|
||||||
|
<!-- Renames a wiki page (changing the title and name) -->
|
||||||
|
<bean id="webscript.org.alfresco.slingshot.wiki.move.post"
|
||||||
|
class="org.alfresco.repo.web.scripts.wiki.WikiPageMovePost"
|
||||||
|
parent="abstractWikiWebScript">
|
||||||
|
</bean>
|
||||||
|
|
||||||
<!-- Deletes a wiki page -->
|
<!-- Deletes a wiki page -->
|
||||||
<bean id="webscript.org.alfresco.slingshot.wiki.page.delete"
|
<bean id="webscript.org.alfresco.slingshot.wiki.page.delete"
|
||||||
class="org.alfresco.repo.web.scripts.wiki.WikiPageDelete"
|
class="org.alfresco.repo.web.scripts.wiki.WikiPageDelete"
|
||||||
|
@@ -25,7 +25,6 @@ import java.util.Map;
|
|||||||
import org.alfresco.query.PagingRequest;
|
import org.alfresco.query.PagingRequest;
|
||||||
import org.alfresco.repo.content.MimetypeMap;
|
import org.alfresco.repo.content.MimetypeMap;
|
||||||
import org.alfresco.service.cmr.activities.ActivityService;
|
import org.alfresco.service.cmr.activities.ActivityService;
|
||||||
import org.alfresco.service.cmr.links.LinkInfo;
|
|
||||||
import org.alfresco.service.cmr.repository.NodeRef;
|
import org.alfresco.service.cmr.repository.NodeRef;
|
||||||
import org.alfresco.service.cmr.repository.NodeService;
|
import org.alfresco.service.cmr.repository.NodeService;
|
||||||
import org.alfresco.service.cmr.security.PersonService;
|
import org.alfresco.service.cmr.security.PersonService;
|
||||||
|
@@ -0,0 +1,118 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2005-2011 Alfresco Software Limited.
|
||||||
|
*
|
||||||
|
* This file is part of Alfresco
|
||||||
|
*
|
||||||
|
* Alfresco is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Alfresco is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
package org.alfresco.repo.web.scripts.wiki;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.ResourceBundle;
|
||||||
|
|
||||||
|
import org.alfresco.service.cmr.model.FileExistsException;
|
||||||
|
import org.alfresco.service.cmr.site.SiteInfo;
|
||||||
|
import org.alfresco.service.cmr.wiki.WikiPageInfo;
|
||||||
|
import org.json.JSONException;
|
||||||
|
import org.json.JSONObject;
|
||||||
|
import org.springframework.extensions.webscripts.Cache;
|
||||||
|
import org.springframework.extensions.webscripts.Status;
|
||||||
|
import org.springframework.extensions.webscripts.WebScriptException;
|
||||||
|
import org.springframework.extensions.webscripts.WebScriptRequest;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This class is the controller for the wiki page renaming move.post webscript.
|
||||||
|
*
|
||||||
|
* TODO Track links to pages, so we can avoid creating the "This page has been moved"
|
||||||
|
* stubs as now, for cases where nothing links to the page being renamed. (ALF-3844)
|
||||||
|
*
|
||||||
|
* @author Nick Burch
|
||||||
|
* @since 4.0
|
||||||
|
*/
|
||||||
|
public class WikiPageMovePost extends AbstractWikiWebScript
|
||||||
|
{
|
||||||
|
private static final String MSG_MOVED = "page-moved";
|
||||||
|
private static final String MSG_MOVED_HERE = "page-moved-here";
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Map<String, Object> executeImpl(SiteInfo site, String pageName,
|
||||||
|
WebScriptRequest req, JSONObject json, Status status, Cache cache) {
|
||||||
|
final Map<String, Object> model = new HashMap<String, Object>();
|
||||||
|
final ResourceBundle rb = getResources();
|
||||||
|
|
||||||
|
// Try to find the page we're renaming
|
||||||
|
WikiPageInfo page = wikiService.getWikiPage(site.getShortName(), pageName);
|
||||||
|
if(page == null)
|
||||||
|
{
|
||||||
|
String message = "The Wiki Page could not be found";
|
||||||
|
status.setCode(Status.STATUS_NOT_FOUND);
|
||||||
|
status.setMessage(message);
|
||||||
|
|
||||||
|
// Wrap and bail
|
||||||
|
model.put("error", message);
|
||||||
|
Map<String, Object> result = new HashMap<String, Object>();
|
||||||
|
result.put("result", model);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Grab the new Title
|
||||||
|
String newTitle;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// The "name" in the JSON is actually the title!
|
||||||
|
newTitle = json.getString("name");
|
||||||
|
}
|
||||||
|
catch(JSONException e)
|
||||||
|
{
|
||||||
|
throw new WebScriptException("Invalid JSON: " + e.getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Have the page re-named, if possible
|
||||||
|
String oldTitle = page.getTitle();
|
||||||
|
try
|
||||||
|
{
|
||||||
|
page.setTitle(newTitle);
|
||||||
|
page = wikiService.updateWikiPage(page);
|
||||||
|
}
|
||||||
|
catch(FileExistsException e)
|
||||||
|
{
|
||||||
|
throw new WebScriptException(Status.STATUS_CONFLICT, "Duplicate page name");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Create the "This page has been moved" entry for the old page
|
||||||
|
String movedContent = rb.getString(MSG_MOVED) + " [[" + page.getSystemName() +
|
||||||
|
"|" + rb.getString(MSG_MOVED_HERE) + "]].";
|
||||||
|
wikiService.createWikiPage(site.getShortName(), oldTitle, movedContent);
|
||||||
|
|
||||||
|
|
||||||
|
// Add an activity entry for the rename
|
||||||
|
addActivityEntry("renamed", page, site, req, json);
|
||||||
|
|
||||||
|
|
||||||
|
// All done
|
||||||
|
model.put("name", page.getSystemName());
|
||||||
|
model.put("page", page);
|
||||||
|
model.put("siteId", site.getShortName());
|
||||||
|
model.put("site", site);
|
||||||
|
|
||||||
|
// Double wrap
|
||||||
|
Map<String, Object> result = new HashMap<String, Object>();
|
||||||
|
result.put("result", model);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
210
source/java/org/alfresco/repo/web/scripts/wiki/WikiPagePut.java
Normal file
210
source/java/org/alfresco/repo/web/scripts/wiki/WikiPagePut.java
Normal file
@@ -0,0 +1,210 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2005-2011 Alfresco Software Limited.
|
||||||
|
*
|
||||||
|
* This file is part of Alfresco
|
||||||
|
*
|
||||||
|
* Alfresco is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Alfresco is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
package org.alfresco.repo.web.scripts.wiki;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import org.alfresco.model.ContentModel;
|
||||||
|
import org.alfresco.service.cmr.site.SiteInfo;
|
||||||
|
import org.alfresco.service.cmr.version.Version;
|
||||||
|
import org.alfresco.service.cmr.version.VersionService;
|
||||||
|
import org.alfresco.service.cmr.wiki.WikiPageInfo;
|
||||||
|
import org.alfresco.service.namespace.QName;
|
||||||
|
import org.json.JSONArray;
|
||||||
|
import org.json.JSONException;
|
||||||
|
import org.json.JSONObject;
|
||||||
|
import org.springframework.extensions.webscripts.Cache;
|
||||||
|
import org.springframework.extensions.webscripts.Status;
|
||||||
|
import org.springframework.extensions.webscripts.WebScriptException;
|
||||||
|
import org.springframework.extensions.webscripts.WebScriptRequest;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This class is the controller for the wiki page creating/editing page.put webscript.
|
||||||
|
*
|
||||||
|
* @author Nick Burch
|
||||||
|
* @since 4.0
|
||||||
|
*/
|
||||||
|
public class WikiPagePut extends AbstractWikiWebScript
|
||||||
|
{
|
||||||
|
private static final String DEFAULT_PAGE_CONTENT = "This is a new page. It has no content";
|
||||||
|
|
||||||
|
private VersionService versionService;
|
||||||
|
public void setVersionService(VersionService versionService)
|
||||||
|
{
|
||||||
|
this.versionService = versionService;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Map<String, Object> executeImpl(SiteInfo site, String pageName,
|
||||||
|
WebScriptRequest req, JSONObject json, Status status, Cache cache) {
|
||||||
|
Map<String, Object> model = new HashMap<String, Object>();
|
||||||
|
|
||||||
|
// Grab the details of the change
|
||||||
|
List<String> tags = null;
|
||||||
|
String currentVersion = null;
|
||||||
|
boolean forceSave;
|
||||||
|
String contents;
|
||||||
|
String title;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// Fetch the contents
|
||||||
|
contents = json.getString("pagecontent");
|
||||||
|
|
||||||
|
// Fetch the title, used only when creating
|
||||||
|
if(json.has("title"))
|
||||||
|
{
|
||||||
|
title = json.getString("title");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
title = pageName;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fetch the versioning details
|
||||||
|
forceSave = json.has("forceSave");
|
||||||
|
if(json.has("currentVersion"))
|
||||||
|
{
|
||||||
|
currentVersion = json.getString("currentVersion");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fetch the tags, if given
|
||||||
|
if(json.has("tags"))
|
||||||
|
{
|
||||||
|
tags = new ArrayList<String>();
|
||||||
|
if(json.get("tags").equals(""))
|
||||||
|
{
|
||||||
|
// Empty list given as a string, eg "tags":""
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Array of tags
|
||||||
|
JSONArray tagsA = json.getJSONArray("tags");
|
||||||
|
for(int i=0; i<tagsA.length(); i++)
|
||||||
|
{
|
||||||
|
tags.add(tagsA.getString(i));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch(JSONException e)
|
||||||
|
{
|
||||||
|
throw new WebScriptException("Invalid JSON: " + e.getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Are we creating or editing?
|
||||||
|
WikiPageInfo page = wikiService.getWikiPage(site.getShortName(), pageName);
|
||||||
|
if(page == null)
|
||||||
|
{
|
||||||
|
// Create the page
|
||||||
|
page = wikiService.createWikiPage(site.getShortName(), title, contents);
|
||||||
|
|
||||||
|
// Add tags if given
|
||||||
|
if(tags != null && tags.size() > 0)
|
||||||
|
{
|
||||||
|
page.getTags().addAll(tags);
|
||||||
|
wikiService.updateWikiPage(page);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Make it versioned
|
||||||
|
makeVersioned(page);
|
||||||
|
|
||||||
|
// Generate the activity
|
||||||
|
addActivityEntry("created", page, site, req, json);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Updating, check about versioning first
|
||||||
|
if(forceSave || pageVersionMatchesSubmitted(page, currentVersion))
|
||||||
|
{
|
||||||
|
// Update the page
|
||||||
|
page.setContents(contents);
|
||||||
|
if(tags != null && tags.size() > 0)
|
||||||
|
{
|
||||||
|
page.getTags().clear();
|
||||||
|
page.getTags().addAll(tags);
|
||||||
|
}
|
||||||
|
wikiService.updateWikiPage(page);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Editing the wrong version
|
||||||
|
String message = "Repository version is newer.";
|
||||||
|
throw new WebScriptException(Status.STATUS_CONFLICT, message);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Generate the activity
|
||||||
|
addActivityEntry("edited", page, site, req, json);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// All done
|
||||||
|
model.put("page", page);
|
||||||
|
model.put("site", site);
|
||||||
|
model.put("siteId", site.getShortName());
|
||||||
|
|
||||||
|
// Double wrap
|
||||||
|
Map<String, Object> result = new HashMap<String, Object>();
|
||||||
|
result.put("result", model);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean pageVersionMatchesSubmitted(WikiPageInfo page, String currentVersion)
|
||||||
|
{
|
||||||
|
// If they didn't give version, it can't be right
|
||||||
|
if(currentVersion == null)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Grab the current version
|
||||||
|
Version version = versionService.getCurrentVersion(page.getNodeRef());
|
||||||
|
if(version == null)
|
||||||
|
{
|
||||||
|
// It should be versioned already, fix that
|
||||||
|
makeVersioned(page);
|
||||||
|
|
||||||
|
// Wasn't versioned before, so can't detect conflict
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check the label
|
||||||
|
if(version.getVersionLabel().equals(currentVersion))
|
||||||
|
{
|
||||||
|
// Match, no changes
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Someone else has edited it
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void makeVersioned(WikiPageInfo page)
|
||||||
|
{
|
||||||
|
Map<QName,Serializable> versionProps = new HashMap<QName, Serializable>();
|
||||||
|
versionProps.put(ContentModel.PROP_AUTO_VERSION, true);
|
||||||
|
versionProps.put(ContentModel.PROP_AUTO_VERSION_PROPS, true);
|
||||||
|
versionService.ensureVersioningEnabled(page.getNodeRef(), versionProps);
|
||||||
|
}
|
||||||
|
}
|
@@ -523,6 +523,23 @@ public class WikiRestApiTest extends BaseWebScriptTest
|
|||||||
assertEquals(name, page.getString("name"));
|
assertEquals(name, page.getString("name"));
|
||||||
assertEquals(PAGE_TITLE_TWO, page.getString("title"));
|
assertEquals(PAGE_TITLE_TWO, page.getString("title"));
|
||||||
assertEquals("This page has been moved [["+name2+"|here]].", page.getString("pagetext"));
|
assertEquals("This page has been moved [["+name2+"|here]].", page.getString("pagetext"));
|
||||||
|
|
||||||
|
|
||||||
|
// Ensure you can't rename onto an existing page
|
||||||
|
page = createOrUpdatePage(PAGE_TITLE_ONE, PAGE_CONTENTS_THREE, null, Status.STATUS_OK);
|
||||||
|
String name1 = PAGE_TITLE_ONE.replace(' ', '_');
|
||||||
|
|
||||||
|
// Check the rename won't work
|
||||||
|
renamePage(PAGE_TITLE_THREE, PAGE_TITLE_ONE, Status.STATUS_CONFLICT);
|
||||||
|
|
||||||
|
// Check that the pages weren't changed
|
||||||
|
page = getPage(name2, Status.STATUS_OK);
|
||||||
|
assertEquals(name2, page.getString("name"));
|
||||||
|
assertEquals(PAGE_TITLE_THREE, page.getString("title"));
|
||||||
|
|
||||||
|
page = getPage(name1, Status.STATUS_OK);
|
||||||
|
assertEquals(name1, page.getString("name"));
|
||||||
|
assertEquals(PAGE_TITLE_ONE, page.getString("title"));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testVersioning() throws Exception
|
public void testVersioning() throws Exception
|
||||||
|
Reference in New Issue
Block a user