cancel
Showing results for 
Search instead for 
Did you mean: 

Create folder and subfolder via API Java

monocromo
Champ in-the-making
Champ in-the-making
Hi,
i would like create this structure /cm:documentLibrary/cm:TestPorting/cm:2388/cm:InVigore but i can't. Because when i create  the subfolder "inVigore" i have this error:

org.alfresco.service.cmr.repository.XPathException: 03242678 Error executing xpath: \n /app:company_home/st:sites/cm:prova-italia-spa/cm:documentLibrary/cm:TestPorting/cm:2388/cm:InVigore


This is the code that create the folder:


boolean res = this.createFolder("2388","/app:company_home/st:sites/cm:bosco-italia-spa/cm:documentLibrary/cm:TestPorting");
boolean res1 = this.createFolder("Approvati","/app:company_home/st:sites/cm:bosco-italia-spa/cm:documentLibrary/cm:TestPorting/cm:2388");
boolean res2 = this.createFolder("inVigore","/app:company_home/st:sites/cm:bosco-italia-spa/cm:documentLibrary/cm:TestPorting/cm:2388");



public boolean createFolder(String fileName,String percorso) throws Exception
   {   
      // Avvio sessione
        //AuthenticationUtils.startSession(user, password);
                   
        try
        {          
           // Referenza al nodo padre in cui inserire il documento
            Store storeRef = new Store(Constants.WORKSPACE_STORE, "SpacesStore");
            ParentReference companyHomeParent = new ParentReference(storeRef, null, percorso, Constants.ASSOC_CONTAINS, Constants.createQNameString(Constants.NAMESPACE_CONTENT_MODEL, "folder"));
           
            //Richiesta del repository service e del content service
            RepositoryServiceSoapBindingStub repositoryService = WebServiceFactory.getRepositoryService();
            ContentServiceSoapBindingStub contentService = WebServiceFactory.getContentService();
                      
            //Vettori delle proprietà
           NamedValue[] contentProps = new NamedValue[1];
             
          //Assegnazione ai vettori delle proprietà
            contentProps[0] = Utils.createNamedValue(Constants.PROP_NAME, fileName);

            //Upload file custom           
            CMLCreate create = new CMLCreate("1", companyHomeParent, null, null, null, Constants.TYPE_FOLDER, contentProps);
           
            // Blocco create CML
            CML cml = new CML();
            cml.setCreate(new CMLCreate[] {create});
           
            //Creazione effettiva del nodo
            UpdateResult[] result = WebServiceFactory.getRepositoryService().update(cml);    
            
            System.out.println("Cartella creata: " + fileName);
            return true;
        }
        catch(Throwable e)
        {
            System.out.println(e.getMessage());
            return false;
        }
        finally
        {
            // Fine della sessione
            //AuthenticationUtils.endSession();          
        }      
   }


Where is the problem?
If i create more folder in /cm:documentLibrary/cm:TestPorting/cm:2388 i haven't problem but if i create a folder in cm:2388 java report the above error.
4 REPLIES 4

afaust
Legendary Innovator
Legendary Innovator
Hello,

leading digits in a path element need to be encoded for XPath - it may not be necessary in all constellations, but for simplicity should always be done. Alfresco provides a utility class for this: ISO9075 with methods getXPathName(QName).
Note that every fragment of your path need to be individually encoded before constructing the complete XPath - there is as far as I know no utility to encode an already constructed XPath.

Regards
Axel

monocromo
Champ in-the-making
Champ in-the-making
Thanks for reply, it is possible have an example for use the ISO9075's method?
I search in internet but i not found example.

afaust
Legendary Innovator
Legendary Innovator
Hello,

a simple example:

String[] fragments = "app:company_home/st:sites/cm:bosco-italia-spa/cm:documentLibrary/cm:TestPorting".split("/");
StringBuilder builder = new StringBuilder();
for(String fragment : fragments)
{
   builder.append("/");
   builder.append(ISO9075.getXPathName(QName.createQName(fragment, namespaceService), namespaceService));
}
String xpath = builder.toString();


Regards
Axel

monocromo
Champ in-the-making
Champ in-the-making
Thanks for reply.