JIVE to SharePoint Migration Assessment
I had to assess the JIVE Software system content to migrate it to SharePoint Online. Here are the key learnings
Key Leanings:
- JIVE has outstanding APIs (Application Programming Interfaces) that can be utilized to discover workspaces
- JIVE has outstanding APIs that can be utilized to discover documents and other data types
- JIVE APIs documentation is public - Jive REST API v3.14 (jivesoftware.com)
- JIVE authentication is cumbersome so take time to build auth script
- JIVE videos cannot be downloaded via APIs. There are no APIs available, but there is an admin panel where you can download all the videos at once.
- JIVE document content type refers to HTML (Hyper Text Markup Language) document, not a word, excel etc., and business gets confused
- JIVE page attachments are part of the document content type, and every document content type has to be scanned for attachments; otherwise, they will be missed during migration
- JIVE follows similar to the SharePoint site's flat hierarchy of workspaces (SP sites), so mapping is possible.
- JIVE follows a similar security model as SharePoint Teams sites where every workspace has a group of people assigned to it with Owner, Edit and Read permissions.
Important Content Types:
There are essential content types to look for that can be migrated to SharePoint.
- Place (also referred to as Workspace) – analogue to a SharePoint site.
- Document – This is an HTML document or snippet. It is not a document like we used to refer to as PDF or Word documents.
- File - Files uploaded to a Place Ex. Word, PDF, Image
- Discussion – data related to a conversation.
- Event – data related to an Event
- Favorite – data related to user URL bookmark saved in Jive.
- Poll – data related to a poll
- Task – data related to a task
- Video – video content, for example, MP4 files.
Scripting:
- I created a JavaScript script to discover all the content across the workspaces (documents, files, discussions etc.)
- The script might work for small data pools (30-50K items for migration) but would not work for significant volumes of data as a more complex script will have to be developed (with retry, pause, resume, and scale functionality included)
The scripts:
// open a web browser
// go to a jive website
// open the web browser developer tools
// navigate to the console
// change the itemsLimit depending on the requirements
// paste the script to the browser console
// execute run()
// wait until operation ends
// the data will be stored in memory
// then run console.save(data, 'your_file_name.json')
// the data will be stored on your local device in your_file_name.json
// you can then use tool able to read json data or excel power query to review the data
let data = [];
let itemsLimit = 30000;
async function getContentRetry(i) {
let retryFor = 4
let error = "Something went wrong"
const f = async () => {
try {
const url = `https://my_jive_intance.my_domain.com/api/core/v3/contents?count=100&startIndex=${i}`
const res = await fetch(url);
const json = await res.json();
data = [...data, ...json.list];
console.log(url);
console.log(data.length);
return [, url];
} catch (e) {
console.log('Error:');
console.log(e);
return [e];
}
}
while (--retryFor) { // 3 times retry
const [err, res] = await f();
if (res) return res;
console.log('Error');
console.log(e);
console.log('Will retry in 30 sec');
error = err;
await new Promise(resolve => setTimeout(resolve, 30000)); //sleep for 30 sec
}
throw new Error(error);
}
async function run() {
//const tasks = [];
let i = 0;
while (i < itemsLimit) {
await getContentRetry(i);
i = i + 100
}
//await Promise.all(tasks);
console.log('DONE!');
}
(function (console) {
console.save = function (data, filename) {
if (!data) {
console.error('Console.save: No data')
return;
}
if (!filename) filename = 'console.json'
if (typeof data === "object") {
data = JSON.stringify(data, undefined, 4)
}
var blob = new Blob([data], { type: 'text/json' }),
e = document.createEvent('MouseEvents'),
a = document.createElement('a')
a.download = filename
a.href = window.URL.createObjectURL(blob)
a.dataset.downloadurl = ['text/json', a.download, a.href].join(':')
e.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null)
a.dispatchEvent(e)
}
})(console)
In JIVE, a Place is like a SharePoint Site collection. To get the number of Places, you can engage the Places API and execute a get request. Something similar to the script below.
// open a web browser
// go to a jive website
// open the web browser developer tools
// navigate to the console
// change the itemsLimit depending on the requirements
// paste the script to the browser console
// execute run()
// wait until operation ends
// the data will be stored in-memory
// then run console.save(data, 'your_file_name.json')
// the data will be stored to your local device in your_file_name.json
// you can then use tool able to read json data or excel power query to review the data
let data = [];
let itemsLimit = 30000;
async function getContentRetry(i) {
let retryFor = 4
let error = "Something went wrong"
const f = async () => {
try {
const url = `https://my_jive_intance.my_domain.com/api/core/v3/places?count=100&startIndex=${i}`
const res = await fetch(url);
const json = await res.json();
data = [...data, ...json.list];
console.log(url);
console.log(data.length);
return [, url];
} catch (e) {
console.log('Error:');
console.log(e);
return [e];
}
}
while (--retryFor) { // 3 times retry
const [err, res] = await f();
if (res) return res;
console.log('Error');
console.log(e);
console.log('Will retry in 30 sec');
error = err;
await new Promise(resolve => setTimeout(resolve, 30000)); //sleep for 30 sec
}
throw new Error(error);
}
async function run() {
//const tasks = [];
let i = 0;
while (i < itemsLimit) {
await getContentRetry(i);
i = i + 100
}
//await Promise.all(tasks);
console.log('DONE!');
}
(function (console) {
console.save = function (data, filename) {
if (!data) {
console.error('Console.save: No data')
return;
}
if (!filename) filename = 'console.json'
if (typeof data === "object") {
data = JSON.stringify(data, undefined, 4)
}
var blob = new Blob([data], { type: 'text/json' }),
e = document.createEvent('MouseEvents'),
a = document.createElement('a')
a.download = filename
a.href = window.URL.createObjectURL(blob)
a.dataset.downloadurl = ['text/json', a.download, a.href].join(':')
e.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null)
a.dispatchEvent(e)
}
})(console)
Need help with JIVE to SharePoint migration?
We can help; feel free to reach out.