Liferay: fecha de caducidad de los mensajes (tablero de mensajes)

¿Me estoy perdiendo algo obvio, o no hay una forma razonable o factible de agregar una fecha de vencimiento a los mensajes en el tablero de mensajes de Liferay?

El primer problema es cómo ingresar la fecha de vencimiento en el editor de mensajes. La solución más obvia es quizás un atributo de expansión, pero parece que no hay un tipo de datos de expansión para las fechas (solo fecha y hora) y no encuentro forma de establecer un valor predeterminado calculado en el atributo de expansión (por ejemplo, hoy + 6 meses). Incluso sin un valor predeterminado, un atributo de fecha y hora tiene como valor predeterminado el 1 de enero de 1970, 0:00 GMT y usar el selector de fecha para ingresar una fecha de vencimiento real es bastante tedioso. Después de ingresar la fecha de vencimiento, no hay una forma obvia de validarla (por ejemplo, restringirla a fechas entre hoy y hoy + 6 meses) y cuando se muestra la fecha en la vista de mensajes, la configuración regional actual no se usa para formatear la fecha y hora.

Incluso si de alguna manera lograra exprimir la fecha de vencimiento en un atributo de expansión, no hay otra forma obvia de evaluar la fecha de vencimiento.

Habría sido aceptable que los mensajes aún persistan, pero no se cuenten ni se muestren en el portlet MB. Sin embargo, los métodos en MBThreadServiceUtil para acceder a los mensajes no ofrecen ningún criterio de filtrado adicional, por lo que tengo que cargar todos los mensajes y hacer las operaciones de conteo/filtro en código Java (difícilmente una solución muy inteligente) o tendría que reescribir todo pila de servicios "de abajo hacia arriba" y agregar métodos de obtención o búsqueda, que pueden reenviar el filtrado a la base de datos.

La solución preferida sería tener una tarea programada, que elimine regularmente los mensajes caducados por completo. Dado que el portlet MB admite ámbitos (los mensajes están relacionados con el ámbito del portlet) y la tarea programada no se ejecuta dentro de un contexto de portlet, tendría que obtener acceso a la identificación del ámbito de alguna manera. Si entiendo la documentación y las discusiones disponibles sobre este tema, el ámbito predeterminado debería ser la comunidad a la que pertenece la página. Por otro lado, nuestra "página del tablero de mensajes" se agrega en el nivel de la organización, y la identificación del alcance de los mensajes no coincide ni con la identificación de la organización ni con ninguna de las identificaciones de las comunidades en la organización. ¿Alguien tiene una idea sobre cómo determinar la identificación del alcance en este caso?

preguntado el 03 de mayo de 12 a las 18:05

¿Qué versión de Liferay estás usando 6.0 o 6.1? También supongo que ha ajustado el portlet a la página a través de la ventana emergente Configuración --> Ámbito --> cambió el menú desplegable de selección a Página actual, ¿es este el caso? -

Estamos usando 6.0.5 CE. El portlet tiene como ámbito el "ámbito predeterminado" y no la página. -

1 Respuestas

Lo haría con una tarea programada: uso de liferay aquí para Quartz; http://liferaysnippets.com/how-to-create-cron-job-in-liferay/

Los mensajes caducados que puede retener con DynamicQueries:

    Calendar c = Calendar.getInstance();
    c.add(Calendar.MONTH, -6);
    Date halfYearAgo = c.getTime();
    ClassLoader portalClassLoader = PortalClassLoaderUtil.getClassLoader();
    DynamicQuery query = DynamicQueryFactoryUtil.forClass(MBThread.class, portalClassLoader)
            .add(PropertyFactoryUtil.forName("lastPostDate").le(halfYearAgo)).addOrder(OrderFactoryUtil.asc("lastPostDate"));

    try {
        List dynamicQuery = MBThreadLocalServiceUtil.dynamicQuery(query);
        for (Object object : dynamicQuery) {
            MBThread thread = (MBThread) object;
            MBThreadLocalServiceUtil.deleteMBThread(thread);
        }
    } catch (SystemException e) {
        e.printStackTrace();
    }

contestado el 04 de mayo de 12 a las 02:05

Esto realmente no responde a mi pregunta. Elimina los hilos en función de la última fecha de publicación y no en función de una fecha de vencimiento configurable. Por alguna razón, tengo entidades MBThread, que no provienen del portlet del tablero de mensajes, por lo que incluso si las eliminara en función de la última fecha de publicación, necesitaría un criterio adicional con el alcance correcto (consulte el último párrafo en mi pregunta sobre el problema de determinar el alcance correcto). - jarnbjo

ok, entonces, puede crear un atributo expando y agregarlo programáticamente a MBThread, cuando la página actual esté en el alcance requerido. Puede hacer esto con la propiedad "value.object.listener.com.liferay.portlet.messageboards.model.MBThread=com.my.MyChanger". Implemente el método "onAfterCreate(MBThread mbThread) ... - Mark

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.