Remova CALs de documentos das APIs no Qlik View 12.

    Remova CALs de documentos das APIs no Qlik View 12.

     

    Vamos construir um exemplo de como você pode liberar cals de documentos num programa C # no Qlik View 12.

     

    Temos um gerenciamento de licenças complexo porque temos clientes em vários países e cada cliente define, a partir de um banco de dados, quais usuários devem ter acesso a cada documento.

     

    Para isso, temos uma solução C # que administra as licenças automaticamente, dependendo do que está definido nos bancos de dados. Executar esta tarefa manualmente, é um tanto tedioso e impossível, porque não só devemos eliminar as licenças manualmente, mas também as permissões em cada documento.

     

    Quando iniciamos os testes de migração para o QlikView 12, descobrimos que a exclusão de licenças de documentos e a liberação de licenças de desenvolvedor não funcionaram.

     

    Foi um tremendo golpe, porque isso nos impediu de passar para a nova versão.

     

    Após semanas de pesquisa e com a ajuda do suporte da Qlik, conseguimos superar a armadilha.

     

    Compartilho a solução encontrada na Comunidade, porque vi que existem vários usuários que receberam esse problema.

     

    Antes de começar, leve em consideração o lago muito importante. Ao adicionar a referência ao serviço, deverão escolher trabalhar com System.Collection.Generic.List em vez de array, que é o que aparece por padrão. Isso é essencial para a liberação de licenças para funcionar.

    listervcice.jpg

    Bem, vá ao trabalho.

     

    O primeiro passo é construir a solução de acordo com o que é detalhado no exemplo das API Qlik para a versão 12.

     

    https://help.qlik.com/pt-PT/qlikview-developer/12.1/apis/QMS%20API/html/2be1e405-a7e5-4a43-b1b6-9540b23a6226.htm

     

    Depois de concluir a solução e sem erros, substitua o código armado por:


    using System;

    using System.Collections.Generic;

    using System.ServiceModel;

    using System.ServiceModel.Channels;

    using System.ServiceModel.Configuration;

    using System.ServiceModel.Description;

    using System.ServiceModel.Dispatcher;

    using MyTestApplication.QMSAPI;

     

    namespace MyTestApplication

    {

        class ServiceKeyBehaviorExtensionElement : BehaviorExtensionElement

    {

    public override Type BehaviorType

    {

    get { return typeof(ServiceKeyEndpointBehavior); }

    }

     

    protected override object CreateBehavior()

    {

    return new ServiceKeyEndpointBehavior();

    }

    }

     

        class ServiceKeyEndpointBehavior : IEndpointBehavior

    {

    public void Validate(ServiceEndpoint endpoint) { }

     

    public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters) { }

     

    public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher) { }

     

    public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)

    {

    clientRuntime.MessageInspectors.Add(new ServiceKeyClientMessageInspector());

    }

    }

     

        class ServiceKeyClientMessageInspector : IClientMessageInspector

    {

    private const string SERVICE_KEY_HTTP_HEADER = "X-Service-Key";

     

    public static string ServiceKey { get; set; }

     

    public object BeforeSendRequest(ref Message request, IClientChannel channel)

    {

    object httpRequestMessageObject;

    if (request.Properties.TryGetValue(HttpRequestMessageProperty.Name, out httpRequestMessageObject))

    {

                    HttpRequestMessageProperty httpRequestMessage = httpRequestMessageObject as HttpRequestMessageProperty;

                    if (httpRequestMessage != null)

                    {

    httpRequestMessage.Headers[SERVICE_KEY_HTTP_HEADER] = (ServiceKey ?? string.Empty);

                    }

                    else

                    {

                        httpRequestMessage = new HttpRequestMessageProperty();

    httpRequestMessage.Headers.Add(SERVICE_KEY_HTTP_HEADER, (ServiceKey ?? string.Empty));

    request.Properties[HttpRequestMessageProperty.Name] = httpRequestMessage;

                    }

    }

    else

    {

                    HttpRequestMessageProperty httpRequestMessage = new HttpRequestMessageProperty();

    httpRequestMessage.Headers.Add(SERVICE_KEY_HTTP_HEADER, (ServiceKey ?? string.Empty));

    request.Properties.Add(HttpRequestMessageProperty.Name, httpRequestMessage);

    }

    return null;

    }

     

    public void AfterReceiveReply(ref Message reply, object correlationState) { }

    }

     

        class Program

    {

    static void Main(string[] args)

    {

    try

    {

                    string usuario = "USUARIO_PRUEBA@CUP.COM";

     

                    // create a QMS API client

                    IQMS apiClient = new QMSClient();

     

                    // retrieve a time limited service key

    ServiceKeyClientMessageInspector.ServiceKey = apiClient.GetTimeLimitedServiceKey();

    // get a list of QVS services

                    List<ServiceInfo> qvsServices = apiClient.GetServices(ServiceTypes.QlikViewServer);

                    if (qvsServices.Count > 0)

                    {

                        // retrieve folder settings for the first QVS in the list

                        QVSSettings qvsSettings = apiClient.GetQVSSettings(qvsServices[0].ID, QVSSettingsScope.Folders);

                        //qvsServices = apiClient.GetServices(ServiceTypes.QlikViewServer);

                        List<DocumentFolder> documentFolders = apiClient.GetUserDocumentFolders(qvsServices[0].ID, DocumentFolderScope.General);

                        List<DocumentNode> documents = apiClient.GetUserDocumentNodes(qvsServices[0].ID, documentFolders[1].ID, "");

                        foreach (DocumentNode myNode in documents)

                        {

                            if (myNode.Name.Equals("DOCUMENTO_QLIK_PRUEBA.QVW"))  //Document Name

                            {

                                // remove cals

                                var docMetaData = apiClient.GetDocumentMetaData(myNode, DocumentMetaDataScope.Licensing);

                                foreach (AssignedNamedCAL myCal in docMetaData.Licensing.AssignedCALs)

                                {

    if (myCal.UserName.Equals(usuario)) //User Name on the CAL

                                    {

                                        // remove licensy - both methods are neccesary

                                        docMetaData.Licensing.AssignedCALs.Remove(myCal);

    docMetaData.Licensing.RemovedAssignedCALs.Add(myCal);

                                        // update allocated cals number

    docMetaData.Licensing.CALsAllocated = docMetaData.Licensing.CALsAllocated - 1;

                                        // save document licensing metadata

    apiClient.SaveDocumentMetaData(docMetaData);

     

                                    }

                                }

                                break;

                            }

                        }

                    }

    }

    catch (System.Exception ex)

    {

                    Console.WriteLine("An exception occurred: " + ex.Message);

    }

    }

    }

    }

     

    Depois de ter feito isso, substitua o nome do documento Qlik e o usuário, pelos valores que deseja usar para testar.

     

    Por exemplo,

     

    Antes de executar a solução, temos o usuário com licença atribuída e cals atribuídos em 1.

    antes.jpg

     

    Após a execução da solução, fica

    despues.jpg

    Com o qual a licenca foi liberada e os cals alocados permaneceram em zero.

     

    Tenha em mente que, se o usuário usou a licença, ficara em quarentena por 7 dias a partir da última data de acesso. Se o usuário não entrar por um mês, a licença será liberada automaticamente.

     

    Bem, espero que essa pequena contribuição ajude aqueles que encontraram esse problema ao querer fazer testes no QlikView 12.

     

    Então vou carregar outra explicação sobre como liberar licenças para desenvolvedores.

     

    Eu deixo abaixo do código para remover as autorizações no documento.

     

    // remove authorization

    var docMetaDataAutho = apiClient.GetDocumentMetaData(myNode, DocumentMetaDataScope.Authorization);

    foreach (var user in docMetaDataAutho.Authorization.Access)

    {

                    if (user.UserName.ToLower() == usuario.ToLower())

                    {

                                   docMetaDataAutho.Authorization.Access.Remove(user);

                                   apiClient.SaveDocumentMetaData(docMetaDataAutho);

                    }

    }