Tutorials

How to use a context menu with FancyTree

Sep 14, 2016 in javascript, fancytree, nestor-qa | tutorials

There used to be several different ways, and even an almost official way to have a context menu in a FancyTree. But it has long been decommissioned, and now the recommendation is to use a global context menu, instead of having a context menu only for the FancyTree. That does make sense, since if your application is already using a context menu library, there may be some inconsistencies with another library provided by FancyTree. Good engineering decision.

Requirements

In Nestor QA, we are using Bower to manage some of the project dependencies. The now recommended library for context menus, that is compatible with the FancyTree library, is jquery-ui-contextmenu (by the same author). However, I could not find it via bower search. So the first step is to install it using a GitHub tag.

bower install --save ui-contextmenu=mar10/jquery-ui-contextmenu#84fb56c6760d1ebd8be3785cd6ff5b67c5c41453

Where 84fb56c6760d1ebd8be3785cd6ff5b67c5c41453 is the commit hash for the latest tag, v1.13.0.

Furthermore, as we also have RequireJS, we have to add the following entry under the paths entry.

paths: {
    'jquery-ui/menu': 'libs/jquery-ui/ui/widgets/menu'
},

packages: [
    {
        name: 'uicontextmenu',
        location: 'libs/ui-contextmenu/',
        main: 'jquery.ui-contextmenu.min'
    }
],

map: {
    'jquery-ui/menu': {
        'keycode': 'libs/jquery-ui/ui/keycode',
        'position': 'libs/jquery-ui/ui/position',
        'safe-active-element': 'libs/jquery-ui/ui/safe-active-element',
        'unique-id': 'libs/jquery-ui/ui/unique-id',
        'version': 'libs/jquery-ui/ui/version',
        'widget': 'libs/jquery-ui/ui/widget'
    }
}

You need to add a package as the ui-contextmenu requires jquery-ui/menu, and adding a path doesn’t seem to work correctly in this case. But you do need to add a path for the jquery-ui/menu dependency.

Finally, jquery-ui/menu requires several other dependencies, that you can just add a map entry for RequireJS, and that’s it.

Creating the navigation tree

We are using FancyTree for the navigation tree, so the code may look a bit more complex than necessary, but if you abstract the logic for the Nestor QA application, you can see that it consists only of a delegate property, which is the CSS filter for elements that trigger the context menu; the menu items, and a select function invoked when you - as you correctly deduced - select a menu item.

// context menu
el.contextmenu({
    delegate: ".editable",
    menu: [
        {
            title: "Edit", 
            cmd: "edit", 
            uiIcon: "ui-icon-pencil"
        },
        {
            title: "Delete",
            cmd: "delete",
            uiIcon: "ui-icon-trash"
        }
    ],
    select: function(event, ui) {
        var nodeId = ui.target[0].parentNode.parentNode.id;
        // fancy tree HTML elements have the key as ft_$KEY
        var underscoreIndex = nodeId.indexOf('_');
        if (underscoreIndex > 0) {
            var length = nodeId.length;
            var key = nodeId.substring(underscoreIndex+1, length);
            var node = el.fancytree('getNodeByKey', key);
            var href = node.data.href;
            if (ui.cmd == 'edit') {
                var editHref = href.substring(0, href.length - 5);
                Backbone.history.navigate(editHref, {
                    trigger: false
                });
            } else if (ui.cmd == 'delete') {
                var editHref = href.substring(0, href.length - 5);
                var deleteHref = editHref + '/confirmDelete';
                Backbone.history.navigate(deleteHref, {
                    trigger: false
                });
            } else {
                console.log('Command ' + ui.cmd + ' not recognized!');
            }
        }
    }
});

But nevertheless the el.fancytree('getNodeByKey', key); call may be useful for you as well! Read more about the ui-context menu API in their Wiki page.

Context menu in action
Context menu in action

Happy hacking!

Querying SPARQL endpoints using Jena JDBC and Squirrel SQL

Oct 11, 2014 in sparql, jena | tutorials

My favorite SQL Editor is Aqua Datastudio, which I use for Open Source projects, accessing Hive, MySQL, SQLite and several other data bases. However, while working on a customer site, I can’t use Datastudio due to its license. So another great SQL Editor that I use is Squirrel SQL.

Last week I had to execute several queries manually against a SPARQL endpoint - that was using Fuseki BTW. After doing that for ten minutes I decided that I needed a more productive way. Here’s where Jena JDBC enters.

Configurando o Jenkins para usar o Active Directory

Jan 29, 2014 in jenkins | tutorials

Depois de ver algumas mensagens na lista do Jenkins em Português decidir escrever este post para ajudar quem quiser configurar o Jenkins para usar o Microsoft Active Directory.

O Jenkins já possui autenticação e uma base de usuários própria. O que faremos é apenas utilizar o Active Directory (AD) como a base de usuários. Para isso basta instalar o Jenkins Active Directory plugin e reiniciar.

Plug-in do AD

Agora precisamos configurar o Jenkins para acessar o Active Directory. Vá até Gerenciar Jenkins / Configurar Segurança Global e em Controle de Acesso, selecione "Active Directory". Entre o domínio e os dados para se conectar no AD. Caso você não saiba os dados do seu AD, pergunte para alguém de infraestrutura ou tente se conectar ao AD com algum cliente de LDAP.

Configurando o Plug-in

Pronto! Agora basta você escolher o modelo de autorização. Na maioria das vezes utilizo a estratégia baseada em matriz por projeto. Se você utilizar a mesma, adicione o nome de usuário de rede e atribua as permissões corretas.

Espero que ajude, boa diversão!

Querying a REST server from Groovy scripts in Jenkins

Feb 01, 2013 in groovy, jenkins | tutorials

This week, in a customer, I had to write a Groovy script to import some projects from an old installation. The SVN URL had changed. Not only the domain, but now the SVN structure was broken in modules (i.e. instead of /svn/… now there was /repo1/…, /repo2/…, etc).

The solution I found, was scan the SVN directory structure with Perl and produce a JSON file. Then I wrote a quick PHP application (with Slim) with an URL like /repo?projectName=XYZ, that returned the new repository URL.

Overly Manly meme

The last step was the hardest, since I needed to query the REST application. The script would get the current SVN address from the SVN SCM, query the REST URL to get the new URL, and lastly update the job with the new URL.

The solution I found was copy the necessary jars to jenkins lib/ folder, restart the server and execute my script. Then stop the server, remove the jars and check the new SVN URL’s. Here’s the list of jars I had to copy.

  • http-builder
  • nekohtml-1.9.9
  • xml-resolver-1.2
  • httpclient
  • httpcore
  • xercesImpl

If you have a Maven project with your REST client, you can get a list of dependencies with mvn dependency:copy-dependencies . Then copy the jars to Jenkins class path.

Escrevendo scripts Groovy para o Jenkins usando o Eclipse com auto complete

Jan 17, 2013 in jenkins, eclipse, groovy | tutorials

Groovy é uma linguagem dinâmica e simples de usar. Ele é baseada no Java (mas mais simples) e roda dentro da JVM. Assim, você consegue executar trechos de código dentro da sua JVM e modificar objetos em tempo de execução, sem nem precisar compilar seus scripts.

O Jenkins utiliza Groovy de diversas maneiras. Quando você escreve plug-ins, você pode usar Groovy tanto para o código quanto para a UI (a vantagem disso é que você pode depurar a tela, diferente do Jelly). Há também diversos plug-ins que permitem que você execute Groovy ou algum DSL com Groovy (como o Job DSL Plug-in). E há também o CLI do Jenkins, um cliente que permite que você execute diversos comandos no Jenkins, entre eles o groovysh, um shell para Groovy, e o groovy, que permite que você envie um script para o Jenkins executar no master.

Há um exemplo que vem com o Jenkins de um script groovy bem simples, que imprime todos os plug-ins instalados:

println(Jenkins.instance.pluginManager.plugins)

pluginManager é o responsável por gerenciar plug-ins no Jenkins, e é um membro da classe Jenkins. Você pode ver mais sobre esta classe lendo o Javadoc do projeto. Ou se você utilizar Eclipse (ou outro IDE) você pode utilizar auto complete e ir escrevendo seu código Groovy com auxílio do IDE :o).

No vídeo acima você aprenderá como configurar seu Eclipse. O segredo é criar um projeto Maven + Groovy (com o plug-in Groovy para Eclipse) e incluir uma dependência para o projeto do Jenkins no seu pom.xml. Assim o Eclipse, utilizando Maven e Groovy, consegue usar o auto complete no seu código. Você pode digitar o começo do nome de uma classe e apertar CTRL + TAB para o Eclipse mostrar as opções e auto completar, ou clicar F3 e ver o código-fonte no projeto Jenkins ou CTRL + T e ver a hierarquia (de onde herda, quem estende essa classe, etc).

Aproveite este começo de ano (já que alguns dizem que o ano começo depois do carnaval) e automatize aquelas tarefas chatas como verificar se todos os jobs estão usando time-out (com o Build Timeout Plug-in) ou para realizar migrações ou atualizações em plug-ins, jobs ou slaves.