server/src/app/Console/Commands/ManageHandles.php
changeset 154 ded3cf22eef8
parent 153 338bcc78d431
child 326 226d5b17a119
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/server/src/app/Console/Commands/ManageHandles.php	Sun Apr 24 22:38:10 2016 +0200
@@ -0,0 +1,150 @@
+<?php
+
+namespace CorpusParole\Console\Commands;
+
+use Illuminate\Console\Command;
+
+use GuzzleHttp\Client;
+use CorpusParole\Libraries\Handle\handleClient;
+use CorpusParole\Libraries\CocoonUtils;
+use CorpusParole\Repositories\DocumentRepository;
+
+class ManageHandles extends Command
+{
+    /**
+     * The name and signature of the console command.
+     *
+     * @var string
+     */
+    protected $signature = 'corpus-parole:manageHandles
+                                {--r|replace : Replace value for existing handles}
+                                {--k|key= : Private key}
+                                {--p|password=: key password}
+                                {--P|ask-password : ask for private key password}
+                                {--a|admin-id= : the admin index + handle - default to config value corpusparole.handle_admin_id, env var HANDLE_ADMIN_ID}
+                                {--H|host= : the handle host format <ip[:port]> - default to corpusparole.handle_host:corpusparole.handle_port (env HANDLE_HOST:HANDLE_PORT)}
+                                {--x|prefix= : handle prefix (default to corpusparole.handle_prefix, env HANDLE_PREFIX)}
+                                {--s|step-size=100 : number of documents to retrieve from repository at a time before indexing}';
+
+    /**
+     * The console command description.
+     *
+     * @var string
+     */
+    protected $description = 'Synchronize the handle registry with the content of the rdf repository.';
+
+
+    /**
+     * Create a new command instance.
+     *
+     * @return void
+     */
+    public function __construct(DocumentRepository $documentRepository, Client $httpClient)
+    {
+        $this->documentRepository = $documentRepository;
+        $this->httpClient = $httpClient;
+        parent::__construct();
+    }
+
+    private function registerHandle($doc) {
+        $this->handleClient->createHandleUrlRecord($doc->getId(), env('APP_URL')."/docs/".$doc->getId());
+    }
+
+    /**
+     * Execute the console command.
+     *
+     * @return mixed
+     */
+    public function handle()
+    {
+        $stepSize = $this->option('step-size');
+
+        $passwordKey = $this->option('password');
+        if($this->option('ask-password')) {
+            $passwordKey = $this->secret('Private key password?');
+        }
+
+        $privateKey = $this->option('key');
+        if(empty($privateKey)) {
+            $privateKey = config('corpusparole.handle_cert_or_pkey');
+        }
+        if(empty($privateKey)) {
+            throw new Exception("No private key found");
+        }
+
+        $adminId = $this->option('admin-id');
+        if(empty($adminId)) {
+            $adminId = config('corpusparole.handle_admin_id');
+        }
+        if(empty($adminId)) {
+            throw new Exception("No admin id found");
+        }
+
+        $handleHost = $this->option('host');
+        if(!empty($handleHost)) {
+            list($handleHost, $handlePort) = array_pad(explode($handleHost, ':'), 2, 8000);
+        }
+        if(empty($handleHost)) {
+            $handleHost = config('corpusparole.handle_host');
+        }
+        if(empty($handlePort)) {
+            $handlePort = config('corpusparole.handle_port', 8000);
+        }
+        if(empty($handleHost)) {
+            throw new Exception("No handle host found");
+        }
+
+        $this->handlePrefix = $this->option('prefix');
+        if(empty($this->handlePrefix)) {
+            $this->handlePrefix = config('corpusparole.handle_prefix');
+        }
+        if(empty($this->handlePrefix)) {
+            throw new Exception("No prefix found");
+        }
+
+        // create handle client
+        $this->handleClient = new HandleClient($privateKey, $passwordKey, $adminId, $handleHost, $handlePort, $this->httpClient);
+
+        $this->info("Adding documents handles...");
+
+        $total = $this->documentRepository->getCount();
+
+        $docs = $this->documentRepository->paginateAll($stepSize, 'page');
+
+        $progressBar = $this->output->createProgressBar($docs->total());
+        $progressBar->setFormat(' %current%/%max% [%bar%] %percent:3s%% - %message%');
+
+        while(!is_null($docs)) {
+            foreach ($docs as $doc){
+                $this->registerHandle($doc);
+                $progressBar->setMessage($doc->getId());
+                $progressBar->advance();
+            }
+            $docs = ($docs->hasMorePages()? $this->documentRepository->paginateAll($stepSize, 'page', $docs->currentPage()+1):null);
+        }
+
+        $progressBar->finish();
+        $this->info("\nAdding handles completed\n");
+
+        $this->info("Removing extra handles...\n");
+
+        $handles = $this->handleClient->paginateAll($this->handlePrefix, $stepSize, 'page');
+
+        $progressBar = $this->output->createProgressBar($handles->total());
+        $progressBar->setFormat(' %current%/%max% [%bar%] %percent:3s%% - %message%');
+
+        while(!is_null($handles)) {
+            foreach($handles as $handle) {
+                if(strpos($handle, config('corpusparole.corpus_id_prefix')) === 0 && is_null($this->documentRepository->get($handle))) {
+                    $this->handleClient->deleteHandle($handle);
+                }
+                $progressBar->setMessage($handle);
+                $progressBar->advance();
+            }
+            $handles = $handles->hasMorePages()?$this->handleClient->paginateAll($this->handlePrefix, $stepSize, 'page', $handles->currentPage()+1):null;
+        }
+
+        $this->info("\nRemoving extra handles completed");
+
+    }
+}