blob: 4500994da50930399f92312495c7d69861f2d90e [file] [log] [blame]
<%@ page language="java" contentType="application/json; charset=UTF-8" pageEncoding="UTF-8"%>
/*
* 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.
*/
function OpenCMISConnector() {
this.repositoryDomain = '<%= request.getAttribute("org.apache.chemistry.opencmis.domain") %>';
this.serviceUrl = '<%= request.getAttribute("org.apache.chemistry.opencmis.serviceUrl") %>';
this.iframeUrl = '<%= request.getAttribute("org.apache.chemistry.opencmis.iframeUrl") %>';
this.applicationDomain = '';
this.iframe = null;
this.init = false;
this.appKey = '';
this.loginKey = '';
this.loginCallback = null;
this.logoutCallback = null;
this.tokenCallbacks = new Array();
}
OpenCMISConnector.prototype.cmisInit = function() {
// get login key cookie
var ca = document.cookie.split(';');
for (var i = 0; i < ca.length; i++) {
var c = ca[i].replace(/^\s\s*/, '').replace(/\s\s*$/, '');
if (c.indexOf('opencmis_loginkey=') == 0) {
this.loginKey = unescape(c.substring(18));
break;
}
}
if (this.loginKey != '') {
// remove the cookie
document.cookie = 'opencmis_loginkey=_; Max-Age=0; expires=Thu, 01-Jan-70 00:00:01 GMT; Version="1"';
}
// app domain and path
this.applicationDomain = window.location.protocol + '//' + window.location.host;
var appDomainEncoded = encodeURIComponent(this.applicationDomain);
var appPathEncoded = encodeURIComponent(window.location.pathname + window.location.search);
var self = this;
// register message event listener
window.addEventListener('message', function(event) { self.cmisReceiver(event) }, false);
// set up iframe
var repositoryIframe = document.createElement('iframe');
repositoryIframe.src = this.iframeUrl + (this.iframeUrl.indexOf('?') == -1 ? '?' : '&') + 'domain=' + appDomainEncoded + '&path=' + appPathEncoded;
repositoryIframe.style.display = 'none';
//var frameLoginKey = this.loginKey;
//var frameRepositoryDomain = this.repositoryDomain;
repositoryIframe.onload = function() { self.sendLoginMessage(); };
this.iframe = document.getElementsByTagName('body').item(0).appendChild(repositoryIframe);
this.init = true;
};
OpenCMISConnector.prototype.cmisReceiver = function(e) {
if (e.origin != this.repositoryDomain) {
// ignore messages that have not been sent from the repository domain
return;
}
if (e.data.substring(0, 6) == 'token:') {
// response of a token request, repository sends token
if (this.tokenCallbacks.length > 0) {
// at least one callback is waiting for a token
// extract token
var token = e.data.substring(6);
// trigger callback
this.tokenCallbacks.pop()(token);
}
} else if (e.data.substring(0, 7) == 'appkey:') {
if (this.loginCallback != null) {
var callback = this.loginCallback;
this.loginCallback = null;
this.appKey = e.data.substring(7, 67);
this.loginKey = '';
callback(true);
}
} else if (e.data.substring(0, 9) == 'loginkey:') {
if (this.loginCallback != null) {
var callback = this.loginCallback;
this.loginCallback = null;
this.loginKey = e.data.substring(9, 69);
var loginUrl = e.data.substring(70);
var expires = new Date();
expires.setTime(expires.getTime() + 3600);
document.cookie = 'opencmis_loginkey=' + escape(this.loginKey)
+ '; Max-Age=3600; expires=' + expires.toGMTString()
+ '; Version="1"; Discard';
window.location.href = loginUrl;
}
} else if (e.data.substring(0, 7) == 'logout:') {
if (this.logoutCallback != null) {
var callback = this.logoutCallback;
this.logoutCallback = null;
var success = ('ok' == e.data.substring(7));
callback(success);
}
}
};
OpenCMISConnector.prototype.sendLoginMessage = function() {
this.iframe.contentWindow.postMessage('login:' + this.loginKey, this.repositoryDomain);
};
OpenCMISConnector.prototype.cmisServiceURL = function() {
return this.serviceUrl;
};
OpenCMISConnector.prototype.cmisLogin = function(callback) {
if (this.loginCallback != null) {
// there is already a login in progress
callback(false);
return;
}
this.loginCallback = callback;
if (!this.init) {
this.cmisInit();
} else {
sendLoginMessage();
}
};
OpenCMISConnector.prototype.cmisLogout = function(callback) {
if (this.logoutCallback != null) {
// there is already a logout in progress
callback(false);
return;
}
if (!this.init) {
// there hasn't been a login before
callback(false);
return;
}
this.logoutCallback = callback;
this.iframe.contentWindow.postMessage('logout:' + this.appKey, this.repositoryDomain);
};
OpenCMISConnector.prototype.cmisNextToken = function(callback) {
if (!this.init) {
// not logged in
callback('');
return;
}
this.tokenCallbacks.unshift(callback);
this.iframe.contentWindow.postMessage('token:' + this.appKey, this.repositoryDomain);
};
var openCMISConnector = new OpenCMISConnector();
// Functions defined by the CMIS 1.1 specification
function cmisServiceURL() {
return openCMISConnector.cmisServiceURL();
}
function cmisLogin(callback) {
openCMISConnector.cmisLogin(callback);
}
function cmisLogout(callback) {
openCMISConnector.cmisLogout(callback);
}
function cmisNextToken(callback) {
openCMISConnector.cmisNextToken(callback);
}