Custom action : paramétrage de AuthenticationUtil.runAs

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

Custom action : paramétrage de AuthenticationUtil.runAs

Bonjour Smiley Happy

Je vous explique en quelques lignes ce que je souhaite faire.

je dispose de 3 dossiers:

a. qui contient le fichier DOC et toutes ses versions antérieures si elle existe.
b. la dernière version du fichier DOC en format PDF
c. la dernière version du fichier DOC en format de base.

je souhaite executer cette action en tant qu'administrateur. ( cad que les validateurs auront le droit d'accéder à ces fichiers en mode lecteur )

pour l'instant j'ai développé que la classe java:

je vais décortiquer le programme pour vous puissiez m'aider à corriger les erreurs Smiley Happy

en ce qui concerne le dossier a: recherche du fichier DOC dans le dossier, s'il existe on incrémente la version sinon on l'ajoute.

if(nodeService.hasAspect(actionedUponNodeRef,"versionable")==false)
{
   nodeService.addAspect(actionedUponNodeRef,"versionable",null);
   fileFolderService.move(actionedUponNodeRef, destinationParent0, null);
}
List<FileInfo> listFichierEtDossier = fileFolderService.list(destinationParent0);
if(!listFichierAndDossier.isEmpty())
       {
          return;
       }
for( FileInfo fichierOuDossier : listFichierEtDossier)
{
    if(fichierOuDossier.isFolder())
    {
       // rien faire:fichierOuDossier est un dossier   
    }
    else if(fichierOuDossier.isLink())
       {
          // ne rien faire: fichierOuDossier est un link
       }else {
          // fichierOuDossier est un fichier
             if(nodeService.getPath(fichierOuDossier.getNodeRef())==nodeService.getPath(actionedUponNodeRef));
                {
                checkOutCheckInService.checkout(fichierOuDossier.getNodeRef());
                NodeRef copieDeTravail=checkOutCheckInService.getWorkingCopy(fichierOuDossier.getNodeRef());
                ContentData Contenu = (ContentData) nodeService.getProperty(actionedUponNodeRef, ContentModel.PROP_CONTENT);
                nodeService.setProperty(copieDeTravail, ContentModel.PROP_CONTENT, Contenu);
                Map<String,Serializable> versionProperties = new HashMap<String,Serializable>();
                versionProperties.put(VersionModel.PROP_VERSION_TYPE, VersionType.MAJOR);
                checkOutCheckInService.checkin(copieDeTravail, versionProperties);
                pt0++;
                }
            }
}
if(pt0==0)
{
fileFolderService.copy(fichier, destinationParent0, null);
}


en ce qui concerne le dossier b: recherche du fichier DOC dans le dossier, s'il existe on change le contenu en format PDF sinon on l'ajoute.

List<FileInfo> listFichierEtDossier = fileFolderService.list(destinationParent2);
if(listFichierAndDossier.isEmpty())
       {
          return;
       }
for( FileInfo fichierOuDossier : listFichierEtDossier)
{
    if(fichierOuDossier.isFolder())
    {
       // rien faire:fichierOuDossier est un dossier   
    }
    else if(fichierOuDossier.isLink())
       {
          // ne rien faire: fichierOuDossier est un link
       }else {
          // fichierOuDossier est fichier
             if(nodeService.getPath(fichierOuDossier.getNodeRef())==nodeService.getPath(actionedUponNodeRef));
                {  
                // changer le contenu du fichier existant
                ContentData Contenu = (ContentData) nodeService.getProperty(actionedUponNodeRef, ContentModel.PROP_CONTENT);
                ContentData newContenu = ContentData.setMimetype(Contenu, "application/PDF");
                nodeService.setProperty(fichierOuDossier.getNodeRef(), ContentModel.PROP_CONTENT, newContenu);
                pt2++;
                }
            }
}
// changer le format du fichier en PDF et l'ajouter au dossier
if(pt2==0)
{
NodeRef fichier = actionedUponNodeRef;
ContentData Contenu = (ContentData) nodeService.getProperty(fichier, ContentModel.PROP_CONTENT);
ContentData newContenu = ContentData.setMimetype(Contenu, "application/PDF");
nodeService.setProperty(fichier, ContentModel.PROP_CONTENT, newContenu);
fileFolderService.copy(fichier, destinationParent2, null);
}


en ce qui concerne le dossier c: recherche du fichier DOC dans le dossier, s'il existe on change le contenu sinon on l'ajoute.


List<FileInfo> listFichierEtDossier = fileFolderService.list(destinationParent1);
   if(listFichierEtDossier.isEmpty())
          {
             return;
          }
for( FileInfo fichierOuDossier : listFichierEtDossier)
{
       if(fichierOuDossier.isFolder())
       {
          // rien faire:fichierOuDossier est un dossier   
       }else if(fichierOuDossier.isLink())
             {
             // ne rien faire: fichierOuDossier est un link
             }else {
                   // fichierOuDossier est fichier
                   if(nodeService.getPath(fichierOuDossier.getNodeRef())==nodeService.getPath(actionedUponNodeRef));
                   {
                      ContentData Contenu = (ContentData) nodeService.getProperty(actionedUponNodeRef, ContentModel.PROP_CONTENT);
                      nodeService.setProperty(fichierOuDossier.getNodeRef(), ContentModel.PROP_CONTENT, Contenu);
                      pt1++;
                   }
                   }
}
if(pt1==0)
{
fileFolderService.copy(actionedUponNodeRef, destinationParent1, null);


et enfin pour la fonction d’exécution en tant qu'administrateur:



AuthenticationUtil.runAs(new AuthenticationUtil.RunAsWork<Void>() {
@Override
public void doWork() throws Exception {
  …mon code Java …
}
}, "admin");
le code en entier est le suivant:


package org.alfresco.sample;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.alfresco.repo.action.ParameterDefinitionImpl;
import org.alfresco.repo.action.executer.ActionExecuterAbstractBase;
import org.alfresco.repo.security.authentication.AuthenticationUtil;
import org.alfresco.repo.security.authentication.AuthenticationUtil.RunAsWork;
import org.alfresco.service.ServiceRegistry;
import org.alfresco.service.cmr.action.Action;
import org.alfresco.service.cmr.action.ParameterDefinition;
import org.alfresco.service.cmr.coci.CheckOutCheckInService;
import org.alfresco.service.cmr.dictionary.DataTypeDefinition;
import org.alfresco.service.cmr.model.FileFolderService;
import org.alfresco.service.cmr.model.FileInfo;
import org.alfresco.service.cmr.model.FileNotFoundException;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.NodeService;
import org.alfresco.service.cmr.version.VersionType;
import org.alfresco.repo.version.VersionModel;

public class MonActionActionExecuter extends ActionExecuterAbstractBase{

public static final String NAME = "traitement";
public static final String PARAM_DESTINATION_FOLDER_0 = "destination-folder-0";   
public static final String PARAM_DESTINATION_FOLDER_1 = "destination-folder-1";   
public static final String PARAM_DESTINATION_FOLDER_2 = "destination-folder-2";   

private NodeService nodeService;
private CheckOutCheckInService checkOutCheckInService;
private FileFolderService fileFolderService;

int pt1=0;
int pt2=0;
int pt0=0;
public void setNodeService(NodeService nodeService)
{
   this.nodeService=nodeService;
}



public void setCheckOutCheckInService(CheckOutCheckInService checkOutCheckInService)
{
    this.checkOutCheckInService = checkOutCheckInService;
}

public void setFileFolderService(FileFolderService fileFolderService)
{
   this.fileFolderService=fileFolderService;
}


   @Override
protected void executeImpl(Action MonAction, NodeRef actionedUponNodeRef)
{
      // TODO Auto-generated method stub
NodeRef destinationParent0 = (NodeRef)MonAction.getParameterValue(PARAM_DESTINATION_FOLDER_0);
NodeRef destinationParent1 = (NodeRef)MonAction.getParameterValue(PARAM_DESTINATION_FOLDER_1);
NodeRef destinationParent2 = (NodeRef)MonAction.getParameterValue(PARAM_DESTINATION_FOLDER_2);



AuthenticationUtil.runAs(new AuthenticationUtil.RunAsWork<void>()
{
   public void doWork() throws Exception
   {

      //… mon code Java …
try
   {

List<FileInfo> listFichierEtDossier = fileFolderService.list(destinationParent1);
   if(listFichierEtDossier.isEmpty())
          {
             return;
          }
for( FileInfo fichierOuDossier : listFichierEtDossier)
{
       if(fichierOuDossier.isFolder())
       {
          // rien faire:fichierOuDossier est un dossier   
       }else if(fichierOuDossier.isLink())
             {
             // ne rien faire: fichierOuDossier est un link
             }else {
                   // fichierOuDossier est fichier
                   if(nodeService.getPath(fichierOuDossier.getNodeRef())==nodeService.getPath(actionedUponNodeRef));
                   {
                      ContentData Contenu = (ContentData) nodeService.getProperty(actionedUponNodeRef, ContentModel.PROP_CONTENT);
                      nodeService.setProperty(fichierOuDossier.getNodeRef(), ContentModel.PROP_CONTENT, Contenu);
                      pt1++;
                   }
                   }
}
if(pt1==0)
{
fileFolderService.copy(actionedUponNodeRef, destinationParent1, null);
}

List<FileInfo> listFichierEtDossier = fileFolderService.list(destinationParent2);
if(listFichierAndDossier.isEmpty())
       {
          return;
       }
for( FileInfo fichierOuDossier : listFichierEtDossier)
{
    if(fichierOuDossier.isFolder())
    {
       // rien faire:fichierOuDossier est un dossier   
    }
    else if(fichierOuDossier.isLink())
       {
          // ne rien faire: fichierOuDossier est un link
       }else {
          // fichierOuDossier est fichier
             if(nodeService.getPath(fichierOuDossier.getNodeRef())==nodeService.getPath(actionedUponNodeRef));
                {  
                // changer le contenu du fichier existant
                ContentData Contenu = (ContentData) nodeService.getProperty(actionedUponNodeRef, ContentModel.PROP_CONTENT);
                ContentData newContenu = ContentData.setMimetype(Contenu, "application/PDF");
                nodeService.setProperty(fichierOuDossier.getNodeRef(), ContentModel.PROP_CONTENT, newContenu);
                pt2++;
                }
            }
}
// changer le format du fichier en PDF et l'ajouter au dossier
if(pt2==0)
{
NodeRef fichier = actionedUponNodeRef;
ContentData Contenu = (ContentData) nodeService.getProperty(fichier, ContentModel.PROP_CONTENT);
ContentData newContenu = ContentData.setMimetype(Contenu, "application/PDF");
nodeService.setProperty(fichier, ContentModel.PROP_CONTENT, newContenu);
fileFolderService.copy(fichier, destinationParent2, null);
}


// faire une verfication et une modification l'aspect du fichier

if(nodeService.hasAspect(actionedUponNodeRef,"versionable")==false)
{
   nodeService.addAspect(actionedUponNodeRef,"versionable",null);
   fileFolderService.move(actionedUponNodeRef, destinationParent0, null);
}
List<FileInfo> listFichierEtDossier = fileFolderService.list(destinationParent0);
if(!listFichierAndDossier.isEmpty())
       {
          return;
       }
for( FileInfo fichierOuDossier : listFichierEtDossier)
{
    if(fichierOuDossier.isFolder())
    {
       // rien faire:fichierOuDossier est un dossier   
    }
    else if(fichierOuDossier.isLink())
       {
          // ne rien faire: fichierOuDossier est un link
       }else {
          // fichierOuDossier est un fichier
             if(nodeService.getPath(fichierOuDossier.getNodeRef())==nodeService.getPath(actionedUponNodeRef));
                {
                checkOutCheckInService.checkout(fichierOuDossier.getNodeRef());
                NodeRef copieDeTravail=checkOutCheckInService.getWorkingCopy(fichierOuDossier.getNodeRef());
                ContentData Contenu = (ContentData) nodeService.getProperty(actionedUponNodeRef, ContentModel.PROP_CONTENT);
                nodeService.setProperty(copieDeTravail, ContentModel.PROP_CONTENT, Contenu);
                Map<String,Serializable> versionProperties = new HashMap<String,Serializable>();
                versionProperties.put(VersionModel.PROP_VERSION_TYPE, VersionType.MAJOR);
                checkOutCheckInService.checkin(copieDeTravail, versionProperties);
                pt0++;
                }
            }
}
if(pt0==0)
{
fileFolderService.copy(fichier, destinationParent0, null);
}
       }
       catch (FileNotFoundException e)
       {
           // ne rien faire
       }      
   }
}, "admin");
   
   
   }

   @Override
   protected void addParameterDefinitions(List<ParameterDefinition> paramList) {
      paramList.add(new ParameterDefinitionImpl(PARAM_DESTINATION_FOLDER_0,
                                      DataTypeDefinition.NODE_REF,
                                      true,
                                      getParamDisplayLabel(PARAM_DESTINATION_FOLDER_0)));
      paramList.add(new ParameterDefinitionImpl(PARAM_DESTINATION_FOLDER_1,
                                        DataTypeDefinition.NODE_REF,
                                        true,
                                        getParamDisplayLabel(PARAM_DESTINATION_FOLDER_1)));
      paramList.add(new ParameterDefinitionImpl(PARAM_DESTINATION_FOLDER_2,
                                        DataTypeDefinition.NODE_REF,
                                        true,
                                        getParamDisplayLabel(PARAM_DESTINATION_FOLDER_2)));
   }

}




pour l'instant j'ai une erreur!!
Syntax error on token "void", Dimensions expected after this token
  eclipse n' accepte pas le "void " et je ne sais pas comment y remédier !!

Merci à vous
5 Replies
vaquero
Member II

Re: Custom action : paramétrage de AuthenticationUtil.runAs

Bonjour, j'ai corrigé quelques erreurs mais j'ai encore le même problème


package org.alfresco.sample;

import java.io.Serializable;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.alfresco.model.ContentModel;
import org.alfresco.repo.action.ParameterDefinitionImpl;
import org.alfresco.repo.action.executer.ActionExecuterAbstractBase;
import org.alfresco.repo.security.authentication.AuthenticationUtil;
import org.alfresco.service.cmr.action.Action;
import org.alfresco.service.cmr.action.ParameterDefinition;
import org.alfresco.service.cmr.coci.CheckOutCheckInService;
import org.alfresco.service.cmr.dictionary.DataTypeDefinition;
import org.alfresco.service.cmr.model.FileFolderService;
import org.alfresco.service.cmr.model.FileInfo;
import org.alfresco.service.cmr.model.FileNotFoundException;
import org.alfresco.service.cmr.repository.ContentData;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.NodeService;
import org.alfresco.service.cmr.version.VersionType;
import org.alfresco.repo.version.VersionModel;

public class MonActionActionExecuter extends ActionExecuterAbstractBase{

public static final String NAME = "traitement";
public static final String PARAM_DESTINATION_FOLDER_0 = "destination-folder-0";   
public static final String PARAM_DESTINATION_FOLDER_1 = "destination-folder-1";   
public static final String PARAM_DESTINATION_FOLDER_2 = "destination-folder-2";   

private NodeService nodeService;
private CheckOutCheckInService checkOutCheckInService;
private FileFolderService fileFolderService;


int pt1=0;
int pt2=0;
int pt0=0;
public void setNodeService(NodeService nodeService)
{
   this.nodeService=nodeService;
}



public void setCheckOutCheckInService(CheckOutCheckInService checkOutCheckInService)
{
    this.checkOutCheckInService = checkOutCheckInService;
}

public void setFileFolderService(FileFolderService fileFolderService)
{
   this.fileFolderService=fileFolderService;
}


   @Override
protected void executeImpl(Action MonAction, final NodeRef actionedUponNodeRef)
{

final NodeRef destinationParent0 = (NodeRef)MonAction.getParameterValue(PARAM_DESTINATION_FOLDER_0);
final NodeRef destinationParent1 = (NodeRef)MonAction.getParameterValue(PARAM_DESTINATION_FOLDER_1);
final NodeRef destinationParent2 = (NodeRef)MonAction.getParameterValue(PARAM_DESTINATION_FOLDER_2);
      

AuthenticationUtil.runAs(new AuthenticationUtil.RunAsWork<void>()
{
   public void doWork() throws Exception
   {
   
      //… mon code Java …
try
   {

List<FileInfo> listFichierEtDossier1 = fileFolderService.list(destinationParent1);
   if(listFichierEtDossier1.isEmpty())
          {
             return null;
          }
for( FileInfo fichierOuDossier : listFichierEtDossier1)
{
       if(fichierOuDossier.isFolder())
       {
          // rien faire:fichierOuDossier est un dossier   
       }else if(fichierOuDossier.isLink())
             {
             // ne rien faire: fichierOuDossier est un link
             }else {
                   // fichierOuDossier est fichier
                   if(nodeService.getPath(fichierOuDossier.getNodeRef())==nodeService.getPath(actionedUponNodeRef));
                   {
                      ContentData Contenu = (ContentData) nodeService.getProperty(actionedUponNodeRef, ContentModel.PROP_CONTENT);
                      nodeService.setProperty(fichierOuDossier.getNodeRef(), ContentModel.PROP_CONTENT, Contenu);
                      pt1++;
                   }
                   }
}
if(pt1==0)
{
fileFolderService.copy(actionedUponNodeRef, destinationParent1, null);
}

List<FileInfo> listFichierEtDossier2 = fileFolderService.list(destinationParent2);
if(listFichierEtDossier2.isEmpty())
       {
          return null;
       }
for( FileInfo fichierOuDossier : listFichierEtDossier1)
{
    if(fichierOuDossier.isFolder())
    {
       // rien faire:fichierOuDossier est un dossier   
    }
    else if(fichierOuDossier.isLink())
       {
          // ne rien faire: fichierOuDossier est un link
       }else {
          // fichierOuDossier est fichier
             if(nodeService.getPath(fichierOuDossier.getNodeRef())==nodeService.getPath(actionedUponNodeRef));
                {  
                // changer le contenu du fichier existant
                ContentData Contenu = (ContentData) nodeService.getProperty(actionedUponNodeRef, ContentModel.PROP_CONTENT);
                ContentData newContenu = ContentData.setMimetype(Contenu, "application/PDF");
                nodeService.setProperty(fichierOuDossier.getNodeRef(), ContentModel.PROP_CONTENT, newContenu);
                pt2++;
                }
            }
}
// changer le format du fichier en PDF et l'ajouter au dossier
if(pt2==0)
{
NodeRef fichier = actionedUponNodeRef;
ContentData Contenu = (ContentData) nodeService.getProperty(fichier, ContentModel.PROP_CONTENT);
ContentData newContenu = ContentData.setMimetype(Contenu, "application/PDF");
nodeService.setProperty(fichier, ContentModel.PROP_CONTENT, newContenu);
fileFolderService.copy(fichier, destinationParent2, null);
}


// faire une verfication et une modification l'aspect du fichier


if(nodeService.hasAspect(actionedUponNodeRef, ContentModel.ASPECT_VERSIONABLE)==false)
{
   nodeService.addAspect(actionedUponNodeRef,ContentModel.ASPECT_VERSIONABLE,null);
   fileFolderService.move(actionedUponNodeRef, destinationParent0, null);
}
List<FileInfo> listFichierEtDossier0 = fileFolderService.list(destinationParent0);
if(!listFichierEtDossier0.isEmpty())
       {
          return null;
       }
for( FileInfo fichierOuDossier : listFichierEtDossier0)
{
    if(fichierOuDossier.isFolder())
    {
       // rien faire:fichierOuDossier est un dossier   
    }
    else if(fichierOuDossier.isLink())
       {
          // ne rien faire: fichierOuDossier est un link
       }else {
          // fichierOuDossier est un fichier
             if(nodeService.getPath(fichierOuDossier.getNodeRef())==nodeService.getPath(actionedUponNodeRef));
                {
                checkOutCheckInService.checkout(fichierOuDossier.getNodeRef());
                NodeRef copieDeTravail=checkOutCheckInService.getWorkingCopy(fichierOuDossier.getNodeRef());
                ContentData Contenu = (ContentData) nodeService.getProperty(actionedUponNodeRef, ContentModel.PROP_CONTENT);
                nodeService.setProperty(copieDeTravail, ContentModel.PROP_CONTENT, Contenu);
                Map<String,Serializable> versionProperties = new HashMap<String,Serializable>();
                versionProperties.put(VersionModel.PROP_VERSION_TYPE, VersionType.MAJOR);
                checkOutCheckInService.checkin(copieDeTravail, versionProperties);
                pt0++;
                }
            }
}
if(pt0==0)
{
fileFolderService.copy(actionedUponNodeRef, destinationParent0, null);
}
       }
       catch (FileNotFoundException e)
       {
           // ne rien faire
       }      
   }
}, "admin");
   
   
   }

   @Override
   protected void addParameterDefinitions(List<ParameterDefinition> paramList) {
      paramList.add(new ParameterDefinitionImpl(PARAM_DESTINATION_FOLDER_0,
                                      DataTypeDefinition.NODE_REF,
                                      true,
                                      getParamDisplayLabel(PARAM_DESTINATION_FOLDER_0)));
      paramList.add(new ParameterDefinitionImpl(PARAM_DESTINATION_FOLDER_1,
                                        DataTypeDefinition.NODE_REF,
                                        true,
                                        getParamDisplayLabel(PARAM_DESTINATION_FOLDER_1)));
      paramList.add(new ParameterDefinitionImpl(PARAM_DESTINATION_FOLDER_2,
                                        DataTypeDefinition.NODE_REF,
                                        true,
                                        getParamDisplayLabel(PARAM_DESTINATION_FOLDER_2)));
   }

}

cleseach
Active Member II

Re: Custom action : paramétrage de AuthenticationUtil.runAs

Bonjour,

Et si vous utilisiez "Object" plutôt que "void" ?

Cordialement,
Charles Le Seac'h
rguinot
Customer

Re: Custom action : paramétrage de AuthenticationUtil.runAs

Je ne vois pas bien le besoin de faire du code spécifique. La manipulation des content data me semble un peu hasardeuse…
Ne pouvez vous pas simplement rendre le doc versionnable et configurer une action pour transformer le contenu entrant en PDF et le copier dans le dossier qui contient le PDF ?
vaquero
Member II

Re: Custom action : paramétrage de AuthenticationUtil.runAs

Bonjour Charles Le Seac'h,
Et si vous utilisiez "Object" plutôt que "void" ?

j'ai essayé d'utiliser "Object" à la place du "void" mais il y avait le même message d'erreur.
je me suis inspiré par la suite du code de cette page: http://svn.alfresco.com/repos/alfresco-open-mirror/alfresco/HEAD/root/projects/repository/source/jav...


// Create a good authentication
        RunAsWork<Void> createAuthenticationWork = new RunAsWork<Void>()
        {
            public Void doWork() throws Exception
            {
                if (!authenticationService.authenticationExists(getName()))
                {
                    authenticationService.createAuthentication(getName(), getName().toCharArray());
                }
                return null;
            }
        };
j'ai changé "void" par "Void" et ça marche Smiley Happy

je voudrais savoir quelle architecture dois-je mettre en place pour que mon action fonctionne??!!

MonAction
*****source
************alfresco.extention -> MonAction-action-context.xml
************org.alfresco.sample-> MonActionActionExecuter.java
                                            -> MonAction-action-messages
************build.xml

Bien Cordialement
vaquero
Member II

Re: Custom action : paramétrage de AuthenticationUtil.runAs

Bonjour rguinot,

La manipulation des content data me semble un peu hasardeuse…
je n'ai pas bien compris ce que vous voulez dire!!

je vous explique ce qu'on me demande de mettre en place:

1. avoir 3 dossiers
documents versionnés
document VF (contenant la dernière version de chaque document)
document PDF ( la dernière version en format PDF)

2. les validateurs auront seulement le droit de lecture sur ces 3 espaces

lorsqu'un document est validé, l'action doit rajouter une nouvelle version au dossier " documents versionnés"
et mettre à jour le document dans les deux espaces " document VF" et "document PDF"

la configuration d'une action d'ajout et de transformation en PDF dépend du rôle de l'utilisateur! j'ai essayé de passer par du javascript mais j'étais confronté au même problème.

Alors le seul moyen était de créer une action pour exécuter ces taches en mode admin !!


bien cordialement