Como invitar a un espacio via web service

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

Como invitar a un espacio via web service

Hola de nuevo,

después de crear un montón de usuarios y sus espacios a la vez, via web services, necesito invitar a otro usuario a todos estos espacios.

¿Sabeis si es posible con la implementación que tienen los web services de Alfresco?

Gracias.
4 Replies
ajv
Member II

Re: Como invitar a un espacio via web service

Hola fumanchu73!

Encontré un fragmento de código que proponían para hacerlo, pero no he tenido ocasión de probarlo  Smiley Surprisedops:.
Se basan en el servicio de control de acceso de los web services: http://wiki.alfresco.com/wiki/Access_Control_Web_Service

public void setAccessControlList(Store store, String path,
boolean inheritPermissions, Hashtable<String, String> accessControl) {

accessControlService = WebServiceFactory.getAccessControlService();

Reference ref = new Reference(store, null, getXPathEscape(path));

Predicate predicate = new Predicate(new Reference[] { ref }, store, null);

ACE[] aces = new ACE[accessControl.size()];

// remove existing …
accessControlService.removeACEs(predicate, null);
accessControlService.addACEs(predicate, aces);
accessControlService.setInheritPermission(predicate, inheritPermissions);
}
Básicamente, dado un nodo por path, le elimina los posibles permisos que pudiera tener, y le asigna un nuevo ACE (Access Control Entry), lo cual define los diferentes permisos y cómo se relacionan con el usuario. Taambién establece si hereda permisos del padre en función del parámetro.
Como se puede ver en el wiki, cada ACE está formado por authority (usuario - grupo), permiso, AccesStatus (ACEPTED / DECLINED).
Espero que te sirva como referencia.  :wink:

Hasta luego!!
fumanchu73
Member II

Re: Como invitar a un espacio via web service

Gracias ajv  :wink:

Pues parece que funciona  Smiley Very Happy  (pero no me fio hasta dentro de unos 10 o 12 años  :lol: )

Dejo aquí el código

   public static void invitarUsuarios(String spaceName, String storeName, String invitado) {
      
      final String consulta = "@\\{http\\://www.alfresco.org/model/content/1.0\\}name:\"" + spaceName + "\"";
      final Store store = new Store(Constants.WORKSPACE_STORE, storeName);
      
      ResultSetRow[] elencoNodos = getEspacioNodo(store, consulta);
      
      Predicate predicate = new Predicate();
      predicate.setStore(store);
      
      // cicle through the nodes
      for (ResultSetRow fila : elencoNodos) {
         Reference ref = new Reference();
         ref.setStore(store);
         ref.setUuid(fila.getNode().getId());
         predicate.setNodes(new Reference[] { ref });
      }
       AccessControlServiceSoapBindingStub accessControlService = WebServiceFactory.getAccessControlService();
       try {
         accessControlService.setOwners(predicate, invitado);
      } catch (AccessControlFault e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
      } catch (RemoteException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
      }
   }

   private static ResultSetRow[] getEspacioNodo(Store store, String consulta) {
      
      ResultSetRow[] elencoNodos = null;
      
      //Construimos la query
      Query query = new Query();
      query.setLanguage(Constants.QUERY_LANG_LUCENE);
      query.setStatement(consulta);
      
      try {
         //Ejecutamos la query y recogemos los resultados
         QueryResult qrst = WebServiceFactory.getRepositoryService().query(store, query, false);
         ResultSet rst = qrst.getResultSet();
         
         long numRec = rst.getTotalRowCount();
         System.out.println("Encontrados " + numRec + " nodos.");

         elencoNodos = rst.getRows();

      } catch (RepositoryFault e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
      } catch (RemoteException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
      }
      return elencoNodos;
   }
ajv
Member II

Re: Como invitar a un espacio via web service

Hola fumanchu73!!

El código que has pasado está bien, pero para establecer como propietario (owner) del espacio. Eso hace que el usuario que le pasas como parámetro tenga control total sobre el nodo (ya sea espacio o contenido).
Si lo que quieres hacer es invitar a usuarios para que puedan acceder al espacio con un rol determinado (Editor, Consumer, Coordinator,…) tendrás que emplear los ACEs.
Me he tomado la libertad de modificar el método de invitar usuarios, empleado las ACEs, a ver qué te parece  Smiley Tongue:
   public static void invitarUsuarios(String spaceName, String storeName,
         String invitado, String permiso,
         boolean eliminarInvitacionesAnteriores) {

      final String consulta = "@\\{http\\://www.alfresco.org/model/content/1.0\\}name:\""
            + spaceName + "\"";
      final Store store = new Store(Constants.WORKSPACE_STORE, storeName);

      ResultSetRow[] elencoNodos = getEspacioNodo(store, consulta);

      Predicate predicate = new Predicate();
      predicate.setStore(store);

      // cicle through the nodes
      for (ResultSetRow fila : elencoNodos) {
         Reference ref = new Reference();
         ref.setStore(store);
         ref.setUuid(fila.getNode().getId());
         predicate.setNodes(new Reference[] { ref });

         AccessControlServiceSoapBindingStub accessControlService = WebServiceFactory
               .getAccessControlService();
         try {
            // Establece Owner (Propietario) – yo no lo haría…
            accessControlService.setOwners(predicate, invitado);
            // Invita como coordinator

            ACE[] aces = new ACE[1];
            aces[0] = new ACE();
            aces[0].setAuthority(invitado);
            aces[0].setPermission(permiso);
            aces[0].setAccessStatus(AccessStatus.acepted);

            if (eliminarInvitacionesAnteriores) {
               // remove existing …
               accessControlService.removeACEs(predicate, null);
            }
            accessControlService.addACEs(predicate, aces);

         } catch (AccessControlFault e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
         } catch (RemoteException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
         }
      }
   }
- Yo no haría lo de establecer al usuario como Owner, sino que iría por permisos ya que puedes afinar más en el rol.
- Si te fijas, toda la gestión de los permisos la he incluido en el bucle, ya que la búsqueda te podría devolver diferentes nodos que tienen el mismo nombre (aunque a diferentes niveles). Si primero hicieras todo el bucle y después pasaras al control de los permisos, sólo afectaría al último nodo de los encontrados…y creo que lo que se pretende es modificar los permisos de todos los espacios que tengan ese nombre.
- El booleano eliminarInvitacionesAnteriores da la opción de eliminar todas las invitaciones que anteriormente pudiera tener el espacio.
- Y respecto a los permisos, lo único que hago es crear un ACE donde establezco el usuario, el rol y el tipo de acceso por defecto a aceptado (puede ser aceptado o denegado…pero la opción de denegar me parece que no está disponible a través del web client y no sé si dará problemas).

Un ejemplo de llamada a este método sería:
invitarUsuarios("pruebaWebService", "SpacesStore", "adrian", "Coordinator", false);
Bueno, espero que sea esto lo que buscabas.  :wink:
Hasta pronto!!
fumanchu73
Member II

Re: Como invitar a un espacio via web service

Un 10 para ajv  Smiley Tongue