Importing programmatically bulk ?

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

Importing programmatically bulk ?

Bonjour tout le monde,

je suis débutant dans alfresco, j'ai réussie l'integration de document en masse avec l'add-on bulk, http://code.google.com/p/alfresco-bulk-filesystem-import/
mais seulement avec UI web script qui permet de le faire manuellement. ce qui m’intéresse c'est l'import automatique,

j'ai parcouru toute la doc possible, et la section Importing programmatically propose ce code sans aucun autre commentaire:


   UserTransaction txn = transactionService.getUserTransaction();
   txn.begin();
           
   AuthenticationUtil.setRunAsUser("admin");
                 
   StreamingNodeImporterFactory streamingNodeImporterFactory = (StreamingNodeImporterFactory)ctx.getBean("streamingNodeImporterFactory");
   NodeImporter nodeImporter = streamingNodeImporterFactory.getNodeImporter(new File("importdirectory"));
   BulkImportParameters bulkImportParameters = new BulkImportParameters();
   bulkImportParameters.setTarget(folderNode);
   bulkImportParameters.setReplaceExisting(true);
   bulkImportParameters.setBatchSize(40);
   bulkImportParameters.setNumThreads(4);
   bulkImporter.bulkImport(bulkImportParameters, nodeImporter);

   txn.commit();

c'est un peu rude, j'ai beau chercher, je ne trouve pas comment utiliser ce bout de code

Merci d'avance,


ma config: alfresco 3.4.e, Windows, tomcat, postgres, alfresco-bulk-filesystem-1.1
8 Replies
cnerger
Member II

Re: Importing programmatically bulk ?

Bonjour ,

   Je travaille avec un alfresco en version 3.4d ainsi que bulk import mais à la difference que je suis sous linux .

J'utilise quotidiennement bulk-import pour intégrer 15-20K fichiers et on utilise bulkimport dans nos scripts d'imports  avec curl http://wiki.soolbox.net/wiki/SysadminTips/cURL.

Il te faudrait trouver un équivalent sous windows dans le cas d'import in-place , mais dans le cas d'import streamé tu pourrai le faire a partir d'un machine (ou vm ) linux .

Voici à quoi ressemble la commande :

target=/Company%20Home/bulktest
source=/ton/dossier/a/importer

curl -sLG -w "%{http_code} %{url_effective}" -d "sourceDirectory=$source&targetPath=$target" "http://admin:admin@localhost:8080/alfresco/s/bulk/import/filesystem/
initiate" -o /dev/null

NB: tu peux utiliser la webUi pour définir plus facilement ta target avec l'auto-complétion .

J’espère t'avoir aidé .

Bonne journée
Cédric
rguinot
Customer

Re: Importing programmatically bulk ?

Il n'est en effet pas obligatoire de réaliser du code Java…. Vous pouvez appeler le service (que ce soit en streaming ou en in place) via cURL ou tout autre moyen vous permettant d'effectuer une requête POST sur le web script en question.

Attention toutefois a ne pas confondre l'outil de bulk import disponible sur google code, et l'outil disponible dans le produit a partir de la version 4. Les capacités peuvent différer.
curtis
Member II

Re: Importing programmatically bulk ?

Bonjour, tout d'abord je vous remercie pour vos réponses,

j'utilise le cURL avec Cygwin sous windows, et j'ai utilisé la la commande :

$ curl -sLG -w  -d "sourceDirectory=C:\CaseManager\Capture-Test&targetPath=/Espace%20racine/Case%20Manager" "http://admin:pwd@localhost:8080/alfresco/service/bulk/import/filesystem" -o C:/My/Folder

j'ai le resultat suivant:


-d<!DOCTYPE HTML>
<html>
  <head>
    <title>Bulk Filesystem Import Tool</title>
    <link rel="stylesheet" href="/alfresco/css/main.css" TYPE="text/css">

    <!– YUI 3.x –>
    <link rel="stylesheet" type="text/css" href="http://yui.yahooapis.com/combo?3.3.0/build/widget/assets/skins/sam/widget.css&3.3.0/build/widget/ass...              s/skins/sam/widget-stack.css&3.3.0/build/autocomplete/assets/skins/sam/autocomplete.css">
    <script type="text/javascript" src="http://yui.yahooapis.com/combo?3.3.0/build/yui/yui-min.js&3.3.0/build/intl/intl-min.js&3.3.0/build/a...              /lang/autocomplete.js&3.3.0/build/collection/array-extras-min.js&3.3.0/build/oop/oop-min.js&3.3.0/build/event-custom/event-custom-min.js&3.3.0/build/at              tribute/attribute-min.js&3.3.0/build/base/base-base-min.js&3.3.0/build/base/base-build-min.js&3.3.0/build/escape/escape-min.js&3.3.0/build/dom/dom-base              -min.js&3.3.0/build/dom/selector-native-min.js&3.3.0/build/dom/selector-css2-min.js&3.3.0/build/event/event-base-min.js&3.3.0/build/node/node-base-min.              js&3.3.0/build/event/event-base-ie-min.js&3.3.0/build/event/event-synthetic-min.js&3.3.0/build/event/event-focus-min.js&3.3.0/build/event-valuechange/e              vent-valuechange-min.js&3.3.0/build/querystring/querystring-stringify-simple-min.js&3.3.0/build/io/io-base-min.js&3.3.0/build/json/json-parse-min.js&3.              3.0/build/jsonp/jsonp-min.js&3.3.0/build/jsonp/jsonp-url-min.js&3.3.0/build/yql/yql-min.js&3.3.0/build/dom/selector-css3-min.js&3.3.0/build/pluginhost/              pluginhost-min.js&3.3.0/build/base/base-pluginhost-min.js&3.3.0/build/dom/dom-style-min.js&3.3.0/build/dom/dom-style-ie-min.js&3.3.0/build/node/node-st              yle-min.js&3.3.0/build/classnamemanager/classnamemanager-min.js&3.3.0/build/event/event-delegate-min.js&3.3.0/build/node/node-event-delegate-min.js&3.3              .0/build/widget/widget-min.js&3.3.0/build/widget/widget-base-ie-min.js&3.3.0/build/dom/dom-screen-min.js&3.3.0/build/node/node-screen-min.js&3.3.0/buil              d/widget/widget-position-min.js&3.3.0/build/widget/widget-position-align-min.js&3.3.0/build/widget/widget-stack-min.js&3.3.0/build/autocomplete/autocom              plete-min.js&3.3.0/build/autocomplete/autocomplete-list-keys-min.js&3.3.0/build/autocomplete/autocomplete-list-keys-min.js"></script>

    <style type="text/css">
      .yui3-aclist-content {
        background-color   : white;
        border             : 1px solid darkgrey;
        box-shadow         : 3px 3px 4px lightgrey;
        -webkit-box-shadow : 3px 3px 4px lightgrey; /* Safari and Chrome */

       }
    </style>

    <!– Validation functions –>
    <script type="text/javascript">
      function validateRequired(field, errorMessageElement, errorMessage)
      {
        var result = true;

        if (field.value == null || field.value == "")
        {
          errorMessageElement.textContent = errorMessage;
          result = false;
        }
        else
        {
          errorMessageElement.textContent = "";
        }

        return result;
      }


      function validateForm(form)
      {
        var result = true;

        result = validateRequired(form.sourceDirectory, document.getElementById("sourceDirectoryMessage"), "Source directory is mandatory.");

        if (result)
        {
          result = validateRequired(form.targetPath, document.getElementById("targetPathMessage"), "Target space is mandatory.");
        }

        return result;
      }
    </script>
  </head>
  <body class="yui-skin-sam">
    <table>
      <tr>
        <td><img src="/alfresco/images/logo/AlfrescoLogo32.png" alt="Alfresco" /></td>
        <td><nobr>Bulk Filesystem Import Tool</nobr></td>
      </tr>
      <tr><td><td>Alfresco Community v3.4.0 (e 3419)
    </table>
    <form action="/alfresco/service/bulk/import/filesystem/initiate" method="get" enctype="multipart/form-data" charset="utf-8" onsubmit="return valida              teForm(this);">
      <table>
        <tr>
          <td>Import directory:</td><td><input type="text" name="sourceDirectory" size="128" /></td><td id="sourceDirectoryMessage" style="color:red"><              /td>
        </tr>
        <tr>
          <td><br/><label for="targetPath">Target space:</label></td>
          <td>
            <div id="targetNodeRefAutoComplete">
              <input id="targetPath" type="text" name="targetPath" size="128" />
              <div id="targetPathAutoSuggestContainer"></div>
            </div>
          </td>
          <td id="targetPathMessage" style="color:red"></td>
        </tr>
        <tr>
          <td colspan="3"> </td>
        </tr>
        <tr>
          <td><label for="replaceExisting">Replace existing files:</label></td><td><input type="checkbox" id="replaceExisting" name="replaceExisting" v              alue="replaceExisting" unchecked/> (unchecked means skip files that already exist in the repository)</td><td></td>
        </tr>
        <tr>
          <td colspan="3"> </td>
        </tr>
        <tr>
          <td colspan="3"><input type="submit" name="submit" value="Initiate Bulk Import"></td>
        </tr>
      </table>
      <br/>
    </form>
    <script type="text/javascript">
    YUI().use("autocomplete", "autocomplete-highlighters", "datasource-get", function(Y)
    {
      Y.one('#targetPath').plug(Y.Plugin.AutoComplete,
      {
        source            : '/alfresco/service/bulk/import/filesystem/ajax/suggest/spaces.json?query={query}',
        maxResults        : 25,
        resultHighlighter : 'phraseMatch',
        resultListLocator : 'data',
        resultTextLocator : 'path'
      });
    });
    </script>
  </body>
</html>
-d
J'ai pas eu d'import, ni d'erreur dans les logs, @Cédric quesque je dois mettre a la place de: "%{http_code} %{url_effective}"

Cordialement.
rguinot
Customer

Re: Importing programmatically bulk ?

au minimum il manque /initiate a la fin de votre URL.
curtis
Member II

Re: Importing programmatically bulk ?

Bonjour, et merci vos réponse claires et précises.

au minimum il manque /initiate a la fin de votre URL.
le /initiate n'a rien changé, es que c'est a cause du code suivent que je n'ai pas initié quelque part ? si oui ou ?
   UserTransaction txn = transactionService.getUserTransaction();
   txn.begin();
          
   AuthenticationUtil.setRunAsUser("admin");
                
   StreamingNodeImporterFactory streamingNodeImporterFactory = (StreamingNodeImporterFactory)ctx.getBean("streamingNodeImporterFactory");
   NodeImporter nodeImporter = streamingNodeImporterFactory.getNodeImporter(new File("importdirectory"));
   BulkImportParameters bulkImportParameters = new BulkImportParameters();
   bulkImportParameters.setTarget(folderNode);
   bulkImportParameters.setReplaceExisting(true);
   bulkImportParameters.setBatchSize(40);
   bulkImportParameters.setNumThreads(4);
   bulkImporter.bulkImport(bulkImportParameters, nodeImporter);

Une dernière question: je souhaite que mon process d'importation massive soit automatisé, es que c'est la bonne approche ?

Bien Cordialement

ma config: alfresco 3.4.e community, Windows, tomcat, postgres, alfresco-bulk-filesystem-1.1
curtis
Member II

Re: Importing programmatically bulk ?

Up
cnerger
Member II

Re: Importing programmatically bulk ?

Bonjour,

Curtis , pratiques tu depuis longtemps le Cygwin/shell ? afin que je détaille mes réponses si nécessaire ?



Effectivement , il y a un problème, peut être je me suis mal expliqué ( ce ne sera pas la premiere fois avec bfsi  :roll: ) , je vais donc re-décomposer la sequence curl :

tes variable :

source=C:\CaseManager\Capture-Test
target=/Espace%20racine/Case%20Manager

avec variable assignée:

curl -sLG -w "%{http_code} %{url_effective}" -d "sourceDirectory=C:\CaseManager\Capture-Test&targetPath=/Espace%20racine/Case%20Manager" "http://user:mdp@localhost:8080/alfresco/s/bulk/import/filesystem/ initiate" -o /dev/null 

le "initiate" -o /dev/null" en dessous vas a la suite comme dans l'exemple suivant!!!

forme scripté ( a utiliser dans un .sh)

curl -sLG -w "%{http_code} %{url_effective}" -d "sourceDirectory=$source&targetPath=$target" "http://admin:admin@localhost:8080/alfresco/s/bulk/import/filesystem/ initiate" -o /dev/null 

Comme tu peut le voir , tu n'as à modifier que les variables $source et $target, les "%{http_code}" et  "%{url_effective}" sont des arguments propres à curl , que tu n'as pas besoin de modifier pour l'exemple 

Dans ton dernier message , le code que tu presente n'a aucun rapport avec la commande curl en cours.
Tu pourras automatiser tes imports via un script bash , dans lequel tu automatiseras l'affectation des variables $sources & $target.

Je reste dans les environs si tu as d'autre questions.

bonne journée , et bon courage
Cédric


ps : à quoi correspond ton "-o C:/My/Folder" ??
mdutoo
Member II

Re: Importing programmatically bulk ?

Bonjour

Vous pouvez aussi utiliser l'ETL Talend pour configurer visuellement le mapping de vos fichiers et métadonnées vers Alfresco, où elles sont envoyées à l'aide de l'Alfresco ETL Connector :

http://knowledge.openwide.fr/Main/AlfrescoETLConnector

Un tel "job" Talend peut alors être exécuté à la demande depuis Talend ou planifié manuellement (gratuit) ou depuis leur interface web payante (TIS TAC).