Je souhaiterais récupérer le chemin CIFS d'un fichier...
Options
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
08-21-2007 01:48 PM
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.
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.
Labels:
- Labels:
-
Archive
7 REPLIES 7
Options
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
08-22-2007 03:54 AM
Bonjour,
Un rapide coup d'oeil dans les sources du client web (plus précisément dans le BaseDetailsBean) indique une solution :
Bertrand.
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.
Options
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
08-22-2007 07:52 AM
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é :
Merci d'avance.
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.
Options
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
08-22-2007 08:46 AM
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.
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.
Options
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
08-22-2007 10:46 AM
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 :
Voici le code complet de mon test :
Merci pour votre patience.
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 introuvable16:42:05,375 WARN [remoting.rmi.RmiRegistryFactoryBean] Could not detect RMI registry - creating new one16: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_data16: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,563MB16:42:11,968 WARN [service.descriptor.DescriptorService] Alfresco JVM - WARNING - maximum heap size 63,563MB is less than recommended 512MB16: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 6416:42:11,968 ERROR [alfresco.ftp.protocol] FTP Socket errorjava.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.pdf16:42:38,375 DEBUG [test.clientAlfresco.TestRecupUrlCifs] companyHomeNode : app:company_home - /app:company_home16:42:47,531 ERROR [test.clientAlfresco.TestRecupUrlCifs] Exception FacesContext must not be nulljava.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.
Options
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
08-22-2007 10:55 AM
Oupss ! En relisant votre réponse encore une fois, je viens de voir la solution… qui marche !
J'ai remplacé :
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 !
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 !
Options
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
10-05-2007 06:57 AM
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.
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.
Options
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
10-05-2007 08:24 AM
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.
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.