Colaboração Mais Inteligente para o Segmento de Mercado de Educação Usando o Lotus Connections, Parte 3: Use Perfis para compartilhar interesses de pesquisa e concessão de verbas

Crie a interface com usuário com widgets e o Lotus Connections

Neste artigo, aprenderemos a aumentar as páginas do IBM Lotus® Connections Profiles com informações sobre concessão de verbas de pesquisa e interesses de pesquisa acadêmica. Um exemplo de aplicativo, incluindo amostras de código, mostra como obter conteúdo de origem sobre concessões e publicações e armazená-lo para análise de texto adicional. O conteúdo é classificado e moldado em uma nuvem de tag de interesse de pesquisa para o usuário de Perfil. A UI é implementada usando dois widgets personalizados compostos de arquivos XML e JavaScript.

Carl Osipov, Software Architect, IBM

CarlCarl Osipov é um experiente arquiteto de software da organização de estratégia e tecnologia do IBM Software Group. Suas qualificações estão relacionadas às áreas de computação distribuída, desenvolvimento de aplicativos de fala e entendimento do idioma natural por computadores. Ele já publicou e fez apresentações sobre SOA (Arquitetura Orientada a Serviços) e gerenciamento de diálogo de conversação para colegas do segmento de mercado e do mundo acadêmico. Seu foco atual é o design de técnicas de reutilização para serviços de negócios compostos.



Ilya Afanasiev, Software Engineer, IBM

Photograph of Ilya AfanasievIlya Afanasiev é engenheiro de software com mais de sete anos de experiência de trabalho bem-sucedido e um grande conjunto de competências em várias áreas, incluindo pesquisa, desenvolvimento, suporte e controle de qualidade de software. Ele passou a fazer parte da IBM em 2007 como programador de Sistemas z/OS no laboratório russo de sistemas e tecnologia. Seu foco atual é o desenvolvimento e a geração de protótipos de UI para a web, recuperação de informações e desenvolvimento de aplicativos Java EE. Seus interesses de pesquisa atuais são a mineração de texto e análise de texto não estruturado.



31/Ago/2012

Introdução

O IBM Lotus Connections é um produto de rede social projetado para o local de trabalho atual. Perfis, que é apenas um componente do produto, fornece um diretório on-line e personalizável de pessoas.

Neste artigo, aprenderemos a implementar uma extensão para o Lotus Connections Profiles que permitirá aos proprietários de perfil aumentar sua página de perfil com informações sobre suas concessão de verbas de pesquisa e interesses de pesquisa acadêmica. Outros usuários (observadores de perfil) que visitam a página verão uma lista de títulos das concessões de verbas do proprietário do perfil e uma nuvem de tags de palavras-chave com base nos interesses de pesquisa do proprietário.

O aplicativo de amostra deste artigo usa o website Tracking Accountability in U.S. Government Grants System (TAGGS) como origem de dados para as verbas de pesquisa concedidas para um usuário do Profiles pelo National Institute of Health (NIH). As informações sobre concessões fornecem apenas uma visão parcial dos interesses de pesquisa do pesquisador. O aplicativo também pode ser configurado para coletar o texto das publicações do proprietário do perfil que se encontram na web (por exemplo, artigos na revista Diabetes). Todos os dados de texto obtidos sobre um usuário a partir do TAGGS, e de publicações online, são persistidos em um banco de dados de conteúdo (baseado em texto) não estruturado do IBM Content Analytics chamado de coleção de analítica de texto.

O aplicativo usa o Content Analytics para transformar o conteúdo de uma coleção em insight sobre interesses de pesquisa. Embora o Content Analytics forneça uma variedade de recursos complexos de analítica de texto, este artigo se concentra em uma simples análise de frequência de termos. O resultado da análise é uma lista ordenada das palavras que ocorrem mais comumente em títulos de concessões de verbas e resumos de publicação de um usuário de Perfil. A lista é renderizada como nuvem de tags de interesses de pesquisa na página de perfil.

Consulte Recursos para obter informações sobre o Lotus Connections Profiles, o widget Tag Cloud, TAGGS, Content Analytics e muito mais.


Arquitetura do aplicativo

A arquitetura do aplicativo de amostra é exibida na Figura 1. Como é comum no caso de aplicativos da web, o lado do servidor consiste em diversas camadas conceituais.

Figura 1. Arquitetura do aplicativo
Arquitetura do aplicativo
Camada de apresentação (ou da web)
Responsável pelo processamento de pedidos do cliente de navegador da web e pelo envio do HTML da interface com o usuário (UI) do Profiles para o navegador. A camada da web é baseada em um servidor de Connections estendido com os widgets My Grant Awards e My Keywords específicos do aplicativo. Como extensões de Profiles, os widgets precisam estar em conformidade com as especificações IBM iWidget. Instâncias de componentes em conformidade com o iWidget são usadas por ambos os widgets para conter funções customizadas e implementadas usando Dojo e JavaScript. Ambos os widgets são compostos de arquivos XML e JavaScript.

O arquivo XML declara uma instância do iWidget em harmonia com a sintaxe de definição deste (Seção 9.1, Especificação do iWidget 1.0). Em conformidade com essa sintaxe, o arquivo XML contém a declaração de um objeto JavaScript (Dojo) que renderiza o conteúdo do widget. Esse arquivo XML também contém uma seção com markup HTML nativo e código de origem JavaScript para passar o controle de renderização de UI para o objeto Dojo.

O arquivo JavaScript contém uma implementação do objeto Dojo responsável pela renderização de UI. O objeto usa as chamadas HTTP GET e HTTP POST assíncronas (dojo.xhrGet e dojo.xhrPost) para recuperar dados da camada de negócios usando a tecnologia Java Servlet. Os dados são retornados para o objeto na forma de resposta de servlet (HTTP) e, assim, são usados para reescrever o DOM da página da web no lado do cliente.

Camada de negócios
Serve de host para o Profiles e a extensão de aplicativos JEE. A última contém servlets Java em apoio aos widgets My Grant Awards e My Keywords. A lógica de servlet depende de métodos customizados de recuperação de dados (nesse caso, dos Web sites TAGGS ou Diabetes Journal) e métodos customizados de análise de dados (para calcular as frequências das palavras-chave usadas nas publicações do Diabetes Journal).

Os servlets retornam mensagens de resposta HTTP em formato XML ou JSON. O Profiles e o aplicativo JEE de extensão são implementados como arquivos EAR no WebSphere Application Server

Camada de integração
Responsável pela exposição dos recursos de web crawling e analítica de texto do Content Analytics como serviços para a camada de negócios. O aplicativo JEE de extensão interage com o Content Analytics via API Java. Visto que o Content Analytics não fornece os meios de execução de crawling em páginas da web geradas dinamicamente, o aplicativo também contém uma implementação customizada de crawler.

O restante deste artigo descreve as funções do lado do cliente e detalhes da implementação da UI para os widgets mencionados acima: My Grant Awards e My Keywords. São incluídos fragmentos de código de origem XML e JavaScript.


Widget My Grant Awards

O widget My Grant Awards exibe uma lista de verbas de pesquisa concedidas a um proprietário de perfil, como mostrado na Figura 2.

Figura 2. Aparência do widget My Grant Awards
Aparência do widget My Grant Awards

O conteúdo do widget é representado por um único elemento: uma tabela HTML com informações sobre verbas de pesquisa concedidas. (A Parte 4 desta série descreverá a recuperação de dados para preencher o conteúdo da tabela.)

iWidget XML

O arquivo XML referenciado no arquivo widgets-config.xml, mostrado na Listagem 13, é usado para declarar o widget adicional na configuração da UI do Profiles. O Anexo deste artigo descreve como implementar widgets adicionais no aplicativo Profiles.

A Listagem 1 mostra o conteúdo do arquivo XML do widget My Grants Awards.

Listagem 1. iWidget XML do widget My Grant Awards
1 <iw:iwidget id="grants" xmlns:iw=http://www.ibm.com/xmlns/prod/iWidget
2 iScope="GrantsWidgetClass" 
3 supportedModes="view" 
4 title="My Grant Awards">
5 <iw:resource uri="grants.js" />
6 <iw:content mode="view">
7 <![CDATA[
8 <div id="grantsWidget">
9 <script type="text/javascript">
10 iContext.iScope().getGrantAwards();
11 </script>
12 </div>
13 ]]>
14 </iw:content>
15  </iw:iwidget>

Na Listagem 1, acima:

  • Linha 1: A declaração define uma instância de iWidget com o identificador grants.
  • Linha 2: Continua a declaração com GrantsWidgetClass como nome do objeto JavaScript.
  • Linha 3: Mostra que o widget suporta apenas um modo de visualização, o que significa que o usuário do Profiles não será capaz de alterar o conteúdo vizualizável do widget.
  • Linha 4: O título do widget é My Grant Awards.
  • Linha 5: Especifica a seção de recurso do iWidget.
  • Linhas 6 a 14: Seção de conteúdo do iWidget.

A seção de recurso liga a declaração ao arquivo de código de origem que contém a implementação do objeto JavaScript. O nome de classe desse objeto é fornecido na linha 2 da Listagem 1. A instância do objeto GrantsWidgetClass é responsável pela renderização DOM do widget. Os detalhes de implementação do objeto são abrangidos no Código Dojo/JavaScript.

A seção de conteúdo contém o código de origem que serve de ponto de entrada para a renderização DOM do widget My Grant Awards. Nas linhas 8 a 12 da Listagem 1, o HTML estático do widget My Grant Awards consiste em um único elemento DIV chamado grantsWidget. Na linha 10, o conteúdo do elemento é gerado dinamicamente por meio do chamado do método getGrantAwards() . Esse método é membro do objeto JavaScript GrantsWidgetClass .

Os componentes iWidget que fornecem o gerenciamento geral da página da web (layout, por exemplo) são acessados pelo qualificador de objeto de alto nível iContext . A chamadaiScope() retorna a instância de objeto GrantsWidgetClass (linha 2), que é inicializada antes do carregamento do iWidget.

Código Dojo/JavaScript

A implementação do objeto de JavaScriptGrantsWidgetClass é responsável pela renderização DOM do widget My Grant Awards. A Listagem 2 mostra as declarações Dojo no arquivo grants.js.

Listagem 2. Declaração Dojo GrantWidgetClass em grants.js
1 dojo.require("dojox.xml.DomParser");
2 dojo.provide("GrantsWidgetClass");
3 dojo.declare("GrantsWidgetClass", 
4 null, 
5 { 
6 getGrantAwards: function() {
7 var userName = profilesData.displayedUser.displayName;
8 retrieveGrantsXML(userName);
9 }
10 }
11 );

A linha 1 na listagem 2 resolve os nomes de rotina Dojox que serão usados pela análise e recuperação DOM. O restante do código na listagem 2 declara a classe Dojo GrantsWidgetClass , incluindo seus métodos e variáveis. A classeGrantWidgetClass tem um método, getGrantAwards, que é chamado para preencher o conteúdo do DIV HTML com o identificador grantsWidget , como mostrado na Listagem 1. O métodogetGrantAwards() chama a função retrieveGrantsXML com um parâmetro que representa o nome do proprietário do perfil (cujo perfil é exibido pelo aplicativo Profiles).

Uma visão geral de alto nível da função retrieveGrantsXML é exibida na Listagem 3.

Listagem 3. Visão geral de retrieveGrantsXML
1 var retrieveGrantsXML = function(authorName) {
2 /* ... */
3 var xhrArgs = {
4 url: "/pubApi/grants",
5 handleAs: "text",
6 preventCache: true,
7 content: {
8 investigator: authorName
9 },
10 load: function(data) {
11 /* ... */
12 var doc = dojox.xml.DomParser.parse(data,"text/xml");
13 var results = doc.getElementsByTagName("award");
14 /* ... */
15 },
16 error: function(error) { /* ...error handling code... */ }
17 };
18 var deferred = dojo.xhrGet(xhrArgs);
19 };

Na Listagem 3 acima:

  • Linha 18: A função JavaScript retrieveGrantsXML implementa um HTTP GET assíncrono chamando a rotina dojo.xhrGet .
  • Linhas 3-17: São inicializados argumentos para essa chamada.
  • Linha 4: Durante uma invocação de chamada GET, o controle é transferido para um lado do servidor ― um servlet com caminho de URL.
  • Linhas 7-9: Os parâmetros transferidos ao servlet são alistados na seção conteúdo .
  • Linhas 10-15: O código responsável pela atualização do conteúdo do widget reside na função load do Python.

    A função é chamada assim que o navegador recebe uma resposta do servlet. O conteúdo de resposta é transferido pela variável , que é um parâmetro para a função load .

Uma resposta típica gerada pelo servlet My Grant Awards está no formato XML. A Listagem 4 mostra um exemplo.

Listagem 4. Resposta típica do servlet My Grant Awards
1 <grants-list faculty="Joel Francis Habener" GAManagerVersion="1.0">
2 <award>
3 <fiscal_year>2008</fiscal_year>
4 <opdiv>NIH</opdiv>
5 <award_number>R01DK030834</award_number>
6 <award_title>GLUCAGON BIOSYNTHESIS AND METABOLISM</award_title>
7 <principal_investigator>JOEL F HABENER</principal_investigator>
8 </award>
9 </grants-list>

Assim que os dados de resposta de servlet são analisados usando o analisador Dojo XML DOM (linhas 12-13 na Listagem 3), os resultados são exibidos em uma tabela HTML similar à tabela da Figura 2.


Widget My Keywords

O widget My Keywords permite que os usuários aprendam rapidamente os principais interesses de pesquisa do proprietário do perfil. Ele exibe as palavras-chave que aparecem mais frequentemente nas publicações do proprietário do perfil, nas descrições de concessões e em outras fontes da web, como PubMed. Ao contrário do widget My Grant Awards, o widget My Keywords tem controles que permitem que o proprietário do perfil personalize a aparência do widget e o conteúdo apresentado.

Qualquer usuário de perfil pode alternar entre os modos de exibição de lista e de nuvem. A Figura 3 mostra uma visualização de lista.

Figura 3. Widget My Keywords, visualização de lista
Widget My Keywords, visualização de lista

Figura 4 a visualização de nuvem.

Figura 4. Widget My Keywords, visualização de nuvem
Widget My Keywords, visualização de nuvem

Usando controles adicionais, o proprietário de um perfil pode personalizar o conteúdo exibido pelo widget, como mostrado na Figura 5. Por exemplo, o proprietário pode selecionar várias fontes para a extração de palavras-chave, ou impedir que algumas palavras-chave (também chamadas de palavras comuns na Figura 5,) sejam exibidas.

Figura 5. Widget My Keywords, controles adicionais
Widget My Keywords, controles adicionais

A visualização de nuvem do widget na A figura 4 mostra as palavras-chave para a usuária de Profiles Alice se ela estiver vendo seu próprio perfil. Quando outro usuário do Profiles, Bob, tenta observar o perfil de Alice, o widget My Keywords destaca as palavras-chave de Alice que correspondem às palavras-chave que Bob tem no seu próprio perfil. A Figura 6 mostra a visualização de Bob do perfil de Alice, com suas palavras-chave comuns destacadas.

Figura 6. Widget My Keywords, visualização de nuvem com palavras-chave similares
Widget My Keywords, visualização de nuvem com palavras-chave similares

iWidget XML

A estrutura de alto nível do código de origem XML My Keywords iWidget é idêntica ao código de origem do widget My Grant Awards , mas os detalhes da implementação diferem significativamente. O código de amostra na Listagem 5 cria uma cadeia de caracteres com uma lista de nomes das fontes utilizadas para a extração de palavras-chave. Podem-se ver as fontes na Figura 5, sob a etiqueta “Extract keywords from”.

Listagem 5. Desenvolvendo a lista de fontes de palavras-chave
1 kwGetExtractableSources = function() {
2 str_extract_from = "";
3 if (dojo.byId("chkbox_1").checked) { 
4 str_extract_from += ",source_1";
5 }
6 if (dojo.byId("chkbox_2").checked) {
7 str_extract_from += ",source_2";
8 }
9 str_extract_from = str_extract_from.substring(1,str_extract_from.length);
10 if(str_extract_from=="") {
11 str_extract_from = "default_source"; 
12 }
13 return str_extract_from; 
14 }

A cadeia de caracteres é transferida, juntamente com outros parâmetros, para o servlet My Keywords.

Similar à implementação My Grant Awards, o widget My Keywords tem seu próprio objeto JavaScript responsável pela renderização da GUI. Um dos métodos do objeto é chamado a partir do arquivo My Keywords iWidget XML, como mostrado na A Listagem 6. Esse método aceita a cadeia de caracteres que representa a lista de fontes que podem ser extraídas. A cadeia de caracteres é recuperada chamando a função mostrada na Listagem 5.

Listagem 6. Atualização inicial do widget My Keywords interno
1 document.getElementById("kw_status").innerHTML += "Loading keywords...";
2 iContext.iScope().kwInitialUpdate (kwGetExtractableSources());

a Listagem 7 mostra o código que cuida dos cliques no botão Update current view na parte inferior da Figura 5,.

Listagem 7. Lidando com o clique no botão “Update current view”
1 <script type="text/javascript"> 
2 kwProcessUpdateCall = function() {
3 str_extract_from = kwGetExtractableSources();
4 iContext.iScope().kwInterimUpdate(kwGetExtractableSources(),
5 kwCurrPage, kwCurrView);
6 }
7 </script>
8 <form name=stopWordsForm>
9 <textarea name=stopWordsText id=kw_stopwords_editable cols=25 rows=5>
10 </textarea>
12 </form>
13 <input type="button" class="lotusBtn lotusBtnSpecial" name="submit_all" 
14 value="Update current view" onClick=kwProcessUpdateCall();/>

Note que são chamados dois métodos diferentes:

Os métodos são dois pontos de entrada para iniciar a renderização da GUI do widget. Renderizando a GUI do widget apresenta mais detalhes.


Autorização baseada em função para controles de widget

As pessoas que visualizam um Lotus Connections Profile estão em uma de duas funções: proprietário de perfil ou observador de perfil. O proprietário de perfil criou o perfil e pode modificá-lo. Os observadores de perfil podem visualizar, mas não modificar, o perfil.

O widget My Grant Awards é parecido para o proprietário de perfil e para o observador de perfil. O widget My Keywords, contudo, aparece de forma diferente quando visualizado por um proprietário de perfil em comparação com um observador de perfil. Os observadores de perfil não são autorizados a modificar o conteúdo exibido pelo widget My Keywords. Os controles disponíveis para o proprietário de perfil são mostrados na Figura 5,.

A autorização de widget baseada em função é implementada na função Dojo onLoad , que é chamada pelo Dojo na conclusão de um processo de carregamento do widget. A funçãoonLoad , mostrada na A Listagem 8, usa duas variáveis:

  • pObserved - representa o usuário cujo perfil é observado atualmente.
  • pLoggedIn - representa o usuário logado no momento ao aplicativo Profiles.
Listagem 8. Autorização simples baseada em função na função Dojo Os manipuladores de retorno de chamada onLoad()
1 onLoad: function () {
2 var pObserved = this.personObserved;
3 var pLoggedIn = this.personLoggedIn;
4 if(pObserved != null && pLoggedIn != null && pObserved == pLoggedIn) {
5 dojo.byId('kw_cust_expand').style.display = "";
6 }
7 }

Dependendo do resultado de uma comparação alfanumérica das duas variáveis, o elemento HTML com o identificador kw_cust_expand é mostrado ou permanece oculto. O elemento HTML representa o elemento de link Customize this view mostrado nas Figuras 3 e 4. Visto que o widget é carregado apenas uma vez (quando o navegador carrega a página Profiles), não é necessário manter continuamente a autorização de função.

É importante notar que o método kwInitialUpdate (chamado pelo código de inicialização do widget My Keywords na A Listagem 6) é chamado antes de o widget ser carregado. A função Dojo onLoad é chamada após a invocação do método kwInitialUpdate , de modo que o kwInitialUpdate inicializa as variáveis de objeto personObserved e personLoggedIn usadas pela função DojoonLoaddo Python.

Renderizando a GUI do widget

Dois pontos de entrada (métodos) para iniciar a renderização da GUI do widget foram mencionados antes (mostrados na A Listagem 6 e a Listagem 7):

  • kwInitialUpdate para atualizar o conteúdo do widget no carregamento inicial.
  • kwInterimUpdate para atualizar o conteúdo do widget após o usuário clicar em Update current view (veja a Figura 5,).

A atualização inicial do conteúdo do widget se dá com a chamada da função kwUpdateContents , como mostrado na linha 4 da Listagem 9.

Listagem 9. Implementações do método de atualização inicial e intermediário do widget My Keywords
        1 kwInitialUpdate: function(extractableSources) { 
        2 /* initialization of personObserved and personLoggedIn */
3 /* ... */
4 kwUpdateContents(this,personObserved,0);
5 }
6 kwInterimUpdate: function(extractableSources, currPageId, currView) { 
7 /* ... */
8 kwUpdateStopWords(this, personLoggedIn,extractableSources,currPageId);
9 }

A Listagem 10 mostra a implementação da função acima.

Lista 10. Implementação de chamada HTTP GET assíncrona para o widget My Keywords
1 var kwUpdateContents = function(kwClassInstance,investigatorName,currPage) {
2 var xhrArgs = {
3 url: "/termsfrequency_proxy/termsfrequency",
4 handleAs: "text",
5 preventCache: true,
6 content: {
7 investigator: investigatorName,
8 compare_with: kwClassInstance.personLoggedIn,
9 extract_from: termsSources, 
10 threshold: 2
11 }, 
12 load: function(data) {
13 /* ... */
14 kwClassInstance.xmlParsed = dojox.xml.DomParser.parse(data);
15 kwUpdateWidgetInternals(kwClassInstance,currPage);
16 /* ... */
17 },
18 error: function(error) {
19 /* error handling ... */
20 }
21 };
22 var deferred = dojo.xhrGet(xhrArgs);
23 };

Na Listagem 10, o HTTP GET é chamado de forma assíncrona usando /termsfrequency_proxy/termsfrequency como caminho de URL, e usando os parâmetros de solicitação do escopo conteúdo (linhas 6-11). Assim que o HTTP GET retorna os dados, a função load executa a renderização da GUI invocando a implementação encapsulada pela função kwUpdateWidgetInternals .

O métodokwInterimUpdate chama a função kwUpdateStopWords , que (ao contrário de kwUpdateContents) chama um HTTP POST assíncrono. Assim que a solicitação HTTP POST é processada no lado do servidor, o controle é devolvido a quem faz a chamada (função kwUpdateStopWords), que chama kwUpdateContents. Veja as linhas 14 e 15 da Listagem 11.

Listagem 11. Implementação de chamada HTTP POST assíncrona para o widget My Keywords
1 var kwUpdateStopWords = 
2 function(kwClassInstance,userName,termsSources,currPage) {
3 var stopWordsEditable = dojo.byId("kw_stopwords_editable");
4 var stopWordsGiven = "";
5 if(stopWordsEditable.value != "Add your own stop words to here...") {
6 stopWordsGiven = stopWordsEditable.value; 
7 }
8 var xhrArgs = {
9 url: "/termsfrequency_proxy/termsfrequency",
10 postData: "updated_stopwords_list="+stopWordsGiven+"+
11 "&investigator="+username+"&terms_sources="+termsSources,
12 error: function(error) {/* ... error handling ... */}
13 };
14 var handler = dojo.xhrPost(xhrArgs);
15      handler.addCallback(kwUpdateContents(kwClassInstance,userName,currPage));
16 };

Usando o widget Dojo Tag Cloud

O métodokwDisplayCloudView é usado para exibir as palavras-chave do usuário em forma de nuvem, como mostrado nas Figuras 4 e 6. A nuvem é implementada usando um objeto Dojo Tag Cloud criado do zero cada vez que o widget My Keywords é atualizado.

O Dojo Tag Cloud funciona com o armazenamento de dados de somente leitura dojo.data.ItemFileReadStore . Uma vez, durante a inicialização do widget, o armazenamento de dados fica cheio com os seguintes metadados: uma lista de palavras-chave e suas frequências; e marcação adicional para ser usada para renderizar a nuvem de tags similares. A resposta do servlet My Keywords preenche o armazenamento de dados com representações XML e JSON de palavras-chave e suas frequências. O widget My Keywords usa XML no modo de lista e JSON no modo de nuvem.

Listagem 12 mostra a implementação da lógica responsável pela renderização de um widget Dojo Tag Cloud.

Listagem 12. Implementação do widget Dojo.TagCloud
1 kwDisplayCloudView: function() {
2 var kwCloudDivName = "kw_cloud_placeholder";
3 var kwCloudRootName = "kw_cloud_root";
4 if(this.oCloud == null) {
5 this.jsonStore = 
6           new dojo.data.ItemFileReadStore({data:this.termsJson,clearOnClose:true});
7 var kwCloudDiv = dojo.byId(kwCloudDivName);
8           this.oCloud = new myDojo.TagCloud({store: this.jsonStore},kwCloudDiv);
9 } else {
10 this.jsonStore.close();
11 this.jsonStore._jsonData = this.termsJson;
12 this.jsonStore.fetch();
13 this.oCloud.destroy();
14 kwCreateCloudDiv(kwCloudDivName, kwCloudRootName);
15 var kwCloudDiv = dojo.byId(kwCloudDivName);
16          this.oCloud = new myDojo.TagCloud({store: this.jsonStore},kwCloudDiv);
17 }
18 }
19
20 var kwCreateCloudDiv = function(divName, rootName) {
21 _kwCreateCloudDiv_impl('div', {id: divName, widgetid: ""}, rootName);
22 }
23
24 _kwCreateCloudDiv_impl = function(tag, attrs, ref, pos){
25 var n = dojo.doc.createElement(tag);
26 if(attrs) dojo.attr(n, attrs);
27 if(ref) dojo.place(n, ref, pos);
28 return n;
29 }

Na Listagem 12 acima:

  • Linhas 5 a 8: Cuida da criação inicial do objeto dojo.TagCloud .
  • Linhas 10 a 16: São responsáveis pela limpeza de um objeto dojo.TagCloud criado anteriormente e do armazenamento de dados de somente leitura vinculado a ele.
  • Linhas 2, 7, 8: Objeto dojo.TagCloud inicial é anexado a um elemento DOM pré-criado, e todas as recriações subsequentes do objeto dojo.TagCloud são feitas primeiro destruindo o elemento DOM.
  • Linhas 14, 15 e 20 a 29: Esse elemento DOM é criado do zero quando um novo objeto dojo.TagCloud é criado dentro desse elemento DOM.

Summary

Neste artigo, você aprendeu o valor da integração do IBM Lotus Connections e do IBM Cognos Content Analytics, de modo que os usuários do Connections possam compartilhar suas palavras-chave de interesses de pesquisa e concessão de verbas. O artigo abrangeu a arquitetura do aplicativo e apresentou os detalhes dos iWidgets My Keywords e My Grant Awards. Exploramos a implementação HTML e JavaScript dos widgets usando Dojo. O código de origem de amostra ajudou a ilustrar a autorização baseada em função do Profiles. Aprendemos também a ativar a comunicação HTTP entre os widgets e os Java Servlets.

Aguarde a Parte 4 desta série, que se concentrará na implementação e integração de servlet com o Cognos Content Analytics.


Anexo

Implementando widgets adicionais no aplicativo Profiles

O caminho dos arquivos XML que declaram os widgets tratados neste artigo encontra-se no arquivo de configuração do widget widgets-config.xml. Para configurar widgets existentes ou disponibilizar widgets personalizados para uso no Profiles, modifique as configurações no arquivo widgets-config.xml. Consulte Configurando widgets no Profiles para obter detalhes.Esse arquivo de configuração é usado para customizar o conteúdo da UI do Lotus Connections Profiles.

Listagem 13 mostra um exemplo do arquivo XML de declaração do widget My Grant Awards, como parte da definição do widget My Grant Awards no arquivo de configuração do widget do Profiles.

Lista 13. Definição do widget My Grant Awards em widgets-config.xml
<widgetDef defId="myGrantAwards" bundleRefId="extraBundle" 
           url="{context_root}/extra-widgets/grantsWidget.xml?version={version}"/>

Recursos

Aprender

Obter produtos e tecnologias

Discutir

Comentários

developerWorks: Conecte-se

Los campos obligatorios están marcados con un asterisco (*).


Precisa de um ID IBM?
Esqueceu seu ID IBM?


Esqueceu sua senha?
Alterar sua senha

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

 


A primeira vez que você entrar no developerWorks, um perfil é criado para você. Informações no seu perfil (seu nome, país / região, e nome da empresa) é apresentado ao público e vai acompanhar qualquer conteúdo que você postar, a menos que você opte por esconder o nome da empresa. Você pode atualizar sua conta IBM a qualquer momento.

Todas as informações enviadas são seguras.

Elija su nombre para mostrar



Ao se conectar ao developerWorks pela primeira vez, é criado um perfil para você e é necessário selecionar um nome de exibição. O nome de exibição acompanhará o conteúdo que você postar no developerWorks.

Escolha um nome de exibição de 3 - 31 caracteres. Seu nome de exibição deve ser exclusivo na comunidade do developerWorks e não deve ser o seu endereço de email por motivo de privacidade.

Los campos obligatorios están marcados con un asterisco (*).

(Escolha um nome de exibição de 3 - 31 caracteres.)

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

 


Todas as informações enviadas são seguras.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=80
Zone=Segmentos de mercado, Lotus
ArticleID=632764
ArticleTitle=Colaboração Mais Inteligente para o Segmento de Mercado de Educação Usando o Lotus Connections, Parte 3: Use Perfis para compartilhar interesses de pesquisa e concessão de verbas
publish-date=08312012