a close-up of a building

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: 

  1. JIVE has outstanding APIs (Application Programming Interfaces) that can be utilized to discover workspaces  
  2. JIVE has outstanding APIs that can be utilized to discover documents and other data types 
  3. JIVE APIs documentation is public - Jive REST API v3.14 (jivesoftware.com) 
  4. JIVE authentication is cumbersome so take time to build auth script 
  5. 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. 
  6. JIVE document content type refers to HTML (Hyper Text Markup Language) document, not a word, excel etc., and business gets confused 
  7. 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 
  8. JIVE follows similar to the SharePoint site's flat hierarchy of workspaces (SP sites), so mapping is possible. 
  9. 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.


  1. Place (also referred to as Workspace)analogue to a SharePoint site.
  2. Document – This is an HTML document or snippet. It is not a document like we used to refer to as PDF or Word documents. 
  3. File - Files uploaded to a Place Ex. Word, PDF, Image 
  4. Discussion – data related to a conversation.
  5. Event – data related to an Event 
  6. Favorite – data related to user URL bookmark saved in Jive. 
  7. Poll – data related to a poll 
  8. Task – data related to a task  
  9. Video – video content, for example, MP4 files.


Scripting: 

  1. I created a JavaScript script to discover all the content across the workspaces (documents, files, discussions etc.) 
  2. 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.