cancel
Showing results for 
Search instead for 
Did you mean: 

Importing programmatically bulk ?

curtis
Champ in-the-making
Champ in-the-making
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 8

cnerger
Champ in-the-making
Champ in-the-making
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
Confirmed Champ
Confirmed Champ
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
Champ in-the-making
Champ in-the-making
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
Confirmed Champ
Confirmed Champ
au minimum il manque /initiate a la fin de votre URL.

curtis
Champ in-the-making
Champ in-the-making
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
Champ in-the-making
Champ in-the-making
Up

cnerger
Champ in-the-making
Champ in-the-making
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
Champ on-the-rise
Champ on-the-rise
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).
Getting started

Tags


Find what you came for

We want to make your experience in Hyland Connect as valuable as possible, so we put together some helpful links.