blob: 5165ee6e5a6cf3f2f88021a02430466764665666 [file] [log] [blame]
<!DOCTYPE html>
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->
<html>
<head>
<meta charset="UTF-8">
<title>OpenCMIS Browser Binding</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" type="text/css" href="../css/opencmis.css"/>
<script src="../browser?login=script" type="text/javascript"></script>
<script type="text/javascript">
var repositoryUrl;
var rootFolderUrl;
var rootFolderId;
var rootFolder = "/";
var lastToken;
var currentFolderId;
// login and logout
function login() {
cmisLogin(function(success) {
if (success) {
cmisNextToken(function(token) {
var script0 = document.createElement('script');
script0.setAttribute('src', cmisServiceURL() + '?callback=printRepositoryInfos&token=' + token);
script0.setAttribute('type', 'text/javascript');
document.body.appendChild(script0);
});
}
});
}
function logout() {
cmisLogout(function(success) {
if (success) {
// login again
login();
}
});
}
// helpers
function performJsonpRequest(url, callback, params) {
var callUrl = url;
if (params) {
for (var key in params) {
callUrl = callUrl + '&' + key + '=' + encodeURIComponent(params[key]);
}
}
cmisNextToken(function(token) {
callUrl = callUrl +
'&callback=' + callback +
'&token=' + encodeURIComponent(token) +
'&suppressResponseCodes=true'
var script = document.createElement('script');
script.setAttribute('src', callUrl);
script.setAttribute('type', 'text/javascript');
document.body.appendChild(script);
});
}
function loadCmisDataById(id, selector, callback, params) {
performJsonpRequest(rootFolderUrl + '?cmisselector=' + selector + '&objectId=' + encodeURIComponent(id), callback, params);
}
function loadCmisDataByPath(path, selector, callback, params) {
performJsonpRequest(rootFolderUrl + path + '?cmisselector=' + selector, callback, params);
}
function loadCmisRepositoryData(selector, callback, params) {
performJsonpRequest(repositoryUrl + '?cmisselector=' + selector, callback, params);
}
function loadCmisLastResult(token, callback) {
var url = repositoryUrl + '?cmisselector=lastResult' +
'&callback=' + callback +
'&token=' + encodeURIComponent(token);
var script = document.createElement('script');
script.setAttribute('src', url);
script.setAttribute('type', 'text/javascript');
document.body.appendChild(script);
}
function openContentInNewWindow(id) {
cmisNextToken(function(token) {
var url = rootFolderUrl +
'?cmisselector=content' +
'&objectId=' + encodeURIComponent(id) +
'&token=' + encodeURIComponent(token);
window.open(url, '_blank');
});
}
function createAndSubmitDeleteForm(rootFolderUrl, id, cmisaction, callback) {
cmisNextToken(function(token) {
var targetFrame = document.createElement('iframe');
targetFrame.style.display = 'none';
targetFrame.name = 'cmis-frame-' + cmisaction + '-' + id;
document.body.appendChild(targetFrame);
targetFrame.addEventListener('load',
function() {
callback();
document.body.removeChild(targetFrame);
},
false);
var frameBody = targetFrame.contentWindow.document.createElement('body');
targetFrame.appendChild(frameBody);
var cmisForm = targetFrame.contentWindow.document.createElement('form');
cmisForm.action = rootFolderUrl + '?objectId=' + encodeURIComponent(id);
cmisForm.method = 'POST';
cmisForm.target = targetFrame.name;
frameBody.appendChild(cmisForm);
var cmisActionInput = targetFrame.contentWindow.document.createElement('input');
cmisActionInput.name = 'cmisaction';
cmisActionInput.type = 'text';
cmisActionInput.value = cmisaction;
cmisForm.appendChild(cmisActionInput);
var cmisAllVersionsInput = targetFrame.contentWindow.document.createElement('input');
cmisAllVersionsInput.name = 'allVersions';
cmisAllVersionsInput.type = 'text';
cmisAllVersionsInput.value = 'true';
cmisForm.appendChild(cmisAllVersionsInput);
var cmisTokenInput = targetFrame.contentWindow.document.createElement('input');
cmisTokenInput.name = 'token';
cmisTokenInput.type = 'text';
cmisTokenInput.value = token;
cmisForm.appendChild(cmisTokenInput);
cmisForm.submit();
});
}
// print callbacks
function printRepositoryInfos(infos) {
for(repId in infos) {
var ri = infos[repId];
document.getElementById('repositoryInfo').innerHTML =
'<h2>Repsository "' + ri.repositoryName + '" (' + ri.repositoryId + ')</h2>' +
'<table>' +
'<tr><td>Id:</td><td>' + ri.repositoryId + '</td></tr>' +
'<tr><td>Name:</td><td>' + ri.repositoryName + '</td></tr>' +
'<tr><td>Description:</td><td>' + ri.repositoryDescription + '</td></tr>' +
'<tr><td>Product:</td><td>' + ri.vendorName + ' ' + ri.productName + ' ' + ri.productVersion + '</td></tr>' +
'<tr><td>Root folder id:</td><td>' + ri.rootFolderId + '</td></tr>' +
'<tr><td>Repository URL:</td><td>' + ri.repositoryUrl + '</td></tr>' +
'<tr><td>Root folder URL:</td><td>' + ri.rootFolderUrl + '</td></tr>' +
'</table>';
// the InMemory repository has only one repository
repositoryUrl = ri.repositoryUrl;
rootFolderUrl = ri.rootFolderUrl;
rootFolderId = ri.rootFolderId;
}
currentFolderId = rootFolderId;
loadCmisDataByPath(rootFolder, 'object', 'printObject', {});
reloadChildren();
loadCmisRepositoryData('typeChildren', 'printTypes', {});
}
function printObject(obj) {
var id = obj.properties["cmis:objectId"].value;
var name = obj.properties["cmis:name"].value;
var s = '<h2>Object "' + name + '" (' + id + ')</h2>';
s = s + '<h3>Properties</h3>';
s = s + '<table>';
for(propertyId in obj.properties) {
var property = obj.properties[propertyId];
s = s + '<tr><td>' + propertyId + '</td>';
s = s + '<td>' + property.displayName + '</td>';
s = s + '<td>' + property.type + '</td>';
s = s + '<td>' + property.cardinality + '</td>';
if(property.type == 'datetime') {
s = s + '<td>' + (new Date(property.value)) + '</td></tr>';
} else {
s = s + '<td>' + property.value + '</td></tr>';
}
}
s = s + '</table>';
document.getElementById('objectInfo').innerHTML = s;
}
function printChildren(children) {
var s = '<h2>Children</h2>';
s = s + '<h3>Properties</h3>';
s = s + '<input type="button" value="Reload folder" onClick="reloadChildren()">';
s = s + '<table><tr><th>Name</th><th>Type</th><th>MIME Type</th><th>Size</th>' +
'<th>Created By</th><th>Created At</th><th>Id</th><th></th></tr>';
for(var index in children.objects) {
var object = children.objects[index].object;
var name = object.properties["cmis:name"].value;
var type = object.properties["cmis:objectTypeId"].value;
var mimetype = "";
var size = "";
var createdBy = object.properties["cmis:createdBy"].value;
var creationDate = new Date(object.properties["cmis:creationDate"].value);
var id = object.properties["cmis:objectId"].value;
var link = 0; // 0 - no link, 1 - content link, 2 - folder link
var deleteLink = "deleteObject('" + id + "')";
if(object.properties["cmis:baseTypeId"].value == "cmis:folder") {
deleteLink = "deleteFolder('" + id + "')";
link = 2;
}
if(object.properties["cmis:baseTypeId"].value == "cmis:document") {
if(object.properties["cmis:contentStreamLength"]) {
size = object.properties["cmis:contentStreamLength"].value;
} else {
size = "";
}
if(object.properties["cmis:contentStreamMimeType"]) {
mimetype = object.properties["cmis:contentStreamMimeType"].value;
link = 1;
} else {
mimetype = "";
link = "";
}
}
s = s + '<tr><td>';
if(link == 1) {
s = s + "<a href=\"javascript:openContentInNewWindow('" + id + "')\">" + name + "</a>";
} else if(link == 2) {
s = s + "<a href=\"javascript:navigateDown('" + id + "')\">" + name + "</a>";
} else {
s = s + name;
}
s = s + '</td><td>' + type + '</td><td>' + mimetype + '</td><td style="rext-align:right">' + size +
'</td><td>' + createdBy + '</td><td>' + creationDate + '</td><td>' + id + '</td><td><button onClick="' + deleteLink + '">delete</button></td></tr>';
}
s = s + '</table>';
document.getElementById('folderInfo').innerHTML = s;
}
function printTypes(types) {
var s = '<h2>Base Types</h2>';
for(var index in types.types) {
var type = types.types[index];
s = s + '<h3>' + type.id + '</h3>';
s = s + '<ul>';
for(var propId in type.propertyDefinitions) {
var propType = type.propertyDefinitions[propId];
s = s + '<li>' + propType.id + '</li>';
}
s = s + '</ul>';
}
document.getElementById('typeInfo').innerHTML = s;
}
// navigate
function reloadChildren() {
var params = {};
params.filter = 'cmis:name,cmis:objectId,cmis:objectTypeId,cmis:baseTypeId,' +
'cmis:contentStreamMimeType,cmis:contentStreamLength,' +
'cmis:creationDate,cmis:createdBy'
params.includeAllowableActions = 'false';
params.includeRelationships = 'none';
params.renditionFilter = 'cmis:none';
params.maxItems = '100';
params.orderBy = 'cmis:name';
loadCmisDataById(currentFolderId, 'children', 'printChildren', params);
}
function navigateDown(folderId) {
currentFolderId = folderId;
loadCmisDataById(currentFolderId, 'children', 'printChildren', {});
}
// delete
function deleteObject(id) {
createAndSubmitDeleteForm(rootFolderUrl, id, 'delete', reloadChildren);
}
function deleteFolder(id) {
createAndSubmitDeleteForm(rootFolderUrl, id, 'deleteTree', reloadChildren);
}
// query
function querySubmit() {
var queryForm = document.getElementById('queryForm');
queryForm.action = repositoryUrl;
var queryParams = {};
queryParams.q = queryForm.q.value;
queryParams.maxItems = queryForm.maxItems.value;
queryParams.skipCount = queryForm.skipCount.value;
loadCmisRepositoryData('query', 'queryCallback', queryParams);
}
function queryCallback(result) {
if (!(typeof result.exception === 'undefined')) {
alert('Exception: ' + result.exception + '\n\nError:\n' + result.message);
return;
}
var cols = {};
var colCount = 0;
var table = [];
for(var i = 0; i < result.results.length; i++) {
var props = result.results[i].properties;
var row = [];
for(var queryName in props) {
var pos;
if (typeof cols[queryName] === 'undefined') {
pos = cols[queryName] = colCount++;
} else {
pos = cols[queryName];
}
while(row.length < pos - 1) {
row.push('');
}
if(props[queryName].type == 'datetime') {
row[pos] = new Date(props[queryName].value);
} else {
row[pos] = props[queryName].value;
}
}
table.push(row);
}
var s = '<h3>Query Results</h3>';
s = s + '<table><tr>';
for(var i = 0; i < colCount; i++) {
for(var colName in cols) {
if(cols[colName] == i) {
s = s + '<th>' + colName + '</th>';
break;
}
}
}
s = s + '</tr>';
for(var rowIndex = 0; rowIndex < table.length; rowIndex++) {
s = s + '<tr>';
for(var colIndex = 0; colIndex < colCount; colIndex++) {
s = s + '<td>';
if(colIndex < table[rowIndex].length) {
s = s + table[rowIndex][colIndex];
}
s = s + '</td>';
}
s = s + '</tr>';
}
s = s + '</table>';
document.getElementById('queryResult').innerHTML = s;
}
// create Folder
function createFolderSubmit() {
var createForm = document.getElementById('createFolderForm');
createForm.action = rootFolderUrl + createForm.folder.value;
cmisNextToken(function(token) {
lastToken = token;
createForm.token.value = token;
createForm.submit();
});
}
// create document
function createDocumentSubmit() {
var createForm = document.getElementById('createDocumentForm');
createForm.action = rootFolderUrl + createForm.folder.value;
cmisNextToken(function(token) {
lastToken = token;
createForm.token.value = token;
createForm.submit();
});
}
// create helpers
function createCallback() {
if(lastToken) {
loadCmisLastResult(lastToken, 'showNewId');
}
}
function showNewId(result) {
if(result.objectId) {
alert('New object id: ' + result.objectId + '\n\nCode: ' + result.code);
} else {
alert('Exception: ' + result.exception + '\n\nError:\n' + result.message + '\n\nCode: ' + result.code);
}
}
</script>
</head>
<body onLoad="login()">
<h1>OpenCMIS Web Interface</h1>
<input type="button" value="Logout" onClick="logout()">
<br />
<div id="repositoryInfo" class="box">repositoryInfo</div>
<br />
<div id="objectInfo" class="box">objectInfo</div>
<br />
<div id="folderInfo" class="box">folderInfo</div>
<br />
<div id="typeInfo" class="box">typeInfo</div>
<br />
<div id="query" class="box">
<h2>Query</h2>
<form id="queryForm" action="" method="GET" target="_blank">
<input name="cmisaction" type="hidden" value="query" />
<input name="token" type="hidden" value="" />
<table>
<tr><td>Query:</td><td><input name="q" type="text" size="100" maxlength="1000" value="SELECT * FROM cmis:document"></td></tr>
<tr><td>Max Items:</td><td><input name="maxItems" type="text" size="4" maxlength="8" value="100"></td></tr>
<tr><td>Skip Count:</td><td><input name="skipCount" type="text" size="4" maxlength="8" value="0"></td></tr>
<tr><td></td><td><input type="button" value="Go" onClick="querySubmit()"/></td></tr>
</table>
</form>
</div>
<div id="queryResult" class="box"></div>
<br />
<div id="folder" class="box">
<h2>Create Folder</h2>
<form id="createFolderForm" action="" method="POST" target="createResult">
<input name="_charset_" type="hidden" />
<input name="cmisaction" type="hidden" value="createFolder" />
<input name="token" type="hidden" value="" />
<table>
<tr>
<td>Parent Folder:</td>
<td><input name="folder" type="text" size="100" maxlength="1000" value="/"></td>
</tr>
<tr>
<td>Folder Name:</td>
<td><input id="docname" name="propertyValue[0]" type="text" size="100" maxlength="100" value="folder"><input name="propertyId[0]" type="hidden" value="cmis:name" /></td>
</tr>
<tr>
<td>Object Type:</td>
<td><input name="propertyValue[1]" type="text" size="100" maxlength="100" value="cmis:folder"><input name="propertyId[1]" type="hidden" value="cmis:objectTypeId" /></td>
</tr>
<tr>
<td></td>
<td><input type="button" value="Create" onClick="createFolderSubmit()"/></td>
</tr>
</table>
</form>
</div>
<br />
<div id="document" class="box">
<h2>Create Document</h2>
<form id="createDocumentForm" action="" method="POST" target="createResult" enctype="multipart/form-data">
<input name="_charset_" type="hidden" />
<input name="cmisaction" type="hidden" value="createDocument" />
<input name="token" type="hidden" value="" />
<table>
<tr>
<td>Parent Folder:</td>
<td><input name="folder" type="text" size="100" maxlength="1000" value="/"></td>
</tr>
<tr>
<td>Document Name:</td>
<td><input id="docname" name="propertyValue[0]" type="text" size="100" maxlength="100" value="document"><input name="propertyId[0]" type="hidden" value="cmis:name" /></td>
</tr>
<tr>
<td>Object Type:</td>
<td><input name="propertyValue[1]" type="text" size="100" maxlength="100" value="cmis:document"><input name="propertyId[1]" type="hidden" value="cmis:objectTypeId" /></td>
</tr>
<tr>
<td>File name:</td>
<td><input name="filename" type="text" size="30" maxlength="30" value=""> (if left blank, the original file name is used)</td>
</tr>
<tr>
<td>Content type:</td>
<td><input name="contentType" type="text" size="30" maxlength="30" value=""> (if left blank, the content type is determined by the browser)</td>
</tr>
<tr>
<td>File:</td>
<td><input name="content" type="file"></td>
</tr>
<tr>
<td></td>
<td><input type="button" value="Create" onClick="createDocumentSubmit()"/></td>
</tr>
</table>
</form>
</div>
<br />
<iframe name="createResult" style="display:none;" onload="createCallback()"></iframe>
</body>
</html>