Récupérer un NodeRef à partir d'un nom de fichier

cancel
Showing results for 
Search instead for 
Did you mean: 
francky31
Member II

Récupérer un NodeRef à partir d'un nom de fichier

Bonjour, je dois écrire un composant alfresco chargé de généré un document dans un espace quelconque à partir d'un template (lui aussi stocké dans un espace Alfresco. Ce composant doit etre appelable par Web Service .
J'ai donc écrit la custom action suivante qui prend 3 paramètres :
- une string contenant le nom du fichier à générer: (ex: docgenere.zip)
- une string contenant le répertoire (l'espace) de destination:
- une 3eme  parametre sans importance pour la questionservant uniquement à la génération

Ma question: comment récupérer à partir du nom du fichier et du nom du répertoire un NodeRef ? le but étant de récupérer un outputStream pour générer mon fichier ?

Merci pour vos réponses



public class GenDocActionExecuter extends ActionExecuterAbstractBase {
    /** The logger */
    private static Log logger = LogFactory.getLog("xxx.yyy");

    /** The name of the action */
    public static final String NAME = "gen_doc_eds-action";

    /** The parameter names */
    public static final String PARAM_XML_INPUT = "param-xml-input";
    public static final String PARAM_DESTINATION_FILE = "param_destination-file";
    public static final String PARAM_DESTINATION_FOLDER = "param_destination-folder";

    /** Standard Alfresco manager allowing manipulating Alfresco object */
    private ContentService contentService = null;
    private NodeService nodeService = null;

    /**
     *
     * @see org.alfresco.repo.action.executer.ActionExecuterAbstractBase#executeImpl(org.alfresco.service.cmr.action.Action,
     *      org.alfresco.service.cmr.repository.NodeRef)
     */
    @Override
    protected void executeImpl(Action action, NodeRef actionedUponNodeRef) {
        logger.debug("GenDocActionExecuter entering …");
       
        if (!nodeService.exists(actionedUponNodeRef)) {
            logger.error("GenDocActionExecuter template doesn't exist: " + actionedUponNodeRef.toString());
            return;
        }

        /* get the parameter of the action */
        String xmlInput = (String) action.getParameterValue(PARAM_XML_INPUT);
        logger.debug("GenDocActionExecuter —> xmlInput " + xmlInput);

        String fileName = (String) nodeService.getProperty(actionedUponNodeRef,
                ContentModel.PROP_NAME);
        logger.debug("GenDocActionExecuter —> fileName " + fileName);

        // Get a reader, then ZipInputStream on the template
        // ————————————————–
        ContentReader reader = contentService.getReader(actionedUponNodeRef,
                ContentModel.PROP_CONTENT);
        InputStream in = reader.getContentInputStream();
        ZipInputStream zin = new ZipInputStream(in);

        // Get a writer, then a ZipOutputStrem on the generated document
        // ————————————————————
        String sdestinationFolder = (String) action
                .getParameterValue(PARAM_DESTINATION_FOLDER);
        String destinationFile = (String) action
                .getParameterValue(PARAM_DESTINATION_FILE);

       
        NodeRef nodeRef=     ???? getNodeRef à partir de sdestinationFolder et destinationFile        ?????
       

        
        ContentWriter writer = contentService.getWriter(nodeRef,
                ContentModel.PROP_CONTENT, true);
        OutputStream outStream = writer.getContentOutputStream();
        ZipOutputStream out = new ZipOutputStream(outStream);

        byte[] buf = new byte[1024];

        try {
            ZipEntry entry = zin.getNextEntry();
            while (entry != null) {
                String name = entry.getName();
                logger.debug("Extracting: " + name);
                out.putNextEntry(new ZipEntry(entry.getName()));

                OutputStream tempOut = null;

                if (name.equals("customXml/item1.xml")) {
                    ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
                    tempOut = byteOut;
                } else {
                    tempOut = out;
                }
                int len;
                while ((len = zin.read(buf)) > 0) {
                    tempOut.write(buf, 0, len);
                }
                if (name.equals("customXml/item1.xml")) {
                    tempOut.write(xmlInput.getBytes("utf-8"));
                }
                entry = zin.getNextEntry();
            }
            zin.close();
            out.close();
        } catch (UnsupportedEncodingException e) {
            logger.error("Error generating document", e);
        } catch (IOException e) {
            logger.error("Error generating document", e);
        }

        logger.debug("GenDocActionExecuter ending …");

    }

4 Replies
rivarola
Active Member

Re: Récupérer un NodeRef à partir d'un nom de fichier

Bonjour,

Ce n'est pas directement une réponse à ta question mais si c'est toi qui génère le document à partir du nom donné c'est toi qui va appeler le NodeService pour créer le noeud. Tu vas donc récupérer le NodeRef du noeud généré.
francky31
Member II

Re: Récupérer un NodeRef à partir d'un nom de fichier

c'est bien la la question: comment à partir du nodeService je crée mon NodeRef (ou tout autre objet qui me permettrait de créer mon fichier).
J'ai bien vu qu'il y avait une methode nodeService.createNode().
Le problème c'est que:
1) on trouve trouve très peu de doc à son sujet :
2) elle prend en premier paramètre un NodeRef (je suppose qu'il s'agit du noeud parent). Celà me ramène  à ma premiière question: comment on construit un NodeRef à partir d'un path de fichier ou de répertoire ? J'ai essayé plusieurs type de syntaxe mais sans succès.

Merci
rivarola
Active Member

Re: Récupérer un NodeRef à partir d'un nom de fichier

Je ne l'ai pas sous les yeux mais il y a une méthode dans le FileFolderService pour résoudre un noeud par son chemin. Quand à la doc, le mieux pour débuter est d'acheter le livre "Alfresco Developer Guide". Les exemples de création de noeuds avec le NodeService sont à la page 495.
francky31
Member II

Re: Récupérer un NodeRef à partir d'un nom de fichier

Ok, merci pour ces réponses.
Je vais explorer le FileFolderService.
Merci également pour la référence du bouquin que je ne connaissais pas (et que je vais très certainement acheter)