5. Wiederverwendung im Softwareentwurf 5.3 Komponenten Literatur: C. Szyperski: Component Software - Beyond Object-oriented Programming, Addison-Wesley 1997 V. Gruhn, A. Thiel: Komponentenmodelle, Addison-Wesley 2000 D. Flanagan: Java in a Nutshell, Kap. 10, O‘Reilly 1997 (2nd ed.) M. Johnson: A beginner‘s guide to Enterprise JavaBeans, JavaWorld 10/98, http://www.javaworld.com/javaworld/jw-10-1998/jw-10-beans_p.html R. Monson-Haefel: Enterprise JavaBeans, O‘Reilly 1999 Technische Universität Dresden Prof. Hußmann Softwaretechnologie II Bausteinorientierte Programmierung (Component-Ware) • Idealzustand der Softwareentwicklung ist die Konstuktion aus vorgegebenen Bausteinen ("Software-ICs") • Generische Bausteine (components) – anpaßbar – zusammensetzbar ("Verdrahtung") • Einfache Kompositionsmechanismen: – werkzeuggestützt – graphisch • Infrastruktur zur Komponenteninteraktion: "object bus" • Beispiele: – – – – Visuelle Programmierung von GUIs Java Beans, Enterprise Java Beans (EJBs) CORBAcomponents Microsoft COM+, DCOM Technische Universität Dresden Prof. Hußmann Seite 1 Softwaretechnologie II Komponenten • Definition: „A software component is a unit of composition with contractually specified interfaces and explicit context dependencies only. A software component can be deployed independently and is subject to composition by third parties.“ ECOOP 1996, Workshop on Component-oriented Prog. 1997 & Clemens Szyperski • Schnittstellen (interfaces): – Explizit definierte Interaktionen mit Komponenten und Umgebung • Kontextabhängigkeiten (context dependencies): – benötigte Komponenten-Infrastruktur – Systemressourcen • Unabhängige Einsetzbarkeit (independent deployment): – Alle Bestandteile enthalten (Archiv-Dateien), als Ganzes eingesetzt • Komposition durch Dritte (composition by third parties): – Endbenutzer, Komponenten-Hersteller und Komponenten-Integrator – Meist nur als compilierter Code verfügbar, nicht als Quellcode Technische Universität Dresden Prof. Hußmann Softwaretechnologie II Sind Komponenten Objekte? Widersprüchliche Stellungnahmen in der Literatur: • Evolutionäre Position: – Komponenten als spezielle (komplexe) Objekte – Komponentenorientierte Programmierung als Abstraktionsschicht über objektorientierter Programmmierung – Komponentenbaukästen als datengetriebene Frameworks – z.B. JavaBeans, Enterprise Java Beans » im folgenden näher erklärt • Revolutionäre Position: – Komponentenorientierte Programmierung als Revolution – „Objektorientierte Programmierung ist gescheitert.“ – Komponentenorientierte Programmierung benötigt die Konzepte der Objektorientierung nicht. – Komponenten ähnlich zu klassischen Modulen Technische Universität Dresden Prof. Hußmann Seite 2 Softwaretechnologie II Client- und Server-Komponenten • Komponenten für eigenständige Anwendungen und Clients: – orientiert auf graphische Benutzungsoberfläche – Fachlogik ohne Berücksichtigung von Mehrbenutzer-Betrieb • Komponenten für Client/Server-Anwendungen: – – – – Serverseitige Komponenten Komponentenbasierte "Application-Server"-Software "Unsichtbare" Komponenten Sicherstellung von Eigenschaften für Server-Software: » Performance » Sicherheit » Mehrbenutzerbetrieb Technische Universität Dresden Prof. Hußmann Softwaretechnologie II JavaBeans • JavaBeans ist das Komponentenmodell von Java (ab Version 1.1). • Definition: Eine Bean (Bohne) ist eine Sammlung von JavaKlassen und anderen Ressourcen, bei der die Klassen bestimmten Konventionen genügen. Eine Bean exportiert zu ihrer Umgebung: – Eigenschaften (properties), d.h. Bestandteile des lokalen Zustands, auf die über get- und setMethoden zugegriffen werden kann; – Ereignisse (events), d.h. Ereignisklassen und "EventListener"-Klassen nach den Konventionen des Ereignismodells von Java 1.1/AWT – Methoden (methods), d.h. öffentlich bekannte Methoden des Objekts Technische Universität Dresden Prof. Hußmann Seite 3 Softwaretechnologie II Beispiel: SimpleBean public class SimpleBean extends Canvas implements Serializable { private Color color = Color.green; public Color getColor(){ return color; } public void setColor(Color newColor){ color = newColor; repaint(); } public void paint(Graphics g) { g.setColor(color); g.fillRect(20, 5, 20, 30); } public SimpleBean(){ setSize(60,40); setBackground(Color.red); } } Technische Universität Dresden Prof. Hußmann Softwaretechnologie II Wann ist eine Java-Klasse eine JavaBean? • Es gibt keine Wurzelklasse aller JavaBeans und kein spezifisches Interfaces für alle JavaBeans! • Eine Klasse wird zur JavaBean(-Klasse) durch Einhaltung bestimmter Namens-Konventionen: – Konventionen für Eigenschaften (Properties): » public setPropertyName (PropertyType p); » public PropertyType getPropertyName(); • Bean-basierte Entwicklungswerkzeuge unterstützen: – Instanziieren von Bean-Objekten – Manipulation von Properties – Ereignisbehandlung » Verwendung von "Meta-Programmierung" (Reflektion) • Die graphischen Elemente der Java-GUI-Toolkits AWT und Swing erfüllen die JavaBean-Konventionen. Technische Universität Dresden Prof. Hußmann Seite 4 Softwaretechnologie II SimpleBean in Entwicklungsumgebung Workbench Properties color background foreground font ... background, foreground und font sind ererbte Properties (aus java.awt.Component via Canvas) Technische Universität Dresden Prof. Hußmann Softwaretechnologie II java.awt.Button public class Button extends Component { ... public String getLabel; public void setLabel (String label); public void addActionListener (ActionListener l); public void removeActionListener (ActionListener l); ... } Technische Universität Dresden Prof. Hußmann Seite 5 Softwaretechnologie II java.awt.event.ActionEvent, ActionListener public interface ActionListener extends EventListener { public void actionPerformed (ActionEvent ev); } public class ActionEvent extends AWTEvent { ... public ActionEvent (object source, ...); ... public Object getSource () } Technische Universität Dresden Prof. Hußmann Softwaretechnologie II Beispiel: Stop Juggling Press Press "Juggler Bean": • Aktive Bean (jongliert) • Methoden: "startJuggling()" "stopJuggling()" Button Bean: • Instanz von java.awt.Button • Graphische Manipulation in Entwicklungstool: – Auswahl der ActionEvents der Button Bean – Verbindung mit der Methode "stopJuggling" der Juggler Bean • Automatische Generierung einer speziellen Klasse, die die Schnittstelle "ActionListener" implementiert Technische Universität Dresden Prof. Hußmann Seite 6 Softwaretechnologie II Generierte Klasse für "Stop Juggling" // Automatically generated event hookup file. import java.awt.event.ActionListener; import java.awt.event.ActionEvent; ... public class ___Hookup_16421c6ea3 implements java.awt.event.ActionListener { private Juggler target; public void setTarget(Juggler t) { target = t; } public void actionPerformed(ActionEvent arg0) { target.stopJuggling(arg0); } } Technische Universität Dresden Prof. Hußmann Softwaretechnologie II Spezialfälle von Bean-Eigenschaften • indexed property: – Feld von Einzeleigenschaften • bound property: – erzeugt bei Veränderung ein Ereignis • constrained property: – erzeugt bei Veränderung ein Ereignis – läßt „Veto“ der Veränderung durch andere Objekte zu • Implementierungsidee für alle diese Varianten ist identisch zur Behandlung von EventListenern. Technische Universität Dresden Prof. Hußmann Seite 7 Softwaretechnologie II JavaBeans und GUIs • JavaBeans taugen nicht nur für Benutzungsoberflächen... • Arten von JavaBeans – Sichtbare (visible) Beans » AWT- und Swing-Komponenten (z.B. Frame, Window, Button, ...) als JavaBeans » Selbstdefinierte graphische Beans » Graphische Komposition von Beans in GUI-Buildern – Unsichtbare (invisible) Beans » Logische Einheiten, die Bean-Konventionen folgen » Interagieren mit sichtbaren Beans » Können in Werkzeugen analog zu sichtbaren Beans behandelt werden Technische Universität Dresden Prof. Hußmann Softwaretechnologie II Beispiel: Sichtbare und unsichtbare Beans Quelle: http://xputers.informatik.uni-kl.de/multimedia/javadoc/beans/ Technische Universität Dresden Prof. Hußmann Seite 8 Softwaretechnologie II Beispiel: Komplexitätsfalle ! Technische Universität Dresden Prof. Hußmann Softwaretechnologie II Meta-Information über Komponenten • Eine Komponente muß alle notwendige Information über ihre Verwendung in sich tragen. • Entwicklungswerkzeuge greifen auf diese Information zu: „Introspektion“ • Beispiel: Für eine JavaBean B kann eine Klasse BBeanInfo definiert und mitgeliefert werden. – Java-Klasse, also ausführbar durch (Java-)Entwicklungswerkzeuge – Enthaltene Information: » Icon ( public Image getIcon (int kind) ) » BeanDescriptor (Referenz auf sog. „Customizer“-Objekt) » Liste der Eigenschaften, zusammen mit textueller Beschreibung » Standardmäßig zur Modifikation anzubietende Eigenschaft » Referenzen auf Editoren für Eigenschaften » Liste der angebotenen Methoden » Information zu den erzeugten Ereignissen Technische Universität Dresden Prof. Hußmann Seite 9 Softwaretechnologie II Client- und Server-Komponenten • Wichtige Eigenschaften für Client/Server-Anwendungen: – – – – Transaktionen Sicherheit Ressourcenverwaltung Persistenz • Komponentenkonzept für Server-Komponenten: – meist unsichtbare Komponenten – standardisierte Realisierung der wichtigen Eigenschaften für Client/Server-Anwendungen – Spezielle Infrastruktur: „Transaktionsmonitor“ für Komponenten • Beispiele für Server-Komponentenmodelle: – Enterprise Java Beans (EJBs) – Microsoft Transaction Server (MTS) Technische Universität Dresden Prof. Hußmann Softwaretechnologie II EJB: Grundsätzliche Architektur Server EJB Container erzeugen finden löschen EJB Home Client Enterprise Bean Fachliches Objekt „fachliche“ Methoden Technische Universität Dresden EJB Object Dienste Prof. Hußmann Seite 10 Softwaretechnologie II EJB: Grundsätzliche Architektur Server EJB Container erzeugen finden löschen EJB Home Client Deployment Descriptor Enterprise Bean Fachliches Objekt „fachliche“ Methoden EJB Object Dienste Transaktionen Weitere Dienste Persistenz Möglicherweise auch außerhalb des „Servers“ Technische Universität Dresden DB TP-Monitor Prof. Hußmann - Resourcen Mgmt. - Sicherheit - Namensdienst - ... Softwaretechnologie II Arten von Enterprise Java Beans • Entity Bean: – Repräsentiert persistente Information aus einer Datenbank – Typischerweise mit mehreren Transaktionen assoziiert – Mehrbenutzerzugriff möglich • Session Bean: – EJB-Instanz, die mit einem einzelnen Client assoziiert ist – Typischerweise nicht persistent – Beispiele: » Benutzersitzung innerhalb einer Web-Site » Buchungsvorgang – „Stateful Session Bean“ » Dialogzustände innerhalb der Session – „Stateless Session Bean“ » keine Dialogzustände, hohe Effizienz Technische Universität Dresden Prof. Hußmann Seite 11 Softwaretechnologie II Beispiel: Remote Interface "Counter" import java.rmi.RemoteException; import javax.ejb.EJBObject; public interface Counter extends EJBObject { public int getCurrent() throws RemoteException; public int getStartValue() throws RemoteException; public void setStartValue(int value) throws RemoteException; public int getIncrValue() throws RemoteException; public void setIncrValue(int value) throws RemoteException; public boolean getEnabled() throws RemoteException; public void setEnabled(boolean value) throws RemoteException; public void reset() throws RemoteException; public void count() throws RemoteException; } Technische Universität Dresden Prof. Hußmann Softwaretechnologie II Beispiel: Home Interface "CounterHome" import javax.ejb.EJBHome; import java.rmi.RemoteException; import javax.ejb.CreateException; public interface CounterHome extends EJBHome { Counter create() throws RemoteException, CreateException; } Technische Universität Dresden Prof. Hußmann Seite 12 Softwaretechnologie II Beispiel: EJB Class "CounterEJB" (1) import javax.ejb.SessionBean; import javax.ejb.SessionContext; public class CounterEJB implements SessionBean { private int count; private int startValue; private int incrValue; private boolean enabled; public void ejbCreate() { startValue = 0; incrValue = 1; reset(); enabled = true; } public int getCurrent () { return count; } public int getStartValue () { return startValue; } ... Technische Universität Dresden Prof. Hußmann Softwaretechnologie II Beispiel: EJB Class "CounterEJB" (2) ... public void reset () { count = startValue; } public void count () { if (enabled) { count += incrValue; } } // EJB Lifecycle Callback Methods public public public public void void void void ejbRemove() {} ejbActivate() {} ejbPassivate() {} setSessionContext(SessionContext sc) {} } Technische Universität Dresden Prof. Hußmann Seite 13 Softwaretechnologie II Beispiel: Deployment-Werkzeug Sun J2EE ReferenzImplementierung 1.3 beta Technische Universität Dresden Prof. Hußmann Softwaretechnologie II Beispiel: Deployment Descriptor <?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE ejb-jar PUBLIC '-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN' 'http://java.sun.com/dtd/ejb-jar_2_0.dtd'> <ejb-jar> <display-name>CounterJAR</display-name> <enterprise-beans> <session> <display-name>CounterBean</display-name> <ejb-name>CounterBean</ejb-name> <home>CounterHome</home> <remote>Counter</remote> <ejb-class>CounterEJB</ejb-class> <session-type>Stateful</session-type> <transaction-type>Bean</transaction-type> <security-identity> <description></description> <use-caller-identity></use-caller-identity> </security-identity> </session> </enterprise-beans> </ejb-jar> Technische Universität Dresden Prof. Hußmann Seite 14 Softwaretechnologie II Client-Programm für "Counter" Session Bean import javax.naming.Context; import javax.naming.InitialContext; import javax.rmi.PortableRemoteObject; import Counter; import CounterHome; ... try { Context ictx = new InitialContext(); Object ctrRef = ictx.lookup("JNDI Name"); CounterHome ctrHome = (CounterHome)PortableRemoteObject.narrow (ctrRef,CounterHome.class); Counter counter = ctrHome.create(); ... counter.setStartValue(...); counter.count(); ... } catch (Exception ex) { System.err.println("Error when connecting to server"); ex.printStackTrace(); } Technische Universität Dresden Prof. Hußmann Softwaretechnologie II Verpackungsform von Komponenten • Eine Komponente ist eine geschlossene Einheit: – Möglicherweise viele Klassen – Dokumentation – Mechanismen zur Anpassung • JavaBeans: • Enterprise JavaBeans: – Bean wird ausgeliefert in JavaArchiv-Datei (JAR-Datei) – Metainformation in der JAR-Datei („Manifest“) beschreibt, welche Klassen Beans sind – Archiv enthält alle möglicherweise zusätzlich notwendigen Ressourcen » Klassen (als Bytecode) (auch Ereignisklassen und Listener-Klassen » Serialisierte Objekte, Daten, Medienobjekte » ... Technische Universität Dresden – Bean wird ausgeliefert in JavaArchiv-Datei (JAR-Datei) – Deployment Descriptor zur Konfiguration der EJB – Archiv enthält alle möglicherweise zusätzlich notwendigen Ressourcen » z.B. Stubs und Skeletons zur CORBA-Kommunikation » ... Prof. Hußmann Seite 15 Softwaretechnologie II