cancel
Showing results for 
Search instead for 
Did you mean: 

Assigner une catégorie à un document en Java avec l'API CMIS

fmarin
Champ in-the-making
Champ in-the-making
bonjour

j'utilise l'implémentation community 5.0 sous Ubuntu 14.04, et je commence à utiliser l'API CMIS

Je cherche à associer un document à une catégorie ; en m'appuyant sur des recherches faites sur le net, et notamment le site http://ecmarchitect.com, j'ai écrit la méthode suivante (qui fonctionne correctement) :
   protected void addCategory(
         Session session,
         Document testDoc,
         String categoryName
         )
   {
      ItemIterable<QueryResult> rs = session.query(
          "select * from cm:category where cmis:name = '" + categoryName + "'",false);
      if (rs.getTotalNumItems() == 0) {
         System.out.println("Couldn't find category with name: " + categoryName);
         return;
      }
      
      int i=0;
      String catId=null;;
      for (QueryResult resultRow : rs)
      {
              if (i==0)
         {
            catId = resultRow.getPropertyValueById("cmis:objectId");
         }
      } 
      testDoc.refresh();
      List<String> aspects = testDoc.getPropertyValue("cmis:secondaryObjectTypeIds");
      
      //je contrôle l'existence de l'aspect 'categorisable' par une méthode adhoc
      if (! CmisClientAspectUtil.readAspectsForExistingDocument(session,
                     testDoc, "P:cm:generalclassifiable"))
      {
         //et j'attribue l'aspect le cas échéant
         CmisClientAspectUtil.addAspectToExistingDocument(
                                testDoc,"P:cm:generalclassifiable",debug);
      }
       
      if (!testDoc.isLatestVersion())
      {
          testDoc = testDoc.getObjectOfLatestVersion(false);
      }
       
      List<String> catIds = testDoc.getPropertyValue("cm:categories");

      if (!catIds.contains(catId)) {
         catIds.add(catId);
         for (int k=0; k<catIds.size(); k++)
         {
             catIds.set(k,"workspace://SpacesStore/"+catIds.get(k));
         }
         HashMap<String, List<String>> props = new HashMap<String, List<String>>();
         props.put("cm:categories",catIds);
         testDoc.updateProperties(props, false);
       }
   }


mes interrogations :
1) est ce la bonne méthode ? c'est à dire correspond elle aux bonnes pratiques ?
2) la méthode s'exécute avec un elaps de 200 millisecondes : c'est acceptable pour un traitement unitaire, mais cela l'est moins pour un traitement par lot ; y aurait t il alors une méthode à recommander ?

merci de vos conseils

Frédéric
2 REPLIES 2

cleseach
Star Contributor
Star Contributor
Bonjour Frédéric,

J'imagine qu'une bonne partie du temps de traitement provient de la recherche de l'identifiant de la catégorie.
Pour traiter un lot de documents, tu as tout intérêt à maintenir un cache des catégories afin d'éviter d'exécuter la recherche pour des catégories déjà rencontrées.

Cordialement,
Charles Le Seac'h

fmarin
Champ in-the-making
Champ in-the-making
j'ai enfin pris le temps de commencer à explorer l'api cmis Smiley Happy  (j'ai encore en mémoire ce que tu m'en disais alors)

les relevés détaillés de temps donnent
- 94 millisecondes pour la lecture de la catégorie
- 141 millisecondes pour la lecture du document à associer
- 124 millisecondes pour l'association en tant que tel

tu as raison, effectivement, avoir la classification en cache serait plus productif, mais il semble que l'api cmis ne fournisse pas les services ad'hoc  (elle ne permet l'accès qu'au spacestore de stockage des documents …).

j'ai d'ailleurs posté un sujet sur la création d'une catégorie à la volée … ("cmis and create a new category")

Frédéric Marin