Schreiben einer neuen Representation



Schreiben einer neuen Representation

Eine Representation kann entweder serialisiert und direkt als neues Attribut an einen Dienst amngehängt werden (nicht angeraten aber einfach), oder eine Factory für die UI kann in einem, die Representation genauer beschreibenden, ServiceUI UIDescriptor angehängt werden (dies ist standartisiert und angeraten). Für eine neue Art vor Representation (z.B. für 8x20 Zeichen LCD-Segment-Displays) muss dafür ein neues Factory-Interface geschrieben werden. Für Swing, AWT, Text und 3D existieren solche bereits. Das Factory-Interface spezifiziert ein static final Attribut TOOLKIT, welches die Art der Representation identifiziert, ohne MarshalledObject.instanceOf() zu benutzen..

Beschreiben der Representation.


Dies wird durch Erzeugung und Ausfüllen eines UIDescriptor-Objektes gemacht. Die Rolle kann einfach auf MainUI.ROLE gesetzt werden. Sie können im ServiceUI-Standart Details zu ihrer Bedeutung nachschlagen. Das nächste Argument ist der Identifikator des Factory-Interfaces. Die Factory wird als pre-serialisiertes Objekt anbehängt um nicht unnötig de-serialisiert werden zu müssen. Das Ganze sieht dann folgendermassen aus:

 /**
  * Get a UIDescriptor as needed by the serviceui-draft-standart
  */
 public static UIDescriptor getUIDescriptor()
  {
   try
     {
      return(new UIDescriptor(MainUI.ROLE,
                              JComponentFactory.TOOLKIT,
                              getServiceUIProperties(),
                              new MarshalledObject(new Factory()))
                             );
     }
   catch(IOException e)
     {
      e.printStackTrace(Logger.err);
     }
   return(null);
  }



  /**
   * Gets a serviceui-draft-standart-compactible attribute-set of this representation
   */
  static Set getServiceUIProperties()
  {
   HashSet set = new HashSet();
   set.add("javax.swing.JComponent");
   set.add("javax.swing.JPanel");
   set.add("java.awt.Component");

   HashSet retval = new HashSet();
   retval.add(new UIFactoryTypes(set));

   HashMap map = new HashMap();
   map.put("javax.swing", Package.getPackage("javax.swing").getSpecificationVersion());
   RequiredPackages req = new RequiredPackages(map);
   retval.add(req);

   return(retval);
  }


  /**
   * A serializable factory for creating this UI
   */
  public static class Factory implements JComponentFactory, Serializable
  {


   /**
    * Returns a <CODE>JComponent</CODE>.
    */
   public JComponent getJComponent(Object roleObject)
   {
    ServiceItem item = (ServiceItem)roleObject;

    Logger.debug.println("DEBUG: [RemoteDesktopClientSwingRepresentation.factory] getJComponent called");
    try
      {
       CalculatorSwingRepresentation rep = new CalculatorSwingRepresentation( ((CalculatorProxy)item.service) );
       return(rep.getPanel());
      }
    catch(RemoteException ex)
       {return(null);}

   }
  }


Das  UIFactoryTypes -Object giebt an, welche Typen von Objekten durch die Factory erzeugt werden. Es kann von der UI benutzt werden, falls nur ein Teil der möglichen Objekte uterstützt wird. (z.B. kein Swing aber AWT) ReqiredPackages ist eine Liste von packages und package-Versionen, die vorhanden sein müssen, damit die Representation funktioniert.

Veröffentlichen der Representation.


Die können den UIDescriptor entweder als neues Attribut im init()-Aufruf des Dienstes mitgeben oder einen neuen Dienst schreiben, der represnetierbare Dieneste sucht und die Represnetation anhängt, sofern der Proxy die beh&uouml;tigten Service-Interface implementiert. Das Anhängen geschieht über das Administrative Object.