<?php

/**
 * Copyright 2005-2020 de Solis Soluções Livres Ltda.
 *
 * Este arquivo é parte do programa Gnuteca.
 *
 * O Gnuteca é um software de propriedade da SOLIS, sendo desenvolvido
 * e mantido exclusivamente por esta empresa.
 *
 * A licença de uso está disponível mediante aquisição exclusiva junto à
 * SOLIS. A licença é concedida sem caráter de exclusividade ao licenciado.
 * Os direitos de uso são perpétuos.
 *
 * Embora os códigos fontes sejam fornecidos, o software é de propriedade
 * da SOLIS, não sendo permitido ao adquirente da licença a sua revenda,
 * empréstimo ou cessão (onerosa ou não) à terceiros. Também não é permitido,
 * a qualquer título e tempo, promover no software qualquer tipo de alienação,
 * reprodução, distribuição, divulgação, registro, licenciamento, transferência
 * ou qualquer outro ato que prejudique ou comprometa os direitos de propriedade
 * de software, o nome e a imagem da sua proprietária e do próprio software,
 * além de configurar concorrência à SOLIS.
 *
 * O licenciado, com o acesso ao código fonte do software, terá o direito de
 * promover mudanças no respectivo código. No entanto, nas situações em que ele
 * contar com o suporte oficial prestado pela SOLIS, não poderá promover mudanças
 * no código fonte, sob pena de perda do referido suporte.
 *
 * Para conhecer em detalhes o Termo de Licenciamento do Software Gnuteca
 * leia o arquivo “LICENCA.txt” disponível junto ao código deste software.
 * 
 * 
 * Class GDSpace
 *
 *
 *
 *
 *
 **/

class GDSpace
{
    private $url;
    private $cookie = null;
    private $logPath;

    public function __construct($url)
    {
        $MIOLO = MIOLO::getInstance();
        $this->url = $url; 
        $this->logPath = $MIOLO->getAbsolutePath() . '/var/log/gnuteca3-dspace.log';
    }

    public function login($login, $senha)
    {
        $this->log('Login no Dspace');
        $ch = curl_init($this->url . "/login?email={$login}&password={$senha}");
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET"); 
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);  
	    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
	    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
        curl_setopt($ch, CURLOPT_HEADER, true);

        $response = str_replace('"', '',  curl_exec($ch));  
       
        $err = curl_error($ch);
        $info = curl_getinfo($ch);

        if ( $info['http_code'] == 200 )
        {
            $this->log('[OK] -Login realizado com sucesso');
            preg_match('/^Set-Cookie:\s*([^;]*)/mi', $response, $cookie);
            $this->cookie = $cookie[1];

            return true;
        }
        else
        {
            $this->log('[ERRO] -Falha no login');
            $this->log($err);
            return false;
        }

        curl_close($ch);
    }
   
    public function status()
    {
        $this->log('Status do Dspace');
        $ch = curl_init($this->url . "/status");
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET"); 
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);  
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array(
            'Cookie: ' . $this->cookie
        ));
        $response = str_replace('"', '',  curl_exec($ch)); 

        $err = curl_error($ch);
        $info = curl_getinfo($ch);

        if ( $info['http_code'] == 200 )
        {
            $this->log(var_export($info, true)); 
            return true;
        }
        else
        {
            $this->log($err);
            return false;
        }

        curl_close($ch);
    }

    public function obterItem($itemId)
    {
        $this->log("Obtendo item {$itemId}");  
        $ch = curl_init($this->url . "/items/{$itemId}?expand=parentCollection");
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET"); 
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);  
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array(
            'Cookie: ' . $this->cookie, 
            'Accept: application/json',
            'Content-Type: application/json')
        );

        $response = curl_exec($ch);

        $err = curl_error($ch);

        $info = curl_getinfo($ch);

        if ( $info['http_code'] == 200 )
        {
            $object = json_decode($response);

            if ( $object )
            {
                $this->log('[OK] -Item obtido com sucesso');  
                return $object;
            }
 
            $this->log('[OK] -Item não encontrado');
   
            return null;
        }
        else
        {
            $this->log('[ERRO] -Falha ao obter o item');
            $this->log($err);

            return null;
        }

        curl_close($ch);
    }

    public function obterItems($offset, $limit)
    {
        $this->log('Obtendo itens');  

        $ch = curl_init($this->url . "/items?offset={$offset}&limit={$limit}");
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET"); 
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);  
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array(
            'Cookie: ' . $this->cookie, 
            'Accept: application/json',
            'Content-Type: application/json')
        );

        $response = curl_exec($ch);

        $err = curl_error($ch);

        $info = curl_getinfo($ch);

        if ( $info['http_code'] == 200 )
        {
            $object = json_decode($response);

            if ( $object )
            {
                $this->log('[OK] -Itens obtidos com sucesso');  
                return $object;
            }
 
            $this->log('[OK] -Itens não encontrados');
   
            return null;
        }
        else
        {
            $this->log('[ERRO] -Falha ao obter os itens');
            $this->log($err);

            return null;
        }

        curl_close($ch);
    }

    public function obterTodosIdsItens()
    {
        $offset = 0;
        $limit = 100;
        $ids = array();

        while ( $items = $this->obterItems($offset, $limit) )
        {
            $offset += $limit;
            foreach ( $items as $item )
            {
                $ids[] = $item->uuid;
            }
        }

        return $ids;
    }

    public function apagarItem($itemId)
    {
        $this->log("Apagando item {$itemId}");
        $args = $dados;

        $ch = curl_init($this->url . "/items/{$itemId}");
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "DELETE"); 
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);  
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array(
            'Cookie: ' . $this->cookie)
        );

        $response = curl_exec($ch);

        $err = curl_error($ch);

        $info = curl_getinfo($ch);

        if ( $info['http_code'] == 200 )
        {
            $this->log("[OK] -Item {$itemId} apagado com sucesso");

            return true;
        }
        else
        {
            $this->log("[ERRO] -Falha ao apagar item {$itemId}");
            $this->log(var_export($info, true));
            $this->log($err);

            return false;
        }

        curl_close($ch);
    }

    public function criarItem($colecao)
    {
        $this->log("Criando novo item na coleção {$colecao}");

        $args = array('type' => 'item');

        $ch = curl_init($this->url . "/collections/{$colecao}/items");
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); 
        curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($args));  
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);  
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array(
            'Cookie: ' . $this->cookie, 
            'Accept: application/json',
            'Content-Type: application/json')
        );

        $response = curl_exec($ch);
        $err = curl_error($ch);

        $info = curl_getinfo($ch);

        if ( $info['http_code'] == 200 )
        {
            $object = json_decode($response);
            if ( $object )
            {
                $this->log("Item {$object->uuid} criado com sucesso");
 
                return $object;
            }

            $this->log("[OK] -Falha ao criar item");
            $this->log($err);

            return null;
        }
        else
        {
            $this->log("[ERRO] -Falha ao criar item");
            $this->log($err);

            return null;
        }

        curl_close($ch);
    }

    public function inserirMetadados($itemId, $dados)
    {
        $this->log("Inserindo metadados no item {$itemId}");
        $this->log(var_export($dados, true));
  
        $args = $dados;

        $ch = curl_init($this->url . "/items/{$itemId}/metadata");
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); 
        curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($args));  
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);  
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array(
            'Cookie: ' . $this->cookie, 
            'Accept: application/json',
            'Content-Type: application/json')
        );

        $response = curl_exec($ch);

        $err = curl_error($ch);

        $info = curl_getinfo($ch);

        if ( $info['http_code'] == 200 )
        {
            $this->log("[OK] -Metadados inseridos com sucesso");
            return true;
        }
        else
        {
            $this->log("[ERRO] -Falha ao inserir metadados");
            $this->log($err);

            return false;
        }

        curl_close($ch);
    }

    public function apagarMetadados($itemId)
    {
        $this->log("Apagando metadados do item {$itemId}");

        $args = $dados;

        $ch = curl_init($this->url . "/items/{$itemId}/metadata");
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "DELETE"); 
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);  
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array(
            'Cookie: ' . $this->cookie)
        );

        $response = curl_exec($ch);

        $err = curl_error($ch);

        $info = curl_getinfo($ch);

        if ( $info['http_code'] == 200 )
        {
            $this->log("[OK] -Metadados apagados com sucesso");

            return true;
        }
        else
        {
            $this->log("[ERRO] -Falha ao apagar metadados");
            $this->log($err);

            return false;
        }

        curl_close($ch);
    }

    public function criarBitstream($itemId, $nome)
    {
        $this->log("Criando bitstream {$nome} no item {$itemId}");

        $args = $dados;

        $ch = curl_init($this->url . "/items/{$itemId}/bitstreams?name={$nome}");
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); 
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);  
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array(
            'Cookie: ' . $this->cookie,
            'Accept: application/json')
        );

        $response = curl_exec($ch);

        $err = curl_error($ch);

        $info = curl_getinfo($ch);


        if ( $info['http_code'] == 200 )
        {
            $object = json_decode($response);

            if ( $object )
            {
                $this->log("[OK] -Bitstream {$object->uuid} criado com sucesso");

                return $object->uuid;
            }

            $this->log("[ERRO] -Falha ao criar bitstream");
            $this->log($err);
 
            return null;
        }
        else
        {
            $this->log("[ERRO] -Falha ao criar bitstream");
            $this->log($err);

            return null;
        }

        curl_close($ch);
    }

    public function apagarBitstream($itemId, $bitstreamId)
    {
        $this->log("Apagando bitstream {$bitstreamId} no item {$itemId}");

        $args = $dados;

        $ch = curl_init($this->url . "/items/{$itemId}/bitstreams/{$bitstreamId}");
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "DELETE"); 
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);  
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array(
            'Cookie: ' . $this->cookie)
        );

        $response = curl_exec($ch);

        $err = curl_error($ch);

        $info = curl_getinfo($ch);

        if ( $info['http_code'] == 200 )
        {
            $this->log("[OK] -Bitstream apagado com sucesso");

            return true;
        }
        else
        {
            $this->log("[ERRO] -Falha ao apagar o bitstream");
            $this->log($err);

            return false;
        }

        curl_close($ch);
    }

    public function obterBitstreams($itemId)
    {
        $this->log("Obtendo bitstreams do item {$itemId}");

        $args = $dados;

        $ch = curl_init($this->url . "/items/{$itemId}/bitstreams");
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET"); 
        curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($args));  
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);  
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array(
            'Cookie: ' . $this->cookie, 
            'Accept: application/json',
            'Content-Type: application/json')
        );

        $response = curl_exec($ch);

        $err = curl_error($ch);

        $info = curl_getinfo($ch);

        if ( $info['http_code'] == 200 )
        {
            $object = json_decode($response);

            if ( $object )
            {
                $this->log("[OK] -Bitstreams obtidos com sucesso");

                return $object;
            }
 
            $this->log("[OK] -Não foram encontrado bitstreams");
 
            return null;
        }
        else
        {
            $this->log("[ERRO] -Falha ao obter bitstreams do item");
            $this->log($err);

            return null;
        }

        curl_close($ch); 
    }

    public function carregarConteudoBitstream($bitstreamId, $data)
    {
        $this->log("Enviando conteúdo de bitstream (upload de conteúdo) no bitstream {$bitstreamId}");

        $ch = curl_init($this->url . "/bitstreams/{$bitstreamId}/data");
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT"); 
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);   
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);  
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array(
            'Cookie: ' . $this->cookie,
            'Content-Type: text/plain',    
            'Accept: application/json')
        );

        $response = curl_exec($ch);

        $err = curl_error($ch);

        $info = curl_getinfo($ch);

        if ( $info['http_code'] == 200 )
        {
            $this->log('[OK] -Conteúdo carregado com sucesso');
            return true;
        }
        else
        {
            $this->log('[ERRO] -Falha ao carregar conteúdo');
            $this->log($err);
            return false;
        }

        curl_close($ch);
    }

    public function criarPolitica($bitstreamId)
    {
        $this->log("Criando política para o  bitstream {$bitstreamId}");

        $data = new stdClass();
        $data->action = 'READ';
        $data->epersonId = -1;
        $data->groupId = 0;
        $data->resourceId = $bitstreamId;
        $data->resourceType = 'bitstream';
        $data->rpDescription = null;
        $data->rpName = null;
        $data->rpType = 'TYPE_INHERITED';
        $data->startDate = null;
        $data->endDate = null;

        $ch = curl_init($this->url . "/bitstreams/{$bitstreamId}/policy");
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
        curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array(
            'Cookie: ' . $this->cookie,
            'Accept: application/json',
            'Content-Type: application/json')
        );

        $response = curl_exec($ch);
        $err = curl_error($ch);

        $info = curl_getinfo($ch);

        if ( $info['http_code'] == 200 )
        {
            $this->log('[OK] - Política para bitstream criada com sucesso');
            return true;
        }
        else
        {
            $this->log('[ERRO] -Falha ao criar política para bitstream');
            $this->log($err);
            return false;
        }

        curl_close($ch);
    }

    public function sincronizarMaterial($itemId=NULL, $colecaoId, $dados)
    {
        $this->log("\n" . 'Sincronização de material ['. ($itemId ? 'Edição' : 'Inserção') . ']');
        $edicao = true;

        if ( !$itemId )
        {
            $item = $this->criarItem($colecaoId);

            if ( $item )
            {
                $itemId = $item->uuid;
            }

            $edicao = false;
        }

        if ( $edicao )
        {
            $bitstreams = $this->obterBitstreams($itemId);

            // Apaga todos bitstreams na edição.
            if ( is_array($bitstreams) )
            {
                foreach ( $bitstreams as $bitstream )
                {
                    $this->apagarBitstream($itemId, $bitstream->uuid);
                }
            }
            // Apaga metadados na edição.
            $apagarMetadados =  $this->apagarMetadados($itemId);
        }

        // Carrega dados do bitstream.
        foreach ( $dados as $i => $dado )
        {
            if ( $dado->key == 'dc.identifier.uri' )
            {
                $name = explode('file=', $dado->value);
                $fileName = $name[1];
                $dataFile = file_get_contents($dado->value);
                $bitstreamId = $this->criarBitstream($itemId, $fileName);
                $this->criarPolitica($bitstreamId);
                $this->carregarConteudoBitstream($bitstreamId, $dataFile);

                // Remove a URI dos metadados.
                unset($dados[$i]);
            }
        }

        // Refaz as chaves do array.
        $dados = array_values($dados);

        // Insere metadados.
        $inserido = $this->inserirMetadados($itemId, $dados);

        $this->log('Fim da sincronização' . "\n");

        return $itemId;
    }

    public function obterColecoes($subcomunidade)
    {
        $this->log("Obtendo coleções da subcomunidade {$subcomunidade}");

        $ch = curl_init($this->url . "/communities/{$subcomunidade}/collections");
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET"); 
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);  
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array(
            'Cookie: ' . $this->cookie, 
            'Accept: application/json',
            'Content-Type: application/json')
        );

        $response = curl_exec($ch);

        $err = curl_error($ch);

        $info = curl_getinfo($ch);

        if ( $info['http_code'] == 200 )
        {
            $object = json_decode($response);

            if ( $object )
            {
                $this->log("[OK] -Coleções obtidas com sucesso");
                return $object;
            }
 
            $this->log("[OK] -Não foram encontradas coleções");

            return null;
        }
        else
        {
            $this->log("[ERRO] -Falha ao obter coleções");
            $this->log($err);

            return null;
        }

        curl_close($ch);
    }

    public function obterComunidades($offset, $limit)
    {
        $this->log("Obtendo comunidades");  
        $ch = curl_init($this->url . "/communities/top-communities?offset={$offset}&limit={$limit}");
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET"); 
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);  
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array(
            'Cookie: ' . $this->cookie, 
            'Accept: application/json',
            'Content-Type: application/json')
        );

        $response = curl_exec($ch);

        $err = curl_error($ch);

        $info = curl_getinfo($ch);

        if ( $info['http_code'] == 200 )
        {
            $object = json_decode($response);

            if ( $object )
            {
                $this->log("[OK] -Comunidades obtidas com sucesso");   
                return $object;
            }
 
            return null;
        }
        else
        {
            $this->log("[ERRO] -Falha ao obter comunidades");
            $this->log($err);

            return null;
        }

        curl_close($ch);
    }

    public function obterTodasComunidades()
    {
        $offset = 0;
        $limit = 100;
        $retorno = array();

        while ( $comunidades = $this->obterComunidades($offset, $limit) )
        {
            $offset += $limit;
            foreach ( $comunidades as $comunidade )
            {
                $retorno[] = $comunidade;
            }
        }

        return $retorno;
    }

    public function obterSubcomunidades($comunidade)
    {
        $this->log("Obtendo subcomunidades da comunidade {$comunidade}");  

        $ch = curl_init($this->url . "/communities/{$comunidade}/communities");
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET"); 
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);  
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array(
            'Cookie: ' . $this->cookie, 
            'Accept: application/json',
            'Content-Type: application/json')
        );

        $response = curl_exec($ch);

        $err = curl_error($ch);

        $info = curl_getinfo($ch);

        if ( $info['http_code'] == 200 )
        {
            $object = json_decode($response);

            if ( $object )
            {
                $this->log("[OK] -Subcomunidades obtidas com sucesso");  
  
                return $object;
            }
 
            $this->log("[OK] - Não foram encontradas subcomunidades");

            return null;
        }
        else
        {
            $this->log("[ERRO] - Falha ao obter subcomunidades");
            $this->log($err);
            return null;
        }

        curl_close($ch);
    }

    public function log($mensagem)
    {
        file_put_contents($this->logPath, date('d/m/Y H:i:s'). ' - ' . $mensagem . "\n", FILE_APPEND);
    }

    public function obterRelacaoComunidadesxColecao()
    {
        $this->log("\n" . 'Obtendo relação entre comunidades x subcomunidades x coleções no DSpace');
        $comunidades = $this->obterTodasComunidades();
        $IdColecoes = [];

        if ( is_array($comunidades) )
        {
            foreach ( $comunidades as $comunidade )
            {
                $subcomunidades = $this->obterSubcomunidades($comunidade->uuid);

                if ( is_array($subcomunidades) && count($subcomunidades) > 0 )
                {
                    foreach ( $subcomunidades as $subcomunidade )
                    {
                        $colecoes = $this->obterColecoes($subcomunidade->uuid);
                          
                        if ( is_array($colecoes) )
                        {
                            foreach ( $colecoes as $colecao )
                            {
                                $IdColecoes[strtolower(trim($comunidade->name))][strtolower(trim($subcomunidade->name))][strtolower(trim($colecao->name))] = $colecao->uuid;
                            }
                        }
                    }
                }            
            }
        }

        $this->log('Fim da obtenção de relação' . "\n");

        return $IdColecoes;
    }
}

?>
