AnsweredAssumed Answered

Modificar una categoría de padre

Question asked by durdy48 on May 14, 2009
Hola.
Estoy intentando desarrollar para la versión 2.2.0 un módulo para poder modificar a una categoría de padre, de forma que se personalizan las jsp: categories.jsp y una nueva change-category.jsp
Para ello tengo un bean creado que extiende de CategoriesBean.java con un atributo nuevo que es de tipo NodeRef llamado "catPadreRef" el cual es el campo que se selecciona en el formulario como nueva categoría padre (el campo del formulario es el componente "r:categorySelector" el cual reutilizo para tener el árbol de navegación de categorías.
La cuestión es que en el método del bean "finishChange()" que es el que realiza la lógica del movimiento de categoría hago lo siguiente:

                     *       1. obtendremos en primer lugar todas las categorias hijas de la que queremos cambiar
                     *       2. después también todos los contenidos que tengan esa categoría aplicada
                     *       3. crearemos una nueva categoría por debajo del padre que hayamos seleccionado
                     *       4. entonces a cada subcategoría   la reasignaremos a la nueva categoría
                     *       5. y a cada contenido le eliminamos la antigua categoría?? y le asignamos la nueva categoría
                     *       6. por último se eliminará la categoría anterior, quedando la nueva con todo el contenido de la vieja

Pues parece que funciona todo excepto el tema de las categorías hijas, es decir, la categoría se crea por debajo del nuevo padre y se elimina de su ubicación anterior, y cada contenido que estuviera categorizado por la antigua categoría se actualiza a la nueva (será la misma pero cambia el id al ser nueva).
Sin embargo con las categorías hijas no sé qué tratamiento darles, ya que he iterado sobre ellas y he intentado crear una nueva relacion padre-hija con respecto a la categoría nueva, la cuál se crea bien (lo he comprobado en base de datos que se crea un registro en la tabla correspondiente…) sin embargo, cuando navego por el nuevo arbol de categorías las subcategorías han desaparecido!!

Adjunto el código del método "finishChange()" por si alguien puede echarme una mano:

public final String finishChange()
    {
      logger.info("_____________Llegamos a FINISH_____________");
      logger.info("_____________Referencia del nodo de categoria que estamos tratando (getNodeRef):" + getActionCategory().getNodeRef() + "_____________");
      logger.info("_____________Referencia del nodo del nuevo padre de la categoria que estamos tratando:" + catPadreRef.getId() + "_____________");
      
        String outcome = "finish";
        try
        {
            FacesContext context = FacesContext.getCurrentInstance();
            RetryingTransactionHelper txnHelper = Repository.getRetryingTransactionHelper(context);
            org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback callback = new org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback() {

                public NodeRef execute()
                    throws Throwable
                {
                    NodeRef nodeRef = getActionCategory().getNodeRef();
                   
                    /**
                     * ADR
                     *       Para cambiar de padre una categoría vamos a seguir estos pasos:
                     *       1. obtendremos en primer lugar todas las categorias hijas de la que queremos cambiar
                     *       2. después también todos los contenidos que tengan esa categoría aplicada
                     *       3. crearemos una nueva categoría por debajo del padre que hayamos seleccionado
                     *       4. entonces a cada subcategoría   la reasignaremos a la nueva categoría
                     *       5. y a cada contenido le eliminamos la antigua categoría?? y le asignamos la nueva
                     *       6. por último se eliminará la categoría anterior, quedando la nueva con todo el contenido de la vieja
                     */
                   
                    // Buscamos todas las categorias hijas de la que estamos tratando
                    Collection<ChildAssociationRef> categoriasHijas = getCategoryService().getChildren(nodeRef, CategoryService.Mode.SUB_CATEGORIES, CategoryService.Depth.IMMEDIATE);
                    logger.info("_____________categoriasHijas: "+ categoriasHijas.size() +"_____________");
                                                       
                    // Buscamos todos los documentos que tienen la categoría que tratamos
                    Collection<ChildAssociationRef> documentosCategorizados = getCategoryService().getChildren(nodeRef, CategoryService.Mode.MEMBERS, CategoryService.Depth.IMMEDIATE);
                    logger.info("_____________documentosCategorizados: "+ documentosCategorizados.size() +"_____________");
                   
                  logger.info("_____________Nueva Categoria Padre: " + catPadreRef.getId() + "_____________");

                   
                    // Creamos una nueva categoría que tenga como padre el mismo que la que tratamos
                    NodeRef nuevaCatRef = getCategoryService().createCategory(catPadreRef, getName());
                    getNodeService().setProperty(nuevaCatRef, ContentModel.PROP_DESCRIPTION, getDescription());
                    logger.info("_____________ID Nueva Categoria: " + nuevaCatRef.getId() + "_____________");
                   
                   
                    //Añadimos a las categorías hijas la nueva categoria creada como padre
                   
                    logger.info("_____________Añadimos a la/s " + categoriasHijas.size() + " categorías hijas la nueva categoria creada como padre_____________");
                   
                   
                    for(ChildAssociationRef catHija: categoriasHijas){
                       Node nodo = new Node(catHija.getChildRef());
                       logger.info("_____________Categoría Hija: " + nodo.getName() + "_____________");
                       logger.info("_____________Categoría Hija TYPEQNAME: " + catHija.getTypeQName() + "_____________");
                       logger.info("_____________Categoría Hija QNAME: " + catHija.getQName() + "_____________");
                       logger.info("_____________Categoría Hija ID: " + catHija.getChildRef() + "_____________");
                       
                       
                       
                       String uri = getNodeService().getPrimaryParent(nuevaCatRef).getQName().getNamespaceURI();
                       logger.info("_____________URI: " + uri + "_____________");
                        String validLocalName = QName.createValidLocalName(nodo.getName());
                        logger.info("_____________VALIDLOCALNAME: " + validLocalName + "_____________");
                        //getNodeService().createNode(nuevaCatRef, ContentModel.ASSOC_SUBCATEGORIES, QName.createQName(uri, validLocalName), ContentModel.TYPE_CATEGORY);
                        //ChildAssociationRef assocHija = getNodeService().addChild(nuevaCatRef, catHija.getChildRef(), ContentModel.ASSOC_SUBCATEGORIES, ContentModel.TYPE_CATEGORY);
                                               
                        getNodeService().removeAssociation(catHija.getChildRef(), catHija.getParentRef(), catHija.getTypeQName());
                        logger.info("_____________Eliminamos la asociación con la categoría padre_____________");                       
                       
                        ChildAssociationRef assocHija = getNodeService().addChild(nuevaCatRef, nodo.getNodeRef(), ContentModel.ASSOC_SUBCATEGORIES, catHija.getQName());
                       
                        if (assocHija != null){
                           logger.info("_____________Establecemos una asociación hija entre las categorías: HIJA = " + assocHija.getChildRef().getId()+ " y PADRE = " + assocHija.getParentRef().getId() + "_____________");
                        }else{
                           logger.info("_____________NO SE HA ESTABLECIDO asociación entre las categorías!!!_____________");                           
                        }                       
                       
                    }
                   
                    //Para que las categorias hijas no tengan que realizar ninguna operación de actualización lo que hacemos es
                    //que después de eliminar la categoría actual al tener almacenado en la variable nodeRef su id lo usamos
                    //para modificar el id de la nueva categoria creada con este valor
                    getCategoryService().deleteCategory(nodeRef);                                       
                    logger.info("_____________Ahora hemos borrado el noderef de la categoría actual_____________");
                    //getNodeService().setProperty(nuevaCatRef, ContentModel.PROP_NODE_REF, idCategoriaEliminada);
                    //logger.info("_____________ID Nueva Categoria con el nodeRef ORIGINAL: " + nuevaCatRef.getId() + "_____________");
                    //logger.info("_____________Y le hemos puesto a la propiedad nodeRef de la nueva categoría el nodeRef de la categoría recien eliminada…q pasará???_____________");
                    //logger.info("_____________Entonces la nueva Categoria tiene como nodeRef: " + nuevaCatRef.getId() + "_____________");
                   
                  //Añadimos a los documentos la nueva categoria creada
                    logger.info("_____________Añadimos a los " + documentosCategorizados.size() + " documentos la nueva categoria creada_____________");
                    ArrayList<NodeRef> categorias = new ArrayList<NodeRef>(1);
                    categorias.add(nuevaCatRef);
                   
                    for (ChildAssociationRef doc: documentosCategorizados){
                       
                       Node nodo = new Node(doc.getChildRef());
                       logger.info("_____________Documento: " + nodo.getName() + "_____________");
                       
                       if (!getNodeService().hasAspect(doc.getChildRef(), ContentModel.ASPECT_GEN_CLASSIFIABLE)){
                          HashMap<QName, Serializable> props = new HashMap<QName, Serializable>();
                           props.put(ContentModel.PROP_CATEGORIES, categorias);
                           getNodeService().addAspect(doc.getChildRef(), ContentModel.ASPECT_GEN_CLASSIFIABLE, props);
                       }else{
                          getNodeService().setProperty(doc.getChildRef(), ContentModel.PROP_CATEGORIES, categorias);
                       }
                    }
                   
                    //return nodeRef;
                    return nuevaCatRef;
                }

               
                final CategoriasCehBean this$0;

           
            {
                this$0 = CategoriasCehBean.this;
                //super();
            }
            };
            NodeRef nodeRef = (NodeRef)txnHelper.doInTransaction(callback);
           
            /*
            // edit the node in the breadcrumb if required
            List<IBreadcrumbHandler> location = getLocation();
            IBreadcrumbHandler handler = location.get(location.size() - 1);
           
            // see if the current breadcrumb location is our node
            if ( nodeRef.equals(((IRepoBreadcrumbHandler)handler).getNodeRef()) )
            {
               // and update with the modified node details
               logger.info("_____________Entramos en el IF_____________");
               IBreadcrumbHandler newHandler = new CategoryBreadcrumbHandler(
                     nodeRef, Repository.getNameForNode(getNodeService(), nodeRef));
               location.set(location.size(), newHandler);
            }
            */
            updateUILocation(nodeRef);
         }
        catch(Throwable err)
        {
            Utils.addErrorMessage(MessageFormat.format(Application.getMessage(FacesContext.getCurrentInstance(), "error_generic"), new Object[] {
                err.getMessage()
            }), err);
            outcome = null;
        }
        //contextUpdated();
        return outcome;
    }

Espero que si alguien me ha entendido,  :?  jeje , que me ayude por favor.

Gracias.
Un saludo.

Outcomes