Liferay Avanzado: Programando con Liferay User Live Session

09-09-2014
 

Liferay nos permite monitorizar que hacen los usuarios en nuestro portal para saber quien y donde esta navegando en cada momento. Además, a través de su API podemos acceder a esta información para completar nuestros desarrollos, en este caso vamos a hacer un portlet que muestre en cada momentos cuantos usuarios están conectado en cada Site.

Primero debemos habilitar esta funcionalidad configurando nuestro ‘portal-ext.properties’.

	live.users.enabled=true

Si además queremos que Liferay guarde en base de datos los datos(En las tablas UserTracker y UserTrackerPath) tendremos que configurar lo siguiente:

	session.tracker.memory.enabled=true
	session.tracker.persistence.enabled=true
	session.tracker.friendly.paths.enabled=true

Ahora si, ya podemos crear nuestro portlet. En mi caso utilizo JavaServer Faces(JSF) y la librería Javascript de Google Chart. El fichero de la vista(index.xhtml) que llama al método ‘getLiveUsers’ de la classe BoardController queda de la siguiente manera:

<script type="text/javascript" src="https://www.google.com/jsapi"></script>

    		
<script type="text/javascript">
      google.load("visualization", "1", {packages:["corechart"]});
      google.setOnLoadCallback(drawChart);
      function drawChart() {

        var data = google.visualization.arrayToDataTable([
          ['Group', 'Usuarios']
          #{boardController.getLiveUsers()}
        ]);

        var options = {
          title: 'Live portal users by Site',
          'chartArea': {'width': '95%', 'height': '80%'}
        };

        var chart = new google.visualization.PieChart(document.getElementById('liveuserschart'));

        chart.draw(data, options);
      }
    </script>

    <div id="liveuserschart" class='box'></div>

Finalmente ya solo nos queda implementar el método que devuelve los datos:

	public String getLiveUsers() {
		ThemeDisplay themeDisplay = (ThemeDisplay) FacesContext.getCurrentInstance().getExternalContext().getRequestMap().get( com.liferay.portal.kernel.util.WebKeys.THEME_DISPLAY );	
		String r="";
		
		try {
			ClassLoader cl=PortalClassLoaderUtil.getClassLoader();
			Class liveUsers=cl.loadClass("com.liferay.portal.liveusers.LiveUsers");
			
			java.lang.reflect.Method getSessionUsers=liveUsers.getDeclaredMethod("getSessionUsers", new Class[] { long.class } );
			Hashtable<String,Integer> groupsUsers=new Hashtable<String,Integer>();
			Map<String,UserTracker> sessions=(Map<String,UserTracker>) getSessionUsers.invoke( null, new Object[] { themeDisplay.getCompanyId() } );
			
			for ( UserTracker ut:sessions.values() ) {
				HttpSession hs = PortalSessionContext.get( ut.getSessionId() );
				
				String gid=""+hs.getAttribute("LIFERAY_SHARED_VISITED_GROUP_ID_RECENT");
				
				int visits=0;
				if ( groupsUsers.get(gid)!=null ) visits=groupsUsers.get(gid);

				groupsUsers.put(gid, visits+1);
				}
			
			for ( Enumeration<String> e=groupsUsers.keys(); e.hasMoreElements(); ) {
				String s=e.nextElement();
				String desc="Otros";
				
				if ( !s.equals("null") ) {
					Group g=GroupLocalServiceUtil.getGroup( Long.parseLong(s) );
										
					desc=g.getDescriptiveName();
					}
				
				r+=",['"+desc.replace("'","\'")+"("+groupsUsers.get(s)+")',"+groupsUsers.get(s)+"]";
				}
		 } catch (Exception ex) { ex.printStackTrace(); }

		
		return r;
		}

Este es el resultado final:

Liferay Live Users

Liferay Live Users

Las aplicaciones de esto para la explotación del portal son brutales. Por ejemplo: nos permite crear componentes inteligentes, que a partir de la navegación del usuario le muestre determinados contenidos. O También nos permite analizar que contenidos o productos consultan los usuarios que compran.

Leave a Reply

© Albert Coronado Calzada