RMI / RMI-over-CORBA CommandInterpreter - Interface import java.rmi.Remote; import java.rmi.RemoteException; public interface CommandInterpreter extends Remote { public String interpret(String command) throws Exception; } MyRmiServer - Implementation import import import import java.rmi.*; java.rmi.server.*; javax.naming.Context; javax.rmi.PortableRemoteObject; // over Corba public class MyRmiServer extends UnicastRemoteObject / PortableRemoteObject implements CommandInterpreter { public static void main(String[] args) throws Exception { MyRmiServer theServer = new MyRmiServer(); Naming.rebind("MyRmiServer",theServer); Context context = ContextMagic.createContext("localhost",900); // Corba context.rebind("AndyServer",theServer); } public MyRmiServer() throws RemoteException {} public String interpret(String command) throws RemoteException { StringBuffer result = new StringBuffer(); result.append("* Die Eingabe war <"); result.append(command); result.append(">\n"); return(result.toString()); } } Einrichten Stub generieren (rmic ImplementKlasse): rmic MyRmiServer RmiRegistry starten (im Projektverzeichnis): start rmiregistry Corba Name Server starten: start TNameServ.exe von IDE teilweise selbstständig Client import java.rmi.Naming; public class MyRmiClient { CommandInterpreter server = null; // RmiObjekt public static void main(String[] args) { MyRmiClient client = new MyRmiClient(); client.connectClient(); client.useServer(); } public void connectClient() { String serverURL = "rmi://localhost/MyRmiServer"; try { Object serverLookup = Naming.lookup(serverURL); // RmiAnfragen if(serverLookup instanceof CommandInterpreter) { server = (CommandInterpreter) serverLookup; // Proxy-Instanz erhalten } } catch(Exception e){} } public void useServer() { try { String antwort = server.interpret("Mein Befehl"); System.out.println(antwort); } catch (Exception e) {} } } CORBA Context einpacken import java.util.Hashtable; import javax.naming.Context; import javax.naming.InitialContext; public class ContextMagic { public static Context createContext(String host, int port) { Context context = null; Hashtable details = new Hashtable(); details.put(InitialContext.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.cosnaming.CNCtxFactory"); details.put(InitialContext.PROVIDER_URL,"iiop://"+host+":"+port); try { context = new InitialContext(details); } catch(Exception e) { e.printStackTrace(); System.exit(0); } return context; } } WebServices Service package com.tutego.insel.ws; import javax.jws.*; import javax.jws.soap.SOAPBinding; @WebService(name="ChrisWebServices") @SOAPBinding(style = SOAPBinding.Style.RPC) // oder DOCUMENT public class MyWebServices { @WebMethod public String hello( String name ) { return "Hello " + name + "!"; } @WebMethod(operationName="body-mass-index") @WebResult(name = "your-bmi") public double bmi( @WebParam(name="height") double height, @WebParam(name="weight") double weight ) { return weight / ((height * height) / 10000); } } wsgen –r . –extension –wsdl:Xsoap1.2 –cp . –keep timeservice.Timer Soap-Server package com.tutego.insel.ws; import javax.swing.JOptionPane; import javax.xml.ws.Endpoint; public class PublishWsOnServer { public static void main( String[] args ) { Endpoint endpoint = Endpoint.publish( "http://localhost:8080/services", new MyWebServices() ); JOptionPane.showMessageDialog( null, "Server beenden" ); endpoint.stop(); } } Client Stubs erzeugen wsimport -d src -keep -p com.tutego.insel.ws.gen.jipnews http://services.javaportal.it/kservices/JIPNews.jws?wsdl - d: destination keep: source Files erzeugen p: Paket bezeichner danach URL WSDL Client WebService verwenden public class ClientServer implements CommandInterpreter { public String interpret(String command) { IBANCheckerWSService service = new IBANCheckerWSService(); // Klassemit Service am Schluss IBANChecker t = service.getIBANCheckerPort(); //Entsprechendes “Interface /portType” String resultat = t.ibanChecker(command); // Methode aufrufen return resultat; } } JUnit, log4j , MBean (JMX), Properties Test package coffee; import java.io.FileInputStream; import java.util.Properties; import junit.framework.TestCase; public class CoffeeCashRegisterTest extends TestCase { private Properties prop = new Properties(); protected void setUp() throws Exception{ super.setUp(); String propFileName = this.getClass().getSimpleName() + ".properties"; try { prop.load(new FileInputStream(propFileName)); } catch( Exception ex ) { fail( "Fehler: Properties-Datei '" + propFileName + "' fehlt (im CLASSPATH). " ); } } protected void tearDown() throws Exception { super.tearDown();} public CoffeeCashRegisterTest (String name) {super(name);} public void testGetCapsules() throws Exception { /* Asserts */ System.out.println("getCapsules"); CoffeeCashRegister r = new CoffeeCashRegister(); int expResultat = Integer.parseInt(prop.getProperty("capsules")); int result = r.getCapsules(); assertEquals(expResultat, result); } public void testGetSaldo() throws Exception { System.out.println("getSaldo"); CoffeeCashRegister r = new CoffeeCashRegister(); int expResultat = Integer.parseInt(prop.getProperty("saldo")); int result = r.getSaldo(); assertEquals(expResultat, result); } } import import import import import java.lang.management.ManagementFactory; javax.management.Attribute; javax.management.JMException; javax.management.MBeanServer; javax.management.ObjectName; // MBean JMX import java.util.*; import import import import import import org.apache.log4j.Appender; org.apache.log4j.FileAppender; org.apache.log4j.Level; org.apache.log4j.Logger; org.apache.log4j.PatternLayout; org.apache.log4j.SimpleLayout; // log4j public class CoffeeCashRegister implements CoffeeCashRegisterMBean { // Normales Interface private static Logger myLogger = Logger.getLogger(CoffeeCashRegister.class.getName( )); private static List consumers = new LinkedList(); private static int capsules = 100; private static int saldo = 0; private static CoffeeCashRegister instance = null; // Sigleton MBeanServer server = null; static ObjectName objName = null; public static CoffeeCashRegister getInstance() throws Exception { /* … */ } public CoffeeCashRegister() throws Exception { PatternLayout myLayout = new PatternLayout("%d{dd-MM-yyyy HH:mm:ss} %m %n"); Appender myAppender = new FileAppender(myLayout, "myLogging.log"); myLogger.addAppender(myAppender); myLogger.setLevel(Level.INFO); server = ManagementFactory.getPlatformMBeanServer(); objName = new ObjectName("coffee:type=KaffeeTrinker"); } public void addConsumer(String name) { consumers.add(name); try { server.setAttribute(objName, new Attribute(name, 0) );} catch(Exception e){} } public void reset() { consumers = new LinkedList(); capsules = 100;saldo = 0; } public List getConsumers() { return consumers; } public int getCapsules() { myLogger.log(Level.INFO, "Anzahl Kapseln: " + capsules); return capsules; } public int getSaldo() { myLogger.log(Level.INFO, "Saldo ist: " + saldo); return saldo; } public void addCapsules(int amount) { capsules += amount; saldo -= amount; myLogger.log(Level.INFO, "Anzahl Kapseln hinzugef�gt: " + amount); } public void payCoffee(String name) throws Exception { if (consumers.contains(name)) saldo += 1; else throw new Exception ("unknown consumer"); } public void drinkCoffee() { capsules -= 1; myLogger.log(Level.INFO, "Kaffee getrunken, bleiben Kapseln: " + capsules); } public static void main(String[] args) throws Exception { System.out.println("Nespresso, what else"); try { // Register MBean in Platform MBeanServer ManagementFactory.getPlatformMBeanServer().registerMBean( new KaffeeTrinker(), objName); // ManagementFactory.getPlatformMBeanServer().registerMBean( CoffeeCashRegister.getInstance(), new ObjectName("coffee:type=CoffeeCashRegister")); Thread.sleep(100000); } catch(JMException ex) { // TODO handle exception } } } ANT <?xml version="1.0" encoding="UTF-8"?> <project name="CoffeeCash" default="main" basedir="."> <description>Das ist eine Beschreibung im Ant File... keine Ahnung was das bringt.</description> <property name="basedir" location="src" /> <property name="destination" location="built" /> <target name="compile" > <mkdir dir="${destination}"/> <javac srcdir="${basedir}" > <include name="coffee/CoffeeCashRegister.java" /> </javac> </target> <target name="main" depends="compile"> <jar jarfile="${destination}/CoffeeCashRegister.jar" basedir="${basedir}" includes="*/*.class" > <manifest> <attribute name="MAIN-CLASS" value="coffee.CoffeeCashRegister" /> </manifest> </jar> </target> <target name="clean" description="clean up"> <delete dir="${build}"/> <delete dir="${dist}"/> </target> <target name="run" depends="main" > <java jar="${destination}/CoffeeCashRegister.jar" fork="true"/> </target> </project> SessionBean Session Bean @Stateful public class BewertungFacadeBean implements BewertungFacadeRemote{ List<Bewertung> bewertungen; Connection con; //Mit EJB nicht mehr notwendig @PersistenceContext(type=PersistenceContextType.EXTENDED) EntityManager em; //EntityManager überlebt Transaktionen Student student; int bewertungId; String username; Bewertung currentBewertung; public List<Bewertungsdetail> getFragen() { return currentBewertung.bewertungsdetails;} public void setFragen(List<Bewertungsdetail> fragen) { int zaehler = 0; //Referenzen der Liste und Ihrer Objekte dürchen nicht geaendert, nur die Werte for( Bewertungsdetail x : fragen) { currentBewertung.bewertungsdetails.get(zaehler).setNote(x.getNote()); zaehler++; } } public void saveFragen(List<Bewertungsdetail> fragen) { int zaehler = 0; //Referenzen der Liste und Ihrer Objekte dürchen nicht geaendert, nur die Werte for( Bewertungsdetail x : fragen) { currentBewertung.bewertungsdetails.get(zaehler).setNote(x.getNote()); zaehler++; } } public BewertungFacadeBean() { // dbConnection(); nicht notwendig mit EJB } /*Diese Methode gibt eine Liste der Bewertungen des angemeldeten Benutzers aus*/ public List<Bewertung> getBewertungen(){ return student.getBewertungen(); } /*Diese Methode erzeugt eine neue Bewertung*/ public void createBewertung(){ currentBewertung=new Bewertung(); currentBewertung.setStudent(student); student.getBewertungen().add(currentBewertung); Dozent t = em.find(Dozent.class,0); currentBewertung.setDozent(t); //Edi Mumprecht (0) muss dran glauben LinkedList<Bewertungsdetail> details = new LinkedList<Bewertungsdetail>(); Bewertungsdetail bw; for(int i=1;i<9;i++){ bw = new Bewertungsdetail(); bw.setFragennr(i); bw.setNote(1); details.add(bw); bw.setBewertung(currentBewertung); //bidirectional in Java } setFragenText(details); currentBewertung.setBewertungsdetails(details); // Am Ende dieser Methode werden alle Aenderung in die DB automatisch gespeichert } /*Diese Methode gibt eine Liste aller Dozenten in Form SelectItem zurück*/ public LinkedList<SelectItem> getDozenten(){ Query q = em.createQuery("select d from Dozent d"); LinkedList<SelectItem> dozenten = new LinkedList<SelectItem>(); List<Dozent> ld = (List<Dozent>) q.getResultList(); for( Dozent d : ld) { dozenten.add(new SelectItem("" + d.id,d.nachname)); } return dozenten; } public void setFragenText(List<Bewertungsdetail> bws){ FacesContext context = FacesContext.getCurrentInstance(); String language = context.getViewRoot().getLocale().getLanguage(); ListIterator<Bewertungsdetail> ib = bws.listIterator(); while (ib.hasNext()) { Bewertungsdetail bw = ib.next(); Query q = em.createNativeQuery("select text from fragehatsprache f, sprachen sp where sp.bezeichnung = '" + language + "' and " + " sp.sprachenr = f.sprachennr and f.fragennr = " + bw.getFragennr() + " "); Vector v = (Vector) q.getSingleResult(); for (Object x : v) { String s = (String) x; bw.setFrage((String) s); break; } } } public void saveBewertung(){ //Methode ist nur dummy, um Controller nicht zu aendern return; } /*Diese Methode setzt die id des aktuellen Dozenten */ public void setDozentId(int id){ Dozent temp = em.find(Dozent.class, id); currentBewertung.setDozent(temp); } /*Diese Methode gibt die id des aktuellen Dozenten zurück*/ public int getDozentId(){ return currentBewertung.getDozent().getId(); } /*Diese Methode erstellt eine JDBC-Connection; mit EJB nicht mehr notwendig */ public void dbConnection(){ String urlString = "jdbc:postgresql://localhost:5432/dozentenbewertungzhaw"; String username = "eauser"; String password = "eauser12"; try{ Class.forName("org.postgresql.Driver"); System.out.println("Driver successfully loaded"); } catch(ClassNotFoundException e) { System.out.println("Could not load the driver"); System.exit(-1); } try{ con = DriverManager.getConnection(urlString,username,password); System.out.println("Connection successful"); } catch(SQLException e){ System.out.println("Connection failed: "+e.toString()); System.exit(-1); } } /*Diese Methode ueberprueft den Benutzername und das Passwort*/ public boolean verifyUser(String username, String password){ Query myQuery = em.createQuery("select s from Student s where s.kuerzel = '" + username + "' and s.passwort = '" + password + "'" ); student = null; List<Student> lu = (List<Student>) myQuery.getResultList(); if (lu.isEmpty()) return false; student = lu.get(0); return true; } public Bewertung readBewertung(Bewertung selectedBewertung) { currentBewertung=em.find(Bewertung.class, selectedBewertung.getId()); this.setFragenText(currentBewertung.getBewertungsdetails()); return currentBewertung; } }