Pré-requisitos de Programação

São descritos aqui os métodos comuns, as etapas de pré-requisito e outras informações necessárias aos programadores que estão desenvolvendo aplicativos do gerenciador de membro virtual.

Importando Pacotes do Gerenciador de Membro Virtual

Antes de integrar funções de gerenciador de membro virtual em seu aplicativo, você deve importar pacotes de gerenciador de membro virtual e outros pacotes relacionados. O exemplo a seguir mostra os pacotes que você deve importar e como definir a classe.

import java.util.Hashtable;
import java.util.List;

import com.ibm.websphere.wim.SchemaConstants;
import com.ibm.websphere.wim.Service;
import com.ibm.websphere.wim.client.LocalServiceProvider;
import com.ibm.websphere.wim.ras.WIMTraceHelper;

import java.security.PrivilegedActionException;
import java.security.PrivilegedExceptionAction;
import javax.security.auth.Subject;
import javax.security.auth.login.LoginContext;
import com.ibm.websphere.security.auth.WSSubject;
import com.ibm.websphere.security.auth.callback.WSCallbackHandlerImpl;
import commonj.sdo.DataObject;

Obtendo o Serviço do Gerenciador de Membro Virtual e Outros Métodos Comuns

O serviço do gerenciador de membro virtual poderá ser obtido do EJB remoto ou da JVM local, se o seu aplicativo estiver sendo executado no WebSphere Application Server.

Nota: Se você estiver chamando o gerenciador de membro virtual usando APIs do EJB remoto, assegure-se de que o wim.ear esteja implementado. Para informações adicionais, consulte Instalando o Gerenciador de Membro Virtual.

O seguinte aplicativo base de amostra contém métodos locateService() que mostram como obter o serviço do gerenciador de membro virtual, bem como outros métodos comuns usados nas amostras de código em diversas operações do gerenciador de membro virtual. Substitua as variáveis mostradas em itálico no seguinte código pelos valores reais que você precisa.

/**
 * Este é um aplicativo base que define métodos comuns que são 
 * usados por outras amostras de código.
 **/
public class BaseApp implements SchemaConstants
{
    /**
     * declaração de variável comum: atualização baseada no ambiente
     **/
    static final String HOST = "localhost";       // nome do host do WebSphere Application Server
    static final String BOOTSTRAP_PORT = "2809";  // Autoinicialização/número da porta RMI
    
    // Serviço do gerenciador de membro virtual usado para fazer chamadas de API
    static Service service = null;

    /**
     * Localiza o serviço do gerenciador de membro virtual usando um EJB remoto
     * @param ejbJndiName Nome JNDI do EJB. 
     * O nome EJB padrão é "ejb/com/ibm/websphere/wim/ejb/WIMServiceHome"
     **/
    public static Service locateService(String ejbJndiName)
    {
        try {
            // EJB Remoto do Serviço do gerenciador de membro virtual
            Hashtable environment = new Hashtable();
            
            String providerURL = "corbaloc:iiop:" + HOST + ":" + BOOTSTRAP_PORT;
            environment.put(LocalServiceProvider.PROVIDER_URL, providerURL);
            if (ejbJndiName == null) {
                ejbJndiName = "ejb/com/ibm/websphere/wim/ejb/WIMServiceHome";
            }
            environment.put(LocalServiceProvider.EJB_JNDI_NAME, ejbJndiName);
            
            service = new LocalServiceProvider(environment);
        }
        catch (Exception e) {
            e.printStackTrace();
        }
        return service;
    }
    
    /**
     * Localiza o serviço do gerenciador de membro virtual na JVM local
     **/
    public static Service locateService()
    {
        try { 
            // Serviço de acesso local do gerenciador de membro virtual 
            return new LocalServiceProvider(null);
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }

        return null;
    }

    /**
     * Executa ação conforme especificado pelo usuário
     * @param user nome de usuário
     * @param password senha do usuário
     * @param action Ação a ser chamada após login com êxito do usuário
     * @return Objeto retornado pela ação
     **/
    public static Object runAsUser(String user, String password, PrivilegedExceptionAction action) throws Exception
    {
        LoginContext loginContext;
        Subject subject;

        // Login usando ID do usuário e senha transmitidos, com a função obrigatória
        loginContext = new LoginContext("WSLogin", new WSCallbackHandlerImpl(user, "", password));
        loginContext.login();
        subject = loginContext.getSubject();

        try {
            return WSSubject.doAs(subject, action);
        }
        catch (PrivilegedActionException excp) {
            throw (Exception) excp.getCause();
        }
    }

    public static String printDO(DataObject obj)
    {
        return WIMTraceHelper.printDataObject(obj);
    }

    /**
     * Efetuar loop pelas entidades no DataObject e imprimir seu uniqueName
     * @param root input DataObject
     */
    @SuppressWarnings("unchecked")
    public static void printIdentifiers(DataObject root) throws Exception
    {
        // Obter todas as entidades no DataObject
        List entities = root.getList(SchemaConstants.DO_ENTITIES);
        for (int i = 0; i < entities.size(); i++) {
            DataObject ent = (DataObject) entities.get(i);
            // Obter o Identificador de entidade
            DataObject id = ent.getDataObject(SchemaConstants.DO_IDENTIFIER);
            if (id != null) {
                String uniqueName = id.getString(SchemaConstants.PROP_UNIQUE_NAME);
                System.out.println("UniqueName is  -> " +uniqueName);
            }
            else {
                System.out.println("Missing Identifier");
            }
        }
    }
}
Nota: Configure a seguinte propriedade de sistema na JVM cliente, se o aplicativo chamar as APIs do gerenciador de membro virtual no modo local:
org.eclipse.emf.ecore.EPackage.Registry.INSTANCE=com.ibm.ws.wim.util.VMMEMFGlobalDelegatorRegistry
Se você não configurar essa propriedade de sistema, a implementação EMF padrão entrará em vigor, a qual não suporta ambiente com vários domínios de segurança, e pode corromper o esquema EMF e provocar erro de violação de esquema.
Limitação: O dano ao esquema EMF também pode ocorrer quando um cliente EJB remoto acessa o EMF em um ambiente de segurança com vários domínios, se o cliente EJB estiver em um processo do servidor que não é o WebSphere Application Server ou é anterior ao WebSphere Application Server versão 8.0. Essa é uma limitação no ambiente com vários domínios de segurança, já que um processo do cliente EJB remoto pode usar no máximo um serviço de domínio por vez. Se um cliente EJB remoto tentar operar em diversos serviços de domínio simultaneamente, o registro do esquema EMF do processo do cliente será danificado e ocorrerá erro inesperado de violação de esquema no aplicativo cliente.

Chamando as APIs do Gerenciador de Membro Virtual

As amostras de código para diversas operações do gerenciador de membro virtual usam os métodos definidos na classe BaseApp. Consulte as amostras de código para obter instruções sobre como fazer chamadas de API.

Para chamar as APIs do gerenciador de membro virtual no código do aplicativo, você deve estar designado a uma das seguintes funções:

Código de Compilação

Verifique a configuração do caminho de classe para assegurar-se de que ela inclua os arquivos Java archive (JAR) corretos, para compilar o código.

Código de Execução

Se o código do aplicativo estiver sendo executado no WebSphere Application Server como um aplicativo ou servlet, Assunto e outros parâmetros para acessar as APIs do gerenciador de membro virtual serão usados implicitamente e serão os mesmos do servidor ou processo no qual o aplicativo foi implementado.

Se o aplicativo estiver sendo executado fora do WebSphere Application Server, por exemplo, a partir de um cliente do WebSphere Application Server, use os seguintes argumentos da JVM ao executar o código compilado. Substitua as variáveis mostradas em itálico nos seguintes argumentos pelos valores reais que você precisa.

-Djava.security.auth.login.config=<WAS_HOME>/properties/wsjaas_client.conf 
-Dcom.ibm.CORBA.ConfigURL=<WAS_HOME_URL>/properties/sas.client.props
-Dcom.ibm.SSL.ConfigURL=<WAS_HOME_URL>/properties/ssl.client.props 

Use os seguintes argumentos apenas quando você tiver de substituir as credenciais especificadas no arquivo de propriedades CORBA:

-Dcom.ibm.CORBA.loginSource=properties 
-Dcom.ibm.CORBA.loginUserid=AdminUserId 
-Dcom.ibm.CORBA.loginPassword=Admin Password
Alguns exemplos de argumentos da JVM com valores de amostra são fornecidos aqui:
-Djava.security.auth.login.config=C:/Progra~1/IBM/WebSphere/AppClient/properties/wsjaas_client.conf 
-Dcom.ibm.CORBA.ConfigURL=file:/Progra~1/IBM/WebSphere/AppClient/properties/sas.client.props
-Dcom.ibm.SSL.ConfigURL=file:/Progra~1/IBM/WebSphere/AppClient/properties/ssl.client.props 
-Dcom.ibm.CORBA.loginSource=properties
-Dcom.ibm.CORBA.loginUserid=admin
-Dcom.ibm.CORBA.loginPassword=admin
Verifique a configuração do caminho de classe para assegurar-se de que ela inclua os seguintes arquivos JAR antes de tentar executar o código:
  • <WAS_HOME>\lib\j2ee.jar
  • <WAS_HOME>\lib\bootstrap.jar
  • Todos os arquivos JAR em <WAS_HOME>\plugins

Estendendo o Esquema de Propriedade

Objetos de dados propertySchema e extensionPropertySchema
O objeto de dados propertySchema é usado para criar um tipo de propriedade e incluí-lo em um tipo de entidade do gerenciador de membro virtual existente em tempo de execução. A nova propriedade é incluída no arquivo wimxmlextension.xml. Entretanto, se você também quiser estender o esquema de banco de dados do repositório de extensão de propriedade, deverá usar o objeto de dados extensionPropertySchema. Se você usar o objeto de dados extensionPropertySchema, a nova propriedade é incluída no tipo de entidade existente no arquivo wimxmlextension.xml bem como armazenada no banco de dados de extensão de propriedade.
Nota: Caso estenda uma propriedade em um namespace customizado e, então, use as APIs de gerenciador de membro virtual get ou de procura, você deve mencionar explicitamente o prefixo de namespace juntamente com o nome da propriedade no gráfico de dados (<nsPrefix>:<propName>). Se uma propriedade com o mesmo nome existe no namespace padrão e namespace customizado e se você criar uma entidade usando esse nome de propriedade, o gerenciador de membro virtual usa a propriedade no namespace padrão para criar a entidade.
Para o código de amostra que usa o objeto de dados propertySchema, consulte Código de Amostra para Estender o Esquema em um Repositório LDAP. Para o código de amostra que usa o objeto de dados extensionPropertySchema, consulte Código de amostra para estender o esquema no repositório de extensão de propriedade.
Tipos de Dados de Propriedades
A sintaxe dos tipos de dados suportados para propriedades do gerenciador de membro virtual é listada aqui. Para obter mais informações, consulte a seção SchemaConstants de informações do Javadoc do gerenciador de membro virtual no centro de informações do WebSphere Application Server.
  • DATA_TYPE_ANY_SIMPLE_TYPE
  • DATA_TYPE_ANY_URI
  • DATA_TYPE_BASE_64_BINARY
  • DATA_TYPE_BOOLEAN
  • DATA_TYPE_BYTE
  • DATA_TYPE_DATE
  • DATA_TYPE_DATE_TIME
  • DATA_TYPE_DOUBLE
  • DATA_TYPE_IDENTIFIER_TYPE
  • DATA_TYPE_INT
  • DATA_TYPE_LONG
  • DATA_TYPE_SHORT
  • DATA_TYPE_STRING
  • DATA_TYPE_TOKEN


Termos de uso | Feedback