miércoles, 22 de septiembre de 2010

Liferay: Registrando varios usuarios (usando complemento Hook)

He estado buscando alguna opción de Liferay que me permita crear varios usuarios a la vez... pero no tuve éxito. Pensé (y hasta pregunté en el foro de liferay.com) si se podía modificar directamente la base de datos. Pero como es un sistema complejo, hacer esto podría malograr el sistema.

Entonces pensé que debería haber otra solución utilizando el API de Liferay. Al final de todo, es una plataforma, y debería existir un API completo para ello.



Bien, el API existe, pero la documentación es bastante pobre (solo echarle un vistazo al javadoc http://docs.liferay.com/portal/6.0/javadocs/ no tiene ni una descripción de alguna clase.. al menos sirve para saber qué clases tiene el API)

Encontré en el wiki de Liferay sobre el desarrollo de extensiones para el Portal, y este me pareció interesante: http://www.liferay.com/community/wiki/-/wiki/Main/Portal+Hook+Plugins. Habla de manera general para qué sirven los Hooks dentro de Liferay y muestran algunos ejemplos.

En líneas generales, los hooks son complementos que modifican el comportamiento del liferay. Hay de tres tipos:
  • Los que se ejecutan al inicio del portal
  • Los eventos de inicio de sesión, y
  • Los eventos de servicios.
Como mi caso es crear usuarios masivamente, me corresponde crear un Hook cuando se ejecute el liferay. Otros ejemplos de Hook (como el de inicio de sesión) se puede encontrar en Adictosaltrabajo.com: http://www.adictosaltrabajo.com/tutoriales/tutoriales.php?pagina=LiferayHookPlugin

En varios tutoriales explican que debería bajarse el Kit de desarrollo (SDK) de Complementos de Liferay. Pero no se preocupen, NetBeans con el PortalPack ya nos ahorra bastante este trabajo. Así que manos a la obra.

Requisitos

Para este tutorial utilicé lo siguiente:
Si quieres saber cómo configurar el Liferay con el NetBeans, te recomiendo mi anterior post: Nuestro primer portlet en Liferay. Aunque se explica utilizando el Liferay + GlassFish, el agregar el servidor Liferay al NetBeans es el mismo procedimiento.

Creando el proyecto Hook

La creación de un proyecto hook en NetBeans es bien simple: consiste en crear un proyecto web común y corriente. A este le llamaremos "CrearUsuarios-hook"

Luego, escogemos el tipo de servidor que queremos utilizar. Naturalmente debemos escoger el Liferay, ya que con esto el NetBeans nos agregará las bibliotecas necesarias para nuestro proyecto.

Y en este paso, hacer clic en "Finish" sin crear ningún portlet.. porque lo que vamos a hacer es un Complemento Hook, no un Portlet.

Creando el complemento Hook

Bien, hasta ahora solo hemos creado el espacio de trabajo. Ahora crearemos el Hook como si fuera un archivo más. Entramos a File > New File y seleccionamos en la categoría "WebSpace/Liferay Plugins" el tipo de archivo "Hook Plugin"


Después de hacer clic en "Next", especificamos qué tipo de Hook es el que vamos a crear. Como queremos que se ejecute al inicio del Portal, seleccionamos en "Event Type" el valor "application.startup.events". El nombre de la clase será CrearUsuariosHookAction en el paquete hook.



Clic en Finish y listo.. ya tenemos nuestra clase en blanco listo para llenar.



Registrando los usuarios

Como les comenté al inicio, la documentación es bastante pobre. Creo que es por la cantidad de clases que contiene. Pero no hay problema. Ya existe un ejemplo (también, sin documentación) de cómo utilizar el API de Liferay. Su nombre es sevencogs-hook y está disponible en la página del proyecto Liferay en sourceforge.net. Aquí están los archivos:
Mi opinión es que el ejemplo de Liferay 5.2 es el más claro.

Por si causa confusión donde encontrar el ejemplo exacto, el código fuente del Hook son los siguientes:

El código es bastante entendible. Basta entender las variables utilizadas. Aquí muestro mi código que es compatible con Liferay 6

    private void doRun(long companyId) {

        try {
            String firstName = "Diego";
            String lastName = "Silva";
            boolean male = true;
            String jobTitle = "Consultor Java";
            String screenName = "diego.silva";
            long creatorUserId = 0;
            long facebookId = 0;
            boolean autoPassword = false;
            String password1 = screenName;
            String password2 = password1;
            boolean autoScreenName = false;
            String emailAddress = screenName + "@apuntesdejava.com";
            String openId = StringPool.BLANK;
            Locale locale = new Locale("ES", "PE");
            String middleName = StringPool.BLANK;
            int prefixId = 0;
            int suffixId = 0;
            int birthdayMonth = Calendar.MARCH;
            int birthdayDay = 27;
            int birthdayYear = 1976;
            Country country = CountryServiceUtil.getCountryByA2("PE");
            long countryId = country.getCountryId();
            long regionId = 0;
            Group guestGroup = GroupLocalServiceUtil.getGroup(companyId, GroupConstants.GUEST);
            long[] groupIds = new long[]{guestGroup.getGroupId()};
            long[] userGroupIds = null;
            boolean sendEmail = false;
            Role adminRole = RoleLocalServiceUtil.getRole(
                    companyId, RoleConstants.ADMINISTRATOR);

            Role powerUserRole = RoleLocalServiceUtil.getRole(
                    companyId, RoleConstants.POWER_USER);
            long[] roleIds = new long[]{
                adminRole.getRoleId(), powerUserRole.getRoleId()
            };
            int statusId = GetterUtil.getInteger(PropsUtil.get("sql.data.com.liferay.portal.model.ListType.organization.status"));
            String comments = null;
            ServiceContext serviceContext = null;
            System.out.print("Creando organización...");
            //creando la organización
            long userId=UserLocalServiceUtil.getDefaultUserId(companyId);
            long parentOrganizationId =
   OrganizationConstants.DEFAULT_PARENT_ORGANIZATION_ID;
            boolean recursable = true;
            Organization apuntesOrganization = OrganizationLocalServiceUtil.addOrganization(userId, parentOrganizationId, "Apuntes de Java",
                    OrganizationConstants.TYPE_REGULAR_ORGANIZATION,
                    recursable, regionId, countryId, statusId,
                    comments, serviceContext);
            long[] organizationIds = new long[]{apuntesOrganization.getOrganizationId()};
            System.out.println("... registrado con ID:"+apuntesOrganization.getOrganizationId());
            //registrando el usuario
            System.out.print("Creando usuario...");
            User user = UserLocalServiceUtil.addUser(creatorUserId, companyId,
                    autoPassword, password1, password2,
                    autoScreenName, screenName, emailAddress, facebookId,
                    openId, locale,
                    firstName, middleName, lastName,
                    prefixId, suffixId, male, birthdayMonth,
                    birthdayDay, birthdayYear,
                    jobTitle, groupIds, organizationIds,
                    roleIds, userGroupIds, sendEmail, serviceContext);
            System.out.println("... creado con ID:"+user.getUserId());
        } catch (PortalException ex) {
            LOGGER.log(Level.SEVERE, null, ex);
        } catch (SystemException ex) {
            LOGGER.log(Level.SEVERE, null, ex);
        }
    }
Aquí se ve que se ha creado una organización nueva llamada "Apuntes de Java" y el usuario que es perteneciente a ella.

La diferencia con Liferay 5, es que en el 6 hay un nuevo parámetro llamado facebookId. Todos los demás campos son iguales. Así que considere esta característica cuando hagas un Hook de crear usuarios en Liferay 5 o 6.

Ejecutando el proyecto

Desde nuestro IDE bastará con ejecutar el proyecto y esperar que se despliegue en el servidor local.

Y aquí vemos la organización creada...


Y el usuario creado...



Para crear varios usuarios, bastará con repetir la misma operación con cada uno de ellos. O si se desea importar de una tabla preexistente, consideren hacer una conexión por JDBC a la base de datos donde se tienen los usuarios a cargar, y dentro de un while (rs.next()) llamar al método UserLocalServiceUtil.addUser()

Desplegando en servidor de producción

Para ponerlo en producción, primero debemos construir el .war. Esto es simple, basta con darle clic derecho al ícono del proyecto y seleccionar build. Con esto nos generará el archivo .war listo para desplegarlo en el servidor.

Hay dos maneras para desplegarlo en un servidor en producción. Una es utilizando el ControlPanel de Liferay y utilizar la opción "Instalar complemento", seleccionamos el archivo .war e instalarlo.



La otra es copiar el archivo .war en el directorio deploy que se encuenrta dentro del directorio instalado de Liferay.

Código fuente

Y no podía faltar el código fuente del proyecto utilizado para este tutorial:
http://kenai.com/projects/apuntes/downloads/download/ejemplos%252Fliferay%252FCrearUsuarios-hook.tar.gz

¡Que les sea de utilidad!


8 comentarios:

  1. Buen artículo. Te retwitteo.
    Un saludo,
    Juan Fernández
    Liferay Core Engineer

    ResponderEliminar
  2. Excelente tutorial te felicito, segui asi!

    ResponderEliminar
  3. Gracias por la información, está muy entretenida.

    ResponderEliminar
  4. Diego, Cuál es el código para agregar un Grupo de Usuario??

    ResponderEliminar
  5. Hola Nano.
    la clase es UserGroupLocalServiceUtil.
    Revisa los métodos aquí:
    http://docs.liferay.com/portal/6.0/javadocs/com/liferay/portal/service/UserGroupLocalServiceUtil.html

    ResponderEliminar
  6. Genial, muy bien, muy agradecido.

    ResponderEliminar

Si quieres hacer una pregunta más específica, hazla en los foros que tenemos habilitados en Google Groups


Ah! solo se permiten comentarios de usuarios registrados. Si tienes OpenID, bienvenido! Puedes obtener su OpenID, aquí: http://openid.net/