javaBacked Script : injection de variables spring [RESOLU]

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

javaBacked Script : injection de variables spring [RESOLU]

bonjour

je suis sous alfresco 4.2.c, sous ubuntu 12.04, et réalise un traitement conséquent en java (la classe fait plus de 1500 lignes).

j'ai naturellement commencé par écrire une classe maître qui réalise le processus, avec différentes classes réalisant chacune un traitement spécifique (par exemple, gestion des tag, des catégories, …) et une classe contenant les différentes variables injectées par spring (par exemple, le repository, le registry, le searchservice, …)

je suis tombé sur des erreurs liées à la sécurité, à des variables "spring" nulles, que je n'ai pas réussi à régler (alors que les variables étaient bien initialisées).

dans mes recherches, j'ai tout réintégré dans une même classe (… de 1500 lignes) et je n'ai pas eu ces problèmes !

y a t il des préconisations liées à la sécurité, ou au passage de telles variables ?

Frédéric Marin

3 Replies
rguinot
Customer

Re: javaBacked Script : injection de variables spring [RESOLU]

Pour ce qui est des variables spring, il faut les injecter comme d'habitude sur le bean représentant votre java backed web script. Il y a des exemples dans l'entrepot dont vous pouvez vous inspirer. Concernant la sécurité, peut etre tentez vous des transactions sans contexte de sécurité et/ou sans être authentifié. Peut être également tentez vous de réaliser des traitements dans différents threads : vous devez être authentifié dans ce cas la également.

Sans plus de détails, logs, exceptions etc… Il sera difficile d'en savoir +.
fmarin
Member II

Re: javaBacked Script : injection de variables spring [RESOLU]

Bonjour

effectivement, tant que je reste dans le bean principal (celui défini dans le ~context.xml), je n'ai aucun problème.

je dois terminer le processus qui m'a été commandé … Dès que j'ai 5 minutes, je reprends le contexte posant problème en retirant tout ce qui concerne les aspects "métier" et en me concentrant sur la première indirection de classe, pour me permettre de poster un code raisonnable (celle qui provoque une erreur java de type authentification)

net.sf.acegisecurity.providers.ProviderNotFoundException: No authentication provider for net.sf.acegisecurity.providers.UsernamePasswordAuthenticationToken
   at net.sf.acegisecurity.providers.ProviderManager.doAuthentication(ProviderManager.java:169)
   at net.sf.acegisecurity.AbstractAuthenticationManager.authenticate(AbstractAuthenticationManager.java:49)
   at net.sf.acegisecurity.intercept.AbstractSecurityInterceptor.beforeInvocation(AbstractSecurityInterceptor.java:376)
   at net.sf.acegisecurity.intercept.method.aopalliance.MethodSecurityInterceptor.invoke(MethodSecurityInterceptor.java:77)
   at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
   at org.alfresco.repo.security.permissions.impl.ExceptionTranslatorMethodInterceptor.invoke(ExceptionTranslatorMethodInterceptor.java:46)
   at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
   at org.alfresco.repo.audit.AuditMethodInterceptor.invoke(AuditMethodInterceptor.java:159)
   at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)


Merci pour votre première réponse.

Frédéric Marin
fmarin
Member II

Re: javaBacked Script : injection de variables spring [RESOLU]

humm … finalement, je vais retourner sur mon code qui m'apparaît de moins en moins catholique.

J'ai simplifié, effectivement, et ne tombe pas sur l'erreur mentionnée.

Je joins le code à titre d'exemple au cas où cela intéresse quelqu'un

le bean appelé en tant que javabacked script
import java.util.HashMap;
import java.util.Map;
import org.alfresco.repo.model.Repository;
import org.alfresco.service.ServiceRegistry;
import org.springframework.extensions.webscripts.Cache;
import org.springframework.extensions.webscripts.DeclarativeWebScript;
import org.springframework.extensions.webscripts.Status;
import org.springframework.extensions.webscripts.WebScriptRequest;

public class StockageTestV8_test extends DeclarativeWebScript
{
   private boolean debug = true;
   // injection spring
      private Repository repository;
      private ServiceRegistry serviceRegistry;
      private String folderPathOut="";
      private String parentFolderPathOut="";
      
   /*
    * les setters - getters
    */
   public void setRepository(Repository repository)
   {
      this.repository=repository;
   }
   public void setServiceRegistry(ServiceRegistry serviceRegistry)
   {
      this.serviceRegistry=serviceRegistry;
   }
   public void setFolderPathOut(String folderPathOut)
   {
      this.folderPathOut=folderPathOut;
   }
   public void setParentFolderPathOut(String parentFolderPathOut)
   {
      this.parentFolderPathOut=parentFolderPathOut;
   }
   public Repository getRepository()
   {
      return this.repository;
   }
   public ServiceRegistry getServiceRegistry()
   {
      return this.serviceRegistry;
   }


/*
* corps de la classe
*/
   protected Map<String, Object> executeImpl(WebScriptRequest req,
      Status status, Cache cache)
   {
      BaseParam_test baseParam=new BaseParam_test(req, debug,
            repository,
            serviceRegistry,
            folderPathOut,
            parentFolderPathOut
            );
      
      baseParam.traitParam(req);

      Map<String, Object> model = new HashMap<String, Object>();
      model.put("mess", "slt old boy");
        if (debug) System.out.println("———– MainProc - fin ———– ");
      return model;
   }
}


et la classe appelée par le bean :

import java.util.Map;

import org.alfresco.service.cmr.model.FileInfo;

import org.alfresco.model.ContentModel;
import org.alfresco.repo.model.Repository;
import org.alfresco.service.ServiceRegistry;
import org.alfresco.service.cmr.repository.NodeRef;
import org.springframework.extensions.webscripts.WebScriptRequest;


public class BaseParam_test {

   private Repository repository;
   private ServiceRegistry serviceRegistry;
   private String folderPathOut="";
   private String parentFolderPathOut="";
   private String verboseArg = null;
   private Map<String, String> templateArgs = null;
   private NodeRef node=null;
   private String path = "";

   /*
    * les getters - setters
    */
   public Repository getRepository()
   {
      return this.repository;
   }
   public ServiceRegistry getServiceRegistry()
   {
      return this.serviceRegistry;
   }

   /*
    * Constructor
    */
   public BaseParam_test(WebScriptRequest req, boolean debug,
         Repository repository,
         ServiceRegistry serviceRegistry,
         String folderPathOut,
         String parentFolderPathOut
         ) {
        this.repository=repository;
        this.serviceRegistry=serviceRegistry;
        this.folderPathOut=folderPathOut;
        this.parentFolderPathOut=parentFolderPathOut;
    }
   
   public boolean traitParam(WebScriptRequest req)
   {
      verboseArg = req.getParameter("verbose");
      templateArgs = req.getServiceMatch().getTemplateVars();
   
      NodeRef parentNode=null;
      try {
         parentNode = getRepository().findNodeRef("path",
               ("workspace/SpacesStore/" + parentFolderPathOut).split("/"));
      } catch(Exception e) {
         System.out.println("create folder - erreur parent inexistant " + parentFolderPathOut );
         return true;
      }
      if (parentNode!=null)
      {
         FileInfo fi=null;
         try {
         fi = getServiceRegistry().getFileFolderService().create(parentNode,folderPathOut,ContentModel.TYPE_FOLDER);
         } catch (Exception e) {
            System.out.println("create folder - erreur sur create folder - " + folderPathOut);
            return true;
         }
         System.out.println("create folder faite - nodeParent=" + parentNode
            + " - nodePath=" + folderPathOut +  "___"
            + "\n name=" + fi.getName() + " - nodeRef=" +fi.getNodeRef() + " - properties=" +fi.getProperties()
            );
      }
      return false;
   }
}


merci pour votre aide … qui m'a permis de reposer le problème

Frédéric Marin