Merged DEV/SWIFT to HEAD

26012: OpenCMIS server bug fixes: PWC properties update and document version delete
   26205: - integrated the CMIS Client API project into the build
          - made the local CMIS client use the Alfresco OpenCMIS Extension
          - updated OpenCMIS
   26300: expose all non-child associations through OpenCMIS and check relationship source and target instead of the relationship type
   26356: OpenCMIS update
   26378: added more CMIS client examples
   26380: added helper methods for CMIS client
   26500: - fixed CMIS date aspect property encoding 
          - fixed CMIS rendition filter handling
   26519: OpenCMIS update
   26523: fixed CMISConnectionManager
   26596: renamed CMIS JavaScript root objects (cmis -> cmisserver, cmisclient -> cmis)
   26651: removed the cmis-client-api project and replaced it with a jar in 3rd-party
   26652: - corrected CMIS samples
   26656: - removed cmis-client-api from build
   26658: - removed the last bit of cmis-client-api
   26663: - added CMIS samples (browser and upload)
   26742: CMIS webscripts samples update
   26743: CMIS webscripts samples update
   26939: removed duplicate commons-fileupload
   26942: updated commons-lang to 2.6
   26943: updated OpenCMIS (browser binding is now included in the server framework)
   26953: refactored OpenCMIS client integration
   26974: Update classpath for Florian - OpenCMIS browser bindings are now rolled into the main jar, no need for their own one
   26975: removed outdated CMIS browser binding demo page
   27048: port of the Spring Surf CMIS browser plus a few new features (create folder, create document, delete object)
   27077: bug fix: CMIS id for associations
   27079: OpenCMIS update
   27085: added check if CMIS is supported
   27086: OpenCMIS client bindings update (force JAX-WS RI)
   27138: clean up
   27764: CMIS default connection handling
   27879: OpenCMIS client: moved server definitions to separate config file
   27880: OpenCMIS client: removed test repositories from configuration
   27918: changed CMIS server configuration tag name to match Spring Surf configuration
   27920: enabled relationships in CMIS browser
   27924: Updated Spring Surf and added the Spring Surf CMIS framework
          [Merge note: Kept most recent HEAD jars where conflicts occured]
   27926: Updated Spring Surf source jars
          [Merge note: Kept most recent HEAD jars where conflicts occured]

git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@28219 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Derek Hulley
2011-06-06 19:49:42 +00:00
parent 23207fbf7f
commit 633aa3b36e
108 changed files with 2258 additions and 414 deletions

View File

@@ -34,5 +34,5 @@ script:
} }
} }
} }
cmis.applyACL(model.node, principalIds, permissions); cmisserver.applyACL(model.node, principalIds, permissions);
} }

View File

@@ -3,24 +3,24 @@
script: script:
{ {
// property filter // property filter
model.filter = args[cmis.ARG_FILTER]; model.filter = args[cmisserver.ARG_FILTER];
if (model.filter === null || model.filter == "") if (model.filter === null || model.filter == "")
{ {
model.filter = "*"; model.filter = "*";
} }
// ACL // ACL
model.includeACL = args[cmis.ARG_INCLUDE_ACL] == "true"; model.includeACL = args[cmisserver.ARG_INCLUDE_ACL] == "true";
// Change log // Change log
var changeLogToken = args[cmis.ARG_CHANGE_LOG_TOKEN]; var changeLogToken = args[cmisserver.ARG_CHANGE_LOG_TOKEN];
if (changeLogToken == "") if (changeLogToken == "")
{ {
changeLogToken = null; changeLogToken = null;
} }
var maxItems = args[cmis.ARG_MAX_ITEMS]; var maxItems = args[cmisserver.ARG_MAX_ITEMS];
var maxItemsInt = maxItems != null && maxItems != "" ? parseInt(maxItems) : null; var maxItemsInt = maxItems != null && maxItems != "" ? parseInt(maxItems) : null;
model.changeLog = cmis.getChangeLog(changeLogToken, maxItemsInt); model.changeLog = cmisserver.getChangeLog(changeLogToken, maxItemsInt);
// return value // return value
1; 1;

View File

@@ -4,7 +4,7 @@ script:
{ {
// locate (optional) folder // locate (optional) folder
model.folder = null; model.folder = null;
var folderId = args[cmis.ARG_FOLDER_ID]; var folderId = args[cmisserver.ARG_FOLDER_ID];
if (folderId !== null) if (folderId !== null)
{ {
var folder = getObjectFromObjectId(folderId); var folder = getObjectFromObjectId(folderId);
@@ -25,25 +25,25 @@ script:
model.includeDescendants = (args.includeDescendants == "true") ? true : false; model.includeDescendants = (args.includeDescendants == "true") ? true : false;
// property filter // property filter
model.filter = args[cmis.ARG_FILTER]; model.filter = args[cmisserver.ARG_FILTER];
if (model.filter === null) if (model.filter === null)
{ {
model.filter = "*"; model.filter = "*";
} }
// rendition filter // rendition filter
model.renditionFilter = args[cmis.ARG_RENDITION_FILTER]; model.renditionFilter = args[cmisserver.ARG_RENDITION_FILTER];
if (model.renditionFilter === null || model.renditionFilter.length == 0) if (model.renditionFilter === null || model.renditionFilter.length == 0)
{ {
model.renditionFilter = "cmis:none"; model.renditionFilter = "cmis:none";
} }
// include allowable actions // include allowable actions
var includeAllowableActions = args[cmis.ARG_INCLUDE_ALLOWABLE_ACTIONS]; var includeAllowableActions = args[cmisserver.ARG_INCLUDE_ALLOWABLE_ACTIONS];
model.includeAllowableActions = (includeAllowableActions == "true" ? true : false); model.includeAllowableActions = (includeAllowableActions == "true" ? true : false);
// include relationships // include relationships
model.includeRelationships = args[cmis.ARG_INCLUDE_RELATIONSHIPS]; model.includeRelationships = args[cmisserver.ARG_INCLUDE_RELATIONSHIPS];
if (model.includeRelationships == null || model.includeRelationships.length == 0) if (model.includeRelationships == null || model.includeRelationships.length == 0)
{ {
model.includeRelationships = "none"; model.includeRelationships = "none";
@@ -51,7 +51,7 @@ script:
// retrieve checked-out // retrieve checked-out
var page = paging.createPageOrWindow(args); var page = paging.createPageOrWindow(args);
var paged = cmis.queryCheckedOut(person.properties.userName, model.folder, model.includeDescendants, page); var paged = cmisserver.queryCheckedOut(person.properties.userName, model.folder, model.includeDescendants, page);
model.results = paged.results; model.results = paged.results;
model.cursor = paged.cursor; model.cursor = paged.cursor;
} }

View File

@@ -31,7 +31,7 @@ script:
model.node = object.node; model.node = object.node;
// checkout // checkout
model.pwc = cmis.checkOut(objectId); model.pwc = cmisserver.checkOut(objectId);
// setup for 201 Created response // setup for 201 Created response
// TODO: set Content-Location // TODO: set Content-Location

View File

@@ -11,8 +11,8 @@ script:
model.node = object.node; model.node = object.node;
// handle filters // handle filters
model.types = args[cmis.ARG_TYPES] === null ? cmis.defaultTypesFilter : args[cmis.ARG_TYPES]; model.types = args[cmisserver.ARG_TYPES] === null ? cmisserver.defaultTypesFilter : args[cmisserver.ARG_TYPES];
if (!cmis.isValidTypesFilter(model.types)) if (!cmisserver.isValidTypesFilter(model.types))
{ {
status.code = 400; status.code = 400;
status.message = "Types filter '" + model.types + "' unknown"; status.message = "Types filter '" + model.types + "' unknown";
@@ -21,28 +21,28 @@ script:
} }
// property filter // property filter
model.filter = args[cmis.ARG_FILTER]; model.filter = args[cmisserver.ARG_FILTER];
if (model.filter === null) if (model.filter === null)
{ {
model.filter = "*"; model.filter = "*";
} }
// rendition filter // rendition filter
model.renditionFilter = args[cmis.ARG_RENDITION_FILTER]; model.renditionFilter = args[cmisserver.ARG_RENDITION_FILTER];
if (model.renditionFilter === null || model.renditionFilter.length == 0) if (model.renditionFilter === null || model.renditionFilter.length == 0)
{ {
model.renditionFilter = "cmis:none"; model.renditionFilter = "cmis:none";
} }
// order by // order by
var orderBy = args[cmis.ARG_ORDER_BY]; var orderBy = args[cmisserver.ARG_ORDER_BY];
// include allowable actions // include allowable actions
var includeAllowableActions = args[cmis.ARG_INCLUDE_ALLOWABLE_ACTIONS]; var includeAllowableActions = args[cmisserver.ARG_INCLUDE_ALLOWABLE_ACTIONS];
model.includeAllowableActions = (includeAllowableActions == "true" ? true : false); model.includeAllowableActions = (includeAllowableActions == "true" ? true : false);
// include relationships // include relationships
model.includeRelationships = args[cmis.ARG_INCLUDE_RELATIONSHIPS]; model.includeRelationships = args[cmisserver.ARG_INCLUDE_RELATIONSHIPS];
if (model.includeRelationships == null || model.includeRelationships.length == 0) if (model.includeRelationships == null || model.includeRelationships.length == 0)
{ {
model.includeRelationships = "none"; model.includeRelationships = "none";
@@ -50,7 +50,7 @@ script:
// retrieve children // retrieve children
var page = paging.createPageOrWindow(args); var page = paging.createPageOrWindow(args);
var paged = cmis.queryChildren(model.node, model.types, orderBy, page); var paged = cmisserver.queryChildren(model.node, model.types, orderBy, page);
model.results = paged.results; model.results = paged.results;
model.cursor = paged.cursor; model.cursor = paged.cursor;
} }

View File

@@ -22,7 +22,7 @@ script:
model.parent = parent.node; model.parent = parent.node;
// versioning state // versioning state
var versioningState = args[cmis.ARG_VERSIONING_STATE]; var versioningState = args[cmisserver.ARG_VERSIONING_STATE];
if (versioningState === null || versioningState.length == 0) if (versioningState === null || versioningState.length == 0)
{ {
versioningState = "major"; versioningState = "major";
@@ -32,7 +32,7 @@ script:
var object = entry.getExtension(atom.names.cmisra_object); var object = entry.getExtension(atom.names.cmisra_object);
var objectIdProp = (object !== null) ? object.objectId : null; var objectIdProp = (object !== null) ? object.objectId : null;
var objectId = (objectIdProp !== null) ? objectIdProp.nativeValue : null; var objectId = (objectIdProp !== null) ? objectIdProp.nativeValue : null;
var sourceFolderId = args[cmis.ARG_SOURCE_FOLDER_ID]; var sourceFolderId = args[cmisserver.ARG_SOURCE_FOLDER_ID];
var node = null; var node = null;
if (objectId == null) if (objectId == null)
@@ -54,7 +54,7 @@ script:
} }
node = object.node; node = object.node;
cmis.addObjectToFolder(node, model.parent); cmisserver.addObjectToFolder(node, model.parent);
} }
else else
{ {
@@ -69,7 +69,7 @@ script:
node = object.node; node = object.node;
// perform move // perform move
cmis.moveObject(node, model.parent, sourceFolderId); cmisserver.moveObject(node, model.parent, sourceFolderId);
} }
// success // success

View File

@@ -0,0 +1,77 @@
<#macro head>
<head>
<title><#nested></title>
<link type="text/css" rel="stylesheet" href="${url.context}/cmis-browser-app/css/style.css" />
</head>
</#macro>
<#macro header>
<div id="header">
<img id="cmis-logo" src="${url.context}/cmis-browser-app/images/cmis-browser-logo.png" width="222" height="35" />
<a href="http://chemistry.apache.org" target="_blank"><img id="apachec-logo"src="${url.context}/cmis-browser-app/images/apache_chemistry.png" width="169" height="21" /></a>
<img id="divider" src="${url.context}/cmis-browser-app/images/divider.jpg" width="2" height="28"/>
<a href="http://www.springsurf.org/" target="_blank"><img id="surf-logo" src="${url.context}/cmis-browser-app/images/surf-logo.png" width="65" height="26" /></a>
</div>
</#macro>
<#macro navigation>
<@header/>
<div id="navigation">
<ul id="pathlist">
<li><a class="pathlinks" href="${url.serviceContext}/cmis-browser-app/connections">CMIS Repositories</a> :</li>
<li><#nested></li>
</ul>
</div>
</#macro>
<#macro connectionNavigation connection>
<@header/>
<div id="navigation">
<ul id="pathlist">
<li><a class="pathlinks" href="${url.serviceContext}/cmis-browser-app/connections">CMIS Repositories</a> :</li>
<li>Repository <a class="pathlinks" href="<@cmisContextUrl connection.name/>/repo">${connection.server.description!""} (${connection.userName!"<i>anonymous</i>"})</a> : </li>
<li><#nested></li>
</ul>
</div>
</#macro>
<#macro cmisContextUrl connectionId=""><#if connectionId != "">${url.serviceContext}/cmis-browser-app/c/${connectionId}<#-- TODO: remove all the hard-coded dirtyness --><#elseif url.match?starts_with("/cmis-browser-app/c/")>${url.serviceContext}/cmis-browser-app/c/${url.templateArgs["conn"]}<#else>${url.serviceContext}/cmis-browser-app</#if></#macro>
<#macro propertyvalue property connectionName="">
<#-- TODO: consider using single as well as list representations of value -->
<#list property.values as val>
<#-- TODO: use property definition type instead of property id -->
<#if property.id?? && property.id == "cmis:objectId">
<@value val ; v><a href="<@cmisContextUrl connectionName/>/object?id=${v}">${v}</a></@value>
<#else>
<@value val ; v>${v}</@value>
</#if>
<#if val_has_next><#nested></#if>
</#list>
</#macro>
<#macro value val>
<#if val?is_hash && val.time??><#nested val.time?datetime>
<#elseif val?is_string><#nested val>
<#elseif val?is_number><#nested val?c>
<#elseif val?is_boolean><#nested val?string>
<#elseif val?is_date><#nested val?datetime>
<#else><#nested val>
</#if>
</#macro>
<#macro resultsHeader skipCount pageNumItems>
<#if pageNumItems == 0>No Results Found<#else>Results <b>${skipCount + 1}</b> - <b>${skipCount + pageNumItems}</#if></b>
</#macro>
<#macro objectImage baseTypeId="cmis:document">
<#if baseTypeId == "cmis:folder"><@image "folder-yellow"/><#else><@image "document"/></#if>
</#macro>
<#macro image image height=-1 width=-1>
<img<#if height !=-1> height="${height}"</#if><#if width !=-1> width="${width}"</#if> src="${url.context}/cmis-browser-app/images/${image}<#if image?index_of(".") == -1>.gif</#if>">
</#macro>
<#macro button name>
<input class="button" type="submit" value="${name}" onmouseover="this.className='btn-hover'" onmouseout="this.className='button'">
</#macro>

View File

@@ -0,0 +1,5 @@
<webscript>
<shortname>CMIS Connect</shortname>
<url>/cmis-browser-app/connect</url>
<authentication>user</authentication>
</webscript>

View File

@@ -0,0 +1,35 @@
<#import "cmis.lib.html.ftl" as cmisLib/>
<html>
<@cmisLib.head>Connect</@cmisLib.head>
<body>
<div id="container">
<@cmisLib.navigation>Connect</@cmisLib.navigation>
<div id="content">
<table class="details">
<tr><th colspan="3">${serverDefinition.name?html} (${serverDefinition.description?html})</th></tr>
<#if error??>
<form action="${url.service}" method="post">
<input type="hidden" name="server" value="${serverDefinition.name}">
<tr><td>Error:</td><td style="color:red">${error?html}</td></tr>
<tr><td>Username:</td><td><input type="text" name="username" size="30"/></td></tr>
<tr><td>Password:</td><td><input type="password" name="password" size="30"/></td></tr>
<tr><td>Repository Id:</td><td><input type="text" name="repositoryid" size="30"/> (leave empty for the first repository)</td></tr>
<tr><td></td><td><@cmisLib.button "connect"/></td></tr>
</form>
<#else>
<table>
<tr><td class="headercol">Name:</td><td>${repoinfo.name}</td></tr>
<tr><td class="headercol">Id:</td><td>${repoinfo.id}<td></tr>
<tr><td class="headercol">Product Name:</td><td>${repoinfo.productName}<td></tr>
<tr><td class="headercol">Product Version:</td><td>${repoinfo.productVersion}<td></tr>
<tr><td class="headercol">Vendor:</td><td>${repoinfo.vendorName}<td></tr>
<tr><td class="headercol">CMIS Version:</td><td>${repoinfo.cmisVersionSupported}<td></tr>
<tr><td></td><td><a href="<@cmisLib.cmisContextUrl/>/connections">Return to the connection page</a></td></tr>
<tr><td></td><td><a href="<@cmisLib.cmisContextUrl conn.id/>/folder?id=${rootFolder.id?url}">Browse the root folder "${rootFolder.name?html}"</a></td></tr>
<tr><td></td><td><a href="<@cmisLib.cmisContextUrl conn.id/>/query">Query the repository</a></td></tr>
</#if>
</table>
</div>
</div>
</body>
</html>

View File

@@ -0,0 +1,38 @@
var serverName = args["server"];
var connectionId = "cmis-browser-" + serverName;
// get server definition
var serverDefinition = cmis.getServerDefinition(serverName);
if (serverDefinition == null) {
status.code = 400;
status.message = "Unknown server!";
status.redirect = true;
}
// clean up old connection
var connection = cmis.getConnection(connectionId);
if (connection != null) {
connection.close();
connection = null;
}
model.serverDefinition = serverDefinition;
// connect
try {
if (args["username"] != null && args["username"].length > 0) {
if (args["repositoryid"] != null && args["repositoryid"].length > 0) {
serverDefinition = cmis.createServerDefinition(serverDefinition, args["username"], args["password"], args["repositoryid"])
} else {
serverDefinition = cmis.createServerDefinition(serverDefinition, args["username"], args["password"])
}
}
connection = cmis.createUserConnection(serverDefinition, connectionId);
model.conn = connection;
model.repoinfo = model.conn.session.repositoryInfo;
model.rootFolder = model.conn.session.rootFolder;
} catch (e) {
model.error = (e.javaException == null ? e.rhinoException.message : e.javaException.message);
}

View File

@@ -0,0 +1,5 @@
<webscript>
<shortname>CMIS Connections</shortname>
<url>/cmis-browser-app/c/{conn}</url>
<authentication>user</authentication>
</webscript>

View File

@@ -0,0 +1,10 @@
<#import "cmis.lib.html.ftl" as cmisLib/>
<html>
<@cmisLib.head>Disconnected Connection</@cmisLib.head>
<body>
<div id="container">
<@cmisLib.navigation>${conn.id} disconnected</@cmisLib.navigation>
</div>
</body>
</html>

View File

@@ -0,0 +1,5 @@
script:
{
model.conn = cmis.getConnection(url.templateArgs["conn"]);
model.conn.close();
}

View File

@@ -0,0 +1,5 @@
<webscript>
<shortname>CMIS Connections</shortname>
<url>/cmis-browser-app/connections</url>
<authentication>user</authentication>
</webscript>

View File

@@ -0,0 +1,56 @@
<#import "cmis.lib.html.ftl" as cmisLib/>
<html>
<@cmisLib.head>Connections</@cmisLib.head>
<body>
<div id="container">
<@cmisLib.navigation>Connections</@cmisLib.navigation>
<div id="content">
<table class="details">
<tr><th colspan="9"><b>My Connections</b></th></tr>
<#if connections?size == 0>
<tr><td colspan="9">None</td></tr>
</table>
<#else>
<tr><td><b>Server</b></td><td></td><td><b>Repository</b></td><td><b>Connection</b></td><td><b>User</b><td><td></td><td></td><td></td></tr>
<#list connections as conn>
<tr>
<td>${conn.server.name!""}</td>
<td>${conn.server.description!""}</td>
<td>${conn.session.repositoryInfo.name}</td>
<td>${conn.id}</td>
<td>${conn.userName}</td>
<td><a href="<@cmisLib.cmisContextUrl conn.id/>/repo">info</a></td>
<td><a href="<@cmisLib.cmisContextUrl conn.id/>/folder?id=${conn.session.rootFolder.id}">browse</a></td>
<td><#if conn.supportsQuery()><a href="<@cmisLib.cmisContextUrl conn.id/>/query">query</a></#if></td>
<td><form action="<@cmisLib.cmisContextUrl conn.id/>" method="post"><input type="hidden" name="alf_method" value="delete"><@cmisLib.button "disconnect"/></form></td>
</tr>
</#list>
</table>
<br>
<table>
<tr><td><a href="<@cmisLib.cmisContextUrl/>/federatedquery">query all</a></td></tr>
</table>
</#if>
<br>
<table class="details">
<tr><th colspan="3"><b>Available CMIS Servers</b></th></tr>
<#if servers?size == 0>
<tr><td colspan="3">None</td></tr>
<#else>
<tr><td><b>Server</b></td><td></td><td></td></tr>
<#list servers as server>
<tr>
<td>${server.name!""}</td>
<td>${server.description!""}</td>
<td><form action="<@cmisLib.cmisContextUrl/>/connect" method="post"><input type="hidden" name="server" value="${server.name}"/><@cmisLib.button "connect"/></form></td>
</tr>
</#list>
</#if>
</table>
</div>
</div>
</body>
</html>

View File

@@ -0,0 +1,6 @@
// create default connection if it doesn't exist yet
var defaultConnection = cmis.getConnection();
// get all connections and servers
model.connections = cmis.getUserConnections();
model.servers = cmis.getServerDefinitions();

View File

@@ -0,0 +1,6 @@
<webscript>
<shortname>CMIS Rendition Stream</shortname>
<url>/cmisbrowser/content?id={objectId}</url>
<url>/cmisbrowser/c/{conn}/content?id={objectId}</url>
<authentication>user</authentication>
</webscript>

View File

@@ -0,0 +1,5 @@
<webscript>
<shortname>CMIS Federated Query</shortname>
<url>/cmis-browser-app/federatedquery?statement={statement?}&amp;maxItems={maxItems?}</url>
<authentication>user</authentication>
</webscript>

View File

@@ -0,0 +1,70 @@
<#import "cmis.lib.html.ftl" as cmisLib/>
<html>
<@cmisLib.head>CMIS Federated Query Tool</@cmisLib.head>
<body>
<div id="container">
<@cmisLib.navigation>Federated Query Tool: ${connectionCount} Connection<#if connectionCount != 1>s</#if></@cmisLib.navigation>
<div id="content">
<form id="query" name="query" action="<@cmisLib.cmisContextUrl/>/federatedquery">
<table class="form">
<tr><td valign="top">Statement</td><td><textarea name="statement" cols=80 rows=5>${formattedStatement!defaultStatement}</textarea></td></tr>
<tr><td>Page size</td><td><input class="field" type="text" name="maxItems" value="${maxItems}"/></td></tr>
<tr><td></td><td><@cmisLib.button "Execute Query"/></td></tr>
</table>
</form>
<#if results??>
<#list results as result>
<hr>
<table>
<tr>
<#if result.skipCount gt 0>
<td><a class="pag-enabled" href="<@cmisLib.cmisContextUrl/>/federatedquery?statement=${encodeuri(formattedStatement)}&<@decSkipCounts results result.conn/>&maxItems=${maxItems}">&larr; Prev</a></td>
<#else>
<td><a class="pag-disabled" href="#">&larr; Prev</td>
</#if>
<td><@cmisLib.resultsHeader result.skipCount result.pageNumItems/> for ${result.conn.server.name?html} (${result.conn.server.description!""}) (${result.conn.userName!"<i>anonymous</i>"?html})</td>
<#if result.hasMoreItems>
<td><a class="pag-enabled" href="<@cmisLib.cmisContextUrl/>/federatedquery?statement=${encodeuri(formattedStatement)}&<@incSkipCounts results result.conn/>&maxItems=${maxItems}">Next &rarr;</a></td>
<#else>
<td><a class="pag-disabled" href="#">Next &rarr;</td>
</#if>
</tr>
</table>
<br>
<table class="details">
<#list result.rows as row>
<#assign properties = row.properties>
<#if row_index == 0>
<tr>
<#list properties as property>
<th><b>${property.queryName!property.displayName!property.id}</b></th>
</#list>
</tr>
</#if>
<tr>
<#list properties as property>
<td><@cmisLib.propertyvalue property result.conn.id>,<br></@cmisLib.propertyvalue></td>
</#list>
</tr>
</#list>
</table>
</#list>
</#if>
</div>
</div>
</body>
</html>
<#macro incSkipCounts results conn>
<#list results as result>${result.conn.id}_skipCount=<#if result.conn == conn>${result.skipCount + maxItems}<#else>${result.skipCount}</#if><#if result_has_next>&</#if></#list>
</#macro>
<#macro decSkipCounts results conn>
<#list results as result>${result.conn.id}_skipCount=<#if result.conn == conn>${result.skipCount - maxItems}<#else>${result.skipCount}</#if><#if result_has_next>&</#if></#list>
</#macro>

View File

@@ -0,0 +1,37 @@
script:
{
var connections = cmis.getUserConnections();
model.connectionCount = connections.size();
model.defaultStatement = "select cmis:objectId, cmis:name, cmis:objectTypeId\nfrom cmis:document";
model.formattedStatement = args.statement;
model.maxItems = (args.maxItems == null) ? 5 : parseInt(args.maxItems);
// execute query
if (model.formattedStatement != null)
{
var statement = model.formattedStatement.replace(/\n/g, " ").replace(/\r/g, "");
var results = new Array();
for (var i = 0; i < connections.size(); i++)
{
if(!connections.get(i).supportsQuery()) {
continue;
}
var skipCount = (args[connections.get(i).id + "_skipCount"] == null) ? 0 : parseInt(args[connections.get(i).id + "_skipCount"]);
skipCount = (skipCount < 0) ? 0 : skipCount;
var iterable = connections.get(i).session.query(statement, false).skipTo(skipCount).getPage(model.maxItems);
var result = new Object();
result.conn = connections.get(i);
result.rows = iterable.iterator();
result.skipCount = skipCount;
result.hasMoreItems = iterable.hasMoreItems;
result.pageNumItems = iterable.pageNumItems;
results.push(result);
}
model.results = results;
}
}

View File

@@ -0,0 +1,6 @@
<webscript>
<shortname>CMIS Folder Browser</shortname>
<url>/cmis-browser-app/folder?id={objectId}</url>
<url>/cmis-browser-app/c/{conn}/folder?id={objectId}</url>
<authentication>user</authentication>
</webscript>

View File

@@ -0,0 +1,67 @@
<#import "cmis.lib.html.ftl" as cmisLib/>
<html>
<@cmisLib.head>${folder.name?html} Folder</@cmisLib.head>
<body>
<div id="container">
<@cmisLib.connectionNavigation conn>Folder ${folder.name?html} <a href="<@cmisLib.cmisContextUrl conn.id/>/object?id=${folder.id?url}">details</a></@cmisLib.connectionNavigation>
<div id="content">
<table id="directory-list">
<#if folderParent?exists>
<tr>
<td colspan="5"><a href="<@cmisLib.cmisContextUrl conn.id/>/folder?id=${folderParent.id?url}"><@cmisLib.image "up"/></a></td>
</tr>
</#if>
<#list folderChildren as child>
<tr>
<#if child.baseType.id == "cmis:folder">
<td><@cmisLib.objectImage child.baseType.id/></td>
<td><#if child.lastModifiedBy??>${child.lastModifiedBy?html}</#if></td>
<td></td>
<td><#if child.lastModificationDate??>${child.lastModificationDate.time?datetime}</#if></td>
<td><a href="<@cmisLib.cmisContextUrl conn.id/>/folder?id=${child.id?url}">${child.name?html}</a></td>
<#else>
<td><@cmisLib.objectImage child.baseType.id?html/></td>
<td><#if child.lastModifiedBy??>${child.lastModifiedBy?html}</#if></td>
<td style="text-align: right;"><#if child.contentStreamLength??>${child.contentStreamLength?c}</#if></td>
<td><#if child.lastModificationDate??>${child.lastModificationDate.time?datetime}</#if></td>
<td><a href="<@cmisLib.cmisContextUrl conn.id/>/object?id=${child.id?url}">${child.name?html}</a></td>
</#if>
</tr>
</#list>
</table>
<hr/>
<form action="<@cmisLib.cmisContextUrl conn.id/>/folder" method="post">
<input type="hidden" name="conn" value="${conn.id}">
<input type="hidden" name="parent" value="${folder.id}">
<input type="hidden" name="type" value="folder">
<table class="details">
<tr><th colspan="2">Create new folder</th></tr>
<tr><td>Name:</td><td><input type="text" name="name" size="60"/></td></tr>
<tr><td>Object Type:</td><td><input type="text" name="objectType" value="cmis:folder" size="60"/></td></tr>
<tr><td></td><td><@cmisLib.button "create"/></td></tr>
</table>
</form>
<hr/>
<form action="<@cmisLib.cmisContextUrl conn.id/>/folder" method="post" enctype="multipart/form-data">
<input type="hidden" name="conn" value="${conn.id}">
<input type="hidden" name="parent" value="${folder.id}">
<input type="hidden" name="type" value="document">
<table class="details">
<tr><th colspan="2">Upload document</th></tr>
<tr><td>File:</td><td><input type="file" name="file" size="60"/></td></tr>
<tr><td>Name:</td><td><input type="text" name="name" size="60"/></td></tr>
<tr><td>Object Type:</td><td><input type="text" name="objectType" value="cmis:document" size="60"/></td></tr>
<tr><td></td><td><@cmisLib.button "upload"/></td></tr>
</table>
</form>
</div>
</div>
</body>
</html>

View File

@@ -0,0 +1,15 @@
script:
{
model.conn = cmis.getConnection(url.templateArgs["conn"]);
model.folder = model.conn.session.getObject(args.id);
model.folderParent = model.folder.folderParent;
var oc = model.conn.session.createOperationContext();
oc.setFilterString("cmis:name,cmis:objectId,cmis:baseType,cmis:lastModifiedBy,cmis:lastModificationDate,cmis:contentStreamLength");
oc.setMaxItemsPerPage(10000);
oc.setIncludeAcls(false);
oc.setIncludeAllowableActions(false);
oc.setIncludePolicies(false);
oc.setIncludePathSegments(false);
model.folderChildren = model.folder.getChildren(oc).iterator();
}

View File

@@ -0,0 +1,6 @@
<webscript>
<shortname>CMIS Folder Browser</shortname>
<url>/cmis-browser-app/folder</url>
<url>/cmis-browser-app/c/{conn}/folder</url>
<authentication>user</authentication>
</webscript>

View File

@@ -0,0 +1,30 @@
<#import "cmis.lib.html.ftl" as cmisLib/>
<html>
<@cmisLib.head>Connect</@cmisLib.head>
<body>
<div id="container">
<@cmisLib.navigation>Create</@cmisLib.navigation>
<div id="content">
<#if error??>
<h3 style="color: red;">${error?html}</h3>
<#else>
<h3>${object.name?html} created!</h3>
<table class="details">
<#assign properties = object.properties>
<tr><th colspan="4"><b>Properties</b></th></tr>
<tr><td><b>Id</b></td><td><b>Type</b></td><td><b>Cardinality</b></td><td><b>Value(s)</b></td></tr>
<#list properties as property>
<tr>
<td>${property.id?html}</td>
<td>${property.type?capitalize}</td>
<td><#if property.isMultiValued()>multiple</#if></td>
<td><@cmisLib.propertyvalue property conn.id>,<br></@cmisLib.propertyvalue></td>
</tr>
</#list>
</table>
</#if>
<p><a href="<@cmisLib.cmisContextUrl conn.id/>/folder?id=${parent.id?url}">Return to folder</a></p>
</div>
</div>
</body>
</html>

View File

@@ -0,0 +1,29 @@
script: {
try {
model.conn = cmis.getConnection(args["conn"]);
model.parent = model.conn.session.getObject(args["parent"]);
var properties = cmis.createMap();
properties["cmis:name"] = args["name"];
properties["cmis:objectTypeId"] = args["objectType"];
if (args["type"] == "document") {
var contentStream = null;
for each (field in formdata.fields) {
if (field.isFile) {
contentStream = cmis.createContentStream(field.filename, field.content);
if (properties["cmis:name"] == null || properties["cmis:name"].length == 0) {
properties["cmis:name"] = String(field.filename);
}
}
}
model.object = model.parent.createDocument(properties, contentStream, null);
} else {
model.object = model.parent.createFolder(properties);
}
} catch (e) {
model.error = (e.javaException == null ? e.rhinoException.message : e.javaException.message);
}
}

View File

@@ -0,0 +1,6 @@
<webscript>
<shortname>CMIS Object Details</shortname>
<url>/cmis-browser-app/object</url>
<url>/cmis-browser-app/c/{conn}/object</url>
<authentication>user</authentication>
</webscript>

View File

@@ -0,0 +1,38 @@
<#import "cmis.lib.html.ftl" as cmisLib/>
<html>
<@cmisLib.head>Delete</@cmisLib.head>
<body>
<div id="container">
<@cmisLib.navigation>Connect</@cmisLib.navigation>
<div id="content">
<#if error??>
<h3 style="color: red;">${error?html}</h3>
<#else>
<#if needsConfirmation??>
<h3>Delete ${object.name?html}?</h3>
<table><tr>
<td>
<form action="<@cmisLib.cmisContextUrl conn.id/>/object" method="post">
<input type="hidden" name="alf_method" value="delete">
<input type="hidden" name="conn" value="${conn.id}">
<input type="hidden" name="id" value="${object.id}">
<input type="hidden" name="confirm" value="1">
<@cmisLib.button "Yes"/>
</form>
</td><td>
<form action="<@cmisLib.cmisContextUrl conn.id/>/object" method="get">
<input type="hidden" name="conn" value="${conn.id}">
<input type="hidden" name="id" value="${object.id}">
<@cmisLib.button "No"/>
</form>
</td>
</tr></table>
<#else>
<h3>${object.name?html} deleted!</h3>
</#if>
</#if>
<p><a href="<@cmisLib.cmisContextUrl conn.id/>/folder?id=${parent.id?url}">Return to folder</a></p>
</div>
</div>
</body>
</html>

View File

@@ -0,0 +1,19 @@
script: {
try {
model.conn = cmis.getConnection(args["conn"]);
model.object = model.conn.session.getObject(args["id"]);
model.parent = model.object.parents.get(0);
if (args["confirm"] == "1") {
if (model.object.baseType.id == "cmis:folder") {
model.object.deleteTree(true, null, true);
} else {
model.object["delete"](true);
}
} else {
model.needsConfirmation = true;
}
} catch (e) {
model.error = (e.javaException == null ? e.rhinoException.message : e.javaException.message);
}
}

View File

@@ -0,0 +1,6 @@
<webscript>
<shortname>CMIS Object Details</shortname>
<url>/cmis-browser-app/object?id={objectId}</url>
<url>/cmis-browser-app/c/{conn}/object?id={objectId}</url>
<authentication>user</authentication>
</webscript>

View File

@@ -0,0 +1,104 @@
<#import "cmis.lib.html.ftl" as cmisLib/>
<html>
<@cmisLib.head><#if isDoc>Document ${object.name}<#else>Folder ${object.path}</#if></@cmisLib.head>
<body>
<div id="container">
<@cmisLib.connectionNavigation conn><#if isDoc>Document ${object.name}<#else>Folder ${object.path}</#if> details</@cmisLib.connectionNavigation>
<div id="content">
<#if parent?exists>
<table>
<tr><td><a href="<@cmisLib.cmisContextUrl conn.id/>/folder?id=${parent.id}">Parent Folder ${parent.path}</a></td></tr>
</table>
<br>
</#if>
<table><tr>
<#if isDoc>
<#if object.contentStreamLength?? && object.contentStreamLength gt 0>
<td>
<#if object.contentStreamMimeType??>
<#assign mimetype = " (${object.contentStreamMimeType?html})">
<#else>
<#assign mimetype = "">
</#if>
<form action="${url.serviceContext}/cmis/content" method="get">
<input type="hidden" name="conn" value="${conn.id}">
<input type="hidden" name="id" value="${object.id}">
<@cmisLib.button "View Content${mimetype}"/>
</form>
</td>
</#if>
<#elseif isFolder>
<td>
<form action="<@cmisLib.cmisContextUrl conn.id/>/folder" method="get">
<input type="hidden" name="id" value="${object.id}">
<@cmisLib.button "View Children"/>
</form>
</td>
</#if>
<td>
<form action="<@cmisLib.cmisContextUrl conn.id/>/object" method="post">
<input type="hidden" name="alf_method" value="delete">
<input type="hidden" name="conn" value="${conn.id}">
<input type="hidden" name="id" value="${object.id}">
<@cmisLib.button "Delete"/>
</form>
</td>
</tr></table>
<#assign renditions = object.renditions![]>
<#if renditions?size gt 0>
<table class="details">
<tr><th colspan="3"><b>Renditions</b></th></tr>
<tr><td><b>Kind</b></td><td><b>Mimetype</b></td><td><b>Length</b></td></tr>
<#list renditions as rendition>
<tr>
<td><a href="${url.serviceContext}/cmis/content?id=${object.id?url}&conn=${conn.id?url}&stream=${rendition.streamId?url}">${rendition.kind?html}</a></td>
<td>${rendition.mimeType}</td>
<td><#if rendition.length != -1>${rendition.length?c}</#if></td>
</tr>
</#list>
</table>
<br>
</#if>
<table class="details">
<#assign properties = object.properties>
<tr><th colspan="4"><b>Properties</b></th></tr>
<tr><td><b>Id</b></td><td><b>Type</b></td><td><b>Cardinality</b></td><td><b>Value(s)</b></td></tr>
<#list properties as property>
<tr>
<td>${property.id?html}</td>
<td>${property.type?capitalize}</td>
<td><#if property.isMultiValued()>multiple</#if></td>
<td><@cmisLib.propertyvalue property conn.id>,<br></@cmisLib.propertyvalue></td>
</tr>
</#list>
</table>
<br>
<table class="details">
<tr><th colspan="3"><b>Relationships</b></th></tr>
<tr><td><b>Id</b></td><td><b>Name</b></td><td><b>Related Objects</b></td></tr>
<#assign relationships = object.relationships![]>
<#if relationships??>
<#list relationships as relationship>
<tr>
<td>${relationship.id?html}</td>
<td>${relationship.name?html}</td>
<td><a href="<@cmisLib.cmisContextUrl conn.id/>/object?id=${relationship.source.id?url}">${relationship.source.name?html}</a> &rarr;
<a href="<@cmisLib.cmisContextUrl conn.id/>/object?id=${relationship.target.id?url}">${relationship.target.name?html}</a></td>
</tr>
</#list>
</#if>
</table>
</div>
</div>
</body>
</html>

View File

@@ -0,0 +1,18 @@
script:
{
model.conn = cmis.getConnection(url.templateArgs["conn"]);
var operationContext = model.conn.session.createOperationContext();
operationContext.renditionFilterString = "*";
operationContext.includeRelationships = Packages.org.apache.chemistry.opencmis.commons.enums.IncludeRelationships.BOTH;
model.object = model.conn.session.getObject(args.id, operationContext);
model.isDoc = (model.object.baseType.id == "cmis:document");
model.isFolder = (model.object.baseType.id == "cmis:folder");
if (model.isDoc)
{
var parents = model.object.parents;
if (parents.size() > 0)
{
model.parent = parents.get(0);
}
}
}

View File

@@ -0,0 +1,6 @@
<webscript>
<shortname>CMIS Query</shortname>
<url>/cmis-browser-app/query?statement={statement?}&amp;skipCount={skipCount?}&amp;maxItems={maxItems?}</url>
<url>/cmis-browser-app/c/{conn}/query?statement={statement?}&amp;skipCount={skipCount?}&amp;maxItems={maxItems?}</url>
<authentication>user</authentication>
</webscript>

View File

@@ -0,0 +1,60 @@
<#import "cmis.lib.html.ftl" as cmisLib/>
<html>
<@cmisLib.head>CMIS Query Tool</@cmisLib.head>
<body>
<div id="container">
<@cmisLib.connectionNavigation conn>Query Tool</@cmisLib.connectionNavigation>
<div id="content">
<form id="query" name="query" action="<@cmisLib.cmisContextUrl conn.id/>/query">
<table class="form">
<tr><td valign="top">Statement</td><td><textarea name="statement" cols=80 rows=5>${formattedStatement!defaultStatement}</textarea></td></tr>
<tr><td>Page size</td><td><input class="field" type="text" name="maxItems" value="${maxItems}"/></td></tr>
<tr><td></td><td><@cmisLib.button "Execute Query"/></td></tr>
</table>
</form>
<#if rows??>
<hr>
<table>
<tr>
<#if skipCount gt 0>
<td><a class="pag-enabled" href="<@cmisLib.cmisContextUrl conn.id/>/query?statement=${encodeuri(formattedStatement)}&skipCount=${skipCount - maxItems}&maxItems=${maxItems}">&larr; Prev</a></td>
<#else>
<td><a class="pag-disabled" href="#">&larr; Prev</td>
</#if>
<td><@cmisLib.resultsHeader skipCount pageNumItems/></td>
<#if hasMoreItems>
<td><a class="pag-enabled" href="<@cmisLib.cmisContextUrl conn.id/>/query?statement=${encodeuri(formattedStatement)}&skipCount=${skipCount + maxItems}&maxItems=${maxItems}">Next &rarr;</a></td>
<#else>
<td><a class="pag-disabled" href="#">Next &rarr;</td>
</#if>
</tr>
</table>
<br>
<table class="details">
<#list rows as row>
<#assign properties = row.properties>
<#if row_index == 0>
<tr>
<#list properties as property>
<th><b>${property.queryName!property.displayName!property.id?html}</b></th>
</#list>
</tr>
</#if>
<tr>
<#list properties as property>
<td><@cmisLib.propertyvalue property conn.id>,<br></@cmisLib.propertyvalue></td>
</#list>
</tr>
</#list>
</table>
</#if>
</div>
</div>
</body>
</html>

View File

@@ -0,0 +1,19 @@
script:
{
model.conn = cmis.getConnection(url.templateArgs["conn"]);
model.defaultStatement = "select cmis:objectId, cmis:name, cmis:objectTypeId\nfrom cmis:document";
model.formattedStatement = args.statement;
model.skipCount = (args.skipCount == null || args.skipCount < 0) ? 0 : parseInt(args.skipCount);
model.maxItems = (args.maxItems == null) ? 10 : parseInt(args.maxItems);
// execute query
if (model.formattedStatement != null)
{
var statement = model.formattedStatement.replace(/\n/g, " ").replace(/\r/g, "");
var iterable = model.conn.session.query(statement, false).skipTo(model.skipCount).getPage(model.maxItems);
model.rows = iterable.iterator();
model.hasMoreItems = iterable.hasMoreItems;
model.pageNumItems = iterable.pageNumItems;
}
}

View File

@@ -0,0 +1,6 @@
<webscript>
<shortname>CMIS Content Stream</shortname>
<url>/cmis-browser-app/rendition/{streamId}?id={objectId}</url>
<url>/cmis-browser-app/c/{conn}/rendition/{streamId}?id={objectId}</url>
<authentication>user</authentication>
</webscript>

View File

@@ -0,0 +1,6 @@
<webscript>
<shortname>CMIS Repository Info</shortname>
<url>/cmis-browser-app/repo</url>
<url>/cmis-browser-app/c/{conn}/repo</url>
<authentication>user</authentication>
</webscript>

View File

@@ -0,0 +1,27 @@
<#import "cmis.lib.html.ftl" as cmisLib/>
<html>
<@cmisLib.head>Repository: ${repoinfo.name}</@cmisLib.head>
<body>
<div id="container">
<@cmisLib.connectionNavigation conn>Information</@cmisLib.connectionNavigation>
<div id="content">
<table>
<tr><td class="headercol">Name:</td><td>${repoinfo.name}</td></tr>
<tr><td class="headercol">Id:</td><td>${repoinfo.id}<td></tr>
<tr><td class="headercol">Product Name:</td><td>${repoinfo.productName}<td></tr>
<tr><td class="headercol">Product Version:</td><td>${repoinfo.productVersion}<td></tr>
<tr><td class="headercol">Vendor:</td><td>${repoinfo.vendorName}<td></tr>
<tr><td class="headercol">CMIS Version:</td><td>${repoinfo.cmisVersionSupported}<td></tr>
</table>
<br>
<table>
<tr>
<td>You may <a href="<@cmisLib.cmisContextUrl conn.id/>/folder?id=${rootFolder.id?url}">browse the ${rootFolder.name?html} folder</a>
or <a href="<@cmisLib.cmisContextUrl conn.id/>/query">query</a> the repository.</td>
</tr>
</table>
</div>
</body>
</html>

View File

@@ -0,0 +1,10 @@
var connectionId = url.templateArgs["conn"];
if (connectionId) {
model.conn = cmis.getConnection(connectionId);
} else {
model.conn = cmis.getConnection();
}
model.repoinfo = model.conn.session.repositoryInfo;
model.rootFolder = model.conn.session.rootFolder;

View File

@@ -0,0 +1,5 @@
<webscript>
<shortname>CMIS Content Stream</shortname>
<url>/cmis/content</url>
<authentication>user</authentication>
</webscript>

View File

@@ -0,0 +1,5 @@
<webscript>
<shortname>CMIS Create Folder Example</shortname>
<url>/cmissamples/createfolder</url>
<authentication>user</authentication>
</webscript>

View File

@@ -0,0 +1,40 @@
<html>
<head>
<title>CMIS Create Folder</title>
<link rel="stylesheet" type="text/css" href="${url.context}/css/base.css" />
</head>
<body>
<h1>New Folder</h1>
<#if folder??>
<table>
<tr><td>Name:</td><td>${folder.name}</td></tr>
<tr><td>Path:</td><td>${folder.path}</td></tr>
<tr><td>Id:</td><td>${folder.id}</td></tr>
<tr><td>Type:</td><td>${folder.type.id}</td></tr>
<tr><td>Created by:</td><td>${folder.createdBy}</td></tr>
<tr><td>Creation date:</td><td>${folder.creationDate.time?datetime}</td></tr>
</table>
<#else>
<form action="${url.service}" method="get" charset="utf-8">
<table>
<tr>
<td>Name:</td>
<td><input type="text" name="name" size="100"/></td>
</tr>
<tr>
<td>Path:</td>
<td><input type="text" name="path" value="/" size="100"/></td>
</tr>
<tr>
<td></td>
<td><input type="submit" name="submit" value="Create Folder"/></td>
</tr>
</table>
</form>
</#if>
</body>
</html>

View File

@@ -0,0 +1,27 @@
// get the sample user connection
var connectionId = "cmis-sample-connection"
var cmisConnection = cmis.getConnection(connectionId)
if (cmisConnection == null) {
// if no connection exists, talk to the local server
cmisConnection = cmis.getConnection()
}
var cmisSession = cmisConnection.getSession()
// get arguments
var path = args["path"]
var name = args["name"]
if (path != null && name != null)
{
// get path folder
var parentFolder = cmisSession.getObjectByPath(path)
// set up properties
var properties = cmis.createMap()
properties["cmis:name"] = name
properties["cmis:objectTypeId"] = "cmis:folder"
// create folder
model.folder = parentFolder.createFolder(properties)
}

View File

@@ -0,0 +1,5 @@
<webscript>
<shortname>CMIS Current Connection</shortname>
<url>/cmissamples/current</url>
<authentication>user</authentication>
</webscript>

View File

@@ -0,0 +1,55 @@
<html>
<head>
<title>CMIS Connection</title>
<link rel="stylesheet" type="text/css" href="${url.context}/css/base.css" />
</head>
<body>
<h1>Connection</h1>
<table>
<tr><td>Is default connection:</td><td>${connection.default?string}</td></tr>
<tr><td>Is shared connection:</td><td>${connection.shared?string}</td></tr>
</table>
<h1>Repository Info</h1>
<table>
<tr><td>Id:</td><td>${cmisSession.repositoryInfo.id?html}</td></tr>
<tr><td>Name:</td><td>${cmisSession.repositoryInfo.name?html}</td></tr>
<tr><td>Description:</td><td>${cmisSession.repositoryInfo.description?html}</td></tr>
<tr><td>Vendor:</td><td>${cmisSession.repositoryInfo.vendorName?html}</td></tr>
<tr><td>Product name:</td><td>${cmisSession.repositoryInfo.productName?html}</td></tr>
<tr><td>Product version:</td><td>${cmisSession.repositoryInfo.productVersion?html}</td></tr>
</table>
<h1>Root folder</h1>
<span>Root folder Id: ${cmisSession.rootFolder.id?html}</span><br/><br/>
<table>
<tr>
<th>Name</td>
<th>Id</td>
<th>Type</td>
</tr>
<#list rootFolderChildren as obj>
<tr>
<td>${obj.name?html}</td>
<td>${obj.id?html}</td>
<td>${obj.type.id?html}</td>
</tr>
</#list>
</table>
<h1>Base Types</h1>
<table>
<tr>
<th>Name</td>
<th>Id</td>
</tr>
<#list baseTypes as bt>
<tr>
<td>${bt.displayName?html}</td>
<td>${bt.id?html}</td>
</tr>
</#list>
</table>
</body>
</html>

View File

@@ -0,0 +1,15 @@
// get the sample user connection
var connectionId = "cmis-sample-connection"
var cmisConnection = cmis.getConnection(connectionId)
if (cmisConnection == null) {
// if no connection exists, talk to the local server
cmisConnection = cmis.getConnection()
}
// get CMIS session
var cmisSession = cmisConnection.getSession();
model.connection = cmisConnection;
model.cmisSession = cmisSession;
model.rootFolderChildren = cmisSession.getRootFolder().getChildren().iterator();
model.baseTypes = cmisSession.getTypeChildren(null, false).iterator();

View File

@@ -0,0 +1,5 @@
<webscript>
<shortname>CMIS Browser</shortname>
<url>/cmissamples/browser</url>
<authentication>user</authentication>
</webscript>

View File

@@ -0,0 +1,51 @@
<html>
<head>
<title>${folder.name} - CMIS Browser</title>
<link rel="stylesheet" type="text/css" href="${url.context}/css/base.css" />
</head>
<body>
<div class="titlebar">
<#if !folder.rootFolder><a href="${url.serviceContext}${url.match}?id=${folder.parentId?url}">UP</a> | </#if><a href="${url.serviceContext}${url.match}"></a>${folder.path?html!""}</td>
</div>
<table border="0">
<#list children as child>
<tr>
<#if child.baseType.id == "cmis:folder">
<td>
<a href="${url.serviceContext}${url.match}?id=${child.id?url}"><img src="${url.context}/images/icons/folder_large.png"></a>
</td>
<td>
<span class="title"><a href="${url.serviceContext}${url.match}?id=${child.id?url}">${child.name?html}</a></span><br/>
<span>modified ${child.lastModificationDate.time?datetime} by ${child.lastModifiedBy?html}
</td>
<#else>
<td>
<#assign contentUrl = "${url.serviceContext}/cmis/content?id=${child.id?url}&conn=${connection.id?url}">
<a target="_new" href="${contentUrl}">
<#if child.renditions?? && (child.renditions?size > 0)>
<#assign streamid = child.renditions?first.streamId>
</#if>
<#if streamid??>
<img src="${contentUrl}&stream=${streamid?url}">
<#else>
<img src="${url.context}/images/icons/file_large.gif">
</#if>
</a>
</td>
<td>
<span class="title"><a target="_new" href="${contentUrl}">${child.name?html}</a> (${child.versionLabel!""})</span><br/>
<span class>modified ${child.lastModificationDate.time?datetime} by ${child.lastModifiedBy?html}<#if (child.contentStreamLength > -1)> / ${(child.contentStreamLength/1000)?int} KB</#if></span>
</td>
</#if>
</tr>
</#list>
</table>
</body>
</html>

View File

@@ -0,0 +1,29 @@
// get the sample user connection
var connectionId = "cmis-sample-connection"
var cmisConnection = cmis.getConnection(connectionId)
if (cmisConnection == null) {
// if no connection exists, talk to the local server
cmisConnection = cmis.getConnection()
}
// get CMIS session
var cmisSession = cmisConnection.getSession();
model.cmisSession = cmisSession;
model.baseTypes = cmisSession.getTypeChildren(null, false).iterator();
if (args.id == null)
{
model.folder = cmisSession.getRootFolder();
}
else
{
model.folder = cmisSession.getObject(args.id);
}
model.connection = cmisConnection;
var operationContext = cmisSession.createOperationContext();
operationContext.setRenditionFilterString("cmis:thumbnail");
model.children = model.folder.getChildren(operationContext).iterator();

View File

@@ -0,0 +1,5 @@
<webscript>
<shortname>CMIS Document Download</shortname>
<url>/cmissamples/download</url>
<authentication>user</authentication>
</webscript>

View File

@@ -0,0 +1,42 @@
<html>
<head>
<title>CMIS Document Download</title>
<link rel="stylesheet" type="text/css" href="${url.context}/css/base.css" />
</head>
<body>
<h1>Document</h1>
<#if doc??>
<table>
<tr><td>Name:</td><td>${doc.name?html}</td></tr>
<tr><td>Id:</td><td>${doc.id?html}</td></tr>
<tr><td>Type:</td><td>${doc.type.displayName?html} (${doc.type.id?html})</td></tr>
<tr><td>Created by:</td><td>${doc.createdBy?html}</td></tr>
<tr><td>Creation date:</td><td>${doc.creationDate.time?datetime}</td></tr>
<tr><td>Last modified by:</td><td>${doc.lastModifiedBy?html}</td></tr>
<tr><td>Last modification date:</td><td>${doc.lastModificationDate.time?datetime}</td></tr>
<tr><td>Size:</td><td>${doc.contentStreamLength?c} bytes</td></tr>
<tr><td>MIME type:</td><td>${doc.contentStreamMimeType?html}</td></tr>
<tr><td>Version label:</td><td>${doc.versionLabel!""?html}</td></tr>
<tr><td></td><td><a href="${url.serviceContext}/cmis/content?id=${doc.id?url}&conn=${connection.id?url}">download</a></td></tr>
</table>
<#else>
<form action="${url.service}" method="get" charset="utf-8">
<table>
<tr>
<td>Path:</td>
<td><input type="text" name="path" value="/" size="100"/></td>
</tr>
<tr>
<td></td>
<td><input type="submit" name="submit" value="Get document"/></td>
</tr>
</table>
</form>
</#if>
</body>
</html>

View File

@@ -0,0 +1,25 @@
// get the sample user connection
var connectionId = "cmis-sample-connection"
var cmisConnection = cmis.getConnection(connectionId)
if (cmisConnection == null) {
// if no connection exists, talk to the local server
cmisConnection = cmis.getConnection()
}
model.connection = cmisConnection;
var cmisSession = cmisConnection.getSession()
// get arguments
var path = args["path"]
if (path != null) {
// if the path is set, get the document
var doc = cmisSession.getObjectByPath(path)
if (!cmis.isDocument(doc)) {
status.code = 404;
status.message = "Object is not a document!";
status.redirect = true;
} else {
model.doc = doc
}
}

View File

@@ -1,5 +0,0 @@
<webscript>
<shortname>Local test</shortname>
<url>/cmissample/local</url>
<authentication>user</authentication>
</webscript>

View File

@@ -1,49 +0,0 @@
<html>
<head>
<title>CMIS Connection</title>
<link rel="stylesheet" type="text/css" href="${url.context}/css/base.css" />
</head>
<body>
<h1>Repository Info</h1>
<table>
<tr><td>Id:</td><td>${cmisSession.repositoryInfo.id}</td></tr>
<tr><td>Name:</td><td>${cmisSession.repositoryInfo.name}</td></tr>
<tr><td>Description:</td><td>${cmisSession.repositoryInfo.description}</td></tr>
<tr><td>Vendor:</td><td>${cmisSession.repositoryInfo.vendorName}</td></tr>
<tr><td>Product name:</td><td>${cmisSession.repositoryInfo.productName}</td></tr>
<tr><td>Product version:</td><td>${cmisSession.repositoryInfo.productVersion}</td></tr>
</table>
<h1>Root folder</h1>
Root folder Id: ${cmisSession.rootFolder.id}<br/><br/>
<table>
<tr>
<th>Name</td>
<th>Id</td>
<th>Type</td>
</tr>
<#list rootFolderChildren as obj>
<tr>
<td>${obj.name}</td>
<td>${obj.id}</td>
<td>${obj.type.id}</td>
</tr>
</#list>
</table>
<h1>Base Types</h1>
<table>
<tr>
<th>Name</td>
<th>Id</td>
</tr>
<#list baseTypes as bt>
<tr>
<td>${bt.displayName}</td>
<td>${bt.id}</td>
</tr>
</#list>
</table>
</body>
</html>

View File

@@ -1,9 +0,0 @@
// get the local or default remote connection
var cmisConnection = cmisclient.getConnection();
// get CMIS session
var cmisSession = cmisConnection.getSession();
model.cmisSession = cmisSession;
model.rootFolderChildren = cmisSession.getRootFolder().getChildren().iterator();
model.baseTypes = cmisSession.getTypeChildren(null, false).iterator();

View File

@@ -0,0 +1,5 @@
<webscript>
<shortname>CMIS Client Samples</shortname>
<url>/cmissamples</url>
<authentication>user</authentication>
</webscript>

View File

@@ -0,0 +1,83 @@
<html>
<head>
<title>CMIS Client Samples</title>
<link rel="stylesheet" type="text/css" href="${url.context}/css/base.css" />
</head>
<body>
<h1>CMIS Client Samples</h1>
<ul>
<li><a href="${url.service}/current">Current CMIS connection</a></li>
<li><a href="${url.service}/servers">Preconfigured servers</a></li>
<li><a href="${url.service}/browser">Simple CMIS browser</a></li>
<li><a href="${url.service}/createfolder">Create folder example</a></li>
<li><a href="${url.service}/download">Download document example</a></li>
<li><a href="${url.service}/upload">Upload document example</a></li>
</ul>
<br/><br/>
<div class="titlebar">Current CMIS Connection</div>
<table>
<tr><td>Id:</td><td>${cmisSession.repositoryInfo.id?html}</td></tr>
<tr><td>Name:</td><td>${cmisSession.repositoryInfo.name?html}</td></tr>
<tr><td>Description:</td><td>${cmisSession.repositoryInfo.description?html}</td></tr>
<tr><td>Vendor:</td><td>${cmisSession.repositoryInfo.vendorName?html}</td></tr>
<tr><td>Product name:</td><td>${cmisSession.repositoryInfo.productName?html}</td></tr>
<tr><td>Product version:</td><td>${cmisSession.repositoryInfo.productVersion?html}</td></tr>
</table>
<br/><br/>
<div class="titlebar">Select CMIS Connection</div>
<table>
<tr>
<td style="vertical-align:text-top;">Local Alfresco server:</td>
<td>
<form action="${url.service}" method="post">
<input type="hidden" name="type" value="local"/>
<input type="submit" value="Connect"/>
</form>
<br/><br/>
</td>
</tr>
<tr>
<td style="vertical-align:text-top;">Custom OpenCMIS configuration:</td>
<td>
<form action="${url.service}" method="post">
<textarea name="config" cols="100" rows="10">
org.apache.chemistry.opencmis.binding.spi.type=atompub
org.apache.chemistry.opencmis.binding.atompub.url=http://cmis.alfresco.com/service/cmis
org.apache.chemistry.opencmis.user=admin
org.apache.chemistry.opencmis.password=admin
</textarea>
<br/>
<input type="hidden" name="type" value="config"/>
<input type="submit" value="Connect"/>
</form>
<br/><br/>
</td>
</tr>
<tr>
<td style="vertical-align:text-top;">Preconfigured CMIS server:</td>
<td>
<form action="${url.service}" method="post">
<select name="server" size="5">
<#list cmisServers as s>
<option value="${s.name}">${s.name} (${s.description})</option>
</#list>
</select>
<br/>
<table>
<tr><td>Username:</td><td><input type="text" name="username" size="30"/></td></tr>
<tr><td>Password:</td><td><input type="password" name="password" size="30"/></td></tr>
<tr><td>Repository Id:</td><td><input type="text" name="repositoryid" size="30"/> (leave empty for the first repository)</td></tr>
</table>
<br/>
<input type="hidden" name="type" value="server"/>
<input type="submit" value="Connect"/>
</form>
<br/><br/>
</td>
</tr>
</table>
</body>
</html>

View File

@@ -0,0 +1,13 @@
// get the local or default remote connection
var cmisConnection = null
// get the sample user connection
cmisConnection = cmis.getConnection("cmis-sample-connection")
if(cmisConnection == null)
{
// if no connection exists, talk to the local server
cmisConnection = cmis.getConnection()
}
model.cmisSession = cmisConnection.getSession()
model.cmisServers = cmis.getServerDefinitions()

View File

@@ -0,0 +1,5 @@
<webscript>
<shortname>CMIS Client Samples</shortname>
<url>/cmissamples</url>
<authentication>user</authentication>
</webscript>

View File

@@ -0,0 +1,61 @@
<html>
<head>
<title>CMIS Connection</title>
<link rel="stylesheet" type="text/css" href="${url.context}/css/base.css" />
</head>
<body>
<h1>Connection</h1>
<#if error??>
<h3 style="color:red">Error: ${error}</h3>
<#else>
<h3>Established!</h3>
</#if>
<div><a href="${url.service}">back</a></div>
<hr/>
<h2>Repository Info</h2>
<table>
<tr><td>Id:</td><td>${cmisSession.repositoryInfo.id?html}</td></tr>
<tr><td>Name:</td><td>${cmisSession.repositoryInfo.name?html}</td></tr>
<tr><td>Description:</td><td>${cmisSession.repositoryInfo.description?html}</td></tr>
<tr><td>Vendor:</td><td>${cmisSession.repositoryInfo.vendorName?html}</td></tr>
<tr><td>Product name:</td><td>${cmisSession.repositoryInfo.productName?html}</td></tr>
<tr><td>Product version:</td><td>${cmisSession.repositoryInfo.productVersion?html}</td></tr>
</table>
<h2>Root folder</h2>
<div>Root folder Id: ${cmisSession.rootFolder.id?html}</div>
<table>
<tr>
<th>Name</td>
<th>Id</td>
<th>Type</td>
</tr>
<#list rootFolderChildren as obj>
<tr>
<td>${obj.name?html}</td>
<td>${obj.id?html}</td>
<td>${obj.type.id?html}</td>
</tr>
</#list>
</table>
<h2>Base Types</h2>
<table>
<tr>
<th>Name</td>
<th>Id</td>
</tr>
<#list baseTypes as bt>
<tr>
<td>${bt.displayName?html}</td>
<td>${bt.id?html}</td>
</tr>
</#list>
</table>
</body>
</html>

View File

@@ -0,0 +1,93 @@
var connectionId = "cmis-sample-connection"
// get the current user connection, returns null if it is the default connection
var cmisConnection = cmis.getConnection(connectionId)
var error = null
var type = args["type"]
if (type == null) {
error = "Connection type not set!"
} else if (type == "local") {
// local Alfresco server
// close current connection and get the local connection
if (cmisConnection != null) {
cmisConnection.close()
}
cmisConnection = cmis.getConnection()
} else if (type == "config") {
// OpenCMIS configuration
var config = args["config"]
if (config == null) {
error = "No configuration!"
} else {
var parameters = cmis.createMap()
var lines = config.split("\r\n")
// parse the configuration
for (idx in lines) {
var line = lines[idx]
var x = line.indexOf("=")
if (x > 0) {
parameters[line.substring(0, x)] = line.substring(x + 1)
}
}
// set up a server definition
var serverDefinition = cmis.createServerDefinition("customserver", parameters)
// close current connection and open a new one
if (cmisConnection != null) {
cmisConnection.close()
}
cmisConnection = cmis.createUserConnection(serverDefinition, connectionId)
}
} else if (type == "server") {
// preconfigured server
var server = args["server"]
if (server == null) {
error = "No server provided!"
} else {
// find the server definition
var serverDefinition = cmis.getServerDefinition(server)
if (serverDefinition == null) {
error = "Server definition not found!"
} else {
// if username and password are set, create a new server definition
if (args["username"] != null && args["username"].length > 0) {
if (args["repositoryid"] != null && args["repositoryid"].length > 0) {
serverDefinition = cmis.createServerDefinition(serverDefinition, args["username"], args["password"], args["repositoryid"])
} else {
serverDefinition = cmis.createServerDefinition(serverDefinition, args["username"], args["password"])
}
}
// close current connection and open a new one
if (cmisConnection != null) {
cmisConnection.close()
}
cmisConnection = cmis.createUserConnection(serverDefinition, connectionId)
}
}
} else {
error = "Unknown type!"
}
// handle errors
if (error != null) {
model.error = error
if (cmisConnection == null) {
cmisConnection = cmis.getConnection()
}
}
model.cmisSession = cmisConnection.getSession()
model.rootFolderChildren = model.cmisSession.getRootFolder().getChildren().iterator();
model.baseTypes = model.cmisSession.getTypeChildren(null, false).iterator();

View File

@@ -1,4 +1,4 @@
<webscript> <webscript>
<shortname>CMIS servers</shortname> <shortname>CMIS Servers</shortname>
<url>/cmissample/servers</url> <url>/cmissamples/servers</url>
</webscript> </webscript>

View File

@@ -14,12 +14,12 @@
</tr> </tr>
<#list cmisServers as s> <#list cmisServers as s>
<tr> <tr>
<td>${s.name}</td> <td>${s.name?html}</td>
<td>${s.description}</td> <td>${s.description?html}</td>
<td> <td>
<#assign p = s.parameters> <#assign p = s.parameters>
<#list p?keys as key> <#list p?keys as key>
<code>${key} = ${p[key]}</code><br/> <code>${key?html} = ${p[key]?html}</code><br/>
</#list> </#list>
</td> </td>
</tr> </tr>

View File

@@ -1,2 +1,2 @@
// get all configured CMIS servers // get all configured CMIS servers
model.cmisServers = cmisclient.getServerDefinitions(); model.cmisServers = cmis.getServerDefinitions();

View File

@@ -0,0 +1,5 @@
<webscript>
<shortname>CMIS Document Upload Form</shortname>
<url>/cmissamples/upload</url>
<authentication>user</authentication>
</webscript>

View File

@@ -0,0 +1,29 @@
<html>
<head>
<title>CMIS Upload Web Script Sample</title>
<link rel="stylesheet" href="${url.context}/css/base.css" TYPE="text/css">
</head>
<body>
<h1>Upload</h1>
<form action="${url.service}" method="post" enctype="multipart/form-data" charset="utf-8">
<table>
<tr>
<td>File:</td>
<td><input type="file" name="file" size="100"/></td>
</tr>
<tr>
<td>Name:</td>
<td><input type="text" name="name" size="100"/></td>
</tr>
<tr>
<td>Path:</td>
<td><input type="text" name="path" value="/" size="100"/></td>
</tr>
<tr>
<td></td>
<td><input type="submit" name="submit" value="Upload"/></td>
</tr>
</table>
</form>
</body>
</html>

View File

@@ -0,0 +1,5 @@
<webscript>
<shortname>CMIS Document Upload</shortname>
<url>/cmissamples/upload</url>
<authentication>user</authentication>
</webscript>

View File

@@ -0,0 +1,18 @@
<html>
<head>
<title>Upload Web Script Sample</title>
<link rel="stylesheet" href="${url.context}/css/base.css" TYPE="text/css">
</head>
<body>
<h1>New Document</h1>
<table>
<tr><td>Name:</td><td>${doc.name?html}</td></tr>
<tr><td>Id:</td><td>${doc.id?html}</td></tr>
<tr><td>Type:</td><td>${doc.type.id?html}</td></tr>
<tr><td>Created by:</td><td>${doc.createdBy?html}</td></tr>
<tr><td>Creation date:</td><td>${doc.creationDate.time?datetime}</td></tr>
<tr><td>Size:</td><td>${(doc.contentStreamLength/1024)?int} KB</td></tr>
<tr><td>MIME type:</td><td>${doc.contentStreamMimeType?html}</td></tr>
</table>
</body>
</html>

View File

@@ -0,0 +1,46 @@
//get the sample user connection
var connectionId = "cmis-sample-connection"
var cmisConnection = cmis.getConnection(connectionId)
if (cmisConnection == null) {
// if no connection exists, talk to the local server
cmisConnection = cmis.getConnection()
}
// get CMIS session
var cmisSession = cmisConnection.getSession();
model.cmisSession = cmisSession;
// locate file attributes
for each (field in formdata.fields) {
if (field.name == "name") {
name = field.value;
} else if (field.name == "file" && field.isFile) {
filename = field.filename;
content = field.content;
} else if (field.name == "path") {
path = field.value;
}
}
// ensure mandatory file attributes have been located
if (filename == undefined || content == undefined) {
status.code = 400;
status.message = "Uploaded file cannot be located in request";
status.redirect = true;
} else {
var folder = cmisSession.getObjectByPath(path);
if (folder != undefined && folder.baseType.id == "cmis:folder") {
var properties = cmis.createMap()
properties["cmis:name"] = String(name);
properties["cmis:objectTypeId"] = "cmis:document";
var contentStream = cmis.createContentStream(filename, content);
model.doc = folder.createDocument(properties, contentStream, null);
} else {
status.code = 400;
status.message = "Error: Upload folder does not exist";
status.redirect = true;
}
}

View File

@@ -1,19 +1,19 @@
model.cmisVersion = cmis.version; model.cmisVersion = cmisserver.version;
model.cmisSpecTitle = cmis.specTitle; model.cmisSpecTitle = cmisserver.specTitle;
model.defaultRootFolder = cmis.defaultRootFolder; model.defaultRootFolder = cmisserver.defaultRootFolder;
model.defaultRootFolderPath = cmis.defaultRootFolderPath; model.defaultRootFolderPath = cmisserver.defaultRootFolderPath;
model.querySupport = cmis.querySupport.label; model.querySupport = cmisserver.querySupport.label;
model.joinSupport = cmis.joinSupport.label; model.joinSupport = cmisserver.joinSupport.label;
model.pwcSearchable = cmis.pwcSearchable; model.pwcSearchable = cmisserver.pwcSearchable;
model.allVersionsSearchable = cmis.allVersionsSearchable; model.allVersionsSearchable = cmisserver.allVersionsSearchable;
model.aclCapability = cmis.aclCapability.label; model.aclCapability = cmisserver.aclCapability.label;
model.aclSupportedPermissions = cmis.aclSupportedPermissions.label; model.aclSupportedPermissions = cmisserver.aclSupportedPermissions.label;
model.aclPropagation = cmis.aclPropagation.label; model.aclPropagation = cmisserver.aclPropagation.label;
model.repositoryPermissions = cmis.repositoryPermissions; model.repositoryPermissions = cmisserver.repositoryPermissions;
model.permissionMappings = cmis.permissionMappings; model.permissionMappings = cmisserver.permissionMappings;
model.principalAnonymous = cmis.principalAnonymous; model.principalAnonymous = cmisserver.principalAnonymous;
model.principalAnyone = cmis.principalAnyone; model.principalAnyone = cmisserver.principalAnyone;
model.changeLogCapability = cmis.changeLogCapability.label; model.changeLogCapability = cmisserver.changeLogCapability.label;
model.lastChangeLogToken = cmis.lastChangeLogToken; model.lastChangeLogToken = cmisserver.lastChangeLogToken;
model.changesOnType = cmis.changesOnType; model.changesOnType = cmisserver.changesOnType;
model.changesIncomplete = cmis.changesIncomplete; model.changesIncomplete = cmisserver.changesIncomplete;

View File

@@ -10,7 +10,7 @@ script:
} }
var node = object.node; var node = object.node;
cmis.deleteContentStream(node); cmisserver.deleteContentStream(node);
status.code = 204; // Success, but no response content status.code = 204; // Success, but no response content
status.redirect = true; status.redirect = true;

View File

@@ -10,8 +10,8 @@ script:
model.node = object.node; model.node = object.node;
// handle filters // handle filters
model.types = args[cmis.ARG_TYPES] === null ? cmis.defaultTypesFilter : args[ARG_TYPES]; model.types = args[cmisserver.ARG_TYPES] === null ? cmisserver.defaultTypesFilter : args[ARG_TYPES];
if (!cmis.isValidTypesFilter(model.types)) if (!cmisserver.isValidTypesFilter(model.types))
{ {
status.code = 400; status.code = 400;
status.message = "Types filter '" + model.types + "' unknown"; status.message = "Types filter '" + model.types + "' unknown";
@@ -20,29 +20,29 @@ script:
} }
// property filter // property filter
model.filter = args[cmis.ARG_FILTER]; model.filter = args[cmisserver.ARG_FILTER];
if (model.filter === null) if (model.filter === null)
{ {
model.filter = "*"; model.filter = "*";
} }
// rendition filter // rendition filter
model.renditionFilter = args[cmis.ARG_RENDITION_FILTER]; model.renditionFilter = args[cmisserver.ARG_RENDITION_FILTER];
if (model.renditionFilter === null || model.renditionFilter.length == 0) if (model.renditionFilter === null || model.renditionFilter.length == 0)
{ {
model.renditionFilter = "cmis:none"; model.renditionFilter = "cmis:none";
} }
// depth // depth
var depth = args[cmis.ARG_DEPTH]; var depth = args[cmisserver.ARG_DEPTH];
model.depth = (depth === null) ? 1 : parseInt(depth); model.depth = (depth === null) ? 1 : parseInt(depth);
// include allowable actions // include allowable actions
var includeAllowableActions = args[cmis.ARG_INCLUDE_ALLOWABLE_ACTIONS]; var includeAllowableActions = args[cmisserver.ARG_INCLUDE_ALLOWABLE_ACTIONS];
model.includeAllowableActions = (includeAllowableActions == "true" ? true : false); model.includeAllowableActions = (includeAllowableActions == "true" ? true : false);
// include relationships // include relationships
model.includeRelationships = args[cmis.ARG_INCLUDE_RELATIONSHIPS]; model.includeRelationships = args[cmisserver.ARG_INCLUDE_RELATIONSHIPS];
if (model.includeRelationships == null || model.includeRelationships.length == 0) if (model.includeRelationships == null || model.includeRelationships.length == 0)
{ {
model.includeRelationships = "none"; model.includeRelationships = "none";

View File

@@ -1,12 +1,12 @@
var tckRunner = Packages.org.apache.chemistry.tck.atompub.tools.TCKRunner(); var tckRunner = Packages.org.apache.chemistry.tck.atompub.tools.TCKRunner();
model.tckTests = tckRunner.getTestNames(); model.tckTests = tckRunner.getTestNames();
model.tckOptions = tckRunner.getOptions(); model.tckOptions = tckRunner.getOptions();
model.cmisVersion = cmis.version; model.cmisVersion = cmisserver.version;
model.cmisSpecTitle = cmis.specTitle; model.cmisSpecTitle = cmisserver.specTitle;
model.querySupport = cmis.querySupport.label; model.querySupport = cmisserver.querySupport.label;
model.joinSupport = cmis.joinSupport.label; model.joinSupport = cmisserver.joinSupport.label;
model.pwcSearchable = cmis.pwcSearchable; model.pwcSearchable = cmisserver.pwcSearchable;
model.allVersionsSearchable = cmis.allVersionsSearchable; model.allVersionsSearchable = cmisserver.allVersionsSearchable;
model.aclCapability = cmis.aclCapability.label; model.aclCapability = cmisserver.aclCapability.label;
model.aclSupportedPermissions = cmis.aclSupportedPermissions.label; model.aclSupportedPermissions = cmisserver.aclSupportedPermissions.label;
model.aclPropagation = cmis.aclPropagation.label; model.aclPropagation = cmisserver.aclPropagation.label;

View File

@@ -11,7 +11,7 @@ script:
var node = object.node; var node = object.node;
// Intentionally pass false as allVersions flag for now. There is no binding. // Intentionally pass false as allVersions flag for now. There is no binding.
cmis.deleteObject(node, false); cmisserver.deleteObject(node, false);
status.code = 204; // Success, but no response content status.code = 204; // Success, but no response content
status.redirect = true; status.redirect = true;

View File

@@ -10,35 +10,35 @@ script:
model.node = object.node; model.node = object.node;
// return version // return version
var returnVersion = args[cmis.ARG_RETURN_VERSION]; var returnVersion = args[cmisserver.ARG_RETURN_VERSION];
if (returnVersion === null || returnVersion.length == 0) if (returnVersion === null || returnVersion.length == 0)
{ {
returnVersion = "this"; returnVersion = "this";
} }
model.node = cmis.getReturnVersion(model.node, returnVersion); model.node = cmisserver.getReturnVersion(model.node, returnVersion);
// property filter // property filter
model.filter = args[cmis.ARG_FILTER]; model.filter = args[cmisserver.ARG_FILTER];
if (model.filter === null || model.filter == "") if (model.filter === null || model.filter == "")
{ {
model.filter = "*"; model.filter = "*";
} }
// ACL // ACL
model.includeACL = args[cmis.ARG_INCLUDE_ACL] == "true"; model.includeACL = args[cmisserver.ARG_INCLUDE_ACL] == "true";
// rendition filter // rendition filter
model.renditionFilter = args[cmis.ARG_RENDITION_FILTER]; model.renditionFilter = args[cmisserver.ARG_RENDITION_FILTER];
if (model.renditionFilter === null || model.renditionFilter.length == 0) if (model.renditionFilter === null || model.renditionFilter.length == 0)
{ {
model.renditionFilter = "cmis:none"; model.renditionFilter = "cmis:none";
} }
// include allowable actions // include allowable actions
model.includeAllowableActions = args[cmis.ARG_INCLUDE_ALLOWABLE_ACTIONS] == "true"; model.includeAllowableActions = args[cmisserver.ARG_INCLUDE_ALLOWABLE_ACTIONS] == "true";
// include relationships // include relationships
model.includeRelationships = args[cmis.ARG_INCLUDE_RELATIONSHIPS]; model.includeRelationships = args[cmisserver.ARG_INCLUDE_RELATIONSHIPS];
if (model.includeRelationships == null || model.includeRelationships.length == 0) if (model.includeRelationships == null || model.includeRelationships.length == 0)
{ {
model.includeRelationships = "none"; model.includeRelationships = "none";

View File

@@ -13,7 +13,7 @@ function createNode(parent, entry, slug, versioningState)
// locate type definition // locate type definition
// TODO: check this against spec - default to Document, if not specified // TODO: check this against spec - default to Document, if not specified
var type = cmis.queryType(typeId === null ? DOCUMENT_TYPE_ID.id : typeId); var type = cmisserver.queryType(typeId === null ? DOCUMENT_TYPE_ID.id : typeId);
if (type === null) if (type === null)
{ {
status.code = 400; status.code = 400;
@@ -36,7 +36,7 @@ function createNode(parent, entry, slug, versioningState)
} }
else if (baseType == POLICY_TYPE_ID) else if (baseType == POLICY_TYPE_ID)
{ {
node = cmis.createPolicy(typeId, parent); node = cmisserver.createPolicy(typeId, parent);
} }
else else
{ {
@@ -58,7 +58,7 @@ function createNode(parent, entry, slug, versioningState)
// apply versioning state // apply versioning state
if (baseType == DOCUMENT_TYPE_ID && versioningState != null) if (baseType == DOCUMENT_TYPE_ID && versioningState != null)
{ {
node = cmis.applyVersioningState(node, versioningState); node = cmisserver.applyVersioningState(node, versioningState);
} }
// only return node if updated successfully // only return node if updated successfully
@@ -91,7 +91,7 @@ function updateNode(node, entry, exclude, validator)
var vals = new Object(); var vals = new Object();
var exclude = (exclude == null) ? new Array() : exclude; var exclude = (exclude == null) ? new Array() : exclude;
exclude.push(PROP_BASE_TYPE_ID); exclude.push(PROP_BASE_TYPE_ID);
var typeDef = cmis.queryType(node); var typeDef = cmisserver.queryType(node);
// Apply the provided properties of the node type // Apply the provided properties of the node type
unpackProperties(node, typeDef, object == null ? null : object.properties, exclude, validator, vals); unpackProperties(node, typeDef, object == null ? null : object.properties, exclude, validator, vals);
@@ -111,7 +111,7 @@ function updateNode(node, entry, exclude, validator)
if (extension != null) if (extension != null)
{ {
// Add and remove aspects // Add and remove aspects
cmis.setAspects(node, extension.aspectsToRemove, extension.aspectsToAdd); cmisserver.setAspects(node, extension.aspectsToRemove, extension.aspectsToAdd);
// Apply the provided properties of the aspects // Apply the provided properties of the aspects
unpackProperties(node, null, extension.properties, exclude, validator, vals); unpackProperties(node, null, extension.properties, exclude, validator, vals);
@@ -213,7 +213,7 @@ function unpackProperties(node, typeDef, props, exclude, validator, vals)
for each (propName in updateProps) for each (propName in updateProps)
{ {
// is this a valid property? // is this a valid property?
var propDef = typeDef == null ? cmis.queryProperty(propName) : typeDef.propertyDefinitions[propName]; var propDef = typeDef == null ? cmisserver.queryProperty(propName) : typeDef.propertyDefinitions[propName];
if (propDef == null) if (propDef == null)
{ {
status.code = 400; status.code = 400;
@@ -299,7 +299,7 @@ function createAssociation(source, entry)
// locate relationship type definition // locate relationship type definition
// TODO: check this against spec - default to Relationship, if not specified // TODO: check this against spec - default to Relationship, if not specified
var type = cmis.queryType(typeId === null ? RELATIONSHIP_TYPE_ID.id : typeId); var type = cmisserver.queryType(typeId === null ? RELATIONSHIP_TYPE_ID.id : typeId);
if (type === null) if (type === null)
{ {
status.setCode(400, "CMIS object type " + typeId + " not understood"); status.setCode(400, "CMIS object type " + typeId + " not understood");
@@ -345,7 +345,7 @@ function createAssociation(source, entry)
function applyPolicy(target, entry) function applyPolicy(target, entry)
{ {
var object = entry.getExtension(atom.names.cmisra_object); var object = entry.getExtension(atom.names.cmisra_object);
cmis.applyPolicy(object.objectId, target); cmisserver.applyPolicy(object.objectId, target);
return null; return null;
} }

View File

@@ -5,13 +5,13 @@
function getObjectFromUrl() function getObjectFromUrl()
{ {
var ret = new Object(); var ret = new Object();
ret.ref = cmis.createObjectReferenceFromUrl(args, url.templateArgs); ret.ref = cmisserver.createObjectReferenceFromUrl(args, url.templateArgs);
if (ret.ref == null) if (ret.ref == null)
{ {
status.setCode(400, "Cannot determine object reference from URL"); status.setCode(400, "Cannot determine object reference from URL");
return ret; return ret;
} }
ret.node = cmis.getNode(ret.ref); ret.node = cmisserver.getNode(ret.ref);
if (ret.node === null) if (ret.node === null)
{ {
status.setCode(404, "Cannot find object for " + ret.ref.toString()); status.setCode(404, "Cannot find object for " + ret.ref.toString());
@@ -26,13 +26,13 @@ function getObjectFromUrl()
function getObjectFromObjectId(objectId) function getObjectFromObjectId(objectId)
{ {
var ret = new Object(); var ret = new Object();
ret.ref = cmis.createObjectIdReference(objectId); ret.ref = cmisserver.createObjectIdReference(objectId);
if (ret.ref == null) if (ret.ref == null)
{ {
status.setCode(400, "Cannot create object id reference from " + objectId); status.setCode(400, "Cannot create object id reference from " + objectId);
return ret; return ret;
} }
ret.node = cmis.getNode(ret.ref); ret.node = cmisserver.getNode(ret.ref);
if (ret.node === null) if (ret.node === null)
{ {
status.setCode(404, "Cannot find object for " + ret.ref.toString()); status.setCode(404, "Cannot find object for " + ret.ref.toString());
@@ -47,13 +47,13 @@ function getObjectFromObjectId(objectId)
function getAssocFromUrl() function getAssocFromUrl()
{ {
var ret = new Object(); var ret = new Object();
ret.ref = cmis.createRelationshipReferenceFromUrl(args, url.templateArgs); ret.ref = cmisserver.createRelationshipReferenceFromUrl(args, url.templateArgs);
if (ret.ref == null) if (ret.ref == null)
{ {
status.setCode(400, "Cannot determine association reference from URL"); status.setCode(400, "Cannot determine association reference from URL");
return ret; return ret;
} }
ret.assoc = cmis.getAssociation(ret.ref); ret.assoc = cmisserver.getAssociation(ret.ref);
if (ret.assoc === null) if (ret.assoc === null)
{ {
status.setCode(404, "Cannot find association for " + ret.ref.toString()); status.setCode(404, "Cannot find association for " + ret.ref.toString());

View File

@@ -11,7 +11,7 @@ script:
var node = object.node; var node = object.node;
// locate parent // locate parent
if (node.id == cmis.defaultRootFolder.id) if (node.id == cmisserver.defaultRootFolder.id)
{ {
status.code = 404; status.code = 404;
status.message = "Object " + object.ref + " parent not found"; status.message = "Object " + object.ref + " parent not found";
@@ -28,18 +28,18 @@ script:
model.node = node.parent; model.node = node.parent;
// property filter // property filter
model.filter = args[cmis.ARG_FILTER]; model.filter = args[cmisserver.ARG_FILTER];
if (model.filter === null) if (model.filter === null)
{ {
model.filter = "*"; model.filter = "*";
} }
// include allowable actions // include allowable actions
var includeAllowableActions = args[cmis.ARG_INCLUDE_ALLOWABLE_ACTIONS]; var includeAllowableActions = args[cmisserver.ARG_INCLUDE_ALLOWABLE_ACTIONS];
model.includeAllowableActions = (includeAllowableActions == "true" ? true : false); model.includeAllowableActions = (includeAllowableActions == "true" ? true : false);
// include relationships // include relationships
model.includeRelationships = args[cmis.ARG_INCLUDE_RELATIONSHIPS]; model.includeRelationships = args[cmisserver.ARG_INCLUDE_RELATIONSHIPS];
if (model.includeRelationships == null || model.includeRelationships.length == 0) if (model.includeRelationships == null || model.includeRelationships.length == 0)
{ {
model.includeRelationships = "none"; model.includeRelationships = "none";

View File

@@ -21,20 +21,20 @@ script:
model.parents = parents; model.parents = parents;
// property filter // property filter
model.filter = args[cmis.ARG_FILTER]; model.filter = args[cmisserver.ARG_FILTER];
if (model.filter === null) if (model.filter === null)
{ {
model.filter = "*"; model.filter = "*";
} }
// rendition filter // rendition filter
model.renditionFilter = args[cmis.ARG_RENDITION_FILTER]; model.renditionFilter = args[cmisserver.ARG_RENDITION_FILTER];
if (model.renditionFilter === null || model.renditionFilter.length == 0) if (model.renditionFilter === null || model.renditionFilter.length == 0)
{ {
model.renditionFilter = "cmis:none"; model.renditionFilter = "cmis:none";
} }
// include allowable actions // include allowable actions
var includeAllowableActions = args[cmis.ARG_INCLUDE_ALLOWABLE_ACTIONS]; var includeAllowableActions = args[cmisserver.ARG_INCLUDE_ALLOWABLE_ACTIONS];
model.includeAllowableActions = (includeAllowableActions == "true" ? true : false); model.includeAllowableActions = (includeAllowableActions == "true" ? true : false);
} }

View File

@@ -12,7 +12,7 @@ script:
model.node = object.node; model.node = object.node;
// property filter // property filter
var filter = args[cmis.ARG_FILTER]; var filter = args[cmisserver.ARG_FILTER];
if (filter === null) if (filter === null)
{ {
filter = "*"; filter = "*";
@@ -20,7 +20,7 @@ script:
// retrieve policies // retrieve policies
var page = paging.createPageOrWindow(args); var page = paging.createPageOrWindow(args);
var paged = cmis.getAppliedPolicies(model.node, filter, page); var paged = cmisserver.getAppliedPolicies(model.node, filter, page);
model.results = paged.results; model.results = paged.results;
model.cursor = paged.cursor; model.cursor = paged.cursor;
} }

View File

@@ -9,7 +9,7 @@ script:
} }
var node = object.node; var node = object.node;
cmis.cancelCheckOut(node); cmisserver.cancelCheckOut(node);
status.code = 204; // Success, but no response content status.code = 204; // Success, but no response content
status.redirect = true; status.redirect = true;

View File

@@ -10,35 +10,35 @@ script:
model.node = object.node; model.node = object.node;
// return version // return version
var returnVersion = args[cmis.ARG_RETURN_VERSION]; var returnVersion = args[cmisserver.ARG_RETURN_VERSION];
if (returnVersion === null || returnVersion.length == 0) if (returnVersion === null || returnVersion.length == 0)
{ {
returnVersion = "this"; returnVersion = "this";
} }
model.node = cmis.getReturnVersion(model.node, returnVersion); model.node = cmisserver.getReturnVersion(model.node, returnVersion);
// property filter // property filter
model.filter = args[cmis.ARG_FILTER]; model.filter = args[cmisserver.ARG_FILTER];
if (model.filter === null || model.filter == "") if (model.filter === null || model.filter == "")
{ {
model.filter = "*"; model.filter = "*";
} }
// ACL // ACL
model.includeACL = args[cmis.ARG_INCLUDE_ACL] == "true"; model.includeACL = args[cmisserver.ARG_INCLUDE_ACL] == "true";
// rendition filter // rendition filter
model.renditionFilter = args[cmis.ARG_RENDITION_FILTER]; model.renditionFilter = args[cmisserver.ARG_RENDITION_FILTER];
if (model.renditionFilter === null || model.renditionFilter.length == 0) if (model.renditionFilter === null || model.renditionFilter.length == 0)
{ {
model.renditionFilter = "cmis:none"; model.renditionFilter = "cmis:none";
} }
// include allowable actions // include allowable actions
model.includeAllowableActions = args[cmis.ARG_INCLUDE_ALLOWABLE_ACTIONS] == "true"; model.includeAllowableActions = args[cmisserver.ARG_INCLUDE_ALLOWABLE_ACTIONS] == "true";
// include relationships // include relationships
model.includeRelationships = args[cmis.ARG_INCLUDE_RELATIONSHIPS]; model.includeRelationships = args[cmisserver.ARG_INCLUDE_RELATIONSHIPS];
if (model.includeRelationships == null || model.includeRelationships.length == 0) if (model.includeRelationships == null || model.includeRelationships.length == 0)
{ {
model.includeRelationships = "none"; model.includeRelationships = "none";

View File

@@ -8,7 +8,7 @@ script:
var object = getObjectFromUrl(); var object = getObjectFromUrl();
model.node = object.node; model.node = object.node;
model.checkin = args[cmis.ARG_CHECKIN] == "true" ? true : false; model.checkin = args[cmisserver.ARG_CHECKIN] == "true" ? true : false;
if (entry !== null) if (entry !== null)
{ {
@@ -27,9 +27,9 @@ script:
// checkin // checkin
if (model.checkin) if (model.checkin)
{ {
var comment = args[cmis.ARG_CHECKIN_COMMENT]; var comment = args[cmisserver.ARG_CHECKIN_COMMENT];
var major = args[cmis.ARG_MAJOR]; var major = args[cmisserver.ARG_MAJOR];
major = (major === null || major == "true") ? true : false; major = (major === null || major == "true") ? true : false;
model.node = cmis.checkIn(model.node, comment, major); model.node = cmisserver.checkIn(model.node, comment, major);
} }
} }

View File

@@ -8,7 +8,7 @@ script:
var object = getObjectFromUrl(); var object = getObjectFromUrl();
model.node = object.node; model.node = object.node;
model.checkin = args[cmis.ARG_CHECKIN] == "true" ? true : false; model.checkin = args[cmisserver.ARG_CHECKIN] == "true" ? true : false;
if (entry !== null) if (entry !== null)
{ {
@@ -27,9 +27,9 @@ script:
// checkin // checkin
if (model.checkin) if (model.checkin)
{ {
var comment = args[cmis.ARG_CHECKIN_COMMENT]; var comment = args[cmisserver.ARG_CHECKIN_COMMENT];
var major = args[cmis.ARG_MAJOR]; var major = args[cmisserver.ARG_MAJOR];
major = (major === null || major == "true") ? true : false; major = (major === null || major == "true") ? true : false;
model.node = cmis.checkIn(model.node, comment, major); model.node = cmisserver.checkIn(model.node, comment, major);
} }
} }

View File

@@ -64,7 +64,7 @@ script:
var page = paging.createPageOrWindow(null, null, isNaN(skipCount) ? null : skipCount, isNaN(maxItems) ? null : maxItems); var page = paging.createPageOrWindow(null, null, isNaN(skipCount) ? null : skipCount, isNaN(maxItems) ? null : maxItems);
// perform query // perform query
var paged = cmis.query(model.statement, page); var paged = cmisserver.query(model.statement, page);
model.resultset = paged.result; model.resultset = paged.result;
model.cursor = paged.cursor; model.cursor = paged.cursor;
@@ -72,12 +72,12 @@ script:
// construct query uri // construct query uri
model.queryUri = "/cmis/query"; model.queryUri = "/cmis/query";
model.queryArgs = cmis.ARG_QUERY_STATEMENT + "=" + model.statement; model.queryArgs = cmisserver.ARG_QUERY_STATEMENT + "=" + model.statement;
if (model.includeAllowableActions) model.queryArgs += "&" + cmis.ARG_INCLUDE_ALLOWABLE_ACTIONS + "=" + model.includeAllowableActions; if (model.includeAllowableActions) model.queryArgs += "&" + cmisserver.ARG_INCLUDE_ALLOWABLE_ACTIONS + "=" + model.includeAllowableActions;
if (model.includeRelationships != "none") model.queryArgs += "&" + cmis.ARG_INCLUDE_RELATIONSHIPS + "=" + model.includeRelationships; if (model.includeRelationships != "none") model.queryArgs += "&" + cmisserver.ARG_INCLUDE_RELATIONSHIPS + "=" + model.includeRelationships;
if (model.renditionFilter != "cmis:none") model.queryArgs += "&" + cmis.ARG_RENDITION_FILTER + "=" + model.renditionFilter; if (model.renditionFilter != "cmis:none") model.queryArgs += "&" + cmisserver.ARG_RENDITION_FILTER + "=" + model.renditionFilter;
model.queryArgs += "&" + cmis.ARG_SKIP_COUNT + "=" + page.number; model.queryArgs += "&" + cmisserver.ARG_SKIP_COUNT + "=" + page.number;
model.queryArgs += "&" + cmis.ARG_MAX_ITEMS + "=" + page.size; model.queryArgs += "&" + cmisserver.ARG_MAX_ITEMS + "=" + page.size;
// TODO: set Content-Location // TODO: set Content-Location
status.code = 201; status.code = 201;

View File

@@ -27,11 +27,11 @@ script:
} }
// include allowable actions // include allowable actions
var includeAllowableActions = args[cmis.ARG_INCLUDE_ALLOWABLE_ACTIONS]; var includeAllowableActions = args[cmisserver.ARG_INCLUDE_ALLOWABLE_ACTIONS];
model.includeAllowableActions = (includeAllowableActions == "true" ? true : false); model.includeAllowableActions = (includeAllowableActions == "true" ? true : false);
// include relationships // include relationships
model.includeRelationships = args[cmis.ARG_INCLUDE_RELATIONSHIPS]; model.includeRelationships = args[cmisserver.ARG_INCLUDE_RELATIONSHIPS];
if (model.includeRelationships == null || model.includeRelationships.length == 0) if (model.includeRelationships == null || model.includeRelationships.length == 0)
{ {
model.includeRelationships = "none"; model.includeRelationships = "none";
@@ -39,7 +39,7 @@ script:
// perform query // perform query
var page = paging.createPageOrWindow(args); var page = paging.createPageOrWindow(args);
var paged = cmis.query(model.statement, page); var paged = cmisserver.query(model.statement, page);
model.resultset = paged.result; model.resultset = paged.result;
model.cursor = paged.cursor; model.cursor = paged.cursor;

View File

@@ -10,7 +10,7 @@ script:
} }
var assoc = rel.assoc; var assoc = rel.assoc;
cmis.deleteObject(assoc); cmisserver.deleteObject(assoc);
status.code = 204; // Success, but no response content status.code = 204; // Success, but no response content
status.redirect = true; status.redirect = true;

View File

@@ -12,13 +12,13 @@ script:
model.assoc = rel.assoc; model.assoc = rel.assoc;
// property filter // property filter
model.filter = args[cmis.ARG_FILTER]; model.filter = args[cmisserver.ARG_FILTER];
if (model.filter === null) if (model.filter === null)
{ {
model.filter = "*"; model.filter = "*";
} }
// include allowable actions // include allowable actions
var includeAllowableActions = args[cmis.ARG_INCLUDE_ALLOWABLE_ACTIONS]; var includeAllowableActions = args[cmisserver.ARG_INCLUDE_ALLOWABLE_ACTIONS];
model.includeAllowableActions = (includeAllowableActions == "true" ? true : false); model.includeAllowableActions = (includeAllowableActions == "true" ? true : false);
} }

View File

@@ -12,17 +12,17 @@ script:
model.node = object.node; model.node = object.node;
// property filter // property filter
model.filter = args[cmis.ARG_FILTER]; model.filter = args[cmisserver.ARG_FILTER];
if (model.filter === null) if (model.filter === null)
{ {
model.filter = "*"; model.filter = "*";
} }
// relationship type // relationship type
var relType = args[cmis.ARG_RELATIONSHIP_TYPE]; var relType = args[cmisserver.ARG_RELATIONSHIP_TYPE];
if (relType != null) if (relType != null)
{ {
model.relTypeDef = cmis.queryType(relType); model.relTypeDef = cmisserver.queryType(relType);
if (model.relTypeDef === null) if (model.relTypeDef === null)
{ {
status.setCode(400, "Relationship type " + relType + " unknown"); status.setCode(400, "Relationship type " + relType + " unknown");
@@ -36,10 +36,10 @@ script:
} }
// include sub relationship types // include sub relationship types
model.includeSubRelationshipTypes = args[cmis.ARG_INCLUDE_SUB_RELATIONSHIP_TYPES] == "true" ? true : false; model.includeSubRelationshipTypes = args[cmisserver.ARG_INCLUDE_SUB_RELATIONSHIP_TYPES] == "true" ? true : false;
// direction // direction
var direction = args[cmis.ARG_DIRECTION]; var direction = args[cmisserver.ARG_DIRECTION];
if (direction !== null && !CMISRelationshipDirectionEnum.FACTORY.validLabel(direction)) if (direction !== null && !CMISRelationshipDirectionEnum.FACTORY.validLabel(direction))
{ {
status.setCode(400, "Direction " + direction + " unknown"); status.setCode(400, "Direction " + direction + " unknown");
@@ -48,11 +48,11 @@ script:
model.direction = CMISRelationshipDirectionEnum.FACTORY.toEnum(direction); model.direction = CMISRelationshipDirectionEnum.FACTORY.toEnum(direction);
// include allowable actions // include allowable actions
model.includeAllowableActions = args[cmis.ARG_INCLUDE_ALLOWABLE_ACTIONS] == "true" ? true : false; model.includeAllowableActions = args[cmisserver.ARG_INCLUDE_ALLOWABLE_ACTIONS] == "true" ? true : false;
// retrieve relationships // retrieve relationships
var page = paging.createPageOrWindow(args); var page = paging.createPageOrWindow(args);
var paged = cmis.queryRelationships(model.node, model.relTypeDef, model.includeSubRelationshipTypes, model.direction, page); var paged = cmisserver.queryRelationships(model.node, model.relTypeDef, model.includeSubRelationshipTypes, model.direction, page);
model.results = paged.results; model.results = paged.results;
model.cursor = paged.cursor; model.cursor = paged.cursor;
} }

View File

@@ -11,7 +11,7 @@ script:
var node = object.node; var node = object.node;
// unfileObjects // unfileObjects
var unfileObjects = args[cmis.ARG_UNFILE_OBJECTS]; var unfileObjects = args[cmisserver.ARG_UNFILE_OBJECTS];
if (unfileObjects === null || unfileObjects.length == 0) if (unfileObjects === null || unfileObjects.length == 0)
{ {
unfileObjects = "delete"; unfileObjects = "delete";
@@ -26,8 +26,8 @@ script:
break script; break script;
} }
var continueOnFailure = (args[cmis.ARG_CONTINUE_ON_FAILURE] == "true"); var continueOnFailure = (args[cmisserver.ARG_CONTINUE_ON_FAILURE] == "true");
// Intentionally pass allVersions=false, even though this isn't the default! // Intentionally pass allVersions=false, even though this isn't the default!
cmis.deleteTree(node, status, continueOnFailure, unfileObjects != "delete", false); cmisserver.deleteTree(node, status, continueOnFailure, unfileObjects != "delete", false);
} }

View File

@@ -19,29 +19,29 @@ script:
} }
// property filter // property filter
model.filter = args[cmis.ARG_FILTER]; model.filter = args[cmisserver.ARG_FILTER];
if (model.filter === null) if (model.filter === null)
{ {
model.filter = "*"; model.filter = "*";
} }
// rendition filter // rendition filter
model.renditionFilter = args[cmis.ARG_RENDITION_FILTER]; model.renditionFilter = args[cmisserver.ARG_RENDITION_FILTER];
if (model.renditionFilter === null || model.renditionFilter.length == 0) if (model.renditionFilter === null || model.renditionFilter.length == 0)
{ {
model.renditionFilter = "cmis:none"; model.renditionFilter = "cmis:none";
} }
// depth // depth
var depth = args[cmis.ARG_DEPTH]; var depth = args[cmisserver.ARG_DEPTH];
model.depth = (depth === null) ? 1 : parseInt(depth); model.depth = (depth === null) ? 1 : parseInt(depth);
// include allowable actions // include allowable actions
var includeAllowableActions = args[cmis.ARG_INCLUDE_ALLOWABLE_ACTIONS]; var includeAllowableActions = args[cmisserver.ARG_INCLUDE_ALLOWABLE_ACTIONS];
model.includeAllowableActions = (includeAllowableActions == "true" ? true : false); model.includeAllowableActions = (includeAllowableActions == "true" ? true : false);
// include relationships // include relationships
model.includeRelationships = args[cmis.ARG_INCLUDE_RELATIONSHIPS]; model.includeRelationships = args[cmisserver.ARG_INCLUDE_RELATIONSHIPS];
if (model.includeRelationships == null || model.includeRelationships.length == 0) if (model.includeRelationships == null || model.includeRelationships.length == 0)
{ {
model.includeRelationships = "none"; model.includeRelationships = "none";

View File

@@ -2,7 +2,7 @@ script:
{ {
// query type // query type
var typeId = url.templateArgs.typeId; var typeId = url.templateArgs.typeId;
model.typedef = cmis.queryType(typeId); model.typedef = cmisserver.queryType(typeId);
if (model.typedef === null) if (model.typedef === null)
{ {
status.code = 404; status.code = 404;
@@ -12,6 +12,6 @@ script:
} }
// handle inherited properties // handle inherited properties
var includeInheritedProperties = args[cmis.ARG_INCLUDE_INHERITED_PROPERTIES]; var includeInheritedProperties = args[cmisserver.ARG_INCLUDE_INHERITED_PROPERTIES];
model.includeInheritedProperties = includeInheritedProperties == "false" ? false : true; model.includeInheritedProperties = includeInheritedProperties == "false" ? false : true;
} }

View File

@@ -1,15 +1,15 @@
script: script:
{ {
var page = paging.createPageOrWindow(args); var page = paging.createPageOrWindow(args);
var typeId = args[cmis.ARG_TYPE_ID]; var typeId = args[cmisserver.ARG_TYPE_ID];
if (typeId === null) if (typeId === null)
{ {
typeId = url.templateArgs[cmis.ARG_TYPE_ID]; typeId = url.templateArgs[cmisserver.ARG_TYPE_ID];
} }
if (typeId === null) if (typeId === null)
{ {
// query for base types // query for base types
var paged = cmis.queryTypeChildren(null, page); var paged = cmisserver.queryTypeChildren(null, page);
model.results = paged.results; model.results = paged.results;
model.cursor = paged.cursor; model.cursor = paged.cursor;
model.typedef = null; model.typedef = null;
@@ -17,7 +17,7 @@ script:
else else
{ {
// query a specific type and its children // query a specific type and its children
var typedef = cmis.queryType(typeId); var typedef = cmisserver.queryType(typeId);
if (typedef === null) if (typedef === null)
{ {
status.code = 404; status.code = 404;
@@ -25,13 +25,13 @@ script:
status.redirect = true; status.redirect = true;
break script; break script;
} }
var paged = cmis.queryTypeChildren(typedef, page); var paged = cmisserver.queryTypeChildren(typedef, page);
model.results = paged.results; model.results = paged.results;
model.cursor = paged.cursor; model.cursor = paged.cursor;
model.typedef = typedef; model.typedef = typedef;
} }
// handle property definitions // handle property definitions
var includePropertyDefinitions = args[cmis.ARG_INCLUDE_PROPERTY_DEFINITIONS]; var includePropertyDefinitions = args[cmisserver.ARG_INCLUDE_PROPERTY_DEFINITIONS];
model.includePropertyDefinitions = includePropertyDefinitions == "true" ? true : false; model.includePropertyDefinitions = includePropertyDefinitions == "true" ? true : false;
} }

View File

@@ -1,22 +1,22 @@
script: script:
{ {
// extract type // extract type
var typeId = args[cmis.ARG_TYPE_ID]; var typeId = args[cmisserver.ARG_TYPE_ID];
if (typeId === null) if (typeId === null)
{ {
typeId = url.templateArgs[cmis.ARG_TYPE_ID]; typeId = url.templateArgs[cmisserver.ARG_TYPE_ID];
} }
// descend from root // descend from root
if (typeId === null) if (typeId === null)
{ {
var paged = cmis.queryTypeChildren(null, paging.createUnlimitedPage()); var paged = cmisserver.queryTypeChildren(null, paging.createUnlimitedPage());
model.basetypes = paged.results; model.basetypes = paged.results;
} }
else else
{ {
// query a specific type // query a specific type
var typedef = cmis.queryType(typeId); var typedef = cmisserver.queryType(typeId);
if (typedef === null) if (typedef === null)
{ {
status.code = 404; status.code = 404;
@@ -28,7 +28,7 @@ script:
} }
// depth // depth
var depth = args[cmis.ARG_DEPTH]; var depth = args[cmisserver.ARG_DEPTH];
if (depth == 0) if (depth == 0)
{ {
status.code = 500; status.code = 500;
@@ -39,6 +39,6 @@ script:
model.depth = (depth === null) ? -1 : parseInt(depth); model.depth = (depth === null) ? -1 : parseInt(depth);
// handle property definitions // handle property definitions
var includePropertyDefinitions = args[cmis.ARG_INCLUDE_PROPERTY_DEFINITIONS]; var includePropertyDefinitions = args[cmisserver.ARG_INCLUDE_PROPERTY_DEFINITIONS];
model.includePropertyDefinitions = includePropertyDefinitions == "true" ? true : false; model.includePropertyDefinitions = includePropertyDefinitions == "true" ? true : false;
} }

View File

@@ -12,12 +12,12 @@ script:
model.node = object.node; model.node = object.node;
// property filter // property filter
model.filter = args[cmis.ARG_FILTER]; model.filter = args[cmisserver.ARG_FILTER];
if (model.filter === null) if (model.filter === null)
{ {
model.filter = "*"; model.filter = "*";
} }
// retrieve versions // retrieve versions
model.nodes = cmis.getAllVersions(model.node); model.nodes = cmisserver.getAllVersions(model.node);
} }

View File

@@ -11,8 +11,10 @@
<constructor-arg> <constructor-arg>
<list> <list>
<value>classpath:alfresco/web-scripts-config.xml</value> <value>classpath:alfresco/web-scripts-config.xml</value>
<value>classpath:alfresco/web-scripts-cmis-config.xml</value>
<value>classpath:alfresco/extension/web-api-config-custom.xml</value> <!-- for backwards compatibility --> <value>classpath:alfresco/extension/web-api-config-custom.xml</value> <!-- for backwards compatibility -->
<value>classpath:alfresco/extension/web-scripts-config-custom.xml</value> <value>classpath:alfresco/extension/web-scripts-config-custom.xml</value>
<value>classpath:alfresco/extension/web-scripts-cmis-config.xml</value>
</list> </list>
</constructor-arg> </constructor-arg>
</bean> </bean>
@@ -142,7 +144,7 @@
<entry key="paging"> <entry key="paging">
<ref bean="webscripts.js.paging"/> <ref bean="webscripts.js.paging"/>
</entry> </entry>
<entry key="cmisclient"> <entry key="cmis">
<ref bean="webscripts.js.cmis.client" /> <ref bean="webscripts.js.cmis.client" />
</entry> </entry>
</map> </map>
@@ -313,8 +315,8 @@
<property name="CMISService" ref="CMISService" /> <property name="CMISService" ref="CMISService" />
</bean> </bean>
<bean id="webscripts.js.cmis" parent="baseJavaScriptExtension" class="org.alfresco.repo.cmis.rest.CMISScript"> <bean id="webscripts.js.cmisserver" parent="baseJavaScriptExtension" class="org.alfresco.repo.cmis.rest.CMISScript">
<property name="extensionName"><value>cmis</value></property> <property name="extensionName"><value>cmisserver</value></property>
<property name="serviceRegistry" ref="ServiceRegistry" /> <property name="serviceRegistry" ref="ServiceRegistry" />
<property name="CMISService" ref="CMISService" /> <property name="CMISService" ref="CMISService" />
<property name="CMISDictionaryService" ref="CMISDictionaryService" /> <property name="CMISDictionaryService" ref="CMISDictionaryService" />
@@ -369,42 +371,20 @@
<!-- CMIS Client --> <!-- CMIS Client -->
<!-- --> <!-- -->
<bean id="webscripts.js.cmis.client" class="org.alfresco.repo.cmis.client.CMISLocalConnectionManagerImpl"> <bean id="webscript.org.alfresco.cmis.client.content.get" class="org.alfresco.repo.cmis.client.CMISContentStreamWebScript" parent="webscript">
<property name="authenticationService" ref="AuthenticationService" /> <property name="connectionManager" ref="webscripts.js.cmis.client" />
<property name="cmisConnector" ref="CMISConnector" />
<property name="servers">
<list>
<map>
<entry key="name" value="demo"/>
<entry key="description" value="cmis.alfresco.com"/>
<entry key="org.apache.chemistry.opencmis.binding.spi.type" value="atompub"/>
<entry key="org.apache.chemistry.opencmis.binding.atompub.url" value="http://cmis.alfresco.com/service/cmis"/>
</map>
</list>
</property>
</bean> </bean>
<!-- <bean id="webscripts.js.cmis.client" class="org.alfresco.repo.cmis.client.CMISLocalConnectionManagerImpl" init-method="init">
<bean id="webscripts.js.cmis.client" class="org.alfresco.repo.cmis.client.CMISRemoteConnectionManagerImpl">
<property name="authenticationService" ref="AuthenticationService" /> <property name="authenticationService" ref="AuthenticationService" />
<property name="defaultServer"> <property name="configService" ref="webscripts.config" />
<map> <property name="cmisConnector" ref="CMISConnector" />
<entry key="name" value="default"/> </bean>
<entry key="description" value="Default server"/>
<entry key="org.apache.chemistry.opencmis.binding.spi.type" value="atompub"/> <!--
<entry key="org.apache.chemistry.opencmis.binding.atompub.url" value="http://<host>/service/cmis"/> <bean id="webscripts.js.cmis.client" class="org.alfresco.repo.cmis.client.CMISRemoteConnectionManagerImpl" init-method="init">
</map> <property name="authenticationService" ref="AuthenticationService" />
</property> <property name="configService" ref="webscripts.config" />
<property name="servers">
<list>
<map>
<entry key="name" value="demo"/>
<entry key="description" value="cmis.alfresco.com"/>
<entry key="org.apache.chemistry.opencmis.binding.spi.type" value="atompub"/>
<entry key="org.apache.chemistry.opencmis.binding.atompub.url" value="http://cmis.alfresco.com/service/cmis"/>
</map>
</list>
</property>
</bean> </bean>
--> -->

View File

@@ -0,0 +1,25 @@
<!-- -->
<!-- CMIS Client Configuration -->
<!-- -->
<alfresco-config>
<plug-ins>
<element-readers>
<element-reader element-name="cmis-servers" class="org.alfresco.repo.cmis.client.CMISServersConfigElementReader" />
</element-readers>
</plug-ins>
<config evaluator="string-compare" condition="CMIS">
<cmis-servers>
<server>
<parameter key="name" value="alfresco-public-cmis"/>
<parameter key="description" value="Public Alfresco 3.4 CMIS Server (cmis.alfresco.com)"/>
<parameter key="org.apache.chemistry.opencmis.binding.spi.type" value="atompub"/>
<parameter key="org.apache.chemistry.opencmis.binding.atompub.url" value="http://cmis.alfresco.com/service/cmis"/>
<parameter key="org.apache.chemistry.opencmis.binding.compression" value="true"/>
</server>
</cmis-servers>
</config>
</alfresco-config>

View File

@@ -19,7 +19,6 @@
package org.alfresco.repo.cmis.client; package org.alfresco.repo.cmis.client;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
@@ -33,27 +32,38 @@ import org.apache.chemistry.opencmis.client.api.Session;
import org.apache.chemistry.opencmis.client.api.SessionFactory; import org.apache.chemistry.opencmis.client.api.SessionFactory;
import org.apache.chemistry.opencmis.client.runtime.SessionFactoryImpl; import org.apache.chemistry.opencmis.client.runtime.SessionFactoryImpl;
import org.apache.chemistry.opencmis.commons.SessionParameter; import org.apache.chemistry.opencmis.commons.SessionParameter;
import org.springframework.beans.factory.InitializingBean; import org.springframework.extensions.config.ConfigService;
public abstract class AbstractCMISConnectionManagerImpl implements CMISConnectionManager, InitializingBean /**
* Connection manager base class.
*/
public abstract class AbstractCMISConnectionManagerImpl extends CMISHelper implements CMISConnectionManager
{ {
public static final String SERVER_NAME = "name"; public static final String SERVER_NAME = "name";
public static final String SERVER_DESCRIPTION = "description"; public static final String SERVER_DESCRIPTION = "description";
public static final String LOCAL_CONNECTION_ID = "local"; public static final String DEFAULT_CONNECTION_ID = "default";
public static final char RESERVED_ID_CHAR = '$'; public static final char RESERVED_ID_CHAR = '$';
protected ConfigService configService;
protected AuthenticationService authenticationService; protected AuthenticationService authenticationService;
protected SessionFactory sessionFactory; protected final SessionFactory sessionFactory = SessionFactoryImpl.newInstance();
protected LinkedHashMap<String, CMISConnection> sharedConnections; protected LinkedHashMap<String, CMISConnection> sharedConnections;
protected LinkedHashMap<String, CMISConnection> userConnections; protected LinkedHashMap<String, CMISConnection> userConnections;
protected int userConnectionsCapacity = 1000; protected int userConnectionsCapacity = 1000;
protected int sharedConnectionsCapacity = 1000; protected int sharedConnectionsCapacity = 100;
protected Map<String, CMISServer> servers; protected Map<String, CMISServer> servers;
protected ReentrantReadWriteLock lock = new ReentrantReadWriteLock(); protected final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
// --- set up ---
public void setConfigService(ConfigService configService)
{
this.configService = configService;
}
public void setAuthenticationService(AuthenticationService authenticationService) public void setAuthenticationService(AuthenticationService authenticationService)
{ {
@@ -70,28 +80,12 @@ public abstract class AbstractCMISConnectionManagerImpl implements CMISConnectio
this.sharedConnectionsCapacity = sharedConnectionsCapacity; this.sharedConnectionsCapacity = sharedConnectionsCapacity;
} }
public void setServers(List<Map<String, String>> serverList) public void init()
{
servers = new HashMap<String, CMISServer>();
for (Map<String, String> serverData : serverList)
{
CMISServer server = createServerDefinition(serverData);
if (server != null)
{
servers.put(server.getName(), server);
}
}
}
@Override
public void afterPropertiesSet() throws Exception
{ {
lock.writeLock().lock(); lock.writeLock().lock();
try try
{ {
sessionFactory = SessionFactoryImpl.newInstance(); // create shared connection LRU cache
sharedConnections = new LinkedHashMap<String, CMISConnection>(sharedConnectionsCapacity, sharedConnections = new LinkedHashMap<String, CMISConnection>(sharedConnectionsCapacity,
(int) Math.ceil(sharedConnectionsCapacity / 0.75) + 1, true) (int) Math.ceil(sharedConnectionsCapacity / 0.75) + 1, true)
{ {
@@ -104,6 +98,7 @@ public abstract class AbstractCMISConnectionManagerImpl implements CMISConnectio
} }
}; };
// create user connection LRU cache
userConnections = new LinkedHashMap<String, CMISConnection>(userConnectionsCapacity, userConnections = new LinkedHashMap<String, CMISConnection>(userConnectionsCapacity,
(int) Math.ceil(userConnectionsCapacity / 0.75) + 1, true) (int) Math.ceil(userConnectionsCapacity / 0.75) + 1, true)
{ {
@@ -115,15 +110,33 @@ public abstract class AbstractCMISConnectionManagerImpl implements CMISConnectio
return size() > userConnectionsCapacity; return size() > userConnectionsCapacity;
} }
}; };
// get predefined server definitions
CMISServersConfigElement cmisServersConfig = (CMISServersConfigElement) configService.getConfig("CMIS")
.getConfigElement("cmis-servers");
if (cmisServersConfig != null && cmisServersConfig.getServerDefinitions() != null)
{
servers = cmisServersConfig.getServerDefinitions();
} else
{
servers = new HashMap<String, CMISServer>();
}
} finally } finally
{ {
lock.writeLock().unlock(); lock.writeLock().unlock();
} }
} }
// --- connections ---
@Override @Override
public CMISConnection createUserConnection(CMISServer server, String connectionId) public CMISConnection createUserConnection(CMISServer server, String connectionId)
{ {
if (connectionId == null || connectionId.length() == 0 || connectionId.indexOf(RESERVED_ID_CHAR) > -1)
{
throw new IllegalArgumentException("Invalid connection id!");
}
String currentUser = authenticationService.getCurrentUserName(); String currentUser = authenticationService.getCurrentUserName();
if (currentUser == null) if (currentUser == null)
{ {
@@ -142,7 +155,7 @@ public abstract class AbstractCMISConnectionManagerImpl implements CMISConnectio
throw new IllegalStateException("Connection id is already in use!"); throw new IllegalStateException("Connection id is already in use!");
} }
connection = createConnection(server, userConnectionId); connection = createConnection(server, userConnectionId, false);
userConnections.put(userConnectionId, connection); userConnections.put(userConnectionId, connection);
} finally } finally
@@ -161,6 +174,12 @@ public abstract class AbstractCMISConnectionManagerImpl implements CMISConnectio
@Override @Override
public CMISConnection createSharedConnection(CMISServer server, String connectionId) public CMISConnection createSharedConnection(CMISServer server, String connectionId)
{ {
if (connectionId == null || connectionId.length() == 0 || connectionId.indexOf(RESERVED_ID_CHAR) > -1
|| DEFAULT_CONNECTION_ID.equals(connectionId))
{
throw new IllegalArgumentException("Invalid connection id!");
}
CMISConnection connection; CMISConnection connection;
lock.writeLock().lock(); lock.writeLock().lock();
@@ -171,9 +190,9 @@ public abstract class AbstractCMISConnectionManagerImpl implements CMISConnectio
throw new IllegalStateException("Connection id is already in use!"); throw new IllegalStateException("Connection id is already in use!");
} }
connection = createConnection(server, connectionId); connection = createConnection(server, connectionId, true);
sharedConnections.put(connection.getId(), connection); sharedConnections.put(connection.getInternalId(), connection);
} finally } finally
{ {
lock.writeLock().unlock(); lock.writeLock().unlock();
@@ -182,23 +201,42 @@ public abstract class AbstractCMISConnectionManagerImpl implements CMISConnectio
return connection; return connection;
} }
protected CMISConnection createConnection(CMISServer server, String connectionId) protected CMISConnection createConnection(CMISServer server, String connectionId, boolean isShared)
{ {
if (connectionId == null || connectionId.length() == 0 || connectionId.indexOf(RESERVED_ID_CHAR) > -1)
{
throw new IllegalArgumentException("Invalid connection id!");
}
Session session = createSession(server.getParameters()); Session session = createSession(server.getParameters());
String username = server.getParameters().get(SessionParameter.USER); String username = server.getParameters().get(SessionParameter.USER);
return new CMISConnectionImpl(this, connectionId, session, server, username, false); return new CMISConnectionImpl(this, connectionId, session, server, username, false, isShared);
} }
@Override
public abstract CMISConnection getConnection(); public abstract CMISConnection getConnection();
public Collection<CMISConnection> getUserConnections() public CMISConnection getConnection(String connectionId)
{
lock.writeLock().lock();
try
{
CMISConnection connection = sharedConnections.get(connectionId);
if (connection != null)
{
return connection;
}
String currentUser = authenticationService.getCurrentUserName();
if (currentUser == null)
{
return null;
}
String userConnectionId = createUserConnectionId(currentUser, connectionId);
return userConnections.get(userConnectionId);
} finally
{
lock.writeLock().unlock();
}
}
public List<CMISConnection> getUserConnections()
{ {
String currentUser = authenticationService.getCurrentUserName(); String currentUser = authenticationService.getCurrentUserName();
if (currentUser == null) if (currentUser == null)
@@ -213,16 +251,17 @@ public abstract class AbstractCMISConnectionManagerImpl implements CMISConnectio
for (CMISConnection conn : userConnections.values()) for (CMISConnection conn : userConnections.values())
{ {
int idx = conn.getId().indexOf(RESERVED_ID_CHAR); int idx = conn.getInternalId().indexOf(RESERVED_ID_CHAR);
if (idx > -1) if (idx > -1)
{ {
if (currentUser.equals(conn.getId().substring(idx + 1))) if (currentUser.equals(conn.getInternalId().substring(idx + 1)))
{ {
result.add(conn); result.add(conn);
} }
} }
} }
Collections.sort(result);
return Collections.unmodifiableList(result); return Collections.unmodifiableList(result);
} finally } finally
{ {
@@ -230,43 +269,15 @@ public abstract class AbstractCMISConnectionManagerImpl implements CMISConnectio
} }
} }
public CMISConnection getUserConnections(String connectionId) public List<CMISConnection> getSharedConnections()
{
String currentUser = authenticationService.getCurrentUserName();
if (currentUser == null)
{
throw new IllegalStateException("No current user!");
}
lock.writeLock().lock();
try
{
String userConnectionId = createUserConnectionId(currentUser, connectionId);
return userConnections.get(userConnectionId);
} finally
{
lock.writeLock().unlock();
}
}
public Collection<CMISConnection> getSharedConnections()
{ {
lock.writeLock().lock(); lock.writeLock().lock();
try try
{ {
return Collections.unmodifiableCollection(sharedConnections.values()); List<CMISConnection> result = new ArrayList<CMISConnection>(sharedConnections.values());
} finally
{
lock.writeLock().unlock();
}
}
public CMISConnection getSharedConnection(String connectionId) Collections.sort(result);
{ return Collections.unmodifiableList(result);
lock.writeLock().lock();
try
{
return sharedConnections.get(connectionId);
} finally } finally
{ {
lock.writeLock().unlock(); lock.writeLock().unlock();
@@ -275,7 +286,7 @@ public abstract class AbstractCMISConnectionManagerImpl implements CMISConnectio
public void removeConnection(CMISConnection connection) public void removeConnection(CMISConnection connection)
{ {
if (connection == null || connection.getId() == null) if (connection == null || connection.getInternalId() == null)
{ {
return; return;
} }
@@ -283,19 +294,12 @@ public abstract class AbstractCMISConnectionManagerImpl implements CMISConnectio
lock.writeLock().lock(); lock.writeLock().lock();
try try
{ {
if (connection.isLocal()) if (connection.isShared())
{ {
userConnections.remove(LOCAL_CONNECTION_ID); sharedConnections.remove(connection.getInternalId());
} else } else
{ {
int idx = connection.getId().indexOf(RESERVED_ID_CHAR); userConnections.remove(connection.getInternalId());
if (idx == -1)
{
sharedConnections.remove(connection.getId());
} else
{
userConnections.remove(connection.getId());
}
} }
} finally } finally
{ {
@@ -314,25 +318,23 @@ public abstract class AbstractCMISConnectionManagerImpl implements CMISConnectio
} }
} }
@Override // --- servers ---
public Collection<CMISServer> getServerDefinitions()
public List<CMISServer> getServerDefinitions()
{ {
return servers == null ? null : servers.values(); return servers == null ? null : Collections.unmodifiableList(new ArrayList<CMISServer>(servers.values()));
} }
@Override
public CMISServer getServerDefinition(String serverName) public CMISServer getServerDefinition(String serverName)
{ {
return servers == null ? null : servers.get(serverName); return servers == null ? null : servers.get(serverName);
} }
@Override
public CMISServer createServerDefinition(String serverName, Map<String, String> parameters) public CMISServer createServerDefinition(String serverName, Map<String, String> parameters)
{ {
return new CMISServerImpl(serverName, null, parameters); return new CMISServerImpl(serverName, null, parameters);
} }
@Override
public CMISServer createServerDefinition(CMISServer server, String username, String password) public CMISServer createServerDefinition(CMISServer server, String username, String password)
{ {
if (server == null) if (server == null)
@@ -347,7 +349,6 @@ public abstract class AbstractCMISConnectionManagerImpl implements CMISConnectio
return new CMISServerImpl(server.getName(), server.getDescription(), parameters); return new CMISServerImpl(server.getName(), server.getDescription(), parameters);
} }
@Override
public CMISServer createServerDefinition(CMISServer server, String username, String password, String repositoryId) public CMISServer createServerDefinition(CMISServer server, String username, String password, String repositoryId)
{ {
if (server == null) if (server == null)
@@ -384,7 +385,6 @@ public abstract class AbstractCMISConnectionManagerImpl implements CMISConnectio
return null; return null;
} }
@Override
public List<Repository> getRepositories(CMISServer server) public List<Repository> getRepositories(CMISServer server)
{ {
if (server == null) if (server == null)

View File

@@ -23,17 +23,24 @@ import org.apache.chemistry.opencmis.client.api.Session;
/** /**
* Represents a CMIS connection. * Represents a CMIS connection.
*/ */
public interface CMISConnection public interface CMISConnection extends Comparable<CMISConnection>
{ {
/** /**
* Gets connection id. * Gets the connection id.
* *
* @return connection id * @return connection id
*/ */
String getId(); String getId();
/** /**
* Gets OpenCMIS Session. * Gets the internal connection id.
*
* @return connection id
*/
String getInternalId();
/**
* Gets the OpenCMIS Session.
* *
* @return OpenCMIS session * @return OpenCMIS session
*/ */
@@ -54,9 +61,19 @@ public interface CMISConnection
String getUserName(); String getUserName();
/** /**
* Indicates if the connection is a local or a remote connection. * Indicates if the connection is shared by multiple users.
*/ */
boolean isLocal(); boolean isShared();
/**
* Indicates if the connection is the default connection.
*/
boolean isDefault();
/**
* Indicates is the repository supports queries.
*/
boolean supportsQuery();
/** /**
* Releases the CMIS session and removes the connection from connection * Releases the CMIS session and removes the connection from connection

View File

@@ -19,19 +19,22 @@
package org.alfresco.repo.cmis.client; package org.alfresco.repo.cmis.client;
import org.apache.chemistry.opencmis.client.api.Session; import org.apache.chemistry.opencmis.client.api.Session;
import org.apache.chemistry.opencmis.commons.enums.CapabilityQuery;
public class CMISConnectionImpl implements CMISConnection public class CMISConnectionImpl implements CMISConnection
{ {
private AbstractCMISConnectionManagerImpl connectionManager; private AbstractCMISConnectionManagerImpl connectionManager;
private String id; private String id;
private String internalId;
private Session session; private Session session;
private CMISServer server; private CMISServer server;
private String username; private String username;
private boolean isLocal; private boolean isDefault;
private boolean isShared;
public CMISConnectionImpl(AbstractCMISConnectionManagerImpl connectionManager, String id, Session session, public CMISConnectionImpl(AbstractCMISConnectionManagerImpl connectionManager, String id, Session session,
CMISServer server, String username, boolean isLocal) CMISServer server, String username, boolean isDefault, boolean isShared)
{ {
if (connectionManager == null) if (connectionManager == null)
{ {
@@ -49,47 +52,75 @@ public class CMISConnectionImpl implements CMISConnection
} }
this.connectionManager = connectionManager; this.connectionManager = connectionManager;
this.id = id; this.internalId = id;
int x = id.indexOf(AbstractCMISConnectionManagerImpl.RESERVED_ID_CHAR);
this.id = (x > -1 ? id.substring(0, x) : id);
this.session = session; this.session = session;
this.server = server; this.server = server;
this.username = username; this.username = username;
this.isLocal = isLocal; this.isDefault = isDefault;
this.isShared = isShared;
} }
@Override
public String getId() public String getId()
{ {
return id; return id;
} }
public String getInternalId()
{
return internalId;
}
@Override @Override
public Session getSession() public Session getSession()
{ {
return session; return session;
} }
@Override
public CMISServer getServer() public CMISServer getServer()
{ {
return server; return server;
} }
@Override
public String getUserName() public String getUserName()
{ {
return username; return username;
} }
@Override public boolean isDefault()
public boolean isLocal()
{ {
return isLocal; return isDefault;
}
public boolean isShared()
{
return isShared;
}
public boolean supportsQuery()
{
if (session == null)
{
return false;
}
if (session.getRepositoryInfo().getCapabilities() == null)
{
return true;
}
return session.getRepositoryInfo().getCapabilities().getQueryCapability() != CapabilityQuery.NONE;
} }
@Override
public void close() public void close()
{ {
connectionManager.removeConnection(this); connectionManager.removeConnection(this);
session = null; session = null;
} }
public int compareTo(CMISConnection conn)
{
return id.compareTo(conn.getId());
}
} }

Some files were not shown because too many files have changed in this diff Show More