Mustercode für die Erweiterung eines Schemas über mehrere Sicherheitsdomänen

Hier finden Sie die Konfigurationsschritte, die Befehle, den Mustercode und die Datengraphen für die Erweiterung des Merkmalsschemas über mehrere Sicherheitsdomänen hinweg.

Die Konfigurationsbefehle und die Mustercode-Snippets decken die folgenden Schritte ab:

  1. Es werden mehrere Sicherheitsdomänen erstellt.
  2. Die Sicherheitsdomänen werden bestimmten Anwendungsservern zugeordnet.
  3. Die vorausgesetzten Systemanwendungen werden installiert.
  4. Es werden neue Merkmale zu jeder Serverinstanz hinzugefügt.
  5. Es werden Suchoperationen ausgeführt, indem erweiterte Merkmale für verschiedene Instanzen verwendet werden.

Voraussetzungen

Stellen Sie sicher, dass Sie die Informationen gelesen und die Schritte ausgeführt haben, die im Thema Voraussetzungen für die Programmierung beschrieben sind. Hierzu gehört auch der Abschnitt Merkmalschema erweitern, in dem Informationen zu Datenobjekten "propertySchema" und "extensionPropertySchema" enthalten sind und die gültige Syntax für Merkmalsdatentypen aufgeführt ist.

Sie müssen die folgenden Konfigurationsschritte ausführen, bevor Sie den Mustercode in Ihrer Anwendung verwenden. Starten Sie das Tool "wsadmin" und führen Sie die folgenden Befehle aus. Ersetzen Sie hierbei die Variablen durch die tatsächlichen Werte, die Sie verwenden wollen.

  1. Erstellen Sie ein Basisprofil. Verwenden Sie hierzu das Profilverwaltungstool von WebSphere Application Server. Stellen Sie sicher, dass die Verwaltungssicherheit aktiviert ist. Es wird ein neuer Anwendungsserver erstellt, z. B. server1.
  2. Fügen Sie einen weiteren Server hinzu, z. B. server2.
    $AdminTask createApplicationServer knotenname {-name server2}
  3. Erstellen Sie eine Sicherheitsdomäne.
    $AdminTask copySecurityDomainFromGlobalSecurity {-securityDomainName domäne1}
  4. Ordnen Sie diese Domäne dem Server server2 zu, den Sie in Schritt 2 erstellt haben.
    $AdminTask mapResourceToSecurityDomain { -securityDomainName domäne1 -resourceName Cell=:Node=knotenname:Server=server2}
  5. In einer Umgebung mit mehreren Sicherheitsdomänen können Sie das Merkmal useGlobalSchema definieren, damit anstelle des domänenspezifischen Schemas das globale Schema verwendet wird. Das globale Schema ist in diesem Zusammenhang das Schema der Verwaltungsdomäne. Anwendungsdomänen, bei denen die Verwendung des globalen Schemas festgelegt ist, nutzen dasselbe Schema der Verwaltungsdomäne gemeinsam. Falls Sie das Schema für eine Anwendung in einer Domäne erweitern, müssen Sie daher berücksichtigen, wie sich dies auf Anwendungen von anderen Domänen auswirken könnte, da diese ebenfalls an dasselbe Schema gebunden sind. Das Hinzufügen eines obligatorischen Merkmals für eine Anwendung kann beispielsweise dazu führen, dass andere Anwendungen fehlschlagen.

    Wenn Sie globale Schemas verwenden wollen, führen Sie diesen Schritt aus. Falls Sie das domänenspezifische Schema verwenden wollen, überspringen Sie diesen Schritt.

    $AdminTask setIdMgrUseGlobalSchemaForModel { -useGlobalSchema true -securityDomainName domäne1 }
  6. Installieren Sie "wim.ear" als Systemanwendung auf server1.
    $AdminApp install stammverzeichnis_des_anwendungsservers/systemApps/wim.ear { -appname wim -server server1 -systemApp}
  7. Installieren Sie "wimperdomain.ear" als normale Anwendung auf server2. In einer Umgebung mit mehreren Sicherheitsdomänen müssen Sie auf jedem Zielserver, bei dem der Servergeltungsbereich dieser Sicherheitsdomäne zugeordnet ist, die EJB von Virtual Member Manager implementieren, um eine Referenz auf die Virtual Member Manager-Instanz in dieser Domäne zu erhalten. Dieses Verfahren versetzt Sie in die Lage, Virtual Member Manager-APIs für eine bestimmte Domäne über die EJB aufzurufen. Nur Benutzer mit den erforderlichen Zugriffsrollen für Virtual Member Manager-APIs oder Superuser in dieser Domäne können die entsprechenden APIs aufrufen.
    $AdminApp install stammverzeichnis_des_anwendungsservers/installableApps/wimperdomain.ear {
      			-appname wimperdomain1 
      						-BindJndiForEJBNonMessageBinding {{ wim.ejb WIMService wimejb.jar,
              META-INF/ejb-jar.xml ejbd1/com/ibm/websphere/wim/ejb/WIMServiceHome}} 
      						-MapModulesToServers {{ wim.ejb wimejb.jar,META-INF/ejb-jar.xml 
              WebSphere:cell=zellenname,node=knotenname,server=server2 }}}
  8. Speichern Sie die Konfiguration.
    $AdminConfig save

Mustercode

Fügen Sie den nachstehenden Mustercode wie in den folgenden Schritten beschrieben zu Ihrer Anwendung hinzu. Ersetzen Sie hierbei die Variablen durch die tatsächlichen Werte, die Sie verwenden wollen.

  1. Die folgenden Variablendeklarationen sind erforderlich, damit die in den nächsten Schritten angegebenen Methoden in den Mustercode-Snippets verwendet werden können. Sie können diese Deklarationen zu Ihrem Anwendungscode hinzufügen und die Variablen durch die tatsächlichen Werte ersetzen, die Sie verwenden wollen.
    //The service object that holds the Virtual Member Manager ejb service reference for server1.
    		private static Service service1 = null;
    	
    //The service object that holds the Virtual Member Manager ejb service reference for server2.
    		private static Service service2 = null;
    
    //A string constant for the new property name to be added for server1.
    		private static final String server1PropName = "postOfficeBox";
    
    //A string constant for the new property name to be added for server2.
    		private static final String server2PropName = "age";
  2. Starten Sie server1 mit dem Befehl startServer.
  3. Verwenden Sie die folgende Methode locateServices(), um Virtual Member Manager-Services zu lokalisieren, die unter WebSphere Application Server auf dem lokalen Host ausgeführt werden. Stellen Sie sicher, dass der Bootstrap-Port in der Methode locateServices() korrekt angegeben ist.
    /**
     *  This method locates the Virtual Member Manager services running on 
     *  WebSphere Application Sever on the localhost
     */
    private static void locateServices()
    {
        // Remote access WIM Service EJB
        try 
        {
            Hashtable<String, String> environment = new Hashtable<String, String>();
            environment.put(LocalServiceProvider.PROVIDER_URL, "corbaloc:iiop:localhost:2814");
            
            service1 = new LocalServiceProvider(environment);
        }
        catch(Exception e) 
        {
            e.printStackTrace();
        }
    
        try 
        {
            Hashtable<String, String> environment = new Hashtable<String, String>();
            environment.put(LocalServiceProvider.EJB_JNDI_NAME, 
                    "ejbd1/com/ibm/websphere/wim/ejb/WIMServiceHome");
            environment.put(LocalServiceProvider.PROVIDER_URL, "corbaloc:iiop:localhost:2815");
            
            service2 = new LocalServiceProvider(environment);
        }
        catch(Exception e) 
        {
            e.printStackTrace();
        }
    }
  4. Verwenden Sie die folgende Methode createPropertyOnServer1(), um ein neues Merkmal zur Instanz server1 hinzuzufügen.
    /**
     *  This method adds the "postOfficeBox" property to "PersonAccount" entity type.
     */
    private static void createPropertyOnServer1() 
    {
        try 
        {
            System.out.println("\nCreating new property type postOfficeBox 
                    and add it to existing entity type PersonAccount");
            
            DataObject root = service1.createRootDataObject();
            DataObject dynaSchemaDO = root.createDataObject(SchemaConstants.DO_SCHEMA);
            
            // Create new property schema data object
            DataObject propSchemaDO = dynaSchemaDO.createDataObject(SchemaConstants.DO_PROPERTY_SCHEMA);
            // Set the values for the property, such as, namespace URI, namespace prefix, property name
            propSchemaDO.set(SchemaConstants.PROP_NS_URI, SchemaConstants.WIM_NS_URI);
            propSchemaDO.set(SchemaConstants.PROP_PROPERTY_NAME, server1PropName);
            propSchemaDO.setBoolean(SchemaConstants.PROP_MULTI_VALUED, false);
            propSchemaDO.set(SchemaConstants.PROP_DATA_TYPE, SchemaConstants.DATA_TYPE_STRING);
            List applicableEntityTypes = propSchemaDO.getList(SchemaConstants.PROP_APPLICABLE_ENTITY_TYPE_NAMES);
            applicableEntityTypes.add(Service.DO_PERSON_ACCOUNT);
            
            System.out.println("Input datagraph -> " + printDO(root));
            // Invoke the create schema API
            root = service1.createSchema(root);
            System.out.println("Output datagraph -> " + printDO(root));
            System.out.println("\nCLIENT: new property type is created.");
        }
        catch(Exception e) 
        {
            e.printStackTrace();
        }
    }
  5. Stoppen Sie server1 mit dem Befehl stopServer.
  6. Starten Sie server2 mit dem Befehl startServer.
  7. Verwenden Sie die folgende Methode createPropertyOnServer2(), um ein neues Merkmal zur Instanz server2 hinzuzufügen.
    /**
     *  This method adds the "age" property to "PersonAccount" entity type.
     */
    private static void createPropertyOnServer2() 
    {
        try 
        {
            System.out.println("\nCreating new property type age and 
                    add it to existing entity type Person");
            
            DataObject root = service2.createRootDataObject();
            DataObject dynaSchemaDO = root.createDataObject(SchemaConstants.DO_SCHEMA);
            
            // Create new property schema data object
            DataObject propSchemaDO = dynaSchemaDO.createDataObject(SchemaConstants.DO_PROPERTY_SCHEMA);
            // Set the values for the property, such as, namespace URI, namespace prefix, property name
            propSchemaDO.set(SchemaConstants.PROP_NS_URI, SchemaConstants.WIM_NS_URI);
            propSchemaDO.set(SchemaConstants.PROP_PROPERTY_NAME, server2PropName);
            propSchemaDO.setBoolean(SchemaConstants.PROP_MULTI_VALUED, false);
            propSchemaDO.set(SchemaConstants.PROP_DATA_TYPE, SchemaConstants.DATA_TYPE_INT);
            List applicableEntityTypes = propSchemaDO.getList(SchemaConstants.PROP_APPLICABLE_ENTITY_TYPE_NAMES);
            applicableEntityTypes.add(Service.DO_PERSON_ACCOUNT);
            
            SDOUtils.printDataGraph("Input datagraph", root);
            System.out.println("Input datagraph -> " + printDO(root));
            // Invoke the create Schema API
            root = service2.createSchema(root);
            System.out.println("Output datagraph -> " + printDO(root));
            System.out.println("New property type is created.");
        }
        catch(Exception e) 
        {
            e.printStackTrace();
        }		
    }
  8. Stoppen Sie server2 mit dem Befehl stopServer.
  9. Starten Sie server2 und server1.
  10. Erstellen Sie Entitäten mit den neuen Merkmalen, die Sie in den Schritten 4 und 7 hinzugefügt haben. Mustercode für das Hinzufügen von neuen Merkmalen finden Sie im Thema Mustercode für die Erweiterung des Schemas im Dateirepository.
  11. Verwenden Sie die folgende Methode testSearchProperties(), um Suchoperationen unter Verwendung von erweiterten Merkmalen für verschiedene Instanzen auszuführen.
    /**
    	 	 *  Method that runs different searches on different servers.
    	 */
    private static void testSearchProperties() 
    {
        // Search using the server1 property but using service1
        System.out.println("Searching property '" + server1PropName + "' on server1");
        searchserver1PropName(service1);
        
        // Utility stop to synchronize output
        pause();
        
        // Search using the server1 property but using service2
        System.out.println("Searching property '" + server1PropName + "' on server2");
        searchserver1PropName(service2);
        
        // Utility stop to synchronize output
        pause();
        
        // Search using the server2 property but using service2
        System.out.println("Searching property '" + server2PropName + "' on server2");
        searchserver2PropName(service2);
        
        // Utility stop to synchronize output
        pause();
        
        // Search using the server2 property but using service1
        System.out.println("Searching property '" + server2PropName + "' on server1");
        searchserver2PropName(service1);
    }
    
    /**
     *  A utility method added to ensure that the exception is flushed to the console 
     *  before starting with the next operation.
     */
    private static void pause() 
    {
        try 
        {
            Thread.sleep(1000);
        }
        catch (InterruptedException e) 
        {
        }
    }
    
    /**
     * Method to search on 'age'
     * @param service
     */
    @SuppressWarnings("unchecked")
    private static void searchserver2PropName(Service service) 
    {
        try 
        {
            //Search
            DataObject root = SDOHelper.createRootDataObject();
            DataObject searchCtrl = SDOHelper.createControlDataObject(root, null, 
                    SchemaConstants.DO_SEARCH_CONTROL);
            searchCtrl.getList(SchemaConstants.PROP_PROPERTIES).add("uid");
            searchCtrl.getList(SchemaConstants.PROP_PROPERTIES).add("sn");
            searchCtrl.getList(SchemaConstants.PROP_PROPERTIES).add("cn"); 
            searchCtrl.setString(SchemaConstants.PROP_SEARCH_EXPRESSION, 
                    "@xsi:type='PersonAccount' and " + server2PropName + " > 4");
            root = service.search(root);
            System.out.println("Output datagraph -> " + printDO(root));
            List searchResults = root.getList(SchemaConstants.DO_ENTITIES);
            for (int i = 0; i < searchResults.size(); i++) {
                DataObject ent = (DataObject) searchResults.get(i);
                DataObject id = ent.getDataObject(SchemaConstants.DO_IDENTIFIER);
                if (id != null) {
                    String uniqueName = id.getString(SchemaConstants.PROP_UNIQUE_NAME);
                    if (uniqueName != null) {
                        System.out.println("Found -> " + ent.getString("cn") + "(" + uniqueName + ")");
                    }
                }
            }
        } 
        catch(Exception e) 
        {
            e.printStackTrace();
        }
    	}
    
    /**
     *  Method to search on 'postOfficeBox'
     *  @param service
     */
    @SuppressWarnings("unchecked")
    private static void searchserver1PropName(Service service) 
    {
        try 
        {
            //Search
            DataObject root = SDOHelper.createRootDataObject();
            DataObject searchCtrl = SDOHelper.createControlDataObject(root, null, 
                    SchemaConstants.DO_SEARCH_CONTROL);
            searchCtrl.getList(SchemaConstants.PROP_PROPERTIES).add("uid");
            searchCtrl.getList(SchemaConstants.PROP_PROPERTIES).add("sn");
            searchCtrl.getList(SchemaConstants.PROP_PROPERTIES).add("cn"); 
            searchCtrl.setString(SchemaConstants.PROP_SEARCH_EXPRESSION, 
                    "@xsi:type='PersonAccount' and " + server1PropName + "='4-23'");
            root = service.search(root);
            System.out.println("Output datagraph -> " + printDO(root));
            List searchResults = root.getList(SchemaConstants.DO_ENTITIES);
            for (int i = 0; i < searchResults.size(); i++) {
                DataObject ent = (DataObject) searchResults.get(i);
                DataObject id = ent.getDataObject(SchemaConstants.DO_IDENTIFIER);
                if (id != null) {
                    String uniqueName = id.getString(SchemaConstants.PROP_UNIQUE_NAME);
                    if (uniqueName != null) {
                        System.out.println("Found -> " + ent.getString("cn") + "(" + uniqueName + ")");
                    }
                }
            }
        } 
        catch(Exception e) 
        {
            e.printStackTrace();
        }
    }

Ergebnisse

Falls Sie das Merkmal useGlobalSchema definiert haben, damit das globale Schema verwendet wird (siehe Schritt 5 im obigen Abschnitt "Voraussetzungen"), können bei der Ausführung von domänenübergreifenden Suchoperationen alle erweiterten Merkmale für alle Instanzen verwendet werden. Haben Sie useGlobalSchema nicht angegeben, wird nur das domänenspezifische Schema erweitert und Suchoperationen basieren ausschließlich auf den erweiterten Merkmalen in der aktuellen Instanz.



Rechtliche Hinweise | Feedback