Get it on Google Play
21-02-2018
 

Formación Liferay: Añadir contenido automáticamente a través del API

API Liferay JournalArticle

API Liferay JournalArticle

Liferay tiene una API que nos permite interactuar con el portal para hacer casi cualquier cosa, aunque algunas cosas son un poco complejas. Un ejemplo de cosa un tanto tediosa es el incluir contenido web automáticamente en el portal.

Nuestro sistema va a coger los datos de una base de datos(Podríamos cogerlos de una API Rest o cualquier otro lugar) y los va a inyectar al portal, además también vamos a comprobar que ese contenido no exista previamente en el portal.

Empezaremos comprobando que el contenido no exista en la base de datos, en caso de existir lo leerá y en caso de no existir lo va a crear y vamos a poner la variable ‘create’ a true para usarla mas adelante:

boolean create=false;
List<JournalArticle> jas=JournalArticleLocalServiceUtil.getJournalArticlesByUuidAndCompanyId(uuid, themeDisplay.getCompanyId());
	
JournalArticle ja=null;			
if ( jas.size()==0 ) {
	ja=JournalArticleLocalServiceUtil.createJournalArticle( 
							CounterLocalServiceUtil.increment( JournalArticle.class.getName() )
							);
	create=true;
} else {
	ja=jas.get(0);
	}

Ahora vamos a poner/modificar el contenido al contenido web(JournalArticle):

ja.setUuid( uuid );
ja.setIndexable(true);
ja.setArticleId( rs.getString("articleid") );
ja.setGroupId( groupId );
ja.setCreateDate( rs.getDate("createDate") );
ja.setModifiedDate( rs.getDate("modifiedDate") );
ja.setVersion( rs.getDouble("version") );
ja.setTitle("<?xml version='1.0' encoding='UTF-8'?><root available-locales='ca_ES' default-locale='ca_ES'><Title language-id='ca_ES'>XXX</Title></root>");
ja.setUrlTitle( rs.getString("urlTitle") );
ja.setDescription( rs.getString("description") );
ja.setContent( replaceFields(rs.getString("content")) );
ja.setDisplayDate( rs.getDate("displayDate") );
ja.setExpirationDate( rs.getDate("expirationDate") );
ja.setStatus( 0 );
				
ja.setDDMStructureKey( newStructureId );
ja.setDDMTemplateKey( newTemplateId );

Ahora vamos a buscar, y si no existe crear el recurso(JournalArticleResource), necesario para dar los permisos de lectura, y se lo pondremos al contenido:

JournalArticleResource jar=JournalArticleResourceLocalServiceUtil.fetchArticleResource(groupId, rs.getString("articleid"));
				
if ( jar==null ) {
	jar=JournalArticleResourceLocalServiceUtil.createJournalArticleResource(
		CounterLocalServiceUtil.increment( JournalArticleResource.class.getName() )
		);
						
	jar.setGroupId( groupId );
	jar.setCompanyId( themeDisplay.getCompanyId() );
	jar.setArticleId( rs.getString("articleid") );
						
	JournalArticleResourceLocalServiceUtil.addJournalArticleResource( jar );
	}
			
ja.setResourcePrimKey( jar.getResourcePrimKey() );

Con esto ya solo nos quedar crear o actualizar el registro con el contenido web y actualizar el asset(Para que se indexe bien):

if ( create ) {
	ja=JournalArticleLocalServiceUtil.addJournalArticle(ja);
} else { 
	ja=JournalArticleLocalServiceUtil.updateJournalArticle(ja);
	}
				
JournalArticleLocalServiceUtil.updateAsset(
	themeDisplay.getUserId(), 
	ja, 
	new long[] {}, 
	new String[] {}, 
	new long[] {}, 
	(double) 0
	);

Finalmente le ponemos los permisos de lectura al rol ‘Guest’ para que se pueda ver en el portal por todo el mundo:

try {
	rp=ResourcePermissionLocalServiceUtil.getResourcePermission(
		themeDisplay.getCompanyId(), 
		JournalArticle.class.getName(), 
		4, 
		""+ja.getResourcePrimKey(),
					
		RoleLocalServiceUtil.getRole( themeDisplay.getCompanyId(), 					
		RoleConstants.GUEST).getRoleId()
		);
} catch (Exception ex) { }

if ( rp==null ) 
	ResourcePermissionLocalServiceUtil.setResourcePermissions(
		themeDisplay.getCompanyId(), 
		JournalArticle.class.getName(), 
		4, 
		""+ja.getResourcePrimKey(),

		RoleLocalServiceUtil.getRole( themeDisplay.getCompanyId(),
		RoleConstants.GUEST).getRoleId(),
		new String[] { ActionKeys.VIEW }
		);

Como veis insertar contenidos al portal a través del API es fácil cuando se sabe como.

Si te ha servido, por favor comparte

Interesado en formación Liferay?

 

Leave a Reply