Conteúdo


Customizando o Cartão de Visita do IBM Sametime

Comments

Resumo:

Contactar os colegas de trabalho no dia a dia deve ser fácil e rápido. Este artigo descreve de forma prática como disponibilizar as informações de contato através do Cartão de Visita do IBM Sametime Connect Client e do IBM Sametime Web Client (Sametime Proxy Server).

Introdução:

A nossa história começa com uma empresa que há um ano atrás disponibilizou para seus funcionários o IBM Sametime e o IBM Connections. Hoje, através dessas duas ferramentas, os empregados se comunicam melhor e de forma mais efetiva.

Em uma certa manhã, o Diretor de TI da empresa retorna de uma reunião com a Vice-Presidente de Marketing. O Departamento de Marketing solicitava que novas informações fossem apresentadas no cartão de visita do IBM Sametime

O cartão de visita do IBM Sametime Connect Client e Web Client apresentam informações sobre o contato, incluindo nome, título, telefone e até fotos. Os usuários visualizam essas informações quando estão numa janela de chat ou quando passam o ponteiro do mouse sobre um contato na lista de contatos.

 

Figura 1: Tela com o Business Card

O Diretor de TI lança o desafio ao administrador do IBM Sametime para atender as demandas a seguir:

  1. Adicionar novos campos provenientes do LDAP;
  2. Adicionar campos provenientes do Sistema de RH da Empresa;
  3. Apresentar a foto do usuário armazenada no perfil do IBM Connections;

De posse dessas necessidades, o administrador do IBM Sametime começa as customizações.

1. Adicionando novos Campos provenientes do LDAP

Por padrão, a interface de configuração do cartão de vista do Sametime System Console permite selecionar quais informações serão apresentadas no cliente Sametime.

1.1. Alterando os atributos através do Sametime System Console

Os atributos disponíveis são:

* Nome (Name)
* Empresa (Company)
* E-mail
* Telefone (Telephone)
* Endereço (Location)
* Título (Title)
* Foto (Photo)

Como as informações do cartão de visita são obtidas do Diretório LDAP , ao qual o servidor IBM Sametime Community Server está configurado, devemos mapear os atributos, conforme mostrado abaixo:

Nome do Atributo Atributo do LDAP
Name cn
Title title
Location postalAddress
Telephone telephoneNumber
E-mail Address mail
Photo jpegPhoto
Company ou

Para alterar o cartão de visita através do Sametime System Console, siga os passos:

1) Acesse o Sametime System Console.
Exemplo: https://stsc01.empresax.com.br:8701/ibm/console/logon.jsp

2) Na navegação (à esquerda) , clique em Sametime System Console

3) Expanda Servidores do Sametime e clique em Servidores da Comunidade Sametime.

4) Clique no Identificador de Implementação (Deployment Plan) do Servidor Sametime Community.

5) Clique na aba Cartão de Visita.

6) Altere os atributos e clique OK para salvar as configurações.

Reinicie o servidor Sametime Community Server.

Veja: Iniciando e Parando Servidores em Lotus Domino (US)

 

Figura 2: Configuração do Cartão de Visita no Sametime System Console

Apesar da facilidade de utilização da console de administração do IBM Sametime, ficamos limitados aos campos disponíveis. Além disso, nem todas as informações do usuário ficam armazenadas em um único repositório, como um diretório LDAP, devido a questões de performance. Um exemplo, seria as fotos dos usuários.

1.2. O subsistema de Cartão de Visita

O subsistema de cartão de visita do IBM Sametime busca as informações dos repositórios configurados no arquivo UserInfoConfig.xml.

Estes repositórios podem ser:

- Um diretório LDAP;
- Um aplicação IBM Notes;
- Uma classe Java, que por sua vez busca informações em uma base SQL ou em um ERP/SAP.

A interface (API) que faz acesso a esses repositório é chamada de BlackBox.

O processo de busca das informações pelo cliente no repositório é descrito abaixo:

1) O Cliente Sametime faz uma requisição HTTP (GET) a um servidor Sametime Community;
2) Quando a requisição chega no servidor HTTP do Sametime/Domino, o Domino redireciona o request para o servlet UserInfoServlet;
3) O servlet UserInfoServlet, por sua vez, lê o arquivo UserInfoConfig.xml, a qual tem as informações de conexão aos repositórios;
4) O servlet consulta cada repositório em busca das informações;
5) Os dados dos repositórios são retornadas ao servlet UserInfo;
6) O servlet combina as respostas destes repositórios e converte em um documento XML;
7) O servidor HTTP envia o documento XML para o cliente, que extrai os dados e apresenta no cliente

 

Figura 3: Configuração do Cartão de Visita no Sametime System Console

1.3. Adicionando atributos através do UserInfoConfig.xml

O arquivo UserInfoConfig.xml permite uma maior flexibilidade na customização dos dados apresentados no cartão de visita.

O arquivo é gerado durante a instalação do servidor Sametime Community e fica localizado no seguinte diretório (conforme a plataforma):

MS Windows:

<DOMINO_INSTALL_DIR>\UserInfoConfig.xml.
Exemplo: C:\IBM\Domino\UserInfoConfig.xml.

Linux/AIX:

<DOMINO_DATA>\UserInfoConfig.xml
Exemplo: /local/notesdata

Ao abrirmos o arquivo UserInfoConfig.xml, você poderá observar, basicamente, duas seções:

Na seção <Storage type="LDAP">, temos as informações de conexão ao servidor LDAP

<Storage type="LDAP">
<StorageDetails HostName="ldapserver" Port="636" UserName="username"
Password="password" SslEnabled="false" SslPort="636" BaseDN="" Scope="2"
SearchFilter="(&amp; (objectclass=organizationalPerson)(|(cn=%s)(givenname=%s)(sn=%s)(mail=%s)))"/>
<!-- Add another StorageDetails tag to support another ldap server. The listing order
implies the searching order -->

<!-- Scope: 0=OBJECT_SCOPE 1=ONELEVEL_SCOPE 2=SUBTREE_SCOPE-->

Listagem 1: Seção com as informações de conexão ao LDAP

Enquanto na seção Details, temos o mapeamento entre os Atributos do Sametime e do LDAP

<Details>
    <Detail Id="MailAddress" FieldName="mail" Type="text/plain"/>
    <Detail Id="Name"  FieldName="cn" Type="text/plain"/>
    <Detail Id="Title" FieldName="title" Type="text/plain"/>
    <Detail Id="Location" FieldName="postalAddress" Type="text/plain"/>
    <Detail Id="Telephone" FieldName="telephoneNumber" Type="text/plain"/>
    <Detail Id="Company" FieldName="ou" Type="text/plain" />
    <Detail Id="Photo" FieldName="jpegPhoto" Type="image/jpeg" />
</Details>
</Storage>
</Resources>
<ParamsSets>
<Set SetId="0" params="MailAddress,Name,Title,Location,Telephone,Photo,Company"/>
<Set SetId="1" params="MailAddress,Name,Title,Location,Telephone,Photo,Company"/>
</ParamsSets>

Listagem 2: Seção com o mapeamento dos atributos

Vamos começar então o procedimento para adicionar novos campos...

Procedimento:

Antes de iniciarmos devemos por precaução realizar um backup do arquivo UserInfoConfig.xml

1) Edite o arquivo UserInfoConfig.xml.

2) Localize a seção <UserInformation>, adicione a entrada:

<ReadStConfigUpdates value="false"/>

Esta configuração define que iremos utilizar os dados de conexão do xml.

3) Localize a seção <Storage type="LDAP">, e altere os valores.

Adicione a linha abaixo:

<CommonField CommonFieldName="Uid" />

Esta configuração define a chave primária a ser utilizada entre os diretórios.

Adicionalmente, altere as seguinte propriedades / campos :
ldapserver = Servidor LDAP
username = Usuário de Conexão ao LDAP
password = Senha do usuário de Conexão ao LDAP
SearchFilter = Caso seja necessário altere o filtro de busca

Obs.: Ao executarmos o servidor a senha sera removida, e será adiciona a tag UserEncodedAuth.

4) Localize a seção Details.

5) Localize a entrada Telephone e inclua o número do Celular.

<Detail Id="Telephone" FieldName="telephoneNumber,mobile" Type="text/plain" DisplaySeparator=" / " />

6) Antes da tag </Details>, vamos adicionar agora dois novos campos, como abaixo:

<Detail Id="State" FieldName="stateOrProvince" Type="text/plain"/>
<Detail Id="City" FieldName="city" Type="text/plain"/>

7) Localize a seção ParamsSets e adicione os novos campos.

<ParamsSets>
<Set SetId="0" params="MailAddress,Name,Title,Location,Telephone,Photo,Company,City,State"/>
<Set SetId="1" params="MailAddress,Name,Title,Location,Telephone,Photo,Company,City,State"/>
</ParamsSets>

8) Salve e Feche o arquivo.

O arquivo final fica da seguinte maneira:

<UserInformation>
<ReadStConfigUpdates value="false"/>
<Resources>
<Storage type="LDAP">
<CommonField CommonFieldName="Uid" />
<StorageDetails HostName="ldapserver" Port="636" UserName="username"
Password="password" SslEnabled="false" SslPort="636" BaseDN="" Scope="2"
SearchFilter="(&amp; (objectclass=organizationalPerson)(|(uid=%s)(cn=%s)
(givenname=%s)(sn=%s)(mail=%s)))"/>
<Details>
    <Detail Id="MailAddress" FieldName="mail" Type="text/plain"/>
    <Detail Id="Name" FieldName="cn" Type="text/plain"/>
    <Detail Id="Title" FieldName="title" Type="text/plain"cod/>
    <Detail Id="Location" FieldName="postalAddress" Type="text/plain"/>
    <Detail Id="Telephone" FieldName="telephoneNumber,mobile" Type="text/plain"
    DisplaySeparator=" / " />
    <Detail Id="Company" FieldName="ou" Type="text/plain" /> 
    <Detail Id="Photo" FieldName="jpegPhoto" Type="image/jpeg" />
    <Detail Id="State" FieldName="stateOrProvince" Type="text/plain"/>
    <Detail Id="City" FieldName="city" Type="text/plain"/>
</Details>
</Storage>
</Resources>

<ParamsSets>
<Set SetId="0" params="MailAddress,Name,Title,Location,Telephone,Photo,Company,City,State"/>
<Set SetId="1" params="MailAddress,Name,Title,Location,Telephone,Photo,Company,City,State"/>
</ParamsSets>

Listagem 3: Resultado das alterações sobre o arquivo UserInfoConfig.xml

7) Reinicie o servidor Sametime Community

Veja: Iniciando e Parando Servidores em Lotus Domino (US)

Para testar o resultado da alteração do UserInfoConfig.xml, você pode verificar o resultado retornado pelo servlet UserInfoServlet.

Em um navegador, entre com o seguinte endereço:

http://<Sametime_Server>/servlet/UserInfoServlet?operation=3&setid=2&userid=<Test_Account_Name>

onde:

Parametro Descrição
operation Operação a ser executada. Utilize o valor 3.
setid Conjunto de parâmetros que devem ser retornados, definidos na seção ParamsSets do arquivo UserInfoConfig.xml
userid Chave de pesquisa

Exemplo:

http://stserver/servlet/UserInfoServlet?operation=3&setid=0&userid=1257

Onde o resultado deverá ser análogo ao exemplo abaixo:

 
<?xml version="1.0" encoding="UTF-8"?>
<userinfo>
<user id ="1257">
  <field name="MailAddress" type="" error="emailaddress"/>
  <field name="Name" type="text/plain">Enio Rubens Basso</field>
  <field name="Title" type="text/plain">Especialista de TI</field>
  <field name="Location" type="" error="UNAVAILABLE"/>
  <field name="Telephone" type="text/plain">61-3333-4444 / 61-9999-9999</field>
  <field name="City" type="text/plain">Brasilia</field>
  <field name="State" type="text/plain">DF</field>
</user>
</userinfo>

Listagem 4: Retorno do servlet

Como você pode ver, caso o valor de uma atributo no LDAP não esteja populado, o UserInfoServlet retorna error="UNAVAILABLE".

2. Adicionar campos provenientes do Sistema de RH da Empresa

Para atender o segundo desafio do departamento de Marketing, o administrador do IBM Sametime, precisa buscar as informações que se encontram no Sistema de RH da Empresa.

Para evitar realizar consultas a todo momento no Sistema de RH, vamos criar um repositório local para armazenar as informações a serem apresentadas no cartão de visita do IBM Sametime.

Para realizar esta tarefa precisamos realizar 3 atividades:

  • Criar o repositório local;
  • Importar os dados do Sistema de RH;
  • Configurar o UserInfoConfig.xml.

Como pré requisito da tarefa, você vai precisar ter um Domino Designer instalado no seu computador, e configurado para acessar o servidor do Sametime Community. Utilize o usuário Administrador do Sametime para que não tenha restrições na criação da database e de execução no servidor.

2.1. Criando o repositório local

Vamos criar uma aplicação Notes (NSF) para armazenar os dados...

1) Abra o Domino Designer.

2) Crie a nova base, através do menu File -> Application -> New.

Informe os seguintes campos

Campo Descrição
Server <Nome do Servidor do Sametime>
Title Secondary Book Store
File name secbookstore.nsf
Server Local
Template Selecione Blank

Clique em OK.

 

Figura 4: Caixa de Dialogo para criar uma nova aplicação

Vamos criar agora o formulário

4) Crie o novo formulário, através do menu Create -> Design -> Form.

Campo Valor
Name: person
Alias: person
Comment:
Application: Secondary Book Store:\\<Nome do Servidor do Sametime>

Clique em OK.

5) Crie o campo chave, denominado uid. Através do menu Create -> Field.

Informe no campo Name, o valor uid e o defina como tipo Text.

 

Figura 5: Caixa de Dialogo para criar uma novo campo

6) Vamos criar os demais campos usados neste artigo.

Nome do Campo Tipo Descrição
dpto Text Departamento
updated Text Data da atualização da foto
PhotoURL Text URL das fotos
Photo Rich Text Lite Foto do usuário

Salve o formulário, através do menu File -> Save.

 

Figura 6: Novos campos criados

Vamos criar a visão de índice

7) Crie uma nova visão, através do menu Create -> Design -> View.

Informe:

CampoValor
View Name: vwIndex
View type: Shared
Select conditions: By Formula
Select conditions: SELECT @ALL

Clique em Save and Customize.

 

Figura 6: Caixa de Dialogo para criar visão

8) Clique na coluna #, selecione Formula e informe uid:MailAddress:dn:dn2:Name.

 

Figura 7: Definindo o valor da coluna

9) Na caixa de dialogo de propriedades, clique na segunda aba.

- Em sort, selecione em Ascending.
- Selecione Show multiple values as separate entries.

 

Figura 8: Definindo o tipo de ordenação

Salve a visão, através do menu File -> Save.

Agora já possuímos uma repositório secundário local.

2.2. Importando os dados do Sistema de RH

O Sistema de RH da empresa fica armazenado em um banco de dados IBM DB2.
Nesta seção vamos criar um agente na linguagem Java para buscar as informações da base de dados SQL , e popular o repositório NSF local.

O nosso agente está divido em 5 partes:

1) Definição das variáveis;
2) Inicialização do Driver JDBC do IBM DB2;
3) Execução da query;
4) Criação ou atualização do documento no repositório NSF ;
5) Método principal.

Preparação:

Como preparação para o acesso ao DB2, devemos adicionar os drivers JDBC (tipo 4) do DB2.

Dentro do diretório <DOMINO_INSTALL_DIR>\ibm-jre\jre\lib\ext, devemos copiar os arquivos:

  • db2jcc.jar
  • db2jcc_license_cu.jar

O download dos drivers JDBC do DB2 pode ser realizado através do link http://www-01.ibm.com/support/docview.wss?uid=swg21363866 (US)

 

Figura 9: Configuração dos drivers JDBC do DB2

Procedimento:

1) Crie o novo através do menu Create -> Design -> Agent.

Campo Valor
Name: ImportPersonInfo
Alias: ImportPersonInfo
Comment:
Type: Java
Application: Secondary Book Store:\\<Nome do Servidor do Sametime>

Clique em OK.

2) Em Basics, defina On Schedule -> Daily, e em Target defina None.

 

3) Em Security, defina o valor 3. Allow restricted operations with full administration rights.

 

4) Click em JavaAgent.java para criarmos o código.

 

5) Dentro da Classe JavaAgent, devemos definir as contantes de conexão ao IBM DB2, variáveis globais a classe, ...

// CONSTANTES
private static final String JDBC_CLASS = "com.ibm.db2.jcc.DB2Driver";
private static final String JDBC_URL = "jdbc:db2://db2srv.empresax.com.br:50000/RHS";
private static final String JDBC_USERID = "STUSER";
private static final String JDBC_PASSWORD = "STUSER";
private static final String UID_LOOKUP_VIEW_NAME = "vwIndex";

private static final String SQL =
	"SELECT UID, DPTO " +
	"FROM EMPLOYEE " +
	"ORDER BY UID";
// VARIAVEIS GLOBAIS A CLASSE
Connection con;

String uid = "";
String dpto = "";

6) Inicialização do Driver JDBC do IBM DB2:

private void initDB() throws Exception { 
  // Load the requested JDBC driver type
  Class.forName(JDBC_CLASS).newInstance();
  con = DriverManager.getConnection(JDBC_URL, JDBC_USERID, JDBC_PASSWORD);
}

7) Execução da query:

Para cada linha retornada pelo SELECT, vamos chamar o método updateOrCreateDocument.

private void runMain(Database db) throws Exception {

  Statement stmt = con.createStatement();
  System.out.println("runQuery - start");
  ResultSet rs = stmt.executeQuery(SQL);
  System.out.println("runQuery - end");
  int i=0;
  System.out.println("Iterating: " + i);
  while (rs.next()) {
    if (++i % 1000 == 0) {
      System.out.println("Iterating: " + i);
    }
    uid = rs.getString("UID");
    if (uid == null) uid = "";
    dpto = rs.getString("DPTO");
    if (dpto == null) dpto = "";
    updateOrCreateDocument(db,uid);
  }
  stmt.close();
  System.out.println("Total: " + i);
}

8) Criação ou atualização do documento no repositório NSF:

Com a chave primária, armazenada na string key, verificamos a existência ou não do documento. Se o resultado for vazio, criamos um novo documento senão verificamos por mudanças e então atualizamos o documento.

Vamos adicionar o distinguishedName do usuário (dn).

private void updateOrCreateDocument(Database db, String key) throws Exception {
  View view = db.getView(UID_LOOKUP_VIEW_NAME);
  Document doc = null;
  boolean saveDoc = false;
  String dn = "uid=" + uid + ",ou=usuarios,o=empresax,c=br";
	
  doc = view.getDocumentByKey(key, true);
  if (doc == null){
    doc = db.createDocument();
    doc.replaceItemValue("Form","person");
    doc.replaceItemValue("uid", uid);
    doc.replaceItemValue("dn", dn);
    doc.replaceItemValue("dpto", dpto);
    saveDoc = true;
  } else {
    if (!uid.equals("") && !uid.equals(doc.getItemValueString("uid"))){
      doc.replaceItemValue("uid", uid);
      saveDoc = true;
    }
    if (!dn.equals("") && !dn.equals(doc.getItemValueString("dn"))){
      doc.replaceItemValue("dn", dn);
      saveDoc = true;
    }
    if (!dpto.equals("") && !dpto.equals(doc.getItemValueString("dpto"))){
      doc.replaceItemValue("dpto", dpto);
      saveDoc = true;
    }
  }
  if (saveDoc) {
    doc.save(true, false, true);
  }
  doc.recycle();
  view.recycle();
}

9) No método principal NotesMain, chamamos os demais métodos.

public void NotesMain() {
  try {
    Session session = getSession();
    AgentContext agentContext = session.getAgentContext();
		
    // (Your code goes here)
    Database notedDb = agentContext.getCurrentDatabase();
		
    System.out.println("ImportPersonInfo - start");
    initDB();
    runMain(notedDb);
    System.out.println("ImportPersonInfo - end");
		
  } catch(Exception e) {
    e.printStackTrace();
  }
}

2.3. Configurando o UserInfoConfig.xml para utilizar o repositório local

Como um pré-requisito para a desta seção é termos uma chave primária entre o primeiro repositório LDAP e o segundo repositório NSF. Neste caso o valor do campo uid sera populado com os mesmos valores.

1) Edite o arquivo UserInfoConfig.xml.

2) Localize a tag <Detail Id="Photo".

Como vamos utilizar as fotos do segundo repositório, devemos comentar a primeira linha.

<!-- <Detail Id="Photo" FieldName="jpegPhoto" Type="image/jpeg" /> -->

2) Localize a tag </Storage>, e adicione o novo repositório:

<Storage type="NOTES_CUSTOM_DB">
<StorageDetails DbName="secbookstore.nsf" View="vwIndex"/>
<Details>
<Detail Id="Dpto" FieldName="Dpto" Type="text/plain"/>
<Detail Id="PhotoURL" FieldName="PhotoURL" Type="text/plain"/>
<Detail Id="Photo" FieldName="photo" Type="image/jpeg" />
</Details>
</Storage>

3) Localize a seção <ParamsSets> e adicione os novos campos:

<ParamsSets>
<Set SetId="0" params="MailAddress,Name,Title,Location,Telephone,Photo,Company,City,State,Dpto"/>
<Set SetId="1" params="MailAddress,Name,Title,Location,Telephone,Photo,Company,City,State,Dpto"/>
</ParamsSets>

4) Localize a seção <BlackBoxConfiguration> e adicione os novos blackbox:

<BlackBox type="NOTES_CUSTOM_DB"
name="com.ibm.sametime.userinfo.userinfobb.UserInfoNotesCustomBB" 
MaxInstances="4"/>

5) Salve e Feche o arquivo.

6) Reinicie o servidor Sametime Community.

Veja: Iniciando e Parando Servidores em Lotus Domino (US)

3. Apresentar a foto do usuário armazenada no Perfil do IBM Connections

Por fim iremos utilizar as fotos armazenadas nos perfis do IBM Connections para serem apresentadas nos IBM Sametime.

No IBM Connections, as fotos do perfis ficam armazenados no banco de dados, dentro da tabela EMPINST.PHOTO. Neste exemplo, vamos fazer acesso direto as tabelas do perfis, utilize um usuário apenas com permissão de leitura para evitar riscos sobre o ambiente.

Aqui vamos adicionar adicionar 2 campos principais:

  • Photo: campo RichText utilizado para armazenar o binário da foto utilizada pelo Sametime Connect Client
  • PhotoURL: Url da foto utilizado pelo Sametime Web Client (Sametime Proxy)

Para evitar a comparação de 2 arquivos, criamos o campo updated, oqual possui a data de alteração do arquivo de foto.

3.1. Importando as fotos do IBM Connections

O nosso agente esta divido em 6 partes:

1) Definição das variáveis;
2) Inicialização do Driver JDBC do IBM DB2;
3) Execução da query;
4) Criar o arquivo de Imagem;
5) Criação ou atualização do documento no repositório NSF;
6) Método principal.

Por se tratar da mesma abordagem usada na seção anterior, vamos apresentar apenas as diferenças...

Procedimento:

1) Crie o novo através do menu Create -> Design -> Agent.

Campo Valor
Name: ImportaFotosConnections
Alias: ImportaFotosConnections
Comment:
Type: Java
Application:Secondary Book Store:\\<Nome do Servidor do Sametime>

Clique em OK.

Repita os passos 2, 3, 4 do item 2.2.

5) Dentro da Classe JavaAgent, vamos adicionar novas contantes de conexão ao IBM DB2, variáveis globais a classe, ...

private static final String PHOTOS_TEMP_DIRECTORY = "c:\\temp\\fotos\\img_";
private static final String PHOTO_URL_PREFIX = 
"http://connections.empresax.com.br/profiles/photo.do?uid=";

private static final String SQL = 
    "SELECT E.PROF_UID UID, P.PROF_UPDATED UPDATED, P.PROF_IMAGE IMAGE " +
    "FROM EMPINST.PHOTO P, " +
    "EMPINST.EMPLOYEE E " +
    "WHERE P.PROF_KEY=E.PROF_KEY";
	
String updated = "";
byte[] photo_bytes ;

A variável PHOTOS_TEMP_DIRECTORY armazena o diretório temporário para armazenar as fotos.

A variável PHOTO_URL_PREFIX armazena a URL para busca das fotos no IBM Connections.

Repita os passos 6 do item 2.2.

7) Execução da query:

Para cada linha retornada pelo SELECT, é necessário criar um arquivo com a foto do usuário em um diretório temporário, através do método createImageFile, logo depois devemos chamar o método updateOrCreateDocument.

private String createImageFile(String uid) throws Exception {

  String filename = PHOTOS_TEMP_DIRECTORY + uid + ".jpg";
  File outFile = new File(filename);>
  FileOutputStream fos = new FileOutputStream(outFile);
  fos.write(photo_bytes);
  fos.close();
  return filename;
}

private void runMain(Database db) throws Exception {

  Statement stmt = con.createStatement();
  System.out.println("runQuery - start");
  ResultSet rs = stmt.executeQuery(SQL);
  System.out.println("runQuery - end");
  int i=0;
  System.out.println("Iterating: " + i);
  while (rs.next()) {
    if (++i % 1000 == 0) {
      System.out.println("Iterating: " + i);
    }
    uid = rs.getString("UID");
    if (uid == null) uid = "";
    updated = rs.getString("UPDATED");
    photo_bytes = rs.getBytes("IMAGE");

    String filename = createImageFile(uid);
    updateOrCreateDocument(db,uid,filename);
  }
  stmt.close();
  System.out.println("Total: " + i);
}

8) Criação ou atualização do documento no repositório NSF

Com a chave primária, armazenada na string key, verificamos a existência ou não do documento. Se o resultado for vazio, criamos um novo documento senão verificamos por mudanças e então atualizamos o documento.

private void updateOrCreateDocument(Database db, String key) throws Exception {
  View view = db.getView(UID_LOOKUP_VIEW_NAME);
  Document doc = null;
  boolean saveDoc = false;
	
  doc = view.getDocumentByKey(key, true);
  if (doc == null){
    doc = db.createDocument();
    doc.replaceItemValue("Form","person");
    doc.replaceItemValue("uid", uid);
    doc.replaceItemValue("updated", updated);
    doc.replaceItemValue("PhotoURL", PHOTO_URL_PREFIX + uid);
		
    photo = doc.createRichTextItem("photo");
    photo.embedObject(EmbeddedObject.EMBED_ATTACHMENT, null, filename, null);
    saveDoc = true;
  } else {
    if (!uid.equals("") && !uid.equals(doc.getItemValueString("uid"))){
      doc.replaceItemValue("uid", uid);
      saveDoc = true;
    }

    if (!updated.equals("") && !updated.equals(doc.getItemValueString("updated"))){
      doc.replaceItemValue("updated", updated);
      doc.removeItem("photo");
      doc.replaceItemValue("PhotoURL", PHOTO_URL_PREFIX + uid);
      photo = doc.createRichTextItem("photo");
      photo.embedObject(EmbeddedObject.EMBED_ATTACHMENT, null, filename, null);
      saveDoc = true;
    }
  }
  if (saveDoc) {
    doc.save(true, false, true); 
  }
  doc.recycle();
  view.recycle();
}

9) No método principal NotesMain, chamamos os demais métodos.

3.2. Configurando o UserInfoConfig.xml para retornar as fotos.

1) Edite o arquivo UserInfoConfig.xml.

2) Localize a seção <Storage>, e adicione os novos campos:

<Storage type="NOTES_CUSTOM_DB">
<StorageDetails DbName="secbookstore.nsf" View="vwIndex"/>
<Details>
<Detail Id="Dpto" FieldName="Dpto" Type="text/plain"/>
<Detail Id="PhotoURL" FieldName="PhotoURL" Type="text/plain"/>
<Detail Id="Photo" FieldName="photo" Type="image/jpeg" />
</Details>
</Storage>

3) Salve e Feche o arquivo.

4) Reinicie o servidor Sametime Community

Veja: Iniciando e Parando Servidores em Lotus Domino (US)

Conclusão

Este artigo descreveu como estender o IBM Sametime para prover informações aos usuários,armazenadas em diversos repositórios. Mostramos como criar um repositório próprio buscando informações de outras fontes como um base SQL e importando as fotos dos perfis do IBM Connections.

Caso você tenha um cluster de IBM Sametime Community Server, basta criar uma réplica da base secbookstore.nsf e copiar o arquivo UserInfoConfig.xml para os demais servidores.

Recursos

Arquivo UserInfoConfig.xml (XML, 2KB)

Arquivo secbookstore.nsf (NSF, 6.5MB)


Recursos para download


Comentários

Acesse ou registre-se para adicionar e acompanhar os comentários.

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=80
Zone=Lotus
ArticleID=956226
ArticleTitle=Customizando o Cartão de Visita do IBM Sametime
publish-date=12102013