diff -r 338bcc78d431 -r ded3cf22eef8 server/src/app/Console/Commands/ManageHandles.php --- /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 @@ + - 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"); + + } +}