Web Services : décrire le répertoire

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

Web Services : décrire le répertoire

Bonjour à tous,
dans le cadre d'une migration de notre Knowledge database vers alfresco j'ai besoin de retranscrire des noms de répertoires en mode Alfresco (/app:company_home/cm:folder1/…) . Les utilisateurs de notre Knowledge database (maison) ont été  assez prolixes et ont utilisés à peu près tous les caractères accessibles (facilement) avec un clavier AZERTY. :lol:

J'ai bien compris que certains caractères étaient interdits, genre '<blanc>' qu'il faut écrire '_x0020_' ou '&' , '_x0026', bref avec leur valeur hexa, et au fur et à mesure j'en découvre d'autres comme ','.
:?: En fait, quelqu'un a-t-il la liste hexaustive des caractères qu'il faut transformer en hexa ? (ou la liste des caractères accessibles directement , i.e. sans code hexa…), ça me serait d'une grande aide.
:arrow: Une bière virtuelle à celui qui me fournit cette info…
Merci d'avance.

Cordialement,
DenisR
11 Replies
rivarola
Active Member

Re: Web Services : décrire le répertoire

Bonjour,

Il s'agit d'un encodage respectant la norme ISO9075, donc tu dois trouver des RFC sur le net (c'est toujours un bonheur de lire ces trucs la  :wink: ).
Sinon il y a une classe Alfresco qui sait déjà faire la transformation : org.alfresco.util.ISO9075
denisr
Member II

Re: Web Services : décrire le répertoire

Bonjour Philippe,
Cette info m'a été d'une très grande aide!
J'ai encore un petit problème avec les répertoires qui commence par un nombre (en l'occurence dans l'exemple ci-dessous par un '1')
En effet, sur un répertoire tel que (extrait de l'écran de navigateur de noeuds):


/{http://www.alfresco.org/model/application/1.0}company_home/{http://www.alfresco.org/model/content/1.... Trade/{http://www.alfresco.org/model/content/1.0}Head Quarter Shared Services/{http://www.alfresco.org/model/content/1.0}Finance/{http://www.alfresco.org/model/content/1.0}1 - BUDGET/{http://www.alfresco.org/model/content/1.0}Budget 2007 

Reference: workspace://SpacesStore/bff434b2-0a1b-11dd-9ce5-818517c9b32f
Type: {http://www.alfresco.org/model/content/1.0}folder
Parent: workspace://SpacesStore/bb17163a-0a1b-11dd-9ce5-818517c9b32f 

En envoyant :
/app:company_home/cm:GL_x0020_TRADE/cm:Head_x0020_Quarter_x0020_Shared_x0020_Services/cm:Finance/cm:_x0031__x0020_-_x0020_BUDGET/cm:Budget_x0020_2007



(remarque bien que encode9075 me code la string:
1 - BUDGET
En:
x0031__x0020_-_x0020_BUDGET)


J'obtiens dans Alfresco:

09:04:45,113 DEBUG [org.alfresco.repo.webservice.Utils] Resolving path: /app:com
pany_home/cm:GL_x0020_TRADE/cm:Head_x0020_Quarter_x0020_Shared_x0020_Services/cm
:Finance/cm:_x0031__x0020_-_x0020_BUDGET/cm:Budget_x0020_2007
09:04:45,124 ERROR [org.alfresco.repo.webservice.accesscontrol.AccessControlWebS
ervice] Unexpected error occurred
java.lang.IllegalStateException: Failed to resolve to a single NodeRef with para
meters (store=workspace:SpacesStore uuid=null path=/app:company_home/cm:GL_x0020
_TRADE/cm:Head_x0020_Quarter_x0020_Shared_x0020_Services/cm:Finance/cm:_x0031__x
0020_-_x0020_BUDGET/cm:Budget_x0020_2007), found 0 nodes.
        at org.alfresco.repo.webservice.Utils.resolveToNodeRef(Utils.java:401)
        at org.alfresco.repo.webservice.Utils.convertToNodeRef(Utils.java:293)
        at org.alfresco.repo.webservice.Utils.resolvePredicate(Utils.java:448)
        at org.alfresco.repo.webservice.accesscontrol.AccessControlWebService.ad
dACEsImpl(AccessControlWebService.java:200)
        at org.alfresco.repo.webservice.accesscontrol.AccessControlWebService.ac
cess$100(AccessControlWebService.java:23)
        at org.alfresco.repo.webservice.accesscontrol.AccessControlWebService$2.
execute(AccessControlWebService.java:174)
        at org.alfresco.repo.webservice.accesscontrol.AccessControlWebService$2.
execute(AccessControlWebService.java:172)
        at org.alfresco.repo.transaction.RetryingTransactionHelper.doInTransacti
on(RetryingTransactionHelper.java:236)
        at org.alfresco.repo.transaction.RetryingTransactionHelper.doInTransacti
on(RetryingTransactionHelper.java:166)
        at org.alfresco.repo.webservice.accesscontrol.AccessControlWebService.ad
dACEs(AccessControlWebService.java:177)
        at sun.reflect.GeneratedMethodAccessor711.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces

Comme un chiffre ( '0'<=x<='9') n'est codé d'après ce que j'ai vu que quand il est en premier dans la chaine de caractères j'ai pensé qu'il y avait peut-être un bug dans encode9075 et j'ai donc j'ai miodifié mon code pour qu'il n'encode pas le premier caractère (dans le cas d'un chiffre en tous cas.
Mais en forçant le non-codage du premier caractère si c'est un nombre , alors j'envoie :

/app:company_home/cm:GL_x0020_TRADE/cm:Head_x0020_Quarter_x0020_Shared_x0020_Services/cm:Finance/cm:1_x0020_-_x0020_BUDGET/cm:Budget_x0020_2007



Et j'obtiens l'exception suivante:

Caused by: org.jaxen.XPathSyntaxException: Unexpected '1'
        at org.jaxen.BaseXPath.<init>(BaseXPath.java:132)
        at org.jaxen.BaseXPath.<init>(BaseXPath.java:153)
        at org.alfresco.repo.search.NodeServiceXPath.<init>(NodeServiceXPath.jav
a:115)
        at org.alfresco.repo.search.impl.NodeSearcher.selectNodes(NodeSearcher.j
ava:133)
        … 59 more
Caused by: class org.jaxen.saxpath.XPathSyntaxException: /app:company_home/cm:GL
_x0020_TRADE/cm:Head_x0020_Quarter_x0020_Shared_x0020_Services/cm:Finance/cm:1_x
0020_-_x0020_BUDGET/cm:Budget_x0020_2007: 100: Unexpected '1'
        at org.jaxen.saxpath.base.XPathReader.createSyntaxException(XPathReader.
java:1120)
        at org.jaxen.saxpath.base.XPathReader.parse(XPathReader.java:119)
        at org.jaxen.BaseXPath.<init>(BaseXPath.java:127)
        … 62 more


Conclusion je ne sais plus tactique adopter pour mon sortir.  :?
:?: Y'a-t-il une stratégie qui marche à tous les coups?

Cordialement,
DenisR
rguinot
Customer

Re: Web Services : décrire le répertoire

Tout à fait j'allais en parler mais j'ai oublié . le premier chiffre des objets commençant par un chiffre doivent également être encodés en ISO9075 .

Il y a un post d'Andy sur le JIRA (issues.alfresco.com) qui détaille le problème mais le JIRA semble avoir qq légers problèmes en ce moment Smiley Sad

Edit : il y a également le qNamePath qui peut vous servir : http://wiki.alfresco.com/wiki/Template_Guide#Extended_TemplateNode_Model_API
denisr
Member II

Re: Web Services : décrire le répertoire

Bonjour,
C'est ce que je fais dans mon premier essai:


09:04:45,113 DEBUG [org.alfresco.repo.webservice.Utils] Resolving path: /app:com
pany_home/cm:GL_x0020_TRADE/cm:Head_x0020_Quarter_x0020_Shared_x0020_Services/cm
:Finance/cm:_x0031__x0020_-_x0020_BUDGET/cm:Budget_x0020_2007
09:04:45,124 ERROR [org.alfresco.repo.webservice.accesscontrol.AccessControlWebS
ervice] Unexpected error occurred
java.lang.IllegalStateException: Failed to resolve to a single NodeRef with para
meters (store=workspace:SpacesStore uuid=null path=/app:company_home/cm:GL_x0020
_TRADE/cm:Head_x0020_Quarter_x0020_Shared_x0020_Services/cm:Finance/cm:_x0031__x
0020_-_x0020_BUDGET/cm:Budget_x0020_2007), found 0 nodes.

Mais Alfresco répond
found 0 nodes.
:?: Donc en fait il y aurait bien un bug pour ce cas particulier côté Alfresco?
(c'est pour mes chefs, ils veulent comprendre si j'ai fait ce qu'il fallait  :lol: )
Bon en tous cas je suis intèressé par la référence du JIRA au cas où.

Cordialement,
DenisR
rguinot
Customer

Re: Web Services : décrire le répertoire

Salut,

le JIRA semble down comme je disais, mais j'ai retrouvé ce bout de code Freemarker que j'avais fait l'année dernière (au moment ou j'ai eu le pb Smiley Happy ) qui te traiter qq cas d'encodage ISO9075  :


<#assign numbers=["0","1","2","3","4","5","6","7","8","9"]>

<#– encode string by replacing spaces by their hex unicode value. –>
<#–Note :  Numerals are not valid at the start of the string so they have to be escaped (ISO 9075)  –>
<#– Input : string - String - input string –>
<#– Output : string - ISO9075 encoded string ( main characters considered)   –>
<#function encode_unicode string>
   <#if numbers?seq_contains(string?substring(0,1))>
      <#return ("_x003"+string?substring(0,1)+"_"+string?substring(1))?replace(" ","_x0020_")>
   </#if>
   <#return string?replace(" ","_x0020_")>
</#function>

Dis moi si as des problèmes quant à son utilisation.
denisr
Member II

Re: Web Services : décrire le répertoire

Merci.
Avant de l'utiliser, j'essaie de comprendre quelque chose:
En fait je suis en train d'écrire un outil de migration que j'ai pratiquement terminé pour le portage de notre Knowledge Database vers Alfresco.
Cela comprend la création des folders et des droits pour les users, la création des fichiers selon un certain modèle et avec les valeurs des propriétés etc,…
Cet outil, destiné à ne servir qu'une fois, est actuellement entièrement en Web Services et fonctionne dans la très grande majorité des cas et je ne connais plus que ce problème de folders commençant par des chiffres.

Ce que vous me proposez pour résoudre ce problème c'est de changer d'API ?  :shock:
:?: Mais si je change d'API je peux encore accéder à encode9075.class? Ou dans le cas de cette nouvelle API il n'y a QUE le premier caractère à transformer ?

"100 fois sur le métier l'ouvrage"  :lol:
rguinot
Customer

Re: Web Services : décrire le répertoire

Non je ne vous propose pas de changer d'API ! je vous donne juste un exemple d'algo permet de gérer le cas où vos nodes commencent par des chiffres c'est tout .
Il vous faudra juste transposer l'algo Freemarker dans l'API que vous utilisez, ce qui ne devrait pas être bien dur.
En gros en regex il vous faut cela :

^\([0,9]\) => _x003\1\_

Peu importe l'API.
denisr
Member II

Re: Web Services : décrire le répertoire

Oui, donc en fait la méthode String encode9075(String) fait déjà le boulot parfaitement sur la totalité de la string.
Le problème c'est que , dans le cas des Web Services et du cas particulier d'un chiffre (encodé) en première position Alfresco part en vrille me semble-t-il  puisqu'il ne trouve pas le node comme je l'indique dans ce post.
rguinot
Customer

Re: Web Services : décrire le répertoire

Il est parfaitement normal d'obtenir une exception avec :

cm:1_x0020_-_x0020_BUDGET

Il vous faut :

cm:_x0031__x0020_-_x0020_BUDGET

peu importe la manière dont vous transformer le noeud (qnamepath, la classe utilitaire ou autres) , il faut que votre path soit encodé ISO9075 ni plus ni moins.