Skip navigation
Kryo and Bad Surprises

 

Jive uses the Kryo Framework to serialize and deserialize objects, typically serialization happens when objects are transferred to the remote Voldemort cache and back. Unfortunately serialization troubles caused by bad implementation mostly occur at runtime, which is a surprise I'd like to avoid.

 

Unittest

 

My colleague Lars Kreisz wrote a short Unittest to test the serialization of a single class, which was a good start. And so I thought "Why not test all the instances implementing Serializable automagically?". All we need for this is a Reflection library, and I chose Google Reflections, which can be added through the following dependency with scope test in your projects pom.xml:

<dependency>
<groupId>org.reflections</groupId>
<artifactId>reflections</artifactId>
<version>0.9.9-RC1</version>
<scope>test</scope>
</dependency>

 

And now for the JUnit test case, which works very well so far. What it does, briefly:

  • init Reflections library with the package name you want to scan for objects (line 22)
  • filter out only types Implementing Serializable (line 23)
  • iterate over every class, filter out the abstract types which can't be instantiated (line 29)
  • instantiate the class (line 31)
  • Serialize, Deserilze and check class

 

When there are any problems with the serialization (like included types that are not serializable them selfs, or missing default constructors), an exception from kryo is thrown and the test case is getting red.

 

import static org.junit.Assert.*;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.Serializable;
import java.lang.reflect.Modifier;
import java.util.Set;

import org.junit.Test;
import org.reflections.Reflections;

import com.esotericsoftware.kryo.Kryo;
import com.esotericsoftware.kryo.io.Input;
import com.esotericsoftware.kryo.io.Output;


public class ExperimentalSerializableTest {

 @Test
  public void test() throws Exception {
  Reflections r = new Reflections("com.your.root.package.goes.here");
  Set<Class<? extends Serializable>> classes = r.getSubTypesOf(Serializable.class);

  for (Class<? extends Serializable> clazz : classes) {

  System.out.println("Checking class " + clazz.getName());

  if (!Modifier.isAbstract(clazz.getModifiers())) {

  Object instance = clazz.newInstance();

  // Serialize to a byte array in ram.
      ByteArrayOutputStream bos = new ByteArrayOutputStream();
      Output ko = new Output(bos);
      Kryo kry = new Kryo();
      kry.writeObject(ko, instance);
      ko.flush();
     
      // Deserialize.
      ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
      Input ki = new Input(bis);
      Object deserialiedInstance = kry.readObject(ki, clazz);
     
      // check casting once more
      Object castedObject = clazz.cast(deserialiedInstance);
     
      // this has to be true then
      assertTrue(castedObject.getClass().equals(clazz));
  }
  }
  }

}








 

Happy to hear your thoughts at the comments. Cheers,

 

Mirko

This fall, we'd released a new update to the Jive Cloud platform (2015.3) and along with that comes a couple of great new features and updates to our REST API. We also brought a couple of new posts and tools to make your integrations richer, built easier and faster than ever before. We did a lot of tidying up with this release and squashed quite a few bugs while we're working hard on the next major release that's sure to completely WOW you—release 2016.1.

 

REST API Improvements

Jive REST API v3.14 → EventCalendarCount entity - Get the event calendar of a place. (added)

Jive REST API v3.14 → EventCategoryType entity - Create, Destroy, Get, Update event category types.  (added)

Jive REST API v3.14 → EventInvite service - Create, Delete, Get, Update invite(s) for an event. (added)

Jive REST API v3.14 → Event service - Create, Cancel, Update an event. (added)

Jive REST API v3.14 → Oembed service - Retrieve an embed code for a URL that is used by the Video Object creation to validate an embed-type video. (added)

Jive REST API v3.14 → Person entity - Delete and Set a users avatar. Update the visibility of a field in a user's profile.(added)

Jive REST API v3.14 → Rsvp service - Get RSVP's and invitees/attendees as well as RSVP to an event. (added)

Jive REST API v3.14 → Video service - Get the download options for a video (added)

Jive REST API v3.14 → ProfileFieldPrivacy entity - Profile field privacy now returns a string for type (updated)

 

 

New Documentation & Posts

One Stop for the Jive-n/Jive-x 2016.1 Cloud Release <-- Highly recommended you take a look.

UX Widgets

Content Manager App - The idea into reality

Built.io Flow: Caffeinate Complex Workflows (1 of 3)

Built.io Flow: Caffeinate Complex Workflows (2 of 3)

 

Stay tuned for more news and updates on our next release and keep yourself checking the Jive Developer community often on new guides, documents, blogs, and great support!

 

 

Reminder

Coming Up: JiveWorld16 Developer Conference

Las Vegas - Aria Resort & Casino

March 14-16, 2016

 

 

We're very excited to be heading to Las Vegas for JiveWorld16! This year, the experience will be very unique with games, prizes, and of course great sessions to keep you ahead in all things Jive. Be sure to review our survival guide well before you go to maximize your experience: A Hacker's Guide to Prepare for the JiveWorld16 Developer Conference

 

builtio_flow_logo_1024.png

Re-Introducing Built.io Flow

 

Rashed Talukder wrote up an excellent primer on how to start out using Built.io Flow with Jive; if you haven't read it, stroll on over to read Built.io Flow: Caffeinate Complex Workflows (2 of 3) . Automating complex workflows with Flow makes some of those repetitive tasks a lot easier while opening your eyes to some of the new things you might be able to accomplish. However, rather than rehash what's already been said, let's jump right into our progression by building an integration between Marketo and Jive.

 

 


 

What We're Building

 

We're going to get a little more complex than the first Flow that was built. However, we're still going to take it a little easy. There may be times when you want to communicate with your Marketo leads and give them an easy call to action in Jive. Let's build something that gets a list of leads from Marketo and then pushes an Inbox Action in Jive to the first lead on the list. This will allow us to get a brief introduction to arrays in Flow as well as show you what it's like to actually integrate multiple services and activities together.

 


 

Getting Started

If you haven't already done so (and you're not familiar with Flow), please take a moment and read Built.io Flow: Caffeinate Complex Workflows (2 of 3) . The next thing we're going to need, though, is for you to have a Group List in Marketo you're willing to experiment with. This tutorial won't go over a step-by-step on how to create that. Simply go to Marketo, create a new Group List (I named mine "Jive List"), and put one Lead inside of it. Make sure that lead has the following attributes:

  • First Name
  • Last Name
  • Email Address – Make sure this is an email with an active Jive account associated with it (I used my own).

Once you've created that list, just go to Flow and create a new Flow. Name it whatever you want. And then we're ready to move on to the meat and potatoes.

 


Get Everything On The Canvas

Now let's get everything we're going to use onto the canvas. I generally prefer to do this just because it helps me organize my thoughts on exactly how the data is going to Flow. For this particular Flow there are five activities you're going to need to get onto the canvas and connect them in the following order:

  1. Marketo -> Get Multiple Lists. While the name of this activity suggests that we're getting more than one list, in point of fact, this activity allows you to search for a particular Group List in Marketo. For example: I am going to search for the list I created named "Jive List". While this activity returns an array, in our particular use case, it will just be returning an array with one element.
  2. Marketo -> Get Leads Using List ID. After performing a search for the list you want, you then need to get the leads out of that particular list.
  3. Marketo -> Get Lead Details. This activity will allow you to get the lead details for a specific lead. For the purposes of simplicity, we're just going to get the lead details for the first lead on the list.
  4. Jive -> Get Person ID by Email. The last activity gave us access to the person's email address. However, before we can push a Jive Inbox Action, we need to know the individual's Person ID. This activity will get us that ID.
  5. Jive -> Create Action. And finally, now we can create an action specifically for the individual we got from the previous activity.

Once you connect them all together, it should look something like this:

Built_io_Flow_-_Marketo_List_to_Jive_Inbox_Action.png


Configure The Activities

You can ignore the warning icons you see because we're about to go in and address those right now; one after another.

 

Marketo -> Get Multiple Lists configuration

The first thing you're going to have to do is set up your Marketo Connection. You can do that by going to edit the settings of the "Get Multiple Lists" activity and selecting the "Marketo Connection" dropdown. If you don't have one already set up that you want to use (as I do in the screenshot below), then go ahead and click on "Add new", type in a name for your new Marketo connection and follow the instructions.

 

Screen Shot 2016-02-20 at 03.36.51.png

 

Now that we've got the connection situation straightened out, we want to search for a specific Group List we created in Marketo. I named my Group List "Jive List", so I'm going to enter that name in the "List name" text box:

 

Screen Shot 2016-02-20 at 03.41.15.png

 

Once you've done that, we're done setting up this particular activity and we can move on to the next one. Click done and go back to the Flow canvas.

Marketo -> Get Leads Using List ID

Now go ahead and edit the next activity in the chain: Get Leads Using List ID. Now this is where arrays start to come into play. We're not going to do iteration this time around (although this is possible with Flow). Instead, let's just focus on getting the first Group List returned by the "Get Multiple Lists" activity we just finished configuring. First, make sure to choose the Marketo connection you created in step one from the "Marketo Connection" dropdown. Then click on the green [+] symbol next to {{$a0.result}} array and that will give you an idea of all of the objects available to you in each element of the returned array.This activity is asking us to give it a List ID so we can get the leads from that particular list. Because we want to get the leads from the first list in the array, we want to put {{$a0.result[0].id}} in the "List ID" text box as is shown below. That will get us the ID of the first Group List returned in the array.

 

Built_io_Flow_-_Marketo_List_to_Jive_Inbox_Action.pngNow that you're done configuring this activity, let's move on to the next one.

Marketo -> Get Lead Details

This is the last Marketo activity we have to configure. Again, make sure to choose your Marketo connection. This activity will get us the details for a specific lead in Marketo. The objective of the last activity was to get us the Lead ID we needed here. The objective of this activity is to get the name and email address of the Lead we're going to be contacting in Jive. So, similar to what we did before with the array of Group Lists returned, we're going to just get the first lead from the "Get Leads Using List ID" activity; that's the lead we want the details for. Just enter {{$a1.result[0].id}} in the "Lead ID" field and we're good to go.

 

Built_io_Flow_-_Marketo_List_to_Jive_Inbox_Action 2.png

 

Once we're done here, we can move on to the configure the first Jive activity.

Jive -> Get Person ID by Email

First things first: set up your Jive connection. If you've already gone through the first tutorial in this series, then you should already have a connection set up. If you haven't gone through that tutorial, then you can just choose "Add new" from the "Jive Connection" drop-down, choose a name for your new Jive connection, and follow the resulting instructions.This activity is going to allow us to get a Jive Person ID given a particular email address. We would have gotten that email address from the previous activity: "Get Lead Details". So now all we have to do is grab the email from the returned objects in that activity and put it in the "Email" field.

 

Built_io_Flow_-_Marketo_List_to_Jive_Inbox_Action 3.png

Jive -> Create Action

This is the last activity that needs to be configured. As before, first set up your Jive connection by selecting your Jive connection from the drop-down.Then let's go ahead and just fill out the first three text boxes as seen below. Since we pulled the Jive user's information from the "Get Person ID by Email" activity, we can put their name in the "Title" text box.

  • Try putting the following in the "Title" text box: {{$a3.name}}: An Awesome Message From Our Marketo! (Note: we could have also pulled similar information from the "Get Lead Details" activity.)
  • Then go ahead and write some content in the "Content" text box. I chose to write: I'm sending you something pretty awesome.
  • And last, but not least, make sure to put a Person URI in the next text box: https://<jive_url>/api/core/v3/people/{{$a13.id}}. In this case, we're getting the Person ID from the "Get Person ID by Email" activity to make sure we have a complete Person URI.

 

Built_io_Flow_-_Marketo_List_to_Jive_Inbox_Action 4.png

Let's Run It, Already!

We're done. There's nothing more to do but see if this thing works. So once you're done editing the "Create Action" activity, just head back to the canvas and hit the "Test" button in the top right-hand corner. That should execute the Flow.

 

Built_io_Flow_-_Marketo_List_to_Jive_Inbox_Action 5.png

 


 

What's Next?

For the next and final iteration, we'll be completing the iteration to a fulfill a common use-case; initiating a Flow through a trigger, initiating another flow from within a flow, and taking a user's action response and calling another Flow.

developer-conference-gradient.png

If you've been following any of our recent blog posts, such as:

then you might know that we have an amazing agenda planned for you, see the full agenda here, at the JiveWorld16 Developer Conference.

 

But knowing the agenda and being ready for the conference are two completely different things.  Our goal for the JiveWorld Developer Conference is to be extremely interactive and hands-on, that way developers can head back to their jobs with momentum to start their next Jive integration using their new skills.  To help achieve this goal, we've put together a quick guide for developers (old and new) on how to best to prepare for the best Jive developer event of the year!

 

 


 

Getting Ready for the Tri-Hackathon

 

jw16-dev-trihackathon-logo-teal.png

The Tri-Hackathon will test your skills in the following hacker disciplines:  coding, trivia and video games.  While trivia and video games will be difficult to suggest recommended training programs, the coding challenge is a bit easier.

 

  1. Register for the Jive Developer Sandbox, see instructions: How to Access the Official Jive Developer Sandbox
  2. Install the Jive SDK for Node.js ... or familiarize yourself with one of our open-source in-progress SDKs on GitHub.
  3. Install ngrok on your laptop.  This will give you ultimate flexibility on the conference WiFi allowing the Jive Developer Sandbox to communicate with your local dev environment.

 

<hint>Take a look and maybe try some of the node.js tutorials, this might come in handy.  </hint>

 


 

JiveWorld14 Presentation Videos

If you are new to the Jive platform, it is a good idea to get up to speed before attending the conference.  Don't worry!  You can revisit all the exceptional presentations from JiveWorld14 below to get started on the right foot!

 

RecommendedOptional, but Good

 


 

Developer Prizes / Awards

Per the previously mentioned blog post, there will be some prizes and badges awarded.  Here is a breakdown of all the opportunities to win, big and small!

 

trihack-code.png

Complete at-least 4 coding challenges to earn this badge in the Jive Community

Each coding challenge you complete will earn you tickets.

You do not need to be a developer to participate! (but it helps)

 

Most Completed Challenges: 
$100 Gift Card

trihack-trivia.png

All participants will earn 400 tickets and this badge in the Jive Community

You do not need to be a developer to participate!

 

Best Trivia Score:

$100 Gift Card

trihack-game.png

All participants will earn 400 tickets and this badge in the Jive Community

You do not need to be a developer to participate!

 

Best Score:

$100 Gift Card

trihack-allstar.png

 

Complete all phases of the JiveWorld16 Tri-Hackathon, 
and get this badge in the Jive Community.

developer-blogger.png

 

Blog about your JiveWorld16 Developer Conference experience,

and get this badge in the Jive Community and 500 tickets!

developer-prize.png

 

Win any of the tri-hackathon top prizes or be selected
by our featured hack sponsors (Pebble & Built.io),

and get this badge in the Jive Community.

pebble-watch.png

jivedev-ticket.png

 

Tickets can be traded in at the end of the conference for
$$$ gift cards, video arcade chachkies and hackathon t-shirts.

Other Awards for Developer Participation
developer.png

 

Check-in to at-least 2 Developer Conference sessions,
and get this badge in the Jive Community.

developer-allstar.png

 

Check-in to at-least 4 Developer Conference sessions,

and get this badge in the Jive Community.

noelwhite

UX Widgets

Posted by noelwhite Feb 1, 2016

Introduction

 

Enhance your community with amazing content display options.  Enable and control search and navigation across multiple community sites.  Empower large, diverse communities with service portals for site and content creation. Do all this without having to install plug-ins or set up add-on servers to host services.  These UX Widgets enrich Jive overview pages with powerful intranet platform capabilities.

 

These projects are for Jive-n instances and controlled Jive-x instances that limit place administration to trusted users and allow JavaScript within HTML widgets.  If this works for your community, click on the title of the below projects to go to the Github site to get full instructions and required files.

 

 


 

Content Lookup

content-lookup.jpg

This is the starter widget in this series of open source releases that eases finding and displaying information about content in your community.  The Content Lookup widget is a handy tool for quickly locating content in your Jive community and obtaining various stats and reference information.  It utilizes the Jive V3 search API and parses the returned information into an easy to consume table.  In particular, this widget makes getting the content ID and Binary URL to uploaded files in the Jive instance much easier than doing API lookups in the browser and parsing the returned information for that level of detail.  The Content Lookup widget is so useful that the rest of the projects in this series have this as a prerequisite.  All of their installation instructions reference its use to help set the projects up within your Jive instance.

 


 

Accordion

accodion-widget.jpg

 

This HTML widget project greatly increases the usable space on pages by displaying information in an accordion viewer.  Viewers expand sections to display the content within.  An easy-to-use builder application creates a self-service portal for site admins to come and generate an accordion for their page in three easy steps:

1.  Create a Jive document with a table defining what to build in the accordion.

2.  Give the builder application the URL to the setup document, and it generates all of the required code.

3.  Place an HTML widget on the target site, and paste the generated code into it.

The accordion widget dynamically builds collapsible Bootstrap panels based on the setup document’s content.  This allows the accordion to be set up quickly and easily, and modifications are a snap.

 

 


 

Advanced Search

Search Widget.jpg

Have you ever wanted a search that only looked in specific places on your community?  This project is an alternative to the Jive search widget’s “current place” or “global” search options.  It allows you to set up a list of places for the search to look through.  This is very useful for business functions that have work spread across several locations within the community, and want to limit search results to only those places.  A builder application lets you set the places that will be searched, eases the configuration process, and generates all of the code to get multi-site searches up and running.

 


 

Content Viewer

content-viewer.jpg

 

How would you like to view various pieces of content within your community within a single site?  You can surface documents, discussions, profiles, and even other overview pages from your community in a single Content Viewer.  All of this functionality is built and maintained using a single Jive document with a bullet list representing the Table of Contents (TOC).  A builder application removes all of the complexity and generates all of the code for you.  All you have to do is set up two widgets on a page.  One widget will become the TOC pane, and the other will become the display panel.  Clicking an item in the TOC loads the content into the display panel for viewing.  Users can select which content to view by the content listed in the TOC and you do not have to implement and maintain complicated menus and navigation bars to keep your sites up to date and connected.    Changes can be made to the TOC document to add, modify, and delete entries.  Linked documents and sites contained in the TOC can be edited to modify the content that is displayed.  Give your community the ultimate in convenience.

 


 

Export

export-widget.jpg

 

Do you need to export the followers of a person or place?  How about exporting event attendee details, including emails?  The Export widget is a service portal that automates the process of gathering information from your community and parsing it into an easy to read, export-friendly format.  Get the information you need without all the hassle.

 


Form

form-widget-overview.jpg
The Forms widget creates a data entry form with controlled inputs, and outputs consistently formatted documents into Jive.  A designer app has a drag & drop interface to create form designs.  It has several elements which ease the entry process, enables categorizing and tagging, and allows attachments.  Form designs can be saved and reloaded later for modification.  All of the code complexities are handled for you.  Just paste the generated code on your site to create the entry form.  Each time a user submits a form, it creates a Jive document with a table of the form fields.  The form makes it easy to guide users on what to submit, and the table format makes it easy to process the submissions.  Form submissions can also be tallied into a report using the Form Report widget.

 


Form Report

form-report-widget.jpg

Working in conjunction with the Form widget, this widget reads a Form design and creates a table of the fields that are able to be tallied.  It then reads through the submissions related to the form design and calculates the number and percentage for each answer.  It also creates an export of the submissions that is spreadsheet friendly for external processing.

 


Menu

 

Control site navigation, both in and out of your Jive instance.  Guide users through related sites, and help them navigate through complex business units.  Organize your site topics and ease access in your community.  Creating a menu in your site is now as simple as creating a Jive document with a bullet list of your menu items.  A builder application takes the setup document and generates the code for you.

 


Picture Carousel

picture-carousel.jpg

Building on Dave Myers original Content Slider project on the Jive community, this project eases the process of creating a Picture Carousel.  The presentation is set up using a single Jive document with a table to control the slides, headings, and links.  A builder application allows users to easily configure size, colors, fonts, and more for total control over the experience.

 


 

Presentation (to be released soon)

presentation-widget.jpg

Looking for an alternative to PowerPoint?  This widget project, utilizing the awesome RevealJS library, allows users to create professional looking presentations within the Jive community.  Presentations are set up using a single Jive document and table where each cell represents a slide in the presentation.  A builder application eases the setup process and generates all of the code.  Several built in 3D transitions add an elegant look.  Presentations can be manually controlled, or set for auto advance.  Make your community stand out…in 3D!

 


 

Team Listing (to be released soon)

team-listing.jpg

Surface team members.  Guide visiting users to the correct contacts.  This widget makes it painless to build a nicely formatted team listing to display on your overview page.  A builder application utilizing the Jive APIs eases the building process and automates all of the work.  Just tell it who you want, generate the code, and paste it into a widget on your page.  It can even be set to dynamically build the list based on current information from the Jive profiles, so it can manage the details when you don’t want to.

 


 

What's Next?

 

The projects that are not currently linked to their Github repository are still in the release process.  They will be available soon.


Tile conversions of these projects are possible, but the UI design would need to work around the tile size restrictions.  Conversion to add-ons / apps is also possible, but the widget design has worked best for our communities.  We look forward to your feedback and contributions.

Filter Blog