cancel
Showing results for 
Search instead for 
Did you mean: 

Je souhaiterais récupérer le chemin CIFS d'un fichier...

marinew
Champ in-the-making
Champ in-the-making
Bonjour,

Je souhaiterais récupérer le chemin CIFS d'un fichier à partir d'un objet Node en Java. Une méthode qui saurait me ramener quelque chose du genre "\LeServeur_AlecheminCIFSverslefichier.pdf

J'ai beau chercher sur les forums, dans le Wiki anglophone, dans la JavaDoc, je ne trouve pas.
Merci d'avance.
7 REPLIES 7

bmagnier
Champ in-the-making
Champ in-the-making
Bonjour,

Un rapide coup d'oeil dans les sources du client web (plus précisément dans le BaseDetailsBean) indique une solution :
import org.alfresco.web.ui.common.Utils;
Utils.generateURL(FacesContext.getCurrentInstance(), node, URLMode.CIFS);
Notez le "FacesContext.getCurrentInstance()" qui suppose que l'on se trouve dans une application Faces telle que le client Web d'Alfresco.

Bertrand.

marinew
Champ in-the-making
Champ in-the-making
Merci beaucoup pour votre aide, ce n'est pas évident de se retrouver dans la masse d'informations quand on démarre avec Alfresco.

Savez-vous s'il y a une autre possibilité, si on n'est pas dans un contexte Faces ?

J'ai bien trouvé des choses intéressantes dans la classe org.alfresco.filesys.smb.server.repo.ContentDiskDriver du jar alfresco-repository, mais je ne vois pas du tout comment je pourrais utiliser cette classe (comment l'instancier en particulier), ou comment faire de même (ce qui implique de récupérer un objet org.alfresco.filesys.server.filesys.TreeConnection)…

Voici le code que j'ai trouvé :
String path = getPathForNode( tree, linkRef);
               path = path.replace( FileName.DOS_SEPERATOR, '/');
               
                // Build the URL file data
               
                StringBuilder urlStr = new StringBuilder();
           
                urlStr.append("[InternetShortcut]rn");
                urlStr.append("URL=file://");
                urlStr.append( sess.getServer().getServerName());
                urlStr.append("/");
                urlStr.append( tree.getSharedDevice().getName());
                urlStr.append( path);
                urlStr.append("rn");
Sinon, j'ai aussi pensé à regarder du côté du "FileFolderService", mais je ne vois pas de méthode qui me permette de récupérer ce que je veux.

Merci d'avance.

thomasb
Champ in-the-making
Champ in-the-making
Euh, si vous avez un Node (pas NodeRef), vous avez probablement un FacesContext, non?

Quoi qu'il en soit, il n'y a apparamment pas de méthode "simple" si on part d'un NodeRef (pas Node), mais on peut s'inspirer (comprendre: copier/coller) du NavigationBean.

Dans la méthode, getCurrentNode, on voit que cifsPath est construit à partir de:
   - node.getNodePath(), qui correspond tout bêtement à nodeService.getPath(nodeRef)
   - un DishShareDevice, qu'on peut récupérer à partir de cifsServer.getConfiguration().getPrimaryFilesystem()
   - deux méthodes (getCIFSServerPath() de cette même classe, et la méthode statique getNamePath de la classe org.alfresco.web.bean.repository.Repository)
Si on a web-client.jar dans son classpath, on pourra utiliser Repository.getNamePath, sinon il faudra en copier/coller le code.
Dans tous les cas, il faudra copier/coller le code de la méthode NavigationBean.getCIFSServerPath.

marinew
Champ in-the-making
Champ in-the-making
En fait, j'ai à ma disposition un Node de type javax.jcr.Node, et un NodeRef (org.alfresco.service.cmr.repository.NodeRef).

Les 2 exemples dans la classe NavigationBean, et dans la classe org.alfresco.web.ui.common.Utils, utilisent un Node de type org.alfresco.web.bean.repository.Node
J'ai donc essayé de récupérer un org.alfresco.web.bean.repository.Node à partir de mon NodeRef, en faisant ceci :

org.alfresco.web.bean.repository.Node nodeBean = new org.alfresco.web.bean.repository.Node(nodeRef);
Le problème, c'est qu'à l'exécution de cette instruction j'ai une exception "FacesContext must not be null" :

16:41:52,140 DEBUG [test.clientAlfresco.TestRecupUrlCifs] Debut Main…
16:42:02,375 ERROR [transform.magick.AbstractImageMagickContentTransformer] ImageMagickContentTransformer not available: Failed to perform ImageMagick transformation:
Execution result:
   os:         Windows XP
   command:    imconvert "C:DOCUME~1ADMINI~1LOCALS~1TempAlfrescoImageMagickContentTransformer_init_source_15461.gif"  "C:DOCUME~1ADMINI~1LOCALS~1TempAlfrescoImageMagickContentTransformer_init_target_15462.png"
   succeeded:  false
   exit code:  1
   out:       
   err:        Cannot run program "imconvert": CreateProcess error=2, Le fichier spécifié est introuvable
16:42:05,375 WARN  [remoting.rmi.RmiRegistryFactoryBean] Could not detect RMI registry - creating new one
16:42:08,343 INFO  [domain.schema.SchemaBootstrap] Schema managed by database dialect org.hibernate.dialect.MySQLInnoDBDialect.
16:42:09,406 INFO  [domain.schema.SchemaBootstrap] No changes were made to the schema.
16:42:11,546 INFO  [repo.admin.ConfigurationChecker] The Alfresco root data directory ('dir.root') is: C:applisalfresco-community-tomcat-2.1.0alf_data
16:42:11,640 INFO  [admin.patch.PatchExecuter] Checking for patches to apply …
16:42:11,781 INFO  [repo.module.ModuleServiceImpl] Found 0 module(s).
16:42:11,953 INFO  [service.descriptor.DescriptorService] Alfresco JVM - v1.6.0_02-b06; maximum heap size 63,563MB
16:42:11,968 WARN  [service.descriptor.DescriptorService] Alfresco JVM - WARNING - maximum heap size 63,563MB is less than recommended 512MB
16:42:11,968 INFO  [service.descriptor.DescriptorService] Alfresco started (Community Network): Current version 2.1.0 (482) schema 64 - Installed version 2.1.0 (482) schema 64
16:42:11,968 ERROR [alfresco.ftp.protocol] FTP Socket error
java.net.BindException: Address already in use: JVM_Bind
   at java.net.PlainSocketImpl.socketBind(Native Method)
   at java.net.PlainSocketImpl.bind(PlainSocketImpl.java:359)
   at java.net.ServerSocket.bind(ServerSocket.java:319)
   at java.net.ServerSocket.<init>(ServerSocket.java:185)
   at java.net.ServerSocket.<init>(ServerSocket.java:141)
   at org.alfresco.filesys.ftp.FTPNetworkServer.run(FTPNetworkServer.java:407)
   at java.lang.Thread.run(Thread.java:619)
16:42:24,812 DEBUG [test.clientAlfresco.TestRecupUrlCifs] jcrNode : cm:Alfresco-Tutorial.pdf - /app:company_home/app:guest_home/cm:Alfresco-Tutorial.pdf
16:42:38,375 DEBUG [test.clientAlfresco.TestRecupUrlCifs] companyHomeNode : app:company_home - /app:company_home
16:42:47,531 ERROR [test.clientAlfresco.TestRecupUrlCifs] Exception FacesContext must not be null
java.lang.IllegalArgumentException: FacesContext must not be null
   at org.springframework.util.Assert.notNull(Assert.java:113)
   at org.springframework.web.jsf.FacesContextUtils.getWebApplicationContext(FacesContextUtils.java:50)
   at org.springframework.web.jsf.FacesContextUtils.getRequiredWebApplicationContext(FacesContextUtils.java:81)
   at org.alfresco.web.bean.repository.Repository.getServiceRegistry(Repository.java:429)
   at org.alfresco.web.bean.repository.Node.getServiceRegistry(Node.java:500)
   at org.alfresco.web.bean.repository.Node.<init>(Node.java:95)
   at fr.armort.test.clientAlfresco.TestRecupUrlCifs.main(TestRecupUrlCifs.java:79)
16:42:54,515 DEBUG [test.clientAlfresco.TestRecupUrlCifs] Finally…
A quoi cette exception peut-elle être due ? Est-ce que j'ai mal initialisé quelque chose ?

Voici le code complet de mon test :

   public static void main(String[] args) {

      logger.debug("Debut Main…");
      Session session = null;

      try {
         ApplicationContext context = ApplicationContextHelper
               .getApplicationContext();

         // Acces au JCR Repository Alfresco
         javax.jcr.Repository repository = (javax.jcr.Repository) context
               .getBean("JCR.Repository");

         // Connection au workspace par défaut défini par le bean
         // JCR.Repository bean
         session = repository.login(new SimpleCredentials("admin", "admin"
               .toCharArray()));
         logger.debug("Acces au noeud de départ");
         Node jcrNode = session
               .getNodeByUUID("ec76d682-4fb8-11dc-ab5d-1797b02bcb1f");

         NodeRef nodeRef = JCRNodeRef.getNodeRef(jcrNode);
         logger.debug("jcrNode : " + jcrNode.getName()
               + " - " + jcrNode.getPath());

         // Recherche du noeud racine
         Node companyHomeNode = session.getRootNode().getNode(
               "app:company_home");
         NodeRef companyHomeNodeRef = JCRNodeRef.getNodeRef(companyHomeNode);
         logger.debug("companyHomeNode : " + companyHomeNode.getName()
               + " - " + companyHomeNode.getPath());

         // Recuperation du NodeService
         ServiceRegistry serviceRegistry = (ServiceRegistry) context
               .getBean(ServiceRegistry.SERVICE_REGISTRY);
         NodeService nodeService = serviceRegistry.getNodeService();

         // Recherche du chemin CIFS
         CIFSServer cifsServer = (CIFSServer) context.getBean("cifsServer");
         org.alfresco.web.bean.repository.Node nodeBean = new org.alfresco.web.bean.repository.Node(
               nodeRef);
         Path nodePath = nodeBean.getNodePath();
         DiskSharedDevice diskShare = cifsServer.getConfiguration()
               .getPrimaryFilesystem();
         String cifsPath = Repository.getNamePath(nodeService, nodePath,
               companyHomeNodeRef, "\", "file:///"
                     + getCIFSServerPath(cifsServer, diskShare));
         logger.debug("   + cifsPath : " + cifsPath);

      } catch (Exception e) {

         logger.error("Exception " + e.getMessage());
         e.printStackTrace();

      } finally {

         session.logout();
         logger.debug("Finally…");
         System.exit(0);
      }
   }

   public static String getCIFSServerPath(CIFSServer cifsServer,
         DiskSharedDevice diskShare) {
      String cifsServerPath;
      StringBuilder buf = new StringBuilder(24);

      String serverName = cifsServer.getConfiguration().getServerName();
      if (serverName != null && serverName.length() != 0) {
         buf.append("\\").append(serverName).append("\");
         buf.append(diskShare.getName());
      }

      cifsServerPath = buf.toString();

      return cifsServerPath;
   }
Je fais mes tests sous Eclipse, dans une simple classe Java avec une méthode main(), et j'ai en référence, le projet SDK AlfrescoEmbedded. J'arrive à parcourir les noeuds avec l'API JCR sans problème, comme en témoigne la sortie du logger.debug.


Merci pour votre patience.

marinew
Champ in-the-making
Champ in-the-making
Oupss ! En relisant votre réponse encore une fois, je viens de voir la solution… qui marche !

J'ai remplacé :

org.alfresco.web.bean.repository.Node nodeBean = new org.alfresco.web.bean.repository.Node(
   nodeRef);
Path nodePath = nodeBean.getNodePath();
par :

Path nodePath = nodeService.getPath(nodeRef);
comme vous me l'aviez indiqué.

Résultat, cifsPath vaut : file:///\NOMMACHINE_AlfrescoEspace InvitéAlfresco-Tutorial.pdf
Il ne reste plus qu'à ajuster les "/" ou "".

Par contre, je reste intéressée par la réponse à ma question, concernant le FacesContext qui est null. Est-ce que le SDK EmbeddedAlfresco démarre un FacesContext, et si oui, comment dois-je m'y prendre pour ne pas avoir cette exception.

Merci beaucoup pour votre aide !

pdubois
Champ on-the-rise
Champ on-the-rise
Bonjour,

Si FacesContext est null, c’est parce que quand vous faites « ApplicationContext getApplicationContext() » c’est un instance « headless » (sans interface web) qui est crée, par conséquent sans « FacesContext ». 

En interne, le code de la méthode getApplicationContext est :

//ceci est un contexte sans les définitions pour une application web
public static final String[] CONFIG_LOCATIONS = new String[] { "classpath:alfresco/application-context.xml" };
public synchronized static ApplicationContext getApplicationContext()
    {
        if (instance != null)
        {
            return instance;
        }
        instance = new ClassPathXmlApplicationContext(CONFIG_LOCATIONS);
        return instance;
    }

Si vous testez dans un environnement web, FacesContext ne sera plus null.

Dans une application web, le web-client-application-context.xml est chargé par :

Spring ContextLoaderListener
The Spring ContextLoaderListener is declared in WEB-INF/web.xml:
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>


C’est probablement grâce à cela que le FacesContext est initialisé dans Alfresco avec une interface web.


Bonne journée.

marinew
Champ in-the-making
Champ in-the-making
Bonjour,

Merci pour cette réponse détaillée. J'ai mis ce sujet un peu en suspens pour le moment, mais j'aurais à m'y replonger dans quelques temps. Votre réponse me sera alors précieuse, et je referai des tests en tenant compte de vos explications.

Merci encore, et bonne journée également.