RMI / RMI-over-CORBA CommandInterpreter

Werbung
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;
}
}
Herunterladen