Alfresco · Orden de la lista de entradas del Blog

En ocasiones resulta conveniente que las entradas de un Blog no aparezcan ordenadas cronológicamente por orden de publicación. En nuestro uso interno de Alfresco, vamos incluyendo entradas para los proyectos a medida que vamos recibiendo o generando información. No obstante, en algunos casos es necesario insertar una entrada en un orden intermedio a su publicación: bien porque la información no estaba disponible en el momento en indicado o bien porque hemos olvidado incluirla.

Alfresco utiliza para la ordenación de entradas en el Blog las clases DraftsAndPublishedBlogPostsCannedQueryGetBlogPostsCannedQuery, junto con sus factorías DraftsAndPublishedBlogPostsCannedQueryFactory y GetBlogPostsCannedQueryFactory. El problema en ambos casos es el mismo: los criterios de ordenación se fijan directamente en el código fuente, por lo que no es posible cambiarlos por parametrización.

Ambas clases heredan de AbstractBlogPostsCannedQueryFactory, que restringe los criterios admisibles para la comparación de entradas de blog: PUBLISHED, CREATED y POSTED.

package org.alfresco.repo.blog.cannedqueries;

public abstract class AbstractBlogPostsCannedQueryFactory extends AbstractQNameAwareCannedQueryFactory<BlogEntity>
{
    protected static class BlogEntityComparator extends PropertyBasedComparator<BlogEntity>
    {
        public BlogEntityComparator(QName comparableProperty)
        {
            super(comparableProperty);
        }
        
        @SuppressWarnings("unchecked")
        @Override
        protected Comparable getProperty(BlogEntity entity) {
           if (comparableProperty.equals(ContentModel.PROP_PUBLISHED))
           {
               return entity.getPublishedDate();
           }
           else if (comparableProperty.equals(ContentModel.PROP_CREATED))
           {
               return entity.getCreatedDate();
           }
           else if (comparableProperty.equals(BlogIntegrationModel.PROP_POSTED))
           {
               return entity.getPostedDate();
           }
           else
           {
               throw new IllegalArgumentException("Unsupported blog sort property: "+comparableProperty);
           }
        }
    }
}

Por otra parte en las factorías, como en la GetBlogPostsCannedQueryFactory, se incluyen explícitamente estos parámetros de ordenación de la lista de entradas. Se incluye a continuación uno de los métodos de esta factoría que fija por código la ordenación para el criterio PUBLISHED.

package org.alfresco.repo.blog.cannedqueries;

public class GetBlogPostsCannedQueryFactory extends AbstractBlogPostsCannedQueryFactory
{
    
    public CannedQuery<BlogEntity> getGetPublishedCannedQuery(NodeRef blogContainerNode, Date fromDate, Date toDate, String byUser, PagingRequest pagingReq)
    {
        ParameterCheck.mandatory("blogContainerNode", blogContainerNode);
        ParameterCheck.mandatory("pagingReq", pagingReq);
        
        int requestTotalCountMax = pagingReq.getRequestTotalCountMax();
        
        boolean isPublished = true;
        GetBlogPostsCannedQueryParams paramBean = new GetBlogPostsCannedQueryParams(getNodeId(blogContainerNode),
                                                                                    getQNameId(ContentModel.PROP_NAME),
                                                                                    getQNameId(ContentModel.PROP_PUBLISHED),
                                                                                    getQNameId(ContentModel.TYPE_CONTENT),
                                                                                    byUser,
                                                                                    isPublished,
                                                                                    fromDate, toDate,
                                                                                    null, null);
        
        CannedQueryPageDetails cqpd = createCQPageDetails(pagingReq);
        CannedQuerySortDetails cqsd = createCQSortDetails(ContentModel.PROP_PUBLISHED, SortOrder.DESCENDING);
        
        // create query params holder
        CannedQueryParameters params = new CannedQueryParameters(paramBean, cqpd, cqsd, requestTotalCountMax, pagingReq.getQueryExecutionId());
        
        // return canned query instance
        return getCannedQuery(params);
    }
}

Por este motivo, la personalización de esta funcionalidad resulta bastante compleja, ya que debe realizarse una sobreescritura selectiva de estos beans para poder programar el comportamiento deseado. Para ello, basta con encontrar el bean blogService en el fichero blog-context.xml y sobreescribir los beans necesarios en el context del módulo de personalización.

Conclusiones
Es difícil estimar el tiempo necesario para realizar una extensión sobre Alfresco cuando se trata de áreas con las que no se ha trabajado. En estos casos siempre resulta más aconsejable estudiar previamente la estructura de los componentes antes de aventurar un plazo de entrega.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s